├── frontend ├── package.json.md5 ├── .vscode │ └── extensions.json ├── src │ ├── vite-env.d.ts │ ├── main.ts │ ├── app.css │ ├── App.svelte │ ├── pages │ │ ├── FileSelectionHeader.svelte │ │ ├── FileSelectionList.svelte │ │ ├── Menu.svelte │ │ ├── ExportConfirmation.svelte │ │ ├── FileSelection.svelte │ │ └── Export.svelte │ └── assets │ │ └── svelte.svg ├── postcss.config.js ├── tsconfig.json ├── vite.config.ts ├── svelte.config.js ├── .gitignore ├── index.html ├── wailsjs │ ├── runtime │ │ ├── package.json │ │ ├── runtime.js │ │ └── runtime.d.ts │ └── go │ │ ├── main │ │ ├── App.d.ts │ │ └── App.js │ │ └── models.ts ├── tsconfig.app.json ├── tsconfig.node.json ├── tailwind.config.ts ├── package.json ├── public │ └── vite.svg ├── README.md └── package-lock.json ├── .gitignore ├── backend ├── ip_validation.go ├── paths.go ├── file_selection.go ├── paths_test.go ├── file_selection_test.go ├── rm_reader.go └── rm_export.go ├── wails.json ├── main.go ├── LICENSE ├── .github └── workflows │ └── main.yml ├── go.mod ├── README.md ├── app.go └── go.sum /frontend/package.json.md5: -------------------------------------------------------------------------------- 1 | 1e55a623007fd5493e650b57528fef34 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | node_modules 3 | frontend/dist 4 | 5 | -------------------------------------------------------------------------------- /frontend/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["svelte.svelte-vscode"] 3 | } 4 | -------------------------------------------------------------------------------- /frontend/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /frontend/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {} 5 | } 6 | }; 7 | -------------------------------------------------------------------------------- /frontend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { "path": "./tsconfig.app.json" }, 5 | { "path": "./tsconfig.node.json" } 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /backend/ip_validation.go: -------------------------------------------------------------------------------- 1 | package backend 2 | 3 | import ( 4 | "net" 5 | ) 6 | 7 | func IsIpValid(s string) bool { 8 | ip := net.ParseIP(s) 9 | return ip != nil 10 | } 11 | -------------------------------------------------------------------------------- /frontend/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import { svelte } from '@sveltejs/vite-plugin-svelte' 3 | 4 | // https://vite.dev/config/ 5 | export default defineConfig({ 6 | plugins: [svelte()], 7 | }) 8 | -------------------------------------------------------------------------------- /frontend/src/main.ts: -------------------------------------------------------------------------------- 1 | import { mount } from 'svelte' 2 | import './app.css' 3 | import App from './App.svelte' 4 | 5 | const app = mount(App, { 6 | target: document.getElementById('app')!, 7 | }) 8 | 9 | export default app 10 | -------------------------------------------------------------------------------- /frontend/svelte.config.js: -------------------------------------------------------------------------------- 1 | import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' 2 | 3 | export default { 4 | // Consult https://svelte.dev/docs#compile-time-svelte-preprocess 5 | // for more information about preprocessors 6 | preprocess: vitePreprocess(), 7 | } 8 | -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /frontend/src/app.css: -------------------------------------------------------------------------------- 1 | @import "tailwindcss/base"; 2 | @import "tailwindcss/components"; 3 | @import "tailwindcss/utilities"; 4 | @tailwind base; 5 | @tailwind components; 6 | @tailwind utilities; 7 | 8 | html, 9 | body { 10 | height: 100%; 11 | width: 100%; 12 | padding: 0; 13 | margin: 0; 14 | } 15 | 16 | @media (min-width: 640px) { 17 | main { 18 | max-width: none; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /wails.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://wails.io/schemas/config.v2.json", 3 | "name": "rm-exporter", 4 | "outputfilename": "rm-exporter", 5 | "frontend:install": "npm install", 6 | "frontend:build": "npm run build", 7 | "frontend:dev:watcher": "npm run dev", 8 | "frontend:dev:serverUrl": "auto", 9 | "author": { 10 | "name": "Igor Chovpan" 11 | }, 12 | "info": { 13 | "productVersion": "0.2.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | rm-exporter 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /frontend/src/App.svelte: -------------------------------------------------------------------------------- 1 | 17 | 18 | -------------------------------------------------------------------------------- /frontend/wailsjs/runtime/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@wailsapp/runtime", 3 | "version": "2.0.0", 4 | "description": "Wails Javascript runtime library", 5 | "main": "runtime.js", 6 | "types": "runtime.d.ts", 7 | "scripts": { 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/wailsapp/wails.git" 12 | }, 13 | "keywords": [ 14 | "Wails", 15 | "Javascript", 16 | "Go" 17 | ], 18 | "author": "Lea Anthony ", 19 | "license": "MIT", 20 | "bugs": { 21 | "url": "https://github.com/wailsapp/wails/issues" 22 | }, 23 | "homepage": "https://github.com/wailsapp/wails#readme" 24 | } 25 | -------------------------------------------------------------------------------- /frontend/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/svelte/tsconfig.json", 3 | "compilerOptions": { 4 | "target": "ESNext", 5 | "useDefineForClassFields": true, 6 | "module": "ESNext", 7 | "resolveJsonModule": true, 8 | /** 9 | * Typecheck JS in `.svelte` and `.js` files by default. 10 | * Disable checkJs if you'd like to use dynamic types in JS. 11 | * Note that setting allowJs false does not prevent the use 12 | * of JS in `.svelte` files. 13 | */ 14 | "allowJs": true, 15 | "checkJs": true, 16 | "isolatedModules": true, 17 | "moduleDetection": "force" 18 | }, 19 | "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.svelte"] 20 | } 21 | -------------------------------------------------------------------------------- /frontend/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 4 | "target": "ES2022", 5 | "lib": ["ES2023"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "isolatedModules": true, 13 | "moduleDetection": "force", 14 | "noEmit": true, 15 | 16 | /* Linting */ 17 | "strict": true, 18 | "noUnusedLocals": true, 19 | "noUnusedParameters": true, 20 | "noFallthroughCasesInSwitch": true, 21 | "noUncheckedSideEffectImports": true 22 | }, 23 | "include": ["vite.config.ts"] 24 | } 25 | -------------------------------------------------------------------------------- /frontend/tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import flowbitePlugin from 'flowbite/plugin' 2 | 3 | import type { Config } from 'tailwindcss'; 4 | 5 | export default { 6 | content: ['./src/**/*.{html,js,svelte,ts}', './node_modules/flowbite-svelte/**/*.{html,js,svelte,ts}'], 7 | darkMode: 'selector', 8 | theme: { 9 | extend: { 10 | colors: { 11 | // flowbite-svelte 12 | primary: { 13 | 50: '#EBF5FF', 14 | 100: '#E1EFFE', 15 | 200: '#C3DDFD', 16 | 300: '#A4CAFE', 17 | 400: '#76A9FA', 18 | 500: '#3F83F8', 19 | 600: '#1C64F2', 20 | 700: '#1A56DB', 21 | 800: '#1E429F', 22 | 900: '#233876' 23 | } 24 | } 25 | } 26 | }, 27 | 28 | plugins: [flowbitePlugin] 29 | } as Config; -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "embed" 5 | 6 | "github.com/wailsapp/wails/v2" 7 | "github.com/wailsapp/wails/v2/pkg/options" 8 | "github.com/wailsapp/wails/v2/pkg/options/assetserver" 9 | ) 10 | 11 | //go:embed all:frontend/dist 12 | var assets embed.FS 13 | 14 | func main() { 15 | // Create an instance of the app structure 16 | app := NewApp() 17 | 18 | // Create application with options 19 | err := wails.Run(&options.App{ 20 | Title: "rm-exporter", 21 | Width: 700, 22 | Height: 700, 23 | AssetServer: &assetserver.Options{ 24 | Assets: assets, 25 | }, 26 | BackgroundColour: &options.RGBA{R: 27, G: 38, B: 54, A: 1}, 27 | OnStartup: app.startup, 28 | Bind: []interface{}{ 29 | app, 30 | }, 31 | }) 32 | 33 | if err != nil { 34 | println("Error:", err.Error()) 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend", 3 | "private": true, 4 | "version": "0.2.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "preview": "vite preview", 10 | "check": "svelte-check --tsconfig ./tsconfig.app.json && tsc -p tsconfig.node.json" 11 | }, 12 | "devDependencies": { 13 | "@sveltejs/vite-plugin-svelte": "^5.0.3", 14 | "@tailwindcss/typography": "^0.5.14", 15 | "@tsconfig/svelte": "^5.0.4", 16 | "autoprefixer": "^10.4.20", 17 | "flowbite": "^2.5.2", 18 | "flowbite-svelte": "^0.47.4", 19 | "flowbite-svelte-icons": "^2.0.2", 20 | "svelte": "^5.15.0", 21 | "svelte-check": "^4.1.1", 22 | "tailwindcss": "^3.4.9", 23 | "typescript": "~5.6.2", 24 | "vite": ">=6.0.9" 25 | }, 26 | "dependencies": { 27 | "svelte-spa-router": "^4.0.1" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Igor Chovpan 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /frontend/wailsjs/go/main/App.d.ts: -------------------------------------------------------------------------------- 1 | // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL 2 | // This file is automatically generated. DO NOT EDIT 3 | import {backend} from '../models'; 4 | 5 | export function DirectoryDialog():Promise; 6 | 7 | export function Export():Promise; 8 | 9 | export function GetAppVersion():Promise; 10 | 11 | export function GetCheckedFiles():Promise>; 12 | 13 | export function GetCheckedFilesCount():Promise; 14 | 15 | export function GetExportOptions():Promise; 16 | 17 | export function GetFolder(arg1:string):Promise>; 18 | 19 | export function GetFolderSelection(arg1:string):Promise>; 20 | 21 | export function GetItemSelection(arg1:string):Promise; 22 | 23 | export function InitExport():Promise; 24 | 25 | export function IsIpValid(arg1:string):Promise; 26 | 27 | export function OnItemSelect(arg1:string,arg2:boolean):Promise; 28 | 29 | export function ReadDocs(arg1:string):Promise; 30 | 31 | export function SetExportOptions(arg1:backend.RmExportOptions):Promise; 32 | -------------------------------------------------------------------------------- /frontend/src/pages/FileSelectionHeader.svelte: -------------------------------------------------------------------------------- 1 | 7 | -------------------------------------------------------------------------------- /frontend/src/pages/FileSelectionList.svelte: -------------------------------------------------------------------------------- 1 | 9 | {#if items.length > 0} 10 | 11 |
12 | isItemChecked(item.Id), (v) => itemCheckUpdate(item.Id, v)} 13 | indeterminate={isItemIndeterminate(item.Id)} 14 | class="mr-4 w-4 h-4" /> 15 | 16 |
onItemClick(item)}> 18 | {#if item.IsFolder} 19 | 20 | {:else} 21 | 22 | {/if} 23 |

{item.Name}

24 |
25 |
26 |
27 | {/if} -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Wails build 2 | 3 | on: 4 | push: 5 | tags: 6 | # Match any new tag 7 | - '*' 8 | 9 | env: 10 | # Necessary for most environments as build failure can occur due to OOM issues 11 | NODE_OPTIONS: "--max-old-space-size=4096" 12 | 13 | jobs: 14 | build: 15 | strategy: 16 | # Failure in one platform build won't impact the others 17 | fail-fast: false 18 | matrix: 19 | build: 20 | - name: 'rm-exporter' 21 | platform: 'linux/amd64' 22 | os: 'ubuntu-latest' 23 | - name: 'rm-exporter' 24 | platform: 'windows/amd64' 25 | os: 'windows-latest' 26 | - name: 'rm-exporter' 27 | platform: 'darwin/universal' 28 | os: 'macos-latest' 29 | 30 | runs-on: ${{ matrix.build.os }} 31 | steps: 32 | - name: Checkout 33 | uses: actions/checkout@v4.2.2 34 | with: 35 | submodules: recursive 36 | 37 | - name: Build wails 38 | uses: chopikus/wails-build-action@a9e607df4c313c9a7aaa7b29c61148e77c54ab92 39 | id: build 40 | with: 41 | build-name: ${{ matrix.build.name }} 42 | build-platform: ${{ matrix.build.platform }} 43 | package: true 44 | go-version: '1.22' 45 | node-version: '20.x' 46 | macos-build-name: 'rm-exporter' 47 | ubuntu24: "-tags webkit2_41" 48 | -------------------------------------------------------------------------------- /frontend/public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module rm-exporter 2 | 3 | go 1.22.0 4 | 5 | toolchain go1.22.10 6 | 7 | require ( 8 | github.com/google/go-cmp v0.6.0 9 | github.com/wailsapp/wails/v2 v2.9.2 10 | ) 11 | 12 | require ( 13 | github.com/bep/debounce v1.2.1 // indirect 14 | github.com/go-ole/go-ole v1.3.0 // indirect 15 | github.com/godbus/dbus/v5 v5.1.0 // indirect 16 | github.com/google/uuid v1.6.0 // indirect 17 | github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect 18 | github.com/labstack/echo/v4 v4.13.3 // indirect 19 | github.com/labstack/gommon v0.4.2 // indirect 20 | github.com/leaanthony/go-ansi-parser v1.6.1 // indirect 21 | github.com/leaanthony/gosod v1.0.4 // indirect 22 | github.com/leaanthony/slicer v1.6.0 // indirect 23 | github.com/leaanthony/u v1.1.1 // indirect 24 | github.com/mattn/go-colorable v0.1.13 // indirect 25 | github.com/mattn/go-isatty v0.0.20 // indirect 26 | github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect 27 | github.com/pkg/errors v0.9.1 // indirect 28 | github.com/rivo/uniseg v0.4.7 // indirect 29 | github.com/samber/lo v1.47.0 // indirect 30 | github.com/tkrajina/go-reflector v0.5.8 // indirect 31 | github.com/valyala/bytebufferpool v1.0.0 // indirect 32 | github.com/valyala/fasttemplate v1.2.2 // indirect 33 | github.com/wailsapp/go-webview2 v1.0.18 // indirect 34 | github.com/wailsapp/mimetype v1.4.1 // indirect 35 | golang.org/x/crypto v0.32.0 // indirect 36 | golang.org/x/net v0.34.0 // indirect 37 | golang.org/x/sys v0.29.0 // indirect 38 | golang.org/x/text v0.21.0 // indirect 39 | ) 40 | 41 | // replace github.com/wailsapp/wails/v2 v2.9.2 => /home/ihor/go/pkg/mod 42 | -------------------------------------------------------------------------------- /frontend/wailsjs/go/main/App.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL 3 | // This file is automatically generated. DO NOT EDIT 4 | 5 | export function DirectoryDialog() { 6 | return window['go']['main']['App']['DirectoryDialog'](); 7 | } 8 | 9 | export function Export() { 10 | return window['go']['main']['App']['Export'](); 11 | } 12 | 13 | export function GetAppVersion() { 14 | return window['go']['main']['App']['GetAppVersion'](); 15 | } 16 | 17 | export function GetCheckedFiles() { 18 | return window['go']['main']['App']['GetCheckedFiles'](); 19 | } 20 | 21 | export function GetCheckedFilesCount() { 22 | return window['go']['main']['App']['GetCheckedFilesCount'](); 23 | } 24 | 25 | export function GetExportOptions() { 26 | return window['go']['main']['App']['GetExportOptions'](); 27 | } 28 | 29 | export function GetFolder(arg1) { 30 | return window['go']['main']['App']['GetFolder'](arg1); 31 | } 32 | 33 | export function GetFolderSelection(arg1) { 34 | return window['go']['main']['App']['GetFolderSelection'](arg1); 35 | } 36 | 37 | export function GetItemSelection(arg1) { 38 | return window['go']['main']['App']['GetItemSelection'](arg1); 39 | } 40 | 41 | export function InitExport() { 42 | return window['go']['main']['App']['InitExport'](); 43 | } 44 | 45 | export function IsIpValid(arg1) { 46 | return window['go']['main']['App']['IsIpValid'](arg1); 47 | } 48 | 49 | export function OnItemSelect(arg1, arg2) { 50 | return window['go']['main']['App']['OnItemSelect'](arg1, arg2); 51 | } 52 | 53 | export function ReadDocs(arg1) { 54 | return window['go']['main']['App']['ReadDocs'](arg1); 55 | } 56 | 57 | export function SetExportOptions(arg1) { 58 | return window['go']['main']['App']['SetExportOptions'](arg1); 59 | } 60 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # rm-exporter 2 | 3 | https://github.com/user-attachments/assets/0996b7c3-85a7-45ea-90d7-cfabd989c5dc 4 | 5 | As you might know, reMarkable supports exporting notes locally through the USB connection. 6 | 7 | Unfortunately, the default local export has a few flaws: 8 | * Large notes (10MB+) often can't be exported, **the UI doesn't wait for long enough for a note to download**; 9 | * Downloading a folder is not possible; only notes one-by-one. 10 | 11 | This tool aims to fix those problems. 12 | 13 | ## Features 14 | * Supports exporting as many folders & notes as you want; 15 | * Can download both .pdf and .rmdoc; 16 | * Retries the download **from the last failed note**; 17 | * Waits for large notes long enough; 18 | * Doesn't require reMarkable account or internet connection; 19 | * Works with out of the box reMarkable software; 20 | * Has a nice GUI. 21 | 22 | ## Usage 23 | Releases for Windows/MacOS/Linux are available on the 'Releases' tab of the repository. 24 | 25 | The tool is built with [wailsv2](https://github.com/wailsapp/wails). The UI is implemented in Typescript/Svelte, file downloading itself is done in Golang. 26 | 27 | ### Supported rM software version 28 | Around 3.10+, around that version the local server requests got updated. 29 | 30 | Tested on Version 3.16.2.3 on reMarkable 2. 31 | 32 | ### Steps before running the `rm-exporter` 33 | * Enable USB connection in the Storage settings. Without the permission the app can't find the tablet; 34 | * For long exports with large number of files, turn off Sleep Mode in the Battery settings. For some reason the local export doesn't prevent the tablet from going to sleep. 35 | 36 | ### Building steps 37 | 1. Install [wails v2](https://wails.io/docs/gettingstarted/installation). 38 | 2. Clone the project 39 | 3. `wails build` 40 | -------------------------------------------------------------------------------- /frontend/src/assets/svelte.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/wailsjs/go/models.ts: -------------------------------------------------------------------------------- 1 | export namespace backend { 2 | 3 | export class DocInfo { 4 | Id: string; 5 | ParentId: string; 6 | IsFolder: boolean; 7 | Name: string; 8 | Bookmarked: boolean; 9 | // Go type: time 10 | LastModified?: any; 11 | FileType?: string; 12 | DisplayPath?: string; 13 | TabletPath: string[]; 14 | 15 | static createFrom(source: any = {}) { 16 | return new DocInfo(source); 17 | } 18 | 19 | constructor(source: any = {}) { 20 | if ('string' === typeof source) source = JSON.parse(source); 21 | this.Id = source["Id"]; 22 | this.ParentId = source["ParentId"]; 23 | this.IsFolder = source["IsFolder"]; 24 | this.Name = source["Name"]; 25 | this.Bookmarked = source["Bookmarked"]; 26 | this.LastModified = this.convertValues(source["LastModified"], null); 27 | this.FileType = source["FileType"]; 28 | this.DisplayPath = source["DisplayPath"]; 29 | this.TabletPath = source["TabletPath"]; 30 | } 31 | 32 | convertValues(a: any, classs: any, asMap: boolean = false): any { 33 | if (!a) { 34 | return a; 35 | } 36 | if (a.slice && a.map) { 37 | return (a as any[]).map(elem => this.convertValues(elem, classs)); 38 | } else if ("object" === typeof a) { 39 | if (asMap) { 40 | for (const key of Object.keys(a)) { 41 | a[key] = new classs(a[key]); 42 | } 43 | return a; 44 | } 45 | return new classs(a); 46 | } 47 | return a; 48 | } 49 | } 50 | export class RmExportOptions { 51 | Pdf: boolean; 52 | Rmdoc: boolean; 53 | Location: string; 54 | 55 | static createFrom(source: any = {}) { 56 | return new RmExportOptions(source); 57 | } 58 | 59 | constructor(source: any = {}) { 60 | if ('string' === typeof source) source = JSON.parse(source); 61 | this.Pdf = source["Pdf"]; 62 | this.Rmdoc = source["Rmdoc"]; 63 | this.Location = source["Location"]; 64 | } 65 | } 66 | export class SelectionInfo { 67 | Id: string; 68 | Status: number; 69 | 70 | static createFrom(source: any = {}) { 71 | return new SelectionInfo(source); 72 | } 73 | 74 | constructor(source: any = {}) { 75 | if ('string' === typeof source) source = JSON.parse(source); 76 | this.Id = source["Id"]; 77 | this.Status = source["Status"]; 78 | } 79 | } 80 | 81 | } 82 | 83 | -------------------------------------------------------------------------------- /frontend/src/pages/Menu.svelte: -------------------------------------------------------------------------------- 1 | 50 | 51 | {#key show_error} 52 | {#if show_error} 53 | 55 |
56 | 57 | Couldn't connect to reMarkable! 58 |
59 |

{error_message}

60 |
61 | {/if} 62 | {/key} 63 | 64 |
65 |

rm-exporter

66 |
67 | 73 | 74 | 81 |
82 |
83 |
84 |

Version {version}. Source available at {source}

85 |
86 | -------------------------------------------------------------------------------- /frontend/README.md: -------------------------------------------------------------------------------- 1 | # Svelte + TS + Vite 2 | 3 | This template should help get you started developing with Svelte and TypeScript in Vite. 4 | 5 | ## Recommended IDE Setup 6 | 7 | [VS Code](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). 8 | 9 | ## Need an official Svelte framework? 10 | 11 | Check out [SvelteKit](https://github.com/sveltejs/kit#readme), which is also powered by Vite. Deploy anywhere with its serverless-first approach and adapt to various platforms, with out of the box support for TypeScript, SCSS, and Less, and easily-added support for mdsvex, GraphQL, PostCSS, Tailwind CSS, and more. 12 | 13 | ## Technical considerations 14 | 15 | **Why use this over SvelteKit?** 16 | 17 | - It brings its own routing solution which might not be preferable for some users. 18 | - It is first and foremost a framework that just happens to use Vite under the hood, not a Vite app. 19 | 20 | This template contains as little as possible to get started with Vite + TypeScript + Svelte, while taking into account the developer experience with regards to HMR and intellisense. It demonstrates capabilities on par with the other `create-vite` templates and is a good starting point for beginners dipping their toes into a Vite + Svelte project. 21 | 22 | Should you later need the extended capabilities and extensibility provided by SvelteKit, the template has been structured similarly to SvelteKit so that it is easy to migrate. 23 | 24 | **Why `global.d.ts` instead of `compilerOptions.types` inside `jsconfig.json` or `tsconfig.json`?** 25 | 26 | Setting `compilerOptions.types` shuts out all other types not explicitly listed in the configuration. Using triple-slash references keeps the default TypeScript setting of accepting type information from the entire workspace, while also adding `svelte` and `vite/client` type information. 27 | 28 | **Why include `.vscode/extensions.json`?** 29 | 30 | Other templates indirectly recommend extensions via the README, but this file allows VS Code to prompt the user to install the recommended extension upon opening the project. 31 | 32 | **Why enable `allowJs` in the TS template?** 33 | 34 | While `allowJs: false` would indeed prevent the use of `.js` files in the project, it does not prevent the use of JavaScript syntax in `.svelte` files. In addition, it would force `checkJs: false`, bringing the worst of both worlds: not being able to guarantee the entire codebase is TypeScript, and also having worse typechecking for the existing JavaScript. In addition, there are valid use cases in which a mixed codebase may be relevant. 35 | 36 | **Why is HMR not preserving my local component state?** 37 | 38 | HMR state preservation comes with a number of gotchas! It has been disabled by default in both `svelte-hmr` and `@sveltejs/vite-plugin-svelte` due to its often surprising behavior. You can read the details [here](https://github.com/rixo/svelte-hmr#svelte-hmr). 39 | 40 | If you have state that's important to retain within a component, consider creating an external store which would not be replaced by HMR. 41 | 42 | ```ts 43 | // store.ts 44 | // An extremely simple external store 45 | import { writable } from 'svelte/store' 46 | export default writable(0) 47 | ``` 48 | -------------------------------------------------------------------------------- /backend/paths.go: -------------------------------------------------------------------------------- 1 | package backend 2 | 3 | import ( 4 | "fmt" 5 | "path" 6 | "path/filepath" 7 | "slices" 8 | "strings" 9 | ) 10 | 11 | type Paths struct { 12 | duplicatePaths map[string]int 13 | } 14 | 15 | func initPaths() Paths { 16 | return Paths{duplicatePaths: map[string]int{}} 17 | } 18 | 19 | /* 20 | Returns a unique file path for a file. 21 | 22 | Appends a number to a file name to make a file name unique. 23 | */ 24 | func (ps *Paths) getFilePathUnique(location string, folderName string, itemPath []string, ext string) (string, error) { 25 | itemPath = slices.Clone(itemPath) 26 | for { 27 | p, err := getFilePath(location, folderName, itemPath, ext) 28 | if err != nil { 29 | return "", err 30 | } 31 | 32 | count := ps.duplicatePaths[p] 33 | ps.duplicatePaths[p] += 1 34 | if count == 0 { 35 | return p, nil 36 | } 37 | /* If count is > 0, need to modify the name and call getFilePath again */ 38 | 39 | if len(itemPath) == 0 { 40 | return "", fmt.Errorf("item path is empty") 41 | } 42 | 43 | name := itemPath[len(itemPath)-1] 44 | nameExt := path.Ext(name) 45 | newName := strings.TrimSuffix(name, nameExt) + fmt.Sprintf("-%d", count) + nameExt 46 | itemPath[len(itemPath)-1] = newName 47 | } 48 | } 49 | 50 | /* 51 | Returns a path for creating a file. 52 | Normalizes folderName and item.TabletPath. 53 | */ 54 | func getFilePath(location string, folderName string, itemPath []string, ext string) (string, error) { 55 | itemPath = slices.Clone(itemPath) 56 | if len(itemPath) == 0 { 57 | return "", fmt.Errorf("item path is empty") 58 | } 59 | 60 | last := itemPath[len(itemPath)-1] 61 | if path.Ext(last) != "."+ext { 62 | itemPath[len(itemPath)-1] = last + "." + ext 63 | } 64 | 65 | for i := range itemPath { 66 | itemPath[i] = normalize(itemPath[i]) 67 | } 68 | folderName = normalize(folderName) 69 | 70 | toJoin := []string{filepath.ToSlash(location), folderName} 71 | toJoin = append(toJoin, itemPath...) 72 | return path.Join(toJoin...), nil 73 | } 74 | 75 | /* Normalizes folder or a file name. */ 76 | /* Replaces banned characters (0x00 up to 0x1F, /"*:<>?\|), 77 | changes the name if reserved on Windows (CON, AUX, NUL, etc.) 78 | */ 79 | func normalize(name string) string { 80 | banned := []rune{'"', '*', '/', ':', '<', '>', '?', '\\', '|'} 81 | banned = append(banned, 0x7F) 82 | for i := range 0x20 { 83 | banned = append(banned, rune(i)) 84 | } 85 | slices.Sort(banned) 86 | 87 | sb := strings.Builder{} 88 | 89 | for _, c := range name { 90 | if _, ok := slices.BinarySearch(banned, c); ok { 91 | sb.WriteRune('-') 92 | } else { 93 | sb.WriteRune(c) 94 | } 95 | } 96 | 97 | name = sb.String() 98 | ext := path.Ext(name) 99 | 100 | reservedWin := []string{"CON", "PRN", "AUX", "NUL", 101 | "COM1", "COM2", "COM3", 102 | "COM4", "COM5", "COM6", 103 | "COM7", "COM8", "COM9", 104 | "LPT1", "LPT2", "LPT3", 105 | "LPT4", "LPT5", "LPT6", 106 | "LPT7", "LPT8", "LPT9"} 107 | 108 | nameWithoutExt := strings.TrimSuffix(name, ext) 109 | if slices.Contains(reservedWin, nameWithoutExt) { 110 | nameWithoutExt += "-1" 111 | } 112 | 113 | return nameWithoutExt + ext 114 | } 115 | -------------------------------------------------------------------------------- /frontend/src/pages/ExportConfirmation.svelte: -------------------------------------------------------------------------------- 1 | 35 | 36 |
37 | 38 |
39 | 40 |
41 |

Export options

42 | 45 |
46 | 47 |
48 |
49 |

Formats:

50 | 51 | 56 | 61 | 62 |
63 |
64 |

Location:

65 | 66 |

{location || "No folder selected."}

67 |
68 | {#if items.length > 0} 69 |

Following items will be exported:

70 | 71 |
72 | 73 |

{item.DisplayPath}

74 |
75 |
76 | {/if} 77 |
78 |
79 | 80 |
81 |
-------------------------------------------------------------------------------- /app.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | _ "embed" 6 | "encoding/json" 7 | "rm-exporter/backend" 8 | "time" 9 | 10 | "github.com/wailsapp/wails/v2/pkg/runtime" 11 | ) 12 | 13 | // App struct 14 | type App struct { 15 | ctx context.Context 16 | rm_reader backend.RmReader 17 | tablet_addr string 18 | selection backend.FileSelection 19 | 20 | rm_export backend.RmExport 21 | export_options backend.RmExportOptions 22 | } 23 | 24 | //go:embed wails.json 25 | var wailsJSON string 26 | 27 | // NewApp creates a new App application struct 28 | func NewApp() *App { 29 | return &App{} 30 | } 31 | 32 | // startup is called when the app starts. The context is saved 33 | // so we can call the runtime methods 34 | func (a *App) startup(ctx context.Context) { 35 | a.ctx = ctx 36 | } 37 | 38 | func (a *App) GetAppVersion() string { 39 | m := make(map[string]interface{}) 40 | err := json.Unmarshal([]byte(wailsJSON), &m) 41 | if err != nil { 42 | return "0.0.0" 43 | } 44 | return m["info"].(map[string]interface{})["productVersion"].(string) 45 | } 46 | 47 | func (a *App) IsIpValid(s string) bool { 48 | return backend.IsIpValid(s) 49 | } 50 | 51 | func (a *App) ReadDocs(tablet_addr string) error { 52 | a.tablet_addr = tablet_addr 53 | 54 | err := a.rm_reader.Read(tablet_addr) 55 | if err != nil { 56 | return err 57 | } 58 | 59 | a.selection = backend.NewFileSelection(a.rm_reader.GetChildrenMap()) 60 | return nil 61 | } 62 | 63 | func (a *App) GetFolder(id backend.DocId) []backend.DocInfo { 64 | return a.rm_reader.GetFolder(id) 65 | } 66 | 67 | func (a *App) GetFolderSelection(id backend.DocId) []backend.SelectionInfo { 68 | return a.selection.GetFolderSelection(id) 69 | } 70 | 71 | func (a *App) GetItemSelection(id backend.DocId) backend.SelectionInfo { 72 | return a.selection.GetItemSelection(id) 73 | } 74 | 75 | func (a *App) OnItemSelect(id backend.DocId, selection bool) { 76 | a.selection.Select(id, selection) 77 | } 78 | 79 | func (a *App) GetCheckedFilesCount() int { 80 | return a.selection.GetCheckedFilesCount() 81 | } 82 | 83 | type RmExportOptions struct { 84 | Format string 85 | Location string 86 | } 87 | 88 | func (a *App) SetExportOptions(options backend.RmExportOptions) { 89 | a.export_options = options 90 | } 91 | 92 | func (a *App) GetExportOptions() backend.RmExportOptions { 93 | return a.export_options 94 | } 95 | 96 | func (a *App) InitExport() { 97 | a.rm_export = backend.InitExport(a.ctx, a.export_options, a.GetCheckedFiles(), a.tablet_addr) 98 | } 99 | 100 | func (a *App) Export() { 101 | started := func(item backend.DocInfo) { 102 | runtime.LogInfof(a.ctx, "[%v] Started file id=%v", time.Now().UTC(), item.Id) 103 | runtime.EventsEmit(a.ctx, "started", item.Id) 104 | } 105 | 106 | finished := func(item backend.DocInfo) { 107 | runtime.LogInfof(a.ctx, "[%v] Finished file id=%v", time.Now().UTC(), item.Id) 108 | runtime.EventsEmit(a.ctx, "finished", item.Id) 109 | } 110 | 111 | failed := func(item backend.DocInfo, err error) { 112 | runtime.LogInfof(a.ctx, "[%v] Failed file id=%v, error: %v", time.Now().UTC(), item.Id, err) 113 | runtime.EventsEmit(a.ctx, "failed", item.Id, err.Error()) 114 | } 115 | 116 | a.rm_export.Export(started, finished, failed) 117 | } 118 | 119 | /* Includes path for every checked file */ 120 | func (a *App) GetCheckedFiles() []backend.DocInfo { 121 | return a.rm_reader.GetCheckedFiles(&a.selection) 122 | } 123 | 124 | func (a *App) DirectoryDialog() string { 125 | dir, err := runtime.OpenDirectoryDialog(a.ctx, runtime.OpenDialogOptions{}) 126 | if err != nil { 127 | return "" 128 | } 129 | return dir 130 | } 131 | -------------------------------------------------------------------------------- /backend/file_selection.go: -------------------------------------------------------------------------------- 1 | package backend 2 | 3 | type SelectionStatus = int 4 | 5 | const ( 6 | NotSelected SelectionStatus = iota // default value 7 | Indeterminate SelectionStatus = iota 8 | Selected SelectionStatus = iota 9 | ) 10 | 11 | type SelectionInfo struct { 12 | Id DocId 13 | Status SelectionStatus 14 | } 15 | 16 | type FileSelection struct { 17 | Children map[DocId][]DocId 18 | Parent map[DocId]DocId 19 | 20 | DocSelection map[DocId]SelectionStatus 21 | Files map[DocId]bool 22 | checkedFiles int 23 | } 24 | 25 | func NewFileSelection(c map[DocId][]DocInfo) FileSelection { 26 | m := make(map[DocId][]DocId) 27 | for parentId, items := range c { 28 | 29 | ids := []DocId{} 30 | for _, item := range items { 31 | ids = append(ids, item.Id) 32 | } 33 | 34 | m[parentId] = ids 35 | } 36 | 37 | parent := make(map[DocId]DocId) 38 | for parentId, items := range c { 39 | for _, item := range items { 40 | parent[item.Id] = parentId 41 | } 42 | } 43 | 44 | files := make(map[DocId]bool) 45 | for _, items := range c { 46 | for _, item := range items { 47 | if !item.IsFolder { 48 | files[item.Id] = true 49 | } 50 | } 51 | } 52 | 53 | return FileSelection{m, parent, make(map[string]SelectionStatus), files, 0} 54 | } 55 | 56 | func (f *FileSelection) setDocSelection(id DocId, selection bool) { 57 | var status SelectionStatus 58 | if !selection { 59 | status = NotSelected 60 | } else { 61 | status = Selected 62 | } 63 | 64 | if _, ok := f.Files[id]; ok { 65 | if f.DocSelection[id] == Selected && !selection { 66 | f.checkedFiles -= 1 67 | } else if f.DocSelection[id] == NotSelected && selection { 68 | f.checkedFiles += 1 69 | } 70 | } 71 | 72 | f.DocSelection[id] = status 73 | } 74 | 75 | func (f *FileSelection) dfs(item DocId, selection bool) { 76 | f.setDocSelection(item, selection) 77 | 78 | if ids, ok := f.Children[item]; ok { 79 | for _, child := range ids { 80 | f.dfs(child, selection) 81 | } 82 | } 83 | } 84 | 85 | func (f *FileSelection) updateParents(id DocId) { 86 | for { 87 | if ids, ok := f.Children[id]; ok { 88 | s, i := 0, 0 89 | for _, id := range ids { 90 | if f.DocSelection[id] == Selected { 91 | s += 1 92 | } 93 | if f.DocSelection[id] == Indeterminate { 94 | i += 1 95 | } 96 | } 97 | if s == 0 && i == 0 { 98 | f.DocSelection[id] = NotSelected 99 | } else if s == len(ids) { 100 | f.DocSelection[id] = Selected 101 | } else { 102 | f.DocSelection[id] = Indeterminate 103 | } 104 | } 105 | 106 | if id == "" { 107 | break 108 | } 109 | id = f.Parent[id] 110 | } 111 | } 112 | 113 | func (f *FileSelection) Select(id DocId, selection bool) { 114 | /* Set the selection value to all items in the subtree of 'item'. */ 115 | f.dfs(id, selection) 116 | 117 | /* Number of selectedOrIndeterminate children could change, 118 | which could in turn change the state of the parent itself. 119 | This method iteratively updates parents' states up to root. */ 120 | f.updateParents(id) 121 | } 122 | 123 | func (f *FileSelection) GetFolderSelection(id DocId) []SelectionInfo { 124 | result := []SelectionInfo{} 125 | for _, id := range f.Children[id] { 126 | result = append(result, SelectionInfo{id, f.DocSelection[id]}) 127 | } 128 | result = append(result, SelectionInfo{id, f.DocSelection[id]}) 129 | return result 130 | } 131 | 132 | func (f *FileSelection) GetItemSelection(id DocId) SelectionInfo { 133 | return SelectionInfo{id, f.DocSelection[id]} 134 | } 135 | 136 | func (f *FileSelection) GetCheckedItems() []DocId { 137 | result := []DocId{} 138 | for id := range f.Files { 139 | if f.DocSelection[id] == Selected { 140 | result = append(result, id) 141 | } 142 | } 143 | return result 144 | } 145 | 146 | func (f *FileSelection) GetCheckedFilesCount() int { 147 | return f.checkedFiles 148 | } 149 | -------------------------------------------------------------------------------- /frontend/src/pages/FileSelection.svelte: -------------------------------------------------------------------------------- 1 | 96 | 97 |
98 | 99 |
100 | 101 |
102 |
103 | 105 |
106 |
-------------------------------------------------------------------------------- /backend/paths_test.go: -------------------------------------------------------------------------------- 1 | package backend 2 | 3 | import ( 4 | "testing" 5 | ) 6 | 7 | func TestNormalize(t *testing.T) { 8 | names := []string{"hello: 1.pdf", "project/v2", "NUL", "NUL-1", "..pdf", "allgood", "cool.epub"} 9 | expected := []string{"hello- 1.pdf", "project-v2", "NUL-1", "NUL-1", "..pdf", "allgood", "cool.epub"} 10 | 11 | for i, name := range names { 12 | if normalize(name) != expected[i] { 13 | t.Fatalf("normalize!=expected, name=%v, normalize=%v, expected=%v", name, normalize(name), expected[i]) 14 | } 15 | } 16 | } 17 | 18 | type args struct { 19 | location string 20 | folderName string 21 | itemPath []string 22 | ext string 23 | } 24 | 25 | func TestGetFilePath(t *testing.T) { 26 | argsList := []args{ 27 | { 28 | location: "/Desktop/folder1/", 29 | folderName: "myFolder: 1", 30 | itemPath: []string{"file1"}, 31 | ext: "pdf", 32 | }, 33 | { 34 | location: "/Desktop/folder1/", 35 | folderName: "folder2", 36 | itemPath: []string{"file:2.epub"}, 37 | ext: "rmdoc", 38 | }, 39 | { 40 | location: "/Desktop/folder1/", 41 | folderName: "", 42 | itemPath: []string{"file"}, 43 | ext: "epub", 44 | }, 45 | } 46 | 47 | expected := []string{ 48 | "/Desktop/folder1/myFolder- 1/file1.pdf", 49 | "/Desktop/folder1/folder2/file-2.epub.rmdoc", 50 | "/Desktop/folder1/file.epub", 51 | } 52 | 53 | for i, a := range argsList { 54 | res, err := getFilePath(a.location, a.folderName, a.itemPath, a.ext) 55 | if err != nil { 56 | t.Fatal(err.Error()) 57 | } 58 | 59 | if res != expected[i] { 60 | t.Fatalf("getFilePath: args=%v, res=%v, expected=%v", a, res, expected[i]) 61 | } 62 | } 63 | } 64 | 65 | func TestGetFilePathUnique(t *testing.T) { 66 | paths := initPaths() 67 | argsList := []args{ 68 | { 69 | location: "/Desktop/folder1/", 70 | folderName: "myFolder: 1", 71 | itemPath: []string{"file1"}, 72 | ext: "pdf", 73 | }, 74 | { 75 | location: "/Desktop/folder1/", 76 | folderName: "myFolder: 1", 77 | itemPath: []string{"file1"}, 78 | ext: "rmdoc", 79 | }, 80 | { 81 | location: "/Desktop/folder1/", 82 | folderName: "myFolder: 1", 83 | itemPath: []string{"file1"}, 84 | ext: "pdf", 85 | }, 86 | { 87 | location: "/another", 88 | folderName: "f", 89 | itemPath: []string{"file1"}, 90 | ext: "pdf", 91 | }, 92 | { 93 | location: "/another", 94 | folderName: "f", 95 | itemPath: []string{"file2"}, 96 | ext: "pdf", 97 | }, 98 | { 99 | location: "/another", 100 | folderName: "f", 101 | itemPath: []string{"file2-1"}, 102 | ext: "pdf", 103 | }, 104 | { 105 | location: "/another", 106 | folderName: "f", 107 | itemPath: []string{"file2"}, 108 | ext: "pdf", 109 | }, 110 | { 111 | location: "/loc", 112 | folderName: "", 113 | itemPath: []string{"doc", "file1"}, 114 | ext: "rmdoc", 115 | }, 116 | { 117 | location: "/loc", 118 | folderName: "", 119 | itemPath: []string{"doc", "file1"}, 120 | ext: "rmdoc", 121 | }, 122 | { 123 | location: "/loc", 124 | folderName: "", 125 | itemPath: []string{"doc", "file1"}, 126 | ext: "rmdoc", 127 | }, 128 | } 129 | 130 | expected := []string{ 131 | "/Desktop/folder1/myFolder- 1/file1.pdf", 132 | "/Desktop/folder1/myFolder- 1/file1.rmdoc", 133 | "/Desktop/folder1/myFolder- 1/file1-1.pdf", 134 | "/another/f/file1.pdf", 135 | "/another/f/file2.pdf", 136 | "/another/f/file2-1.pdf", 137 | "/another/f/file2-1-1.pdf", 138 | "/loc/doc/file1.rmdoc", 139 | "/loc/doc/file1-1.rmdoc", 140 | "/loc/doc/file1-2.rmdoc", 141 | } 142 | 143 | for i, a := range argsList { 144 | res, err := paths.getFilePathUnique(a.location, a.folderName, a.itemPath, a.ext) 145 | if err != nil { 146 | t.Fatal(err.Error()) 147 | } 148 | 149 | if res != expected[i] { 150 | t.Fatalf("getFilePathUnique: args=%v, res=%v, expected=%v", a, res, expected[i]) 151 | } 152 | } 153 | } 154 | -------------------------------------------------------------------------------- /frontend/src/pages/Export.svelte: -------------------------------------------------------------------------------- 1 | 72 | 73 |
74 | {#key showError} 75 | {#if showError} 76 | 77 | 78 | 79 | Info 80 | 81 |

Couldn't export a file!

82 |

{errorMessage}

83 |
84 | {/if} 85 | {/key} 86 | 87 | 88 |

{finishedAllItems() ? "Success!" : "Export"}

89 |
90 | 91 |
92 | 93 |

Formats: {formats}

94 |

Location: {exportOptions["Location"]}

95 | 96 | {#if exportItems.length > 0} 97 | 98 |
99 | 100 |

{item.DisplayPath}

101 | {#if exportItemState[item.Id] === "started"} 102 | 103 | {:else if exportItemState[item.Id] === "finished"} 104 | 105 | {:else if exportItemState[item.Id] === "failed"} 106 | 107 | {/if} 108 |
109 |
110 | {/if} 111 |
112 | 113 |
114 | 115 |
116 |
-------------------------------------------------------------------------------- /backend/file_selection_test.go: -------------------------------------------------------------------------------- 1 | package backend 2 | 3 | import ( 4 | "slices" 5 | "testing" 6 | 7 | "github.com/google/go-cmp/cmp" 8 | ) 9 | 10 | /* 11 | Graph sketch 12 | 13 | root 14 | / | \ 15 | 16 | dir1 dir2 file3 17 | file1 dir3 file2 18 | */ 19 | func initFileSelection() FileSelection { 20 | folder1 := DocInfo{Id: "dir1", ParentId: "", IsFolder: true, Name: "folder1"} 21 | folder2 := DocInfo{Id: "dir2", ParentId: "", IsFolder: true, Name: "folder2"} 22 | folder3 := DocInfo{Id: "dir3", ParentId: "dir2", IsFolder: true, Name: "folder3"} 23 | file1 := DocInfo{Id: "f1", ParentId: "dir1", IsFolder: false, Name: "file1"} 24 | file2 := DocInfo{Id: "f2", ParentId: "dir2", IsFolder: false, Name: "file2"} 25 | file3 := DocInfo{Id: "f3", ParentId: "", IsFolder: false, Name: "file3"} 26 | c := make(map[DocId][]DocInfo) 27 | c[""] = []DocInfo{folder1, folder2, file3} 28 | c["dir1"] = []DocInfo{file1} 29 | c["dir2"] = []DocInfo{file2, folder3} 30 | return NewFileSelection(c) 31 | } 32 | 33 | func assertAllSelected(t *testing.T, f *FileSelection, folderId DocId) { 34 | for _, sel := range f.GetFolderSelection(folderId) { 35 | if sel.Status == Selected { 36 | continue 37 | } 38 | t.Fatalf("After selecting root one of the items is not selected! %v", sel) 39 | } 40 | } 41 | 42 | func assertAllNotSelected(t *testing.T, f *FileSelection, folderId DocId) { 43 | for _, sel := range f.GetFolderSelection(folderId) { 44 | if sel.Status == NotSelected { 45 | continue 46 | } 47 | t.Fatalf("After selecting root one of the items is not selected! %v", sel) 48 | } 49 | } 50 | 51 | func assertOne(t *testing.T, f *FileSelection, id DocId, expected SelectionStatus) { 52 | result := f.GetItemSelection(id) 53 | if result.Status != expected { 54 | t.Fatalf("assertOne failed! id: %s, result.Status: %v, expected: %v", id, result.Status, expected) 55 | } 56 | } 57 | 58 | func TestFolderSelectionRoot(t *testing.T) { 59 | f := initFileSelection() 60 | f.Select("", true) 61 | 62 | assertAllSelected(t, &f, "") 63 | assertAllSelected(t, &f, "dir1") 64 | assertAllSelected(t, &f, "dir2") 65 | 66 | f.Select("", false) 67 | 68 | assertAllNotSelected(t, &f, "") 69 | assertAllNotSelected(t, &f, "dir1") 70 | assertAllNotSelected(t, &f, "dir2") 71 | } 72 | 73 | func TestSelectionSub(t *testing.T) { 74 | f := initFileSelection() 75 | 76 | f.Select("", true) 77 | f.Select("dir1", false) 78 | f.Select("dir2", true) 79 | 80 | assertOne(t, &f, "", Indeterminate) 81 | assertAllNotSelected(t, &f, "dir1") 82 | assertAllSelected(t, &f, "dir2") 83 | assertOne(t, &f, "f3", Selected) 84 | } 85 | 86 | func TestParentUpdate(t *testing.T) { 87 | f := initFileSelection() 88 | f.Select("f1", true) 89 | f.Select("f2", true) 90 | f.Select("f3", true) 91 | assertOne(t, &f, "", Indeterminate) 92 | assertOne(t, &f, "dir1", Selected) 93 | assertOne(t, &f, "dir2", Indeterminate) 94 | assertOne(t, &f, "dir3", NotSelected) 95 | } 96 | 97 | func TestParentUpdate2(t *testing.T) { 98 | f := initFileSelection() 99 | f.Select("f1", true) 100 | f.Select("f2", true) 101 | f.Select("f3", true) 102 | f.Select("dir3", true) 103 | assertOne(t, &f, "", Selected) 104 | assertOne(t, &f, "dir1", Selected) 105 | assertOne(t, &f, "dir2", Selected) 106 | assertOne(t, &f, "dir3", Selected) 107 | } 108 | 109 | func TestSelectSimple(t *testing.T) { 110 | f := initFileSelection() 111 | f.Select("f1", true) 112 | assertOne(t, &f, "f1", Selected) 113 | assertOne(t, &f, "f2", NotSelected) 114 | assertOne(t, &f, "f3", NotSelected) 115 | } 116 | 117 | func TestCheckedFilesRoot(t *testing.T) { 118 | f := initFileSelection() 119 | f.Select("", true) 120 | 121 | result := f.GetCheckedItems() 122 | expected := []DocId{"f1", "f2", "f3"} 123 | slices.Sort(result) 124 | slices.Sort(expected) 125 | if !cmp.Equal(result, expected) { 126 | t.Fatalf("CheckedFilesRoot failed! %v", cmp.Diff(result, expected)) 127 | } 128 | } 129 | 130 | func TestCheckedFilesSub(t *testing.T) { 131 | f := initFileSelection() 132 | f.Select("", false) 133 | f.Select("dir2", true) 134 | f.Select("f3", true) 135 | 136 | result := f.GetCheckedItems() 137 | expected := []DocId{"f2", "f3"} 138 | slices.Sort(result) 139 | slices.Sort(expected) 140 | if !cmp.Equal(result, expected) { 141 | t.Fatalf("CheckedFilesSub failed! %v", cmp.Diff(result, expected)) 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /backend/rm_reader.go: -------------------------------------------------------------------------------- 1 | package backend 2 | 3 | import ( 4 | "bytes" 5 | "encoding/json" 6 | "fmt" 7 | "io" 8 | "net/http" 9 | "slices" 10 | "strings" 11 | "time" 12 | ) 13 | 14 | type DocId = string 15 | type DocInfo struct { 16 | // Required 17 | Id DocId 18 | ParentId DocId 19 | IsFolder bool 20 | Name string 21 | 22 | // Optional 23 | Bookmarked bool 24 | LastModified *time.Time 25 | FileType *string 26 | DisplayPath *string 27 | TabletPath []string 28 | } 29 | 30 | func parseDocsResponse(bytes []byte) ([]DocInfo, error) { 31 | data := []map[string]interface{}{} 32 | err := json.Unmarshal(bytes, &data) 33 | 34 | if err != nil { 35 | return nil, err 36 | } 37 | 38 | result := []DocInfo{} 39 | for _, item := range data { 40 | info := DocInfo{} 41 | 42 | // Required elements 43 | info.Id = item["ID"].(string) 44 | info.ParentId = item["Parent"].(string) 45 | info.IsFolder = bool(item["Type"].(string) == "CollectionType") 46 | info.Name = item["VissibleName"].(string) 47 | 48 | // Optional elements 49 | if _, ok := item["ModifiedClient"]; ok { 50 | last, err := time.Parse("2006-01-02T15:04:05.000Z", item["ModifiedClient"].(string)) 51 | if err == nil { 52 | info.LastModified = &last 53 | } 54 | } 55 | 56 | if t, ok := item["fileType"].(string); ok { 57 | info.FileType = &t 58 | } 59 | 60 | info.Bookmarked = item["Bookmarked"].(bool) 61 | 62 | result = append(result, info) 63 | } 64 | 65 | return result, nil 66 | } 67 | 68 | func readDocs(tablet_addr string) ([]DocInfo, error) { 69 | if !IsIpValid(tablet_addr) { 70 | return nil, fmt.Errorf("readDocs error: the IP address is invalid") 71 | } 72 | 73 | directories := []string{""} 74 | result := []DocInfo{} 75 | client := http.Client{ 76 | Timeout: 5 * time.Second, 77 | } 78 | 79 | for len(directories) > 0 { 80 | id := directories[0] 81 | directories = directories[1:] 82 | 83 | url := "http://" + tablet_addr + "/documents/" + id 84 | 85 | req, err := http.NewRequest(http.MethodPost, url, &bytes.Buffer{}) 86 | if err != nil { 87 | return nil, err 88 | } 89 | req.Header.Set("Accept", "*/*") 90 | req.Header.Set("Connection", "keep-alive") 91 | req.Header.Set("User-Agent", "Mozilla/5.0 (U; Linux x86_64; en-US) Gecko/20100101 Firefox/133.0") 92 | 93 | resp, err := client.Do(req) 94 | if err != nil { 95 | return nil, err 96 | } 97 | 98 | respBytes, err := io.ReadAll(resp.Body) 99 | if err != nil { 100 | return nil, err 101 | } 102 | 103 | elements, err := parseDocsResponse(respBytes) 104 | if err != nil { 105 | return nil, err 106 | } 107 | 108 | for _, element := range elements { 109 | if element.IsFolder { 110 | directories = append(directories, element.Id) 111 | } 112 | } 113 | 114 | result = append(result, elements...) 115 | } 116 | 117 | return result, nil 118 | } 119 | 120 | type RmReader struct { 121 | /* For an collection with DocId 'id', map[id] stores elements in that folder. 122 | For a root element the 'id' is empty 123 | */ 124 | children map[DocId][]DocInfo 125 | 126 | docById map[DocId]DocInfo 127 | } 128 | 129 | /* 130 | Reads all the items the rM tablet and stores them. 131 | Past items are cleared in case read() was called previously. 132 | */ 133 | func (r *RmReader) Read(tablet_addr string) error { 134 | r.children = make(map[DocId][]DocInfo) 135 | r.docById = make(map[DocId]DocInfo) 136 | 137 | docs, err := readDocs(tablet_addr) 138 | if err != nil { 139 | return err 140 | } 141 | 142 | for _, doc := range docs { 143 | r.children[doc.ParentId] = append(r.children[doc.ParentId], doc) 144 | } 145 | 146 | for _, doc := range docs { 147 | r.docById[doc.Id] = doc 148 | } 149 | 150 | return nil 151 | } 152 | 153 | func (r *RmReader) GetFolder(id DocId) []DocInfo { 154 | if items, ok := r.children[id]; ok { 155 | return items 156 | } 157 | return []DocInfo{} 158 | } 159 | 160 | func (r *RmReader) GetCheckedFiles(selection *FileSelection) []DocInfo { 161 | ids := selection.GetCheckedItems() 162 | files := r.getElementsByIds(ids) 163 | r.fillPaths(files) 164 | 165 | slices.SortFunc(files, func(i, j DocInfo) int { 166 | c := strings.Compare(*i.DisplayPath, *j.DisplayPath) 167 | if c != 0 { 168 | return c 169 | } 170 | return strings.Compare(i.Id, j.Id) 171 | }) 172 | return files 173 | } 174 | 175 | func (r *RmReader) getElementsByIds(ids []DocId) []DocInfo { 176 | result := []DocInfo{} 177 | for _, id := range ids { 178 | result = append(result, r.docById[id]) 179 | } 180 | return result 181 | } 182 | 183 | func (r *RmReader) GetChildrenMap() map[DocId][]DocInfo { 184 | return r.children 185 | } 186 | 187 | func (r *RmReader) fillPaths(items []DocInfo) { 188 | for i, item := range items { 189 | p := r.getDisplayPath(item) 190 | items[i].DisplayPath = &p 191 | items[i].TabletPath = r.getTabletPath(item) 192 | } 193 | } 194 | 195 | func (r *RmReader) getTabletPath(item DocInfo) []string { 196 | id := item.Id 197 | 198 | l := []string{} 199 | for id != "" { 200 | item := r.docById[id] 201 | l = append(l, item.Name) 202 | id = item.ParentId 203 | } 204 | slices.Reverse(l) 205 | 206 | return l 207 | } 208 | 209 | func (r *RmReader) getDisplayPath(item DocInfo) string { 210 | tabletPath := r.getTabletPath(item) 211 | for i, x := range tabletPath { 212 | if strings.Contains(x, "/") { 213 | tabletPath[i] = "'" + x + "'" 214 | } 215 | } 216 | 217 | return strings.Join(tabletPath, "/") 218 | } 219 | -------------------------------------------------------------------------------- /backend/rm_export.go: -------------------------------------------------------------------------------- 1 | package backend 2 | 3 | import ( 4 | "bytes" 5 | "context" 6 | "fmt" 7 | "io" 8 | "net" 9 | "net/http" 10 | "os" 11 | "path/filepath" 12 | "time" 13 | 14 | "github.com/wailsapp/wails/v2/pkg/runtime" 15 | ) 16 | 17 | type RmExportOptions struct { 18 | Pdf bool 19 | Rmdoc bool 20 | Location string // path to the folder to export 21 | } 22 | 23 | type RmExport struct { 24 | Options RmExportOptions 25 | 26 | items []DocInfo 27 | export_from int // index of the first item to be exported 28 | 29 | tablet_addr string 30 | wrappingFolderName string 31 | client http.Client 32 | ctx context.Context 33 | paths Paths 34 | } 35 | 36 | func InitExport(ctx context.Context, options RmExportOptions, items []DocInfo, tablet_addr string) RmExport { 37 | client := http.Client{ 38 | Transport: &http.Transport{ 39 | Dial: (&net.Dialer{ 40 | Timeout: 5 * time.Second, 41 | }).Dial, 42 | }, 43 | Timeout: 5 * time.Minute, 44 | } 45 | 46 | t := time.Now().Format(time.DateTime) 47 | folderName := "rM Export (" + t + ")" 48 | 49 | return RmExport{ 50 | Options: options, 51 | items: items, 52 | export_from: 0, 53 | tablet_addr: tablet_addr, 54 | wrappingFolderName: folderName, 55 | client: client, 56 | ctx: ctx, 57 | paths: initPaths(), 58 | } 59 | } 60 | 61 | /* 62 | Exports all items passed in Init() method. 63 | Calls the callbacks when: 64 | * item started downloading; 65 | * item download has finished; 66 | * item download has failed. 67 | 68 | Supports retries. 69 | In case the last export succeeded on all items, it starts the export again from the first item; 70 | otherwise, the export starts from the first failed item. 71 | */ 72 | func (r *RmExport) Export(started, finished func(item DocInfo), failed func(item DocInfo, err error)) { 73 | formats := []string{} 74 | if r.Options.Rmdoc { 75 | formats = append(formats, "rmdoc") 76 | } 77 | if r.Options.Pdf { 78 | formats = append(formats, "pdf") 79 | } 80 | 81 | runtime.LogInfof(r.ctx, "[%v] Export formats: %v", time.Now().UTC(), formats) 82 | runtime.LogInfof(r.ctx, "[%v] In export location, using a wrapper folder with a name: %v", time.Now().UTC(), r.wrappingFolderName) 83 | 84 | for i := r.export_from; i < len(r.items); i++ { 85 | item := r.items[i] 86 | started(item) 87 | 88 | for _, format := range formats { 89 | err := r.exportOne(item, format) 90 | if err != nil { 91 | r.export_from = i 92 | failed(item, err) 93 | return 94 | } 95 | } 96 | 97 | finished(item) 98 | } 99 | } 100 | 101 | func (r *RmExport) lookupDir(id DocId) error { 102 | runtime.LogInfof(r.ctx, "[%v] looking up dir, id=%v", time.Now().UTC(), id) 103 | 104 | url := "http://" + r.tablet_addr + "/documents/" + id 105 | 106 | ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) 107 | defer cancel() 108 | 109 | req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, &bytes.Buffer{}) 110 | if err != nil { 111 | return err 112 | } 113 | 114 | req.Header.Set("Accept", "*/*") 115 | req.Header.Set("Connection", "keep-alive") 116 | req.Header.Set("User-Agent", "Mozilla/5.0 (U; Linux x86_64; en-US) Gecko/20100101 Firefox/133.0") 117 | _, err = r.client.Do(req) 118 | 119 | if err != nil { 120 | return err 121 | } 122 | 123 | return nil 124 | } 125 | 126 | func (r *RmExport) exportOne(item DocInfo, format string) error { 127 | time.Sleep(150 * time.Millisecond) 128 | err := r.lookupDir(item.ParentId) 129 | if err != nil { 130 | return err 131 | } 132 | 133 | time.Sleep(150 * time.Millisecond) 134 | err = r.download(item, format) 135 | if err != nil { 136 | return err 137 | } 138 | 139 | return nil 140 | } 141 | 142 | func (r *RmExport) download(item DocInfo, format string) error { 143 | if item.IsFolder { 144 | return nil 145 | } 146 | runtime.LogInfof(r.ctx, "[%v] downloading an item, id=%v", time.Now().UTC(), item.Id) 147 | 148 | out, err := r.createFile(r.wrappingFolderName, item, format) 149 | if err != nil { 150 | return err 151 | } 152 | defer out.Close() 153 | 154 | url := "http://" + r.tablet_addr + "/download/" + item.Id + "/" + format 155 | 156 | req, err := http.NewRequest(http.MethodGet, url, &bytes.Buffer{}) 157 | if err != nil { 158 | return err 159 | } 160 | 161 | req.Header.Set("Accept", "*/*") 162 | req.Header.Set("Connection", "keep-alive") 163 | req.Header.Set("User-Agent", "Mozilla/5.0 (U; Linux x86_64; en-US) Gecko/20100101 Firefox/133.0") 164 | resp, err := r.client.Do(req) 165 | 166 | if err != nil { 167 | return err 168 | } 169 | 170 | if resp.StatusCode != 200 { 171 | return fmt.Errorf("tablet returned HTTP code %d", resp.StatusCode) 172 | } 173 | 174 | defer resp.Body.Close() 175 | 176 | _, err = io.Copy(out, resp.Body) 177 | 178 | return err 179 | } 180 | 181 | func (r *RmExport) createFile(folderName string, item DocInfo, format string) (*os.File, error) { 182 | path, err := r.paths.getFilePathUnique(r.Options.Location, folderName, item.TabletPath, format) 183 | if err != nil { 184 | return nil, fmt.Errorf("failed to find a path, id=%v, (%v)", item.Id, err.Error()) 185 | } 186 | 187 | runtime.LogDebugf(r.ctx, "[%v] exporting to path %v, id=%v", time.Now().UTC(), path, item.Id) 188 | 189 | path = filepath.FromSlash(path) 190 | dir, _ := filepath.Split(path) 191 | 192 | /* Permission 0755: The owner can read, write, execute. 193 | Everyone else can read and execute but not modify the file.*/ 194 | err = os.MkdirAll(dir, 0755) 195 | if err != nil { 196 | return nil, err 197 | } 198 | 199 | out, err := os.Create(path) 200 | if err != nil { 201 | return nil, err 202 | } 203 | return out, nil 204 | } 205 | -------------------------------------------------------------------------------- /frontend/wailsjs/runtime/runtime.js: -------------------------------------------------------------------------------- 1 | /* 2 | _ __ _ __ 3 | | | / /___ _(_) /____ 4 | | | /| / / __ `/ / / ___/ 5 | | |/ |/ / /_/ / / (__ ) 6 | |__/|__/\__,_/_/_/____/ 7 | The electron alternative for Go 8 | (c) Lea Anthony 2019-present 9 | */ 10 | 11 | export function LogPrint(message) { 12 | window.runtime.LogPrint(message); 13 | } 14 | 15 | export function LogTrace(message) { 16 | window.runtime.LogTrace(message); 17 | } 18 | 19 | export function LogDebug(message) { 20 | window.runtime.LogDebug(message); 21 | } 22 | 23 | export function LogInfo(message) { 24 | window.runtime.LogInfo(message); 25 | } 26 | 27 | export function LogWarning(message) { 28 | window.runtime.LogWarning(message); 29 | } 30 | 31 | export function LogError(message) { 32 | window.runtime.LogError(message); 33 | } 34 | 35 | export function LogFatal(message) { 36 | window.runtime.LogFatal(message); 37 | } 38 | 39 | export function EventsOnMultiple(eventName, callback, maxCallbacks) { 40 | return window.runtime.EventsOnMultiple(eventName, callback, maxCallbacks); 41 | } 42 | 43 | export function EventsOn(eventName, callback) { 44 | return EventsOnMultiple(eventName, callback, -1); 45 | } 46 | 47 | export function EventsOff(eventName, ...additionalEventNames) { 48 | return window.runtime.EventsOff(eventName, ...additionalEventNames); 49 | } 50 | 51 | export function EventsOnce(eventName, callback) { 52 | return EventsOnMultiple(eventName, callback, 1); 53 | } 54 | 55 | export function EventsEmit(eventName) { 56 | let args = [eventName].slice.call(arguments); 57 | return window.runtime.EventsEmit.apply(null, args); 58 | } 59 | 60 | export function WindowReload() { 61 | window.runtime.WindowReload(); 62 | } 63 | 64 | export function WindowReloadApp() { 65 | window.runtime.WindowReloadApp(); 66 | } 67 | 68 | export function WindowSetAlwaysOnTop(b) { 69 | window.runtime.WindowSetAlwaysOnTop(b); 70 | } 71 | 72 | export function WindowSetSystemDefaultTheme() { 73 | window.runtime.WindowSetSystemDefaultTheme(); 74 | } 75 | 76 | export function WindowSetLightTheme() { 77 | window.runtime.WindowSetLightTheme(); 78 | } 79 | 80 | export function WindowSetDarkTheme() { 81 | window.runtime.WindowSetDarkTheme(); 82 | } 83 | 84 | export function WindowCenter() { 85 | window.runtime.WindowCenter(); 86 | } 87 | 88 | export function WindowSetTitle(title) { 89 | window.runtime.WindowSetTitle(title); 90 | } 91 | 92 | export function WindowFullscreen() { 93 | window.runtime.WindowFullscreen(); 94 | } 95 | 96 | export function WindowUnfullscreen() { 97 | window.runtime.WindowUnfullscreen(); 98 | } 99 | 100 | export function WindowIsFullscreen() { 101 | return window.runtime.WindowIsFullscreen(); 102 | } 103 | 104 | export function WindowGetSize() { 105 | return window.runtime.WindowGetSize(); 106 | } 107 | 108 | export function WindowSetSize(width, height) { 109 | window.runtime.WindowSetSize(width, height); 110 | } 111 | 112 | export function WindowSetMaxSize(width, height) { 113 | window.runtime.WindowSetMaxSize(width, height); 114 | } 115 | 116 | export function WindowSetMinSize(width, height) { 117 | window.runtime.WindowSetMinSize(width, height); 118 | } 119 | 120 | export function WindowSetPosition(x, y) { 121 | window.runtime.WindowSetPosition(x, y); 122 | } 123 | 124 | export function WindowGetPosition() { 125 | return window.runtime.WindowGetPosition(); 126 | } 127 | 128 | export function WindowHide() { 129 | window.runtime.WindowHide(); 130 | } 131 | 132 | export function WindowShow() { 133 | window.runtime.WindowShow(); 134 | } 135 | 136 | export function WindowMaximise() { 137 | window.runtime.WindowMaximise(); 138 | } 139 | 140 | export function WindowToggleMaximise() { 141 | window.runtime.WindowToggleMaximise(); 142 | } 143 | 144 | export function WindowUnmaximise() { 145 | window.runtime.WindowUnmaximise(); 146 | } 147 | 148 | export function WindowIsMaximised() { 149 | return window.runtime.WindowIsMaximised(); 150 | } 151 | 152 | export function WindowMinimise() { 153 | window.runtime.WindowMinimise(); 154 | } 155 | 156 | export function WindowUnminimise() { 157 | window.runtime.WindowUnminimise(); 158 | } 159 | 160 | export function WindowSetBackgroundColour(R, G, B, A) { 161 | window.runtime.WindowSetBackgroundColour(R, G, B, A); 162 | } 163 | 164 | export function ScreenGetAll() { 165 | return window.runtime.ScreenGetAll(); 166 | } 167 | 168 | export function WindowIsMinimised() { 169 | return window.runtime.WindowIsMinimised(); 170 | } 171 | 172 | export function WindowIsNormal() { 173 | return window.runtime.WindowIsNormal(); 174 | } 175 | 176 | export function BrowserOpenURL(url) { 177 | window.runtime.BrowserOpenURL(url); 178 | } 179 | 180 | export function Environment() { 181 | return window.runtime.Environment(); 182 | } 183 | 184 | export function Quit() { 185 | window.runtime.Quit(); 186 | } 187 | 188 | export function Hide() { 189 | window.runtime.Hide(); 190 | } 191 | 192 | export function Show() { 193 | window.runtime.Show(); 194 | } 195 | 196 | export function ClipboardGetText() { 197 | return window.runtime.ClipboardGetText(); 198 | } 199 | 200 | export function ClipboardSetText(text) { 201 | return window.runtime.ClipboardSetText(text); 202 | } 203 | 204 | /** 205 | * Callback for OnFileDrop returns a slice of file path strings when a drop is finished. 206 | * 207 | * @export 208 | * @callback OnFileDropCallback 209 | * @param {number} x - x coordinate of the drop 210 | * @param {number} y - y coordinate of the drop 211 | * @param {string[]} paths - A list of file paths. 212 | */ 213 | 214 | /** 215 | * OnFileDrop listens to drag and drop events and calls the callback with the coordinates of the drop and an array of path strings. 216 | * 217 | * @export 218 | * @param {OnFileDropCallback} callback - Callback for OnFileDrop returns a slice of file path strings when a drop is finished. 219 | * @param {boolean} [useDropTarget=true] - Only call the callback when the drop finished on an element that has the drop target style. (--wails-drop-target) 220 | */ 221 | export function OnFileDrop(callback, useDropTarget) { 222 | return window.runtime.OnFileDrop(callback, useDropTarget); 223 | } 224 | 225 | /** 226 | * OnFileDropOff removes the drag and drop listeners and handlers. 227 | */ 228 | export function OnFileDropOff() { 229 | return window.runtime.OnFileDropOff(); 230 | } 231 | 232 | export function CanResolveFilePaths() { 233 | return window.runtime.CanResolveFilePaths(); 234 | } 235 | 236 | export function ResolveFilePaths(files) { 237 | return window.runtime.ResolveFilePaths(files); 238 | } -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= 2 | github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= 3 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 4 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 5 | github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= 6 | github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= 7 | github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= 8 | github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= 9 | github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= 10 | github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 11 | github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= 12 | github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 13 | github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e h1:Q3+PugElBCf4PFpxhErSzU3/PY5sFL5Z6rfv4AbGAck= 14 | github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs= 15 | github.com/labstack/echo/v4 v4.13.3 h1:pwhpCPrTl5qry5HRdM5FwdXnhXSLSY+WE+YQSeCaafY= 16 | github.com/labstack/echo/v4 v4.13.3/go.mod h1:o90YNEeQWjDozo584l7AwhJMHN0bOC4tAfg+Xox9q5g= 17 | github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= 18 | github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU= 19 | github.com/leaanthony/debme v1.2.1 h1:9Tgwf+kjcrbMQ4WnPcEIUcQuIZYqdWftzZkBr+i/oOc= 20 | github.com/leaanthony/debme v1.2.1/go.mod h1:3V+sCm5tYAgQymvSOfYQ5Xx2JCr+OXiD9Jkw3otUjiA= 21 | github.com/leaanthony/go-ansi-parser v1.6.1 h1:xd8bzARK3dErqkPFtoF9F3/HgN8UQk0ed1YDKpEz01A= 22 | github.com/leaanthony/go-ansi-parser v1.6.1/go.mod h1:+vva/2y4alzVmmIEpk9QDhA7vLC5zKDTRwfZGOp3IWU= 23 | github.com/leaanthony/gosod v1.0.4 h1:YLAbVyd591MRffDgxUOU1NwLhT9T1/YiwjKZpkNFeaI= 24 | github.com/leaanthony/gosod v1.0.4/go.mod h1:GKuIL0zzPj3O1SdWQOdgURSuhkF+Urizzxh26t9f1cw= 25 | github.com/leaanthony/slicer v1.6.0 h1:1RFP5uiPJvT93TAHi+ipd3NACobkW53yUiBqZheE/Js= 26 | github.com/leaanthony/slicer v1.6.0/go.mod h1:o/Iz29g7LN0GqH3aMjWAe90381nyZlDNquK+mtH2Fj8= 27 | github.com/leaanthony/u v1.1.1 h1:TUFjwDGlNX+WuwVEzDqQwC2lOv0P4uhTQw7CMFdiK7M= 28 | github.com/leaanthony/u v1.1.1/go.mod h1:9+o6hejoRljvZ3BzdYlVL0JYCwtnAsVuN9pVTQcaRfI= 29 | github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= 30 | github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ= 31 | github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= 32 | github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= 33 | github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= 34 | github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 35 | github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= 36 | github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 37 | github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= 38 | github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= 39 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 40 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 41 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 42 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 43 | github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= 44 | github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= 45 | github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= 46 | github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc= 47 | github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU= 48 | github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= 49 | github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 50 | github.com/tkrajina/go-reflector v0.5.8 h1:yPADHrwmUbMq4RGEyaOUpz2H90sRsETNVpjzo3DLVQQ= 51 | github.com/tkrajina/go-reflector v0.5.8/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4= 52 | github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= 53 | github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= 54 | github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= 55 | github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= 56 | github.com/wailsapp/go-webview2 v1.0.18 h1:SSSCoLA+MYikSp1U0WmvELF/4c3x5kH8Vi31TKyZ4yk= 57 | github.com/wailsapp/go-webview2 v1.0.18/go.mod h1:qJmWAmAmaniuKGZPWwne+uor3AHMB5PFhqiK0Bbj8kc= 58 | github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs= 59 | github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o= 60 | github.com/wailsapp/wails/v2 v2.9.2 h1:Xb5YRTos1w5N7DTMyYegWaGukCP2fIaX9WF21kPPF2k= 61 | github.com/wailsapp/wails/v2 v2.9.2/go.mod h1:uehvlCwJSFcBq7rMCGfk4rxca67QQGsbg5Nm4m9UnBs= 62 | golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= 63 | golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= 64 | golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 65 | golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= 66 | golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= 67 | golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 68 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 69 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 70 | golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 71 | golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 72 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 73 | golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= 74 | golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 75 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 76 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 77 | golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= 78 | golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= 79 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 80 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 81 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 82 | -------------------------------------------------------------------------------- /frontend/wailsjs/runtime/runtime.d.ts: -------------------------------------------------------------------------------- 1 | /* 2 | _ __ _ __ 3 | | | / /___ _(_) /____ 4 | | | /| / / __ `/ / / ___/ 5 | | |/ |/ / /_/ / / (__ ) 6 | |__/|__/\__,_/_/_/____/ 7 | The electron alternative for Go 8 | (c) Lea Anthony 2019-present 9 | */ 10 | 11 | export interface Position { 12 | x: number; 13 | y: number; 14 | } 15 | 16 | export interface Size { 17 | w: number; 18 | h: number; 19 | } 20 | 21 | export interface Screen { 22 | isCurrent: boolean; 23 | isPrimary: boolean; 24 | width : number 25 | height : number 26 | } 27 | 28 | // Environment information such as platform, buildtype, ... 29 | export interface EnvironmentInfo { 30 | buildType: string; 31 | platform: string; 32 | arch: string; 33 | } 34 | 35 | // [EventsEmit](https://wails.io/docs/reference/runtime/events#eventsemit) 36 | // emits the given event. Optional data may be passed with the event. 37 | // This will trigger any event listeners. 38 | export function EventsEmit(eventName: string, ...data: any): void; 39 | 40 | // [EventsOn](https://wails.io/docs/reference/runtime/events#eventson) sets up a listener for the given event name. 41 | export function EventsOn(eventName: string, callback: (...data: any) => void): () => void; 42 | 43 | // [EventsOnMultiple](https://wails.io/docs/reference/runtime/events#eventsonmultiple) 44 | // sets up a listener for the given event name, but will only trigger a given number times. 45 | export function EventsOnMultiple(eventName: string, callback: (...data: any) => void, maxCallbacks: number): () => void; 46 | 47 | // [EventsOnce](https://wails.io/docs/reference/runtime/events#eventsonce) 48 | // sets up a listener for the given event name, but will only trigger once. 49 | export function EventsOnce(eventName: string, callback: (...data: any) => void): () => void; 50 | 51 | // [EventsOff](https://wails.io/docs/reference/runtime/events#eventsoff) 52 | // unregisters the listener for the given event name. 53 | export function EventsOff(eventName: string, ...additionalEventNames: string[]): void; 54 | 55 | // [EventsOffAll](https://wails.io/docs/reference/runtime/events#eventsoffall) 56 | // unregisters all listeners. 57 | export function EventsOffAll(): void; 58 | 59 | // [LogPrint](https://wails.io/docs/reference/runtime/log#logprint) 60 | // logs the given message as a raw message 61 | export function LogPrint(message: string): void; 62 | 63 | // [LogTrace](https://wails.io/docs/reference/runtime/log#logtrace) 64 | // logs the given message at the `trace` log level. 65 | export function LogTrace(message: string): void; 66 | 67 | // [LogDebug](https://wails.io/docs/reference/runtime/log#logdebug) 68 | // logs the given message at the `debug` log level. 69 | export function LogDebug(message: string): void; 70 | 71 | // [LogError](https://wails.io/docs/reference/runtime/log#logerror) 72 | // logs the given message at the `error` log level. 73 | export function LogError(message: string): void; 74 | 75 | // [LogFatal](https://wails.io/docs/reference/runtime/log#logfatal) 76 | // logs the given message at the `fatal` log level. 77 | // The application will quit after calling this method. 78 | export function LogFatal(message: string): void; 79 | 80 | // [LogInfo](https://wails.io/docs/reference/runtime/log#loginfo) 81 | // logs the given message at the `info` log level. 82 | export function LogInfo(message: string): void; 83 | 84 | // [LogWarning](https://wails.io/docs/reference/runtime/log#logwarning) 85 | // logs the given message at the `warning` log level. 86 | export function LogWarning(message: string): void; 87 | 88 | // [WindowReload](https://wails.io/docs/reference/runtime/window#windowreload) 89 | // Forces a reload by the main application as well as connected browsers. 90 | export function WindowReload(): void; 91 | 92 | // [WindowReloadApp](https://wails.io/docs/reference/runtime/window#windowreloadapp) 93 | // Reloads the application frontend. 94 | export function WindowReloadApp(): void; 95 | 96 | // [WindowSetAlwaysOnTop](https://wails.io/docs/reference/runtime/window#windowsetalwaysontop) 97 | // Sets the window AlwaysOnTop or not on top. 98 | export function WindowSetAlwaysOnTop(b: boolean): void; 99 | 100 | // [WindowSetSystemDefaultTheme](https://wails.io/docs/next/reference/runtime/window#windowsetsystemdefaulttheme) 101 | // *Windows only* 102 | // Sets window theme to system default (dark/light). 103 | export function WindowSetSystemDefaultTheme(): void; 104 | 105 | // [WindowSetLightTheme](https://wails.io/docs/next/reference/runtime/window#windowsetlighttheme) 106 | // *Windows only* 107 | // Sets window to light theme. 108 | export function WindowSetLightTheme(): void; 109 | 110 | // [WindowSetDarkTheme](https://wails.io/docs/next/reference/runtime/window#windowsetdarktheme) 111 | // *Windows only* 112 | // Sets window to dark theme. 113 | export function WindowSetDarkTheme(): void; 114 | 115 | // [WindowCenter](https://wails.io/docs/reference/runtime/window#windowcenter) 116 | // Centers the window on the monitor the window is currently on. 117 | export function WindowCenter(): void; 118 | 119 | // [WindowSetTitle](https://wails.io/docs/reference/runtime/window#windowsettitle) 120 | // Sets the text in the window title bar. 121 | export function WindowSetTitle(title: string): void; 122 | 123 | // [WindowFullscreen](https://wails.io/docs/reference/runtime/window#windowfullscreen) 124 | // Makes the window full screen. 125 | export function WindowFullscreen(): void; 126 | 127 | // [WindowUnfullscreen](https://wails.io/docs/reference/runtime/window#windowunfullscreen) 128 | // Restores the previous window dimensions and position prior to full screen. 129 | export function WindowUnfullscreen(): void; 130 | 131 | // [WindowIsFullscreen](https://wails.io/docs/reference/runtime/window#windowisfullscreen) 132 | // Returns the state of the window, i.e. whether the window is in full screen mode or not. 133 | export function WindowIsFullscreen(): Promise; 134 | 135 | // [WindowSetSize](https://wails.io/docs/reference/runtime/window#windowsetsize) 136 | // Sets the width and height of the window. 137 | export function WindowSetSize(width: number, height: number): Promise; 138 | 139 | // [WindowGetSize](https://wails.io/docs/reference/runtime/window#windowgetsize) 140 | // Gets the width and height of the window. 141 | export function WindowGetSize(): Promise; 142 | 143 | // [WindowSetMaxSize](https://wails.io/docs/reference/runtime/window#windowsetmaxsize) 144 | // Sets the maximum window size. Will resize the window if the window is currently larger than the given dimensions. 145 | // Setting a size of 0,0 will disable this constraint. 146 | export function WindowSetMaxSize(width: number, height: number): void; 147 | 148 | // [WindowSetMinSize](https://wails.io/docs/reference/runtime/window#windowsetminsize) 149 | // Sets the minimum window size. Will resize the window if the window is currently smaller than the given dimensions. 150 | // Setting a size of 0,0 will disable this constraint. 151 | export function WindowSetMinSize(width: number, height: number): void; 152 | 153 | // [WindowSetPosition](https://wails.io/docs/reference/runtime/window#windowsetposition) 154 | // Sets the window position relative to the monitor the window is currently on. 155 | export function WindowSetPosition(x: number, y: number): void; 156 | 157 | // [WindowGetPosition](https://wails.io/docs/reference/runtime/window#windowgetposition) 158 | // Gets the window position relative to the monitor the window is currently on. 159 | export function WindowGetPosition(): Promise; 160 | 161 | // [WindowHide](https://wails.io/docs/reference/runtime/window#windowhide) 162 | // Hides the window. 163 | export function WindowHide(): void; 164 | 165 | // [WindowShow](https://wails.io/docs/reference/runtime/window#windowshow) 166 | // Shows the window, if it is currently hidden. 167 | export function WindowShow(): void; 168 | 169 | // [WindowMaximise](https://wails.io/docs/reference/runtime/window#windowmaximise) 170 | // Maximises the window to fill the screen. 171 | export function WindowMaximise(): void; 172 | 173 | // [WindowToggleMaximise](https://wails.io/docs/reference/runtime/window#windowtogglemaximise) 174 | // Toggles between Maximised and UnMaximised. 175 | export function WindowToggleMaximise(): void; 176 | 177 | // [WindowUnmaximise](https://wails.io/docs/reference/runtime/window#windowunmaximise) 178 | // Restores the window to the dimensions and position prior to maximising. 179 | export function WindowUnmaximise(): void; 180 | 181 | // [WindowIsMaximised](https://wails.io/docs/reference/runtime/window#windowismaximised) 182 | // Returns the state of the window, i.e. whether the window is maximised or not. 183 | export function WindowIsMaximised(): Promise; 184 | 185 | // [WindowMinimise](https://wails.io/docs/reference/runtime/window#windowminimise) 186 | // Minimises the window. 187 | export function WindowMinimise(): void; 188 | 189 | // [WindowUnminimise](https://wails.io/docs/reference/runtime/window#windowunminimise) 190 | // Restores the window to the dimensions and position prior to minimising. 191 | export function WindowUnminimise(): void; 192 | 193 | // [WindowIsMinimised](https://wails.io/docs/reference/runtime/window#windowisminimised) 194 | // Returns the state of the window, i.e. whether the window is minimised or not. 195 | export function WindowIsMinimised(): Promise; 196 | 197 | // [WindowIsNormal](https://wails.io/docs/reference/runtime/window#windowisnormal) 198 | // Returns the state of the window, i.e. whether the window is normal or not. 199 | export function WindowIsNormal(): Promise; 200 | 201 | // [WindowSetBackgroundColour](https://wails.io/docs/reference/runtime/window#windowsetbackgroundcolour) 202 | // Sets the background colour of the window to the given RGBA colour definition. This colour will show through for all transparent pixels. 203 | export function WindowSetBackgroundColour(R: number, G: number, B: number, A: number): void; 204 | 205 | // [ScreenGetAll](https://wails.io/docs/reference/runtime/window#screengetall) 206 | // Gets the all screens. Call this anew each time you want to refresh data from the underlying windowing system. 207 | export function ScreenGetAll(): Promise; 208 | 209 | // [BrowserOpenURL](https://wails.io/docs/reference/runtime/browser#browseropenurl) 210 | // Opens the given URL in the system browser. 211 | export function BrowserOpenURL(url: string): void; 212 | 213 | // [Environment](https://wails.io/docs/reference/runtime/intro#environment) 214 | // Returns information about the environment 215 | export function Environment(): Promise; 216 | 217 | // [Quit](https://wails.io/docs/reference/runtime/intro#quit) 218 | // Quits the application. 219 | export function Quit(): void; 220 | 221 | // [Hide](https://wails.io/docs/reference/runtime/intro#hide) 222 | // Hides the application. 223 | export function Hide(): void; 224 | 225 | // [Show](https://wails.io/docs/reference/runtime/intro#show) 226 | // Shows the application. 227 | export function Show(): void; 228 | 229 | // [ClipboardGetText](https://wails.io/docs/reference/runtime/clipboard#clipboardgettext) 230 | // Returns the current text stored on clipboard 231 | export function ClipboardGetText(): Promise; 232 | 233 | // [ClipboardSetText](https://wails.io/docs/reference/runtime/clipboard#clipboardsettext) 234 | // Sets a text on the clipboard 235 | export function ClipboardSetText(text: string): Promise; 236 | 237 | // [OnFileDrop](https://wails.io/docs/reference/runtime/draganddrop#onfiledrop) 238 | // OnFileDrop listens to drag and drop events and calls the callback with the coordinates of the drop and an array of path strings. 239 | export function OnFileDrop(callback: (x: number, y: number ,paths: string[]) => void, useDropTarget: boolean) :void 240 | 241 | // [OnFileDropOff](https://wails.io/docs/reference/runtime/draganddrop#dragandddropoff) 242 | // OnFileDropOff removes the drag and drop listeners and handlers. 243 | export function OnFileDropOff() :void 244 | 245 | // Check if the file path resolver is available 246 | export function CanResolveFilePaths(): boolean; 247 | 248 | // Resolves file paths for an array of files 249 | export function ResolveFilePaths(files: File[]): void -------------------------------------------------------------------------------- /frontend/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend", 3 | "version": "0.2.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "frontend", 9 | "version": "0.2.0", 10 | "dependencies": { 11 | "svelte-spa-router": "^4.0.1" 12 | }, 13 | "devDependencies": { 14 | "@sveltejs/vite-plugin-svelte": "^5.0.3", 15 | "@tailwindcss/typography": "^0.5.14", 16 | "@tsconfig/svelte": "^5.0.4", 17 | "autoprefixer": "^10.4.20", 18 | "flowbite": "^2.5.2", 19 | "flowbite-svelte": "^0.47.4", 20 | "flowbite-svelte-icons": "^2.0.2", 21 | "svelte": "^5.15.0", 22 | "svelte-check": "^4.1.1", 23 | "tailwindcss": "^3.4.9", 24 | "typescript": "~5.6.2", 25 | "vite": ">=6.0.9" 26 | } 27 | }, 28 | "node_modules/@alloc/quick-lru": { 29 | "version": "5.2.0", 30 | "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", 31 | "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", 32 | "dev": true, 33 | "license": "MIT", 34 | "engines": { 35 | "node": ">=10" 36 | }, 37 | "funding": { 38 | "url": "https://github.com/sponsors/sindresorhus" 39 | } 40 | }, 41 | "node_modules/@ampproject/remapping": { 42 | "version": "2.3.0", 43 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 44 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 45 | "dev": true, 46 | "license": "Apache-2.0", 47 | "dependencies": { 48 | "@jridgewell/gen-mapping": "^0.3.5", 49 | "@jridgewell/trace-mapping": "^0.3.24" 50 | }, 51 | "engines": { 52 | "node": ">=6.0.0" 53 | } 54 | }, 55 | "node_modules/@esbuild/aix-ppc64": { 56 | "version": "0.24.2", 57 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", 58 | "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", 59 | "cpu": [ 60 | "ppc64" 61 | ], 62 | "dev": true, 63 | "license": "MIT", 64 | "optional": true, 65 | "os": [ 66 | "aix" 67 | ], 68 | "engines": { 69 | "node": ">=18" 70 | } 71 | }, 72 | "node_modules/@esbuild/android-arm": { 73 | "version": "0.24.2", 74 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", 75 | "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", 76 | "cpu": [ 77 | "arm" 78 | ], 79 | "dev": true, 80 | "license": "MIT", 81 | "optional": true, 82 | "os": [ 83 | "android" 84 | ], 85 | "engines": { 86 | "node": ">=18" 87 | } 88 | }, 89 | "node_modules/@esbuild/android-arm64": { 90 | "version": "0.24.2", 91 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", 92 | "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", 93 | "cpu": [ 94 | "arm64" 95 | ], 96 | "dev": true, 97 | "license": "MIT", 98 | "optional": true, 99 | "os": [ 100 | "android" 101 | ], 102 | "engines": { 103 | "node": ">=18" 104 | } 105 | }, 106 | "node_modules/@esbuild/android-x64": { 107 | "version": "0.24.2", 108 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", 109 | "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", 110 | "cpu": [ 111 | "x64" 112 | ], 113 | "dev": true, 114 | "license": "MIT", 115 | "optional": true, 116 | "os": [ 117 | "android" 118 | ], 119 | "engines": { 120 | "node": ">=18" 121 | } 122 | }, 123 | "node_modules/@esbuild/darwin-arm64": { 124 | "version": "0.24.2", 125 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", 126 | "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", 127 | "cpu": [ 128 | "arm64" 129 | ], 130 | "dev": true, 131 | "license": "MIT", 132 | "optional": true, 133 | "os": [ 134 | "darwin" 135 | ], 136 | "engines": { 137 | "node": ">=18" 138 | } 139 | }, 140 | "node_modules/@esbuild/darwin-x64": { 141 | "version": "0.24.2", 142 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", 143 | "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", 144 | "cpu": [ 145 | "x64" 146 | ], 147 | "dev": true, 148 | "license": "MIT", 149 | "optional": true, 150 | "os": [ 151 | "darwin" 152 | ], 153 | "engines": { 154 | "node": ">=18" 155 | } 156 | }, 157 | "node_modules/@esbuild/freebsd-arm64": { 158 | "version": "0.24.2", 159 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", 160 | "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", 161 | "cpu": [ 162 | "arm64" 163 | ], 164 | "dev": true, 165 | "license": "MIT", 166 | "optional": true, 167 | "os": [ 168 | "freebsd" 169 | ], 170 | "engines": { 171 | "node": ">=18" 172 | } 173 | }, 174 | "node_modules/@esbuild/freebsd-x64": { 175 | "version": "0.24.2", 176 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", 177 | "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", 178 | "cpu": [ 179 | "x64" 180 | ], 181 | "dev": true, 182 | "license": "MIT", 183 | "optional": true, 184 | "os": [ 185 | "freebsd" 186 | ], 187 | "engines": { 188 | "node": ">=18" 189 | } 190 | }, 191 | "node_modules/@esbuild/linux-arm": { 192 | "version": "0.24.2", 193 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", 194 | "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", 195 | "cpu": [ 196 | "arm" 197 | ], 198 | "dev": true, 199 | "license": "MIT", 200 | "optional": true, 201 | "os": [ 202 | "linux" 203 | ], 204 | "engines": { 205 | "node": ">=18" 206 | } 207 | }, 208 | "node_modules/@esbuild/linux-arm64": { 209 | "version": "0.24.2", 210 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", 211 | "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", 212 | "cpu": [ 213 | "arm64" 214 | ], 215 | "dev": true, 216 | "license": "MIT", 217 | "optional": true, 218 | "os": [ 219 | "linux" 220 | ], 221 | "engines": { 222 | "node": ">=18" 223 | } 224 | }, 225 | "node_modules/@esbuild/linux-ia32": { 226 | "version": "0.24.2", 227 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", 228 | "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", 229 | "cpu": [ 230 | "ia32" 231 | ], 232 | "dev": true, 233 | "license": "MIT", 234 | "optional": true, 235 | "os": [ 236 | "linux" 237 | ], 238 | "engines": { 239 | "node": ">=18" 240 | } 241 | }, 242 | "node_modules/@esbuild/linux-loong64": { 243 | "version": "0.24.2", 244 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", 245 | "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", 246 | "cpu": [ 247 | "loong64" 248 | ], 249 | "dev": true, 250 | "license": "MIT", 251 | "optional": true, 252 | "os": [ 253 | "linux" 254 | ], 255 | "engines": { 256 | "node": ">=18" 257 | } 258 | }, 259 | "node_modules/@esbuild/linux-mips64el": { 260 | "version": "0.24.2", 261 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", 262 | "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", 263 | "cpu": [ 264 | "mips64el" 265 | ], 266 | "dev": true, 267 | "license": "MIT", 268 | "optional": true, 269 | "os": [ 270 | "linux" 271 | ], 272 | "engines": { 273 | "node": ">=18" 274 | } 275 | }, 276 | "node_modules/@esbuild/linux-ppc64": { 277 | "version": "0.24.2", 278 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", 279 | "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", 280 | "cpu": [ 281 | "ppc64" 282 | ], 283 | "dev": true, 284 | "license": "MIT", 285 | "optional": true, 286 | "os": [ 287 | "linux" 288 | ], 289 | "engines": { 290 | "node": ">=18" 291 | } 292 | }, 293 | "node_modules/@esbuild/linux-riscv64": { 294 | "version": "0.24.2", 295 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", 296 | "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", 297 | "cpu": [ 298 | "riscv64" 299 | ], 300 | "dev": true, 301 | "license": "MIT", 302 | "optional": true, 303 | "os": [ 304 | "linux" 305 | ], 306 | "engines": { 307 | "node": ">=18" 308 | } 309 | }, 310 | "node_modules/@esbuild/linux-s390x": { 311 | "version": "0.24.2", 312 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", 313 | "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", 314 | "cpu": [ 315 | "s390x" 316 | ], 317 | "dev": true, 318 | "license": "MIT", 319 | "optional": true, 320 | "os": [ 321 | "linux" 322 | ], 323 | "engines": { 324 | "node": ">=18" 325 | } 326 | }, 327 | "node_modules/@esbuild/linux-x64": { 328 | "version": "0.24.2", 329 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", 330 | "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", 331 | "cpu": [ 332 | "x64" 333 | ], 334 | "dev": true, 335 | "license": "MIT", 336 | "optional": true, 337 | "os": [ 338 | "linux" 339 | ], 340 | "engines": { 341 | "node": ">=18" 342 | } 343 | }, 344 | "node_modules/@esbuild/netbsd-arm64": { 345 | "version": "0.24.2", 346 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", 347 | "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", 348 | "cpu": [ 349 | "arm64" 350 | ], 351 | "dev": true, 352 | "license": "MIT", 353 | "optional": true, 354 | "os": [ 355 | "netbsd" 356 | ], 357 | "engines": { 358 | "node": ">=18" 359 | } 360 | }, 361 | "node_modules/@esbuild/netbsd-x64": { 362 | "version": "0.24.2", 363 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", 364 | "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", 365 | "cpu": [ 366 | "x64" 367 | ], 368 | "dev": true, 369 | "license": "MIT", 370 | "optional": true, 371 | "os": [ 372 | "netbsd" 373 | ], 374 | "engines": { 375 | "node": ">=18" 376 | } 377 | }, 378 | "node_modules/@esbuild/openbsd-arm64": { 379 | "version": "0.24.2", 380 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", 381 | "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", 382 | "cpu": [ 383 | "arm64" 384 | ], 385 | "dev": true, 386 | "license": "MIT", 387 | "optional": true, 388 | "os": [ 389 | "openbsd" 390 | ], 391 | "engines": { 392 | "node": ">=18" 393 | } 394 | }, 395 | "node_modules/@esbuild/openbsd-x64": { 396 | "version": "0.24.2", 397 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", 398 | "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", 399 | "cpu": [ 400 | "x64" 401 | ], 402 | "dev": true, 403 | "license": "MIT", 404 | "optional": true, 405 | "os": [ 406 | "openbsd" 407 | ], 408 | "engines": { 409 | "node": ">=18" 410 | } 411 | }, 412 | "node_modules/@esbuild/sunos-x64": { 413 | "version": "0.24.2", 414 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", 415 | "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", 416 | "cpu": [ 417 | "x64" 418 | ], 419 | "dev": true, 420 | "license": "MIT", 421 | "optional": true, 422 | "os": [ 423 | "sunos" 424 | ], 425 | "engines": { 426 | "node": ">=18" 427 | } 428 | }, 429 | "node_modules/@esbuild/win32-arm64": { 430 | "version": "0.24.2", 431 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", 432 | "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", 433 | "cpu": [ 434 | "arm64" 435 | ], 436 | "dev": true, 437 | "license": "MIT", 438 | "optional": true, 439 | "os": [ 440 | "win32" 441 | ], 442 | "engines": { 443 | "node": ">=18" 444 | } 445 | }, 446 | "node_modules/@esbuild/win32-ia32": { 447 | "version": "0.24.2", 448 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", 449 | "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", 450 | "cpu": [ 451 | "ia32" 452 | ], 453 | "dev": true, 454 | "license": "MIT", 455 | "optional": true, 456 | "os": [ 457 | "win32" 458 | ], 459 | "engines": { 460 | "node": ">=18" 461 | } 462 | }, 463 | "node_modules/@esbuild/win32-x64": { 464 | "version": "0.24.2", 465 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", 466 | "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", 467 | "cpu": [ 468 | "x64" 469 | ], 470 | "dev": true, 471 | "license": "MIT", 472 | "optional": true, 473 | "os": [ 474 | "win32" 475 | ], 476 | "engines": { 477 | "node": ">=18" 478 | } 479 | }, 480 | "node_modules/@floating-ui/core": { 481 | "version": "1.6.8", 482 | "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", 483 | "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", 484 | "dev": true, 485 | "license": "MIT", 486 | "dependencies": { 487 | "@floating-ui/utils": "^0.2.8" 488 | } 489 | }, 490 | "node_modules/@floating-ui/dom": { 491 | "version": "1.6.12", 492 | "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz", 493 | "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==", 494 | "dev": true, 495 | "license": "MIT", 496 | "dependencies": { 497 | "@floating-ui/core": "^1.6.0", 498 | "@floating-ui/utils": "^0.2.8" 499 | } 500 | }, 501 | "node_modules/@floating-ui/utils": { 502 | "version": "0.2.8", 503 | "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", 504 | "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==", 505 | "dev": true, 506 | "license": "MIT" 507 | }, 508 | "node_modules/@isaacs/cliui": { 509 | "version": "8.0.2", 510 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 511 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 512 | "dev": true, 513 | "license": "ISC", 514 | "dependencies": { 515 | "string-width": "^5.1.2", 516 | "string-width-cjs": "npm:string-width@^4.2.0", 517 | "strip-ansi": "^7.0.1", 518 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 519 | "wrap-ansi": "^8.1.0", 520 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 521 | }, 522 | "engines": { 523 | "node": ">=12" 524 | } 525 | }, 526 | "node_modules/@jridgewell/gen-mapping": { 527 | "version": "0.3.8", 528 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", 529 | "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 530 | "dev": true, 531 | "license": "MIT", 532 | "dependencies": { 533 | "@jridgewell/set-array": "^1.2.1", 534 | "@jridgewell/sourcemap-codec": "^1.4.10", 535 | "@jridgewell/trace-mapping": "^0.3.24" 536 | }, 537 | "engines": { 538 | "node": ">=6.0.0" 539 | } 540 | }, 541 | "node_modules/@jridgewell/resolve-uri": { 542 | "version": "3.1.2", 543 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 544 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 545 | "dev": true, 546 | "license": "MIT", 547 | "engines": { 548 | "node": ">=6.0.0" 549 | } 550 | }, 551 | "node_modules/@jridgewell/set-array": { 552 | "version": "1.2.1", 553 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 554 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 555 | "dev": true, 556 | "license": "MIT", 557 | "engines": { 558 | "node": ">=6.0.0" 559 | } 560 | }, 561 | "node_modules/@jridgewell/sourcemap-codec": { 562 | "version": "1.5.0", 563 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 564 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 565 | "dev": true, 566 | "license": "MIT" 567 | }, 568 | "node_modules/@jridgewell/trace-mapping": { 569 | "version": "0.3.25", 570 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 571 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 572 | "dev": true, 573 | "license": "MIT", 574 | "dependencies": { 575 | "@jridgewell/resolve-uri": "^3.1.0", 576 | "@jridgewell/sourcemap-codec": "^1.4.14" 577 | } 578 | }, 579 | "node_modules/@nodelib/fs.scandir": { 580 | "version": "2.1.5", 581 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 582 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 583 | "dev": true, 584 | "license": "MIT", 585 | "dependencies": { 586 | "@nodelib/fs.stat": "2.0.5", 587 | "run-parallel": "^1.1.9" 588 | }, 589 | "engines": { 590 | "node": ">= 8" 591 | } 592 | }, 593 | "node_modules/@nodelib/fs.stat": { 594 | "version": "2.0.5", 595 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 596 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 597 | "dev": true, 598 | "license": "MIT", 599 | "engines": { 600 | "node": ">= 8" 601 | } 602 | }, 603 | "node_modules/@nodelib/fs.walk": { 604 | "version": "1.2.8", 605 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 606 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 607 | "dev": true, 608 | "license": "MIT", 609 | "dependencies": { 610 | "@nodelib/fs.scandir": "2.1.5", 611 | "fastq": "^1.6.0" 612 | }, 613 | "engines": { 614 | "node": ">= 8" 615 | } 616 | }, 617 | "node_modules/@pkgjs/parseargs": { 618 | "version": "0.11.0", 619 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 620 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 621 | "dev": true, 622 | "license": "MIT", 623 | "optional": true, 624 | "engines": { 625 | "node": ">=14" 626 | } 627 | }, 628 | "node_modules/@popperjs/core": { 629 | "version": "2.11.8", 630 | "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", 631 | "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", 632 | "dev": true, 633 | "license": "MIT", 634 | "funding": { 635 | "type": "opencollective", 636 | "url": "https://opencollective.com/popperjs" 637 | } 638 | }, 639 | "node_modules/@rollup/plugin-node-resolve": { 640 | "version": "15.3.1", 641 | "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", 642 | "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", 643 | "dev": true, 644 | "license": "MIT", 645 | "dependencies": { 646 | "@rollup/pluginutils": "^5.0.1", 647 | "@types/resolve": "1.20.2", 648 | "deepmerge": "^4.2.2", 649 | "is-module": "^1.0.0", 650 | "resolve": "^1.22.1" 651 | }, 652 | "engines": { 653 | "node": ">=14.0.0" 654 | }, 655 | "peerDependencies": { 656 | "rollup": "^2.78.0||^3.0.0||^4.0.0" 657 | }, 658 | "peerDependenciesMeta": { 659 | "rollup": { 660 | "optional": true 661 | } 662 | } 663 | }, 664 | "node_modules/@rollup/pluginutils": { 665 | "version": "5.1.4", 666 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", 667 | "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", 668 | "dev": true, 669 | "license": "MIT", 670 | "dependencies": { 671 | "@types/estree": "^1.0.0", 672 | "estree-walker": "^2.0.2", 673 | "picomatch": "^4.0.2" 674 | }, 675 | "engines": { 676 | "node": ">=14.0.0" 677 | }, 678 | "peerDependencies": { 679 | "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" 680 | }, 681 | "peerDependenciesMeta": { 682 | "rollup": { 683 | "optional": true 684 | } 685 | } 686 | }, 687 | "node_modules/@rollup/rollup-android-arm-eabi": { 688 | "version": "4.29.1", 689 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.29.1.tgz", 690 | "integrity": "sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==", 691 | "cpu": [ 692 | "arm" 693 | ], 694 | "dev": true, 695 | "license": "MIT", 696 | "optional": true, 697 | "os": [ 698 | "android" 699 | ] 700 | }, 701 | "node_modules/@rollup/rollup-android-arm64": { 702 | "version": "4.29.1", 703 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.29.1.tgz", 704 | "integrity": "sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==", 705 | "cpu": [ 706 | "arm64" 707 | ], 708 | "dev": true, 709 | "license": "MIT", 710 | "optional": true, 711 | "os": [ 712 | "android" 713 | ] 714 | }, 715 | "node_modules/@rollup/rollup-darwin-arm64": { 716 | "version": "4.29.1", 717 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.29.1.tgz", 718 | "integrity": "sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==", 719 | "cpu": [ 720 | "arm64" 721 | ], 722 | "dev": true, 723 | "license": "MIT", 724 | "optional": true, 725 | "os": [ 726 | "darwin" 727 | ] 728 | }, 729 | "node_modules/@rollup/rollup-darwin-x64": { 730 | "version": "4.29.1", 731 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.29.1.tgz", 732 | "integrity": "sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==", 733 | "cpu": [ 734 | "x64" 735 | ], 736 | "dev": true, 737 | "license": "MIT", 738 | "optional": true, 739 | "os": [ 740 | "darwin" 741 | ] 742 | }, 743 | "node_modules/@rollup/rollup-freebsd-arm64": { 744 | "version": "4.29.1", 745 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.29.1.tgz", 746 | "integrity": "sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==", 747 | "cpu": [ 748 | "arm64" 749 | ], 750 | "dev": true, 751 | "license": "MIT", 752 | "optional": true, 753 | "os": [ 754 | "freebsd" 755 | ] 756 | }, 757 | "node_modules/@rollup/rollup-freebsd-x64": { 758 | "version": "4.29.1", 759 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.29.1.tgz", 760 | "integrity": "sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==", 761 | "cpu": [ 762 | "x64" 763 | ], 764 | "dev": true, 765 | "license": "MIT", 766 | "optional": true, 767 | "os": [ 768 | "freebsd" 769 | ] 770 | }, 771 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 772 | "version": "4.29.1", 773 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.29.1.tgz", 774 | "integrity": "sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==", 775 | "cpu": [ 776 | "arm" 777 | ], 778 | "dev": true, 779 | "license": "MIT", 780 | "optional": true, 781 | "os": [ 782 | "linux" 783 | ] 784 | }, 785 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 786 | "version": "4.29.1", 787 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.29.1.tgz", 788 | "integrity": "sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==", 789 | "cpu": [ 790 | "arm" 791 | ], 792 | "dev": true, 793 | "license": "MIT", 794 | "optional": true, 795 | "os": [ 796 | "linux" 797 | ] 798 | }, 799 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 800 | "version": "4.29.1", 801 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.29.1.tgz", 802 | "integrity": "sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==", 803 | "cpu": [ 804 | "arm64" 805 | ], 806 | "dev": true, 807 | "license": "MIT", 808 | "optional": true, 809 | "os": [ 810 | "linux" 811 | ] 812 | }, 813 | "node_modules/@rollup/rollup-linux-arm64-musl": { 814 | "version": "4.29.1", 815 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.29.1.tgz", 816 | "integrity": "sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==", 817 | "cpu": [ 818 | "arm64" 819 | ], 820 | "dev": true, 821 | "license": "MIT", 822 | "optional": true, 823 | "os": [ 824 | "linux" 825 | ] 826 | }, 827 | "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 828 | "version": "4.29.1", 829 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.29.1.tgz", 830 | "integrity": "sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==", 831 | "cpu": [ 832 | "loong64" 833 | ], 834 | "dev": true, 835 | "license": "MIT", 836 | "optional": true, 837 | "os": [ 838 | "linux" 839 | ] 840 | }, 841 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 842 | "version": "4.29.1", 843 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.29.1.tgz", 844 | "integrity": "sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==", 845 | "cpu": [ 846 | "ppc64" 847 | ], 848 | "dev": true, 849 | "license": "MIT", 850 | "optional": true, 851 | "os": [ 852 | "linux" 853 | ] 854 | }, 855 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 856 | "version": "4.29.1", 857 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.29.1.tgz", 858 | "integrity": "sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==", 859 | "cpu": [ 860 | "riscv64" 861 | ], 862 | "dev": true, 863 | "license": "MIT", 864 | "optional": true, 865 | "os": [ 866 | "linux" 867 | ] 868 | }, 869 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 870 | "version": "4.29.1", 871 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.29.1.tgz", 872 | "integrity": "sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==", 873 | "cpu": [ 874 | "s390x" 875 | ], 876 | "dev": true, 877 | "license": "MIT", 878 | "optional": true, 879 | "os": [ 880 | "linux" 881 | ] 882 | }, 883 | "node_modules/@rollup/rollup-linux-x64-gnu": { 884 | "version": "4.29.1", 885 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.29.1.tgz", 886 | "integrity": "sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==", 887 | "cpu": [ 888 | "x64" 889 | ], 890 | "dev": true, 891 | "license": "MIT", 892 | "optional": true, 893 | "os": [ 894 | "linux" 895 | ] 896 | }, 897 | "node_modules/@rollup/rollup-linux-x64-musl": { 898 | "version": "4.29.1", 899 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.29.1.tgz", 900 | "integrity": "sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==", 901 | "cpu": [ 902 | "x64" 903 | ], 904 | "dev": true, 905 | "license": "MIT", 906 | "optional": true, 907 | "os": [ 908 | "linux" 909 | ] 910 | }, 911 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 912 | "version": "4.29.1", 913 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.29.1.tgz", 914 | "integrity": "sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==", 915 | "cpu": [ 916 | "arm64" 917 | ], 918 | "dev": true, 919 | "license": "MIT", 920 | "optional": true, 921 | "os": [ 922 | "win32" 923 | ] 924 | }, 925 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 926 | "version": "4.29.1", 927 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.29.1.tgz", 928 | "integrity": "sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==", 929 | "cpu": [ 930 | "ia32" 931 | ], 932 | "dev": true, 933 | "license": "MIT", 934 | "optional": true, 935 | "os": [ 936 | "win32" 937 | ] 938 | }, 939 | "node_modules/@rollup/rollup-win32-x64-msvc": { 940 | "version": "4.29.1", 941 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.29.1.tgz", 942 | "integrity": "sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==", 943 | "cpu": [ 944 | "x64" 945 | ], 946 | "dev": true, 947 | "license": "MIT", 948 | "optional": true, 949 | "os": [ 950 | "win32" 951 | ] 952 | }, 953 | "node_modules/@sveltejs/vite-plugin-svelte": { 954 | "version": "5.0.3", 955 | "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.0.3.tgz", 956 | "integrity": "sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==", 957 | "dev": true, 958 | "license": "MIT", 959 | "dependencies": { 960 | "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", 961 | "debug": "^4.4.0", 962 | "deepmerge": "^4.3.1", 963 | "kleur": "^4.1.5", 964 | "magic-string": "^0.30.15", 965 | "vitefu": "^1.0.4" 966 | }, 967 | "engines": { 968 | "node": "^18.0.0 || ^20.0.0 || >=22" 969 | }, 970 | "peerDependencies": { 971 | "svelte": "^5.0.0", 972 | "vite": "^6.0.0" 973 | } 974 | }, 975 | "node_modules/@sveltejs/vite-plugin-svelte-inspector": { 976 | "version": "4.0.1", 977 | "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-4.0.1.tgz", 978 | "integrity": "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==", 979 | "dev": true, 980 | "license": "MIT", 981 | "dependencies": { 982 | "debug": "^4.3.7" 983 | }, 984 | "engines": { 985 | "node": "^18.0.0 || ^20.0.0 || >=22" 986 | }, 987 | "peerDependencies": { 988 | "@sveltejs/vite-plugin-svelte": "^5.0.0", 989 | "svelte": "^5.0.0", 990 | "vite": "^6.0.0" 991 | } 992 | }, 993 | "node_modules/@tailwindcss/typography": { 994 | "version": "0.5.15", 995 | "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.15.tgz", 996 | "integrity": "sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==", 997 | "dev": true, 998 | "license": "MIT", 999 | "dependencies": { 1000 | "lodash.castarray": "^4.4.0", 1001 | "lodash.isplainobject": "^4.0.6", 1002 | "lodash.merge": "^4.6.2", 1003 | "postcss-selector-parser": "6.0.10" 1004 | }, 1005 | "peerDependencies": { 1006 | "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20" 1007 | } 1008 | }, 1009 | "node_modules/@tsconfig/svelte": { 1010 | "version": "5.0.4", 1011 | "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.4.tgz", 1012 | "integrity": "sha512-BV9NplVgLmSi4mwKzD8BD/NQ8erOY/nUE/GpgWe2ckx+wIQF5RyRirn/QsSSCPeulVpc3RA/iJt6DpfTIZps0Q==", 1013 | "dev": true, 1014 | "license": "MIT" 1015 | }, 1016 | "node_modules/@types/estree": { 1017 | "version": "1.0.6", 1018 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 1019 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 1020 | "dev": true, 1021 | "license": "MIT" 1022 | }, 1023 | "node_modules/@types/resolve": { 1024 | "version": "1.20.2", 1025 | "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", 1026 | "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", 1027 | "dev": true, 1028 | "license": "MIT" 1029 | }, 1030 | "node_modules/@yr/monotone-cubic-spline": { 1031 | "version": "1.0.3", 1032 | "resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz", 1033 | "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==", 1034 | "dev": true, 1035 | "license": "MIT" 1036 | }, 1037 | "node_modules/acorn": { 1038 | "version": "8.14.0", 1039 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 1040 | "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 1041 | "dev": true, 1042 | "license": "MIT", 1043 | "bin": { 1044 | "acorn": "bin/acorn" 1045 | }, 1046 | "engines": { 1047 | "node": ">=0.4.0" 1048 | } 1049 | }, 1050 | "node_modules/acorn-typescript": { 1051 | "version": "1.4.13", 1052 | "resolved": "https://registry.npmjs.org/acorn-typescript/-/acorn-typescript-1.4.13.tgz", 1053 | "integrity": "sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==", 1054 | "dev": true, 1055 | "license": "MIT", 1056 | "peerDependencies": { 1057 | "acorn": ">=8.9.0" 1058 | } 1059 | }, 1060 | "node_modules/ansi-regex": { 1061 | "version": "6.1.0", 1062 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 1063 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 1064 | "dev": true, 1065 | "license": "MIT", 1066 | "engines": { 1067 | "node": ">=12" 1068 | }, 1069 | "funding": { 1070 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 1071 | } 1072 | }, 1073 | "node_modules/ansi-styles": { 1074 | "version": "6.2.1", 1075 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 1076 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 1077 | "dev": true, 1078 | "license": "MIT", 1079 | "engines": { 1080 | "node": ">=12" 1081 | }, 1082 | "funding": { 1083 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1084 | } 1085 | }, 1086 | "node_modules/any-promise": { 1087 | "version": "1.3.0", 1088 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 1089 | "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", 1090 | "dev": true, 1091 | "license": "MIT" 1092 | }, 1093 | "node_modules/anymatch": { 1094 | "version": "3.1.3", 1095 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 1096 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 1097 | "dev": true, 1098 | "license": "ISC", 1099 | "dependencies": { 1100 | "normalize-path": "^3.0.0", 1101 | "picomatch": "^2.0.4" 1102 | }, 1103 | "engines": { 1104 | "node": ">= 8" 1105 | } 1106 | }, 1107 | "node_modules/anymatch/node_modules/picomatch": { 1108 | "version": "2.3.1", 1109 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1110 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1111 | "dev": true, 1112 | "license": "MIT", 1113 | "engines": { 1114 | "node": ">=8.6" 1115 | }, 1116 | "funding": { 1117 | "url": "https://github.com/sponsors/jonschlinkert" 1118 | } 1119 | }, 1120 | "node_modules/apexcharts": { 1121 | "version": "3.54.1", 1122 | "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.54.1.tgz", 1123 | "integrity": "sha512-E4et0h/J1U3r3EwS/WlqJCQIbepKbp6wGUmaAwJOMjHUP4Ci0gxanLa7FR3okx6p9coi4st6J853/Cb1NP0vpA==", 1124 | "dev": true, 1125 | "license": "MIT", 1126 | "dependencies": { 1127 | "@yr/monotone-cubic-spline": "^1.0.3", 1128 | "svg.draggable.js": "^2.2.2", 1129 | "svg.easing.js": "^2.0.0", 1130 | "svg.filter.js": "^2.0.2", 1131 | "svg.pathmorphing.js": "^0.1.3", 1132 | "svg.resize.js": "^1.4.3", 1133 | "svg.select.js": "^3.0.1" 1134 | } 1135 | }, 1136 | "node_modules/arg": { 1137 | "version": "5.0.2", 1138 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", 1139 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", 1140 | "dev": true, 1141 | "license": "MIT" 1142 | }, 1143 | "node_modules/aria-query": { 1144 | "version": "5.3.2", 1145 | "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", 1146 | "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", 1147 | "dev": true, 1148 | "license": "Apache-2.0", 1149 | "engines": { 1150 | "node": ">= 0.4" 1151 | } 1152 | }, 1153 | "node_modules/autoprefixer": { 1154 | "version": "10.4.20", 1155 | "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", 1156 | "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", 1157 | "dev": true, 1158 | "funding": [ 1159 | { 1160 | "type": "opencollective", 1161 | "url": "https://opencollective.com/postcss/" 1162 | }, 1163 | { 1164 | "type": "tidelift", 1165 | "url": "https://tidelift.com/funding/github/npm/autoprefixer" 1166 | }, 1167 | { 1168 | "type": "github", 1169 | "url": "https://github.com/sponsors/ai" 1170 | } 1171 | ], 1172 | "license": "MIT", 1173 | "dependencies": { 1174 | "browserslist": "^4.23.3", 1175 | "caniuse-lite": "^1.0.30001646", 1176 | "fraction.js": "^4.3.7", 1177 | "normalize-range": "^0.1.2", 1178 | "picocolors": "^1.0.1", 1179 | "postcss-value-parser": "^4.2.0" 1180 | }, 1181 | "bin": { 1182 | "autoprefixer": "bin/autoprefixer" 1183 | }, 1184 | "engines": { 1185 | "node": "^10 || ^12 || >=14" 1186 | }, 1187 | "peerDependencies": { 1188 | "postcss": "^8.1.0" 1189 | } 1190 | }, 1191 | "node_modules/axobject-query": { 1192 | "version": "4.1.0", 1193 | "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", 1194 | "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", 1195 | "dev": true, 1196 | "license": "Apache-2.0", 1197 | "engines": { 1198 | "node": ">= 0.4" 1199 | } 1200 | }, 1201 | "node_modules/balanced-match": { 1202 | "version": "1.0.2", 1203 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1204 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1205 | "dev": true, 1206 | "license": "MIT" 1207 | }, 1208 | "node_modules/binary-extensions": { 1209 | "version": "2.3.0", 1210 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 1211 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 1212 | "dev": true, 1213 | "license": "MIT", 1214 | "engines": { 1215 | "node": ">=8" 1216 | }, 1217 | "funding": { 1218 | "url": "https://github.com/sponsors/sindresorhus" 1219 | } 1220 | }, 1221 | "node_modules/brace-expansion": { 1222 | "version": "2.0.1", 1223 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1224 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1225 | "dev": true, 1226 | "license": "MIT", 1227 | "dependencies": { 1228 | "balanced-match": "^1.0.0" 1229 | } 1230 | }, 1231 | "node_modules/braces": { 1232 | "version": "3.0.3", 1233 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 1234 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 1235 | "dev": true, 1236 | "license": "MIT", 1237 | "dependencies": { 1238 | "fill-range": "^7.1.1" 1239 | }, 1240 | "engines": { 1241 | "node": ">=8" 1242 | } 1243 | }, 1244 | "node_modules/browserslist": { 1245 | "version": "4.24.3", 1246 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", 1247 | "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", 1248 | "dev": true, 1249 | "funding": [ 1250 | { 1251 | "type": "opencollective", 1252 | "url": "https://opencollective.com/browserslist" 1253 | }, 1254 | { 1255 | "type": "tidelift", 1256 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1257 | }, 1258 | { 1259 | "type": "github", 1260 | "url": "https://github.com/sponsors/ai" 1261 | } 1262 | ], 1263 | "license": "MIT", 1264 | "dependencies": { 1265 | "caniuse-lite": "^1.0.30001688", 1266 | "electron-to-chromium": "^1.5.73", 1267 | "node-releases": "^2.0.19", 1268 | "update-browserslist-db": "^1.1.1" 1269 | }, 1270 | "bin": { 1271 | "browserslist": "cli.js" 1272 | }, 1273 | "engines": { 1274 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 1275 | } 1276 | }, 1277 | "node_modules/camelcase-css": { 1278 | "version": "2.0.1", 1279 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 1280 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 1281 | "dev": true, 1282 | "license": "MIT", 1283 | "engines": { 1284 | "node": ">= 6" 1285 | } 1286 | }, 1287 | "node_modules/caniuse-lite": { 1288 | "version": "1.0.30001690", 1289 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", 1290 | "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", 1291 | "dev": true, 1292 | "funding": [ 1293 | { 1294 | "type": "opencollective", 1295 | "url": "https://opencollective.com/browserslist" 1296 | }, 1297 | { 1298 | "type": "tidelift", 1299 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 1300 | }, 1301 | { 1302 | "type": "github", 1303 | "url": "https://github.com/sponsors/ai" 1304 | } 1305 | ], 1306 | "license": "CC-BY-4.0" 1307 | }, 1308 | "node_modules/chokidar": { 1309 | "version": "4.0.3", 1310 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", 1311 | "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", 1312 | "dev": true, 1313 | "license": "MIT", 1314 | "dependencies": { 1315 | "readdirp": "^4.0.1" 1316 | }, 1317 | "engines": { 1318 | "node": ">= 14.16.0" 1319 | }, 1320 | "funding": { 1321 | "url": "https://paulmillr.com/funding/" 1322 | } 1323 | }, 1324 | "node_modules/clsx": { 1325 | "version": "2.1.1", 1326 | "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", 1327 | "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", 1328 | "dev": true, 1329 | "license": "MIT", 1330 | "engines": { 1331 | "node": ">=6" 1332 | } 1333 | }, 1334 | "node_modules/color-convert": { 1335 | "version": "2.0.1", 1336 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1337 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1338 | "dev": true, 1339 | "license": "MIT", 1340 | "dependencies": { 1341 | "color-name": "~1.1.4" 1342 | }, 1343 | "engines": { 1344 | "node": ">=7.0.0" 1345 | } 1346 | }, 1347 | "node_modules/color-name": { 1348 | "version": "1.1.4", 1349 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1350 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1351 | "dev": true, 1352 | "license": "MIT" 1353 | }, 1354 | "node_modules/commander": { 1355 | "version": "4.1.1", 1356 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", 1357 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", 1358 | "dev": true, 1359 | "license": "MIT", 1360 | "engines": { 1361 | "node": ">= 6" 1362 | } 1363 | }, 1364 | "node_modules/cross-spawn": { 1365 | "version": "7.0.6", 1366 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 1367 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 1368 | "dev": true, 1369 | "license": "MIT", 1370 | "dependencies": { 1371 | "path-key": "^3.1.0", 1372 | "shebang-command": "^2.0.0", 1373 | "which": "^2.0.1" 1374 | }, 1375 | "engines": { 1376 | "node": ">= 8" 1377 | } 1378 | }, 1379 | "node_modules/cssesc": { 1380 | "version": "3.0.0", 1381 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 1382 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 1383 | "dev": true, 1384 | "license": "MIT", 1385 | "bin": { 1386 | "cssesc": "bin/cssesc" 1387 | }, 1388 | "engines": { 1389 | "node": ">=4" 1390 | } 1391 | }, 1392 | "node_modules/debug": { 1393 | "version": "4.4.0", 1394 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 1395 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 1396 | "dev": true, 1397 | "license": "MIT", 1398 | "dependencies": { 1399 | "ms": "^2.1.3" 1400 | }, 1401 | "engines": { 1402 | "node": ">=6.0" 1403 | }, 1404 | "peerDependenciesMeta": { 1405 | "supports-color": { 1406 | "optional": true 1407 | } 1408 | } 1409 | }, 1410 | "node_modules/deepmerge": { 1411 | "version": "4.3.1", 1412 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 1413 | "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 1414 | "dev": true, 1415 | "license": "MIT", 1416 | "engines": { 1417 | "node": ">=0.10.0" 1418 | } 1419 | }, 1420 | "node_modules/didyoumean": { 1421 | "version": "1.2.2", 1422 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 1423 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", 1424 | "dev": true, 1425 | "license": "Apache-2.0" 1426 | }, 1427 | "node_modules/dlv": { 1428 | "version": "1.1.3", 1429 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 1430 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 1431 | "dev": true, 1432 | "license": "MIT" 1433 | }, 1434 | "node_modules/eastasianwidth": { 1435 | "version": "0.2.0", 1436 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 1437 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 1438 | "dev": true, 1439 | "license": "MIT" 1440 | }, 1441 | "node_modules/electron-to-chromium": { 1442 | "version": "1.5.76", 1443 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz", 1444 | "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==", 1445 | "dev": true, 1446 | "license": "ISC" 1447 | }, 1448 | "node_modules/emoji-regex": { 1449 | "version": "9.2.2", 1450 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 1451 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 1452 | "dev": true, 1453 | "license": "MIT" 1454 | }, 1455 | "node_modules/esbuild": { 1456 | "version": "0.24.2", 1457 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", 1458 | "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", 1459 | "dev": true, 1460 | "hasInstallScript": true, 1461 | "license": "MIT", 1462 | "bin": { 1463 | "esbuild": "bin/esbuild" 1464 | }, 1465 | "engines": { 1466 | "node": ">=18" 1467 | }, 1468 | "optionalDependencies": { 1469 | "@esbuild/aix-ppc64": "0.24.2", 1470 | "@esbuild/android-arm": "0.24.2", 1471 | "@esbuild/android-arm64": "0.24.2", 1472 | "@esbuild/android-x64": "0.24.2", 1473 | "@esbuild/darwin-arm64": "0.24.2", 1474 | "@esbuild/darwin-x64": "0.24.2", 1475 | "@esbuild/freebsd-arm64": "0.24.2", 1476 | "@esbuild/freebsd-x64": "0.24.2", 1477 | "@esbuild/linux-arm": "0.24.2", 1478 | "@esbuild/linux-arm64": "0.24.2", 1479 | "@esbuild/linux-ia32": "0.24.2", 1480 | "@esbuild/linux-loong64": "0.24.2", 1481 | "@esbuild/linux-mips64el": "0.24.2", 1482 | "@esbuild/linux-ppc64": "0.24.2", 1483 | "@esbuild/linux-riscv64": "0.24.2", 1484 | "@esbuild/linux-s390x": "0.24.2", 1485 | "@esbuild/linux-x64": "0.24.2", 1486 | "@esbuild/netbsd-arm64": "0.24.2", 1487 | "@esbuild/netbsd-x64": "0.24.2", 1488 | "@esbuild/openbsd-arm64": "0.24.2", 1489 | "@esbuild/openbsd-x64": "0.24.2", 1490 | "@esbuild/sunos-x64": "0.24.2", 1491 | "@esbuild/win32-arm64": "0.24.2", 1492 | "@esbuild/win32-ia32": "0.24.2", 1493 | "@esbuild/win32-x64": "0.24.2" 1494 | } 1495 | }, 1496 | "node_modules/escalade": { 1497 | "version": "3.2.0", 1498 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 1499 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 1500 | "dev": true, 1501 | "license": "MIT", 1502 | "engines": { 1503 | "node": ">=6" 1504 | } 1505 | }, 1506 | "node_modules/esm-env": { 1507 | "version": "1.2.1", 1508 | "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.1.tgz", 1509 | "integrity": "sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng==", 1510 | "dev": true, 1511 | "license": "MIT" 1512 | }, 1513 | "node_modules/esrap": { 1514 | "version": "1.3.2", 1515 | "resolved": "https://registry.npmjs.org/esrap/-/esrap-1.3.2.tgz", 1516 | "integrity": "sha512-C4PXusxYhFT98GjLSmb20k9PREuUdporer50dhzGuJu9IJXktbMddVCMLAERl5dAHyAi73GWWCE4FVHGP1794g==", 1517 | "dev": true, 1518 | "license": "MIT", 1519 | "dependencies": { 1520 | "@jridgewell/sourcemap-codec": "^1.4.15" 1521 | } 1522 | }, 1523 | "node_modules/estree-walker": { 1524 | "version": "2.0.2", 1525 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 1526 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 1527 | "dev": true, 1528 | "license": "MIT" 1529 | }, 1530 | "node_modules/fast-glob": { 1531 | "version": "3.3.2", 1532 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", 1533 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 1534 | "dev": true, 1535 | "license": "MIT", 1536 | "dependencies": { 1537 | "@nodelib/fs.stat": "^2.0.2", 1538 | "@nodelib/fs.walk": "^1.2.3", 1539 | "glob-parent": "^5.1.2", 1540 | "merge2": "^1.3.0", 1541 | "micromatch": "^4.0.4" 1542 | }, 1543 | "engines": { 1544 | "node": ">=8.6.0" 1545 | } 1546 | }, 1547 | "node_modules/fast-glob/node_modules/glob-parent": { 1548 | "version": "5.1.2", 1549 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1550 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1551 | "dev": true, 1552 | "license": "ISC", 1553 | "dependencies": { 1554 | "is-glob": "^4.0.1" 1555 | }, 1556 | "engines": { 1557 | "node": ">= 6" 1558 | } 1559 | }, 1560 | "node_modules/fastq": { 1561 | "version": "1.18.0", 1562 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", 1563 | "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", 1564 | "dev": true, 1565 | "license": "ISC", 1566 | "dependencies": { 1567 | "reusify": "^1.0.4" 1568 | } 1569 | }, 1570 | "node_modules/fdir": { 1571 | "version": "6.4.2", 1572 | "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", 1573 | "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", 1574 | "dev": true, 1575 | "license": "MIT", 1576 | "peerDependencies": { 1577 | "picomatch": "^3 || ^4" 1578 | }, 1579 | "peerDependenciesMeta": { 1580 | "picomatch": { 1581 | "optional": true 1582 | } 1583 | } 1584 | }, 1585 | "node_modules/fill-range": { 1586 | "version": "7.1.1", 1587 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 1588 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 1589 | "dev": true, 1590 | "license": "MIT", 1591 | "dependencies": { 1592 | "to-regex-range": "^5.0.1" 1593 | }, 1594 | "engines": { 1595 | "node": ">=8" 1596 | } 1597 | }, 1598 | "node_modules/flowbite": { 1599 | "version": "2.5.2", 1600 | "resolved": "https://registry.npmjs.org/flowbite/-/flowbite-2.5.2.tgz", 1601 | "integrity": "sha512-kwFD3n8/YW4EG8GlY3Od9IoKND97kitO+/ejISHSqpn3vw2i5K/+ZI8Jm2V+KC4fGdnfi0XZ+TzYqQb4Q1LshA==", 1602 | "dev": true, 1603 | "license": "MIT", 1604 | "dependencies": { 1605 | "@popperjs/core": "^2.9.3", 1606 | "flowbite-datepicker": "^1.3.0", 1607 | "mini-svg-data-uri": "^1.4.3" 1608 | } 1609 | }, 1610 | "node_modules/flowbite-datepicker": { 1611 | "version": "1.3.1", 1612 | "resolved": "https://registry.npmjs.org/flowbite-datepicker/-/flowbite-datepicker-1.3.1.tgz", 1613 | "integrity": "sha512-FM8EZE0Vc/nhEr+FcvJQldkIeS3hGhDQY5hoTWvqSrnlAqNd1JJhSj9bNiq6xpIXLqewWiTONiRVMUcUcSSiQA==", 1614 | "dev": true, 1615 | "license": "MIT", 1616 | "dependencies": { 1617 | "@rollup/plugin-node-resolve": "^15.2.3", 1618 | "flowbite": "^2.0.0" 1619 | } 1620 | }, 1621 | "node_modules/flowbite-svelte": { 1622 | "version": "0.47.4", 1623 | "resolved": "https://registry.npmjs.org/flowbite-svelte/-/flowbite-svelte-0.47.4.tgz", 1624 | "integrity": "sha512-8oiY/oeWA7fgkDF91MZKEBo5VmjL8El3wuqTDWAFO1j7p45BHIL6G1VGnnidgCEYlbADDQN9BIGCvyPq4J3g+w==", 1625 | "dev": true, 1626 | "license": "MIT", 1627 | "dependencies": { 1628 | "@floating-ui/dom": "^1.6.11", 1629 | "apexcharts": "^3.54.1", 1630 | "flowbite": "^2.5.2", 1631 | "tailwind-merge": "^2.5.4" 1632 | }, 1633 | "peerDependencies": { 1634 | "svelte": "^3.55.1 || ^4.0.0 || ^5.0.0" 1635 | } 1636 | }, 1637 | "node_modules/flowbite-svelte-icons": { 1638 | "version": "2.0.2", 1639 | "resolved": "https://registry.npmjs.org/flowbite-svelte-icons/-/flowbite-svelte-icons-2.0.2.tgz", 1640 | "integrity": "sha512-Vkmduy2867Rk8R7TziPirsWkixJnToFBEXRaN4ouJabOx62NQjiBbHFe+HTaMOQmdp4FNMI2Nhtk2I2CQ8r3RQ==", 1641 | "dev": true, 1642 | "license": "MIT", 1643 | "dependencies": { 1644 | "tailwind-merge": "^2.5.4", 1645 | "tailwindcss": "^3.4.14" 1646 | }, 1647 | "engines": { 1648 | "node": ">=18.0.0", 1649 | "npm": ">=7.0.0" 1650 | }, 1651 | "peerDependencies": { 1652 | "svelte": "^5.0.0", 1653 | "tailwind-merge": "^2.3.0", 1654 | "tailwindcss": "^3.4.3" 1655 | } 1656 | }, 1657 | "node_modules/foreground-child": { 1658 | "version": "3.3.0", 1659 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", 1660 | "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", 1661 | "dev": true, 1662 | "license": "ISC", 1663 | "dependencies": { 1664 | "cross-spawn": "^7.0.0", 1665 | "signal-exit": "^4.0.1" 1666 | }, 1667 | "engines": { 1668 | "node": ">=14" 1669 | }, 1670 | "funding": { 1671 | "url": "https://github.com/sponsors/isaacs" 1672 | } 1673 | }, 1674 | "node_modules/fraction.js": { 1675 | "version": "4.3.7", 1676 | "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", 1677 | "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", 1678 | "dev": true, 1679 | "license": "MIT", 1680 | "engines": { 1681 | "node": "*" 1682 | }, 1683 | "funding": { 1684 | "type": "patreon", 1685 | "url": "https://github.com/sponsors/rawify" 1686 | } 1687 | }, 1688 | "node_modules/fsevents": { 1689 | "version": "2.3.3", 1690 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1691 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1692 | "dev": true, 1693 | "hasInstallScript": true, 1694 | "license": "MIT", 1695 | "optional": true, 1696 | "os": [ 1697 | "darwin" 1698 | ], 1699 | "engines": { 1700 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1701 | } 1702 | }, 1703 | "node_modules/function-bind": { 1704 | "version": "1.1.2", 1705 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1706 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1707 | "dev": true, 1708 | "license": "MIT", 1709 | "funding": { 1710 | "url": "https://github.com/sponsors/ljharb" 1711 | } 1712 | }, 1713 | "node_modules/glob": { 1714 | "version": "10.4.5", 1715 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", 1716 | "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", 1717 | "dev": true, 1718 | "license": "ISC", 1719 | "dependencies": { 1720 | "foreground-child": "^3.1.0", 1721 | "jackspeak": "^3.1.2", 1722 | "minimatch": "^9.0.4", 1723 | "minipass": "^7.1.2", 1724 | "package-json-from-dist": "^1.0.0", 1725 | "path-scurry": "^1.11.1" 1726 | }, 1727 | "bin": { 1728 | "glob": "dist/esm/bin.mjs" 1729 | }, 1730 | "funding": { 1731 | "url": "https://github.com/sponsors/isaacs" 1732 | } 1733 | }, 1734 | "node_modules/glob-parent": { 1735 | "version": "6.0.2", 1736 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1737 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1738 | "dev": true, 1739 | "license": "ISC", 1740 | "dependencies": { 1741 | "is-glob": "^4.0.3" 1742 | }, 1743 | "engines": { 1744 | "node": ">=10.13.0" 1745 | } 1746 | }, 1747 | "node_modules/hasown": { 1748 | "version": "2.0.2", 1749 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 1750 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 1751 | "dev": true, 1752 | "license": "MIT", 1753 | "dependencies": { 1754 | "function-bind": "^1.1.2" 1755 | }, 1756 | "engines": { 1757 | "node": ">= 0.4" 1758 | } 1759 | }, 1760 | "node_modules/is-binary-path": { 1761 | "version": "2.1.0", 1762 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1763 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1764 | "dev": true, 1765 | "license": "MIT", 1766 | "dependencies": { 1767 | "binary-extensions": "^2.0.0" 1768 | }, 1769 | "engines": { 1770 | "node": ">=8" 1771 | } 1772 | }, 1773 | "node_modules/is-core-module": { 1774 | "version": "2.16.1", 1775 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", 1776 | "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", 1777 | "dev": true, 1778 | "license": "MIT", 1779 | "dependencies": { 1780 | "hasown": "^2.0.2" 1781 | }, 1782 | "engines": { 1783 | "node": ">= 0.4" 1784 | }, 1785 | "funding": { 1786 | "url": "https://github.com/sponsors/ljharb" 1787 | } 1788 | }, 1789 | "node_modules/is-extglob": { 1790 | "version": "2.1.1", 1791 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1792 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1793 | "dev": true, 1794 | "license": "MIT", 1795 | "engines": { 1796 | "node": ">=0.10.0" 1797 | } 1798 | }, 1799 | "node_modules/is-fullwidth-code-point": { 1800 | "version": "3.0.0", 1801 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1802 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1803 | "dev": true, 1804 | "license": "MIT", 1805 | "engines": { 1806 | "node": ">=8" 1807 | } 1808 | }, 1809 | "node_modules/is-glob": { 1810 | "version": "4.0.3", 1811 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1812 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1813 | "dev": true, 1814 | "license": "MIT", 1815 | "dependencies": { 1816 | "is-extglob": "^2.1.1" 1817 | }, 1818 | "engines": { 1819 | "node": ">=0.10.0" 1820 | } 1821 | }, 1822 | "node_modules/is-module": { 1823 | "version": "1.0.0", 1824 | "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", 1825 | "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", 1826 | "dev": true, 1827 | "license": "MIT" 1828 | }, 1829 | "node_modules/is-number": { 1830 | "version": "7.0.0", 1831 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1832 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1833 | "dev": true, 1834 | "license": "MIT", 1835 | "engines": { 1836 | "node": ">=0.12.0" 1837 | } 1838 | }, 1839 | "node_modules/is-reference": { 1840 | "version": "3.0.3", 1841 | "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", 1842 | "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", 1843 | "dev": true, 1844 | "license": "MIT", 1845 | "dependencies": { 1846 | "@types/estree": "^1.0.6" 1847 | } 1848 | }, 1849 | "node_modules/isexe": { 1850 | "version": "2.0.0", 1851 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1852 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1853 | "dev": true, 1854 | "license": "ISC" 1855 | }, 1856 | "node_modules/jackspeak": { 1857 | "version": "3.4.3", 1858 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 1859 | "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 1860 | "dev": true, 1861 | "license": "BlueOak-1.0.0", 1862 | "dependencies": { 1863 | "@isaacs/cliui": "^8.0.2" 1864 | }, 1865 | "funding": { 1866 | "url": "https://github.com/sponsors/isaacs" 1867 | }, 1868 | "optionalDependencies": { 1869 | "@pkgjs/parseargs": "^0.11.0" 1870 | } 1871 | }, 1872 | "node_modules/jiti": { 1873 | "version": "1.21.7", 1874 | "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", 1875 | "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", 1876 | "dev": true, 1877 | "license": "MIT", 1878 | "bin": { 1879 | "jiti": "bin/jiti.js" 1880 | } 1881 | }, 1882 | "node_modules/kleur": { 1883 | "version": "4.1.5", 1884 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", 1885 | "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", 1886 | "dev": true, 1887 | "license": "MIT", 1888 | "engines": { 1889 | "node": ">=6" 1890 | } 1891 | }, 1892 | "node_modules/lilconfig": { 1893 | "version": "3.1.3", 1894 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", 1895 | "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", 1896 | "dev": true, 1897 | "license": "MIT", 1898 | "engines": { 1899 | "node": ">=14" 1900 | }, 1901 | "funding": { 1902 | "url": "https://github.com/sponsors/antonk52" 1903 | } 1904 | }, 1905 | "node_modules/lines-and-columns": { 1906 | "version": "1.2.4", 1907 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 1908 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 1909 | "dev": true, 1910 | "license": "MIT" 1911 | }, 1912 | "node_modules/locate-character": { 1913 | "version": "3.0.0", 1914 | "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", 1915 | "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", 1916 | "dev": true, 1917 | "license": "MIT" 1918 | }, 1919 | "node_modules/lodash.castarray": { 1920 | "version": "4.4.0", 1921 | "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", 1922 | "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", 1923 | "dev": true, 1924 | "license": "MIT" 1925 | }, 1926 | "node_modules/lodash.isplainobject": { 1927 | "version": "4.0.6", 1928 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 1929 | "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", 1930 | "dev": true, 1931 | "license": "MIT" 1932 | }, 1933 | "node_modules/lodash.merge": { 1934 | "version": "4.6.2", 1935 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1936 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1937 | "dev": true, 1938 | "license": "MIT" 1939 | }, 1940 | "node_modules/lru-cache": { 1941 | "version": "10.4.3", 1942 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 1943 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 1944 | "dev": true, 1945 | "license": "ISC" 1946 | }, 1947 | "node_modules/magic-string": { 1948 | "version": "0.30.17", 1949 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", 1950 | "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", 1951 | "dev": true, 1952 | "license": "MIT", 1953 | "dependencies": { 1954 | "@jridgewell/sourcemap-codec": "^1.5.0" 1955 | } 1956 | }, 1957 | "node_modules/merge2": { 1958 | "version": "1.4.1", 1959 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1960 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1961 | "dev": true, 1962 | "license": "MIT", 1963 | "engines": { 1964 | "node": ">= 8" 1965 | } 1966 | }, 1967 | "node_modules/micromatch": { 1968 | "version": "4.0.8", 1969 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 1970 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 1971 | "dev": true, 1972 | "license": "MIT", 1973 | "dependencies": { 1974 | "braces": "^3.0.3", 1975 | "picomatch": "^2.3.1" 1976 | }, 1977 | "engines": { 1978 | "node": ">=8.6" 1979 | } 1980 | }, 1981 | "node_modules/micromatch/node_modules/picomatch": { 1982 | "version": "2.3.1", 1983 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1984 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1985 | "dev": true, 1986 | "license": "MIT", 1987 | "engines": { 1988 | "node": ">=8.6" 1989 | }, 1990 | "funding": { 1991 | "url": "https://github.com/sponsors/jonschlinkert" 1992 | } 1993 | }, 1994 | "node_modules/mini-svg-data-uri": { 1995 | "version": "1.4.4", 1996 | "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", 1997 | "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", 1998 | "dev": true, 1999 | "license": "MIT", 2000 | "bin": { 2001 | "mini-svg-data-uri": "cli.js" 2002 | } 2003 | }, 2004 | "node_modules/minimatch": { 2005 | "version": "9.0.5", 2006 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 2007 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 2008 | "dev": true, 2009 | "license": "ISC", 2010 | "dependencies": { 2011 | "brace-expansion": "^2.0.1" 2012 | }, 2013 | "engines": { 2014 | "node": ">=16 || 14 >=14.17" 2015 | }, 2016 | "funding": { 2017 | "url": "https://github.com/sponsors/isaacs" 2018 | } 2019 | }, 2020 | "node_modules/minipass": { 2021 | "version": "7.1.2", 2022 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 2023 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 2024 | "dev": true, 2025 | "license": "ISC", 2026 | "engines": { 2027 | "node": ">=16 || 14 >=14.17" 2028 | } 2029 | }, 2030 | "node_modules/mri": { 2031 | "version": "1.2.0", 2032 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", 2033 | "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", 2034 | "dev": true, 2035 | "license": "MIT", 2036 | "engines": { 2037 | "node": ">=4" 2038 | } 2039 | }, 2040 | "node_modules/ms": { 2041 | "version": "2.1.3", 2042 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2043 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2044 | "dev": true, 2045 | "license": "MIT" 2046 | }, 2047 | "node_modules/mz": { 2048 | "version": "2.7.0", 2049 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 2050 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 2051 | "dev": true, 2052 | "license": "MIT", 2053 | "dependencies": { 2054 | "any-promise": "^1.0.0", 2055 | "object-assign": "^4.0.1", 2056 | "thenify-all": "^1.0.0" 2057 | } 2058 | }, 2059 | "node_modules/nanoid": { 2060 | "version": "3.3.8", 2061 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", 2062 | "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", 2063 | "dev": true, 2064 | "funding": [ 2065 | { 2066 | "type": "github", 2067 | "url": "https://github.com/sponsors/ai" 2068 | } 2069 | ], 2070 | "license": "MIT", 2071 | "bin": { 2072 | "nanoid": "bin/nanoid.cjs" 2073 | }, 2074 | "engines": { 2075 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 2076 | } 2077 | }, 2078 | "node_modules/node-releases": { 2079 | "version": "2.0.19", 2080 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", 2081 | "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", 2082 | "dev": true, 2083 | "license": "MIT" 2084 | }, 2085 | "node_modules/normalize-path": { 2086 | "version": "3.0.0", 2087 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2088 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2089 | "dev": true, 2090 | "license": "MIT", 2091 | "engines": { 2092 | "node": ">=0.10.0" 2093 | } 2094 | }, 2095 | "node_modules/normalize-range": { 2096 | "version": "0.1.2", 2097 | "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 2098 | "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", 2099 | "dev": true, 2100 | "license": "MIT", 2101 | "engines": { 2102 | "node": ">=0.10.0" 2103 | } 2104 | }, 2105 | "node_modules/object-assign": { 2106 | "version": "4.1.1", 2107 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2108 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 2109 | "dev": true, 2110 | "license": "MIT", 2111 | "engines": { 2112 | "node": ">=0.10.0" 2113 | } 2114 | }, 2115 | "node_modules/object-hash": { 2116 | "version": "3.0.0", 2117 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 2118 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 2119 | "dev": true, 2120 | "license": "MIT", 2121 | "engines": { 2122 | "node": ">= 6" 2123 | } 2124 | }, 2125 | "node_modules/package-json-from-dist": { 2126 | "version": "1.0.1", 2127 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 2128 | "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", 2129 | "dev": true, 2130 | "license": "BlueOak-1.0.0" 2131 | }, 2132 | "node_modules/path-key": { 2133 | "version": "3.1.1", 2134 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2135 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2136 | "dev": true, 2137 | "license": "MIT", 2138 | "engines": { 2139 | "node": ">=8" 2140 | } 2141 | }, 2142 | "node_modules/path-parse": { 2143 | "version": "1.0.7", 2144 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2145 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2146 | "dev": true, 2147 | "license": "MIT" 2148 | }, 2149 | "node_modules/path-scurry": { 2150 | "version": "1.11.1", 2151 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 2152 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 2153 | "dev": true, 2154 | "license": "BlueOak-1.0.0", 2155 | "dependencies": { 2156 | "lru-cache": "^10.2.0", 2157 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 2158 | }, 2159 | "engines": { 2160 | "node": ">=16 || 14 >=14.18" 2161 | }, 2162 | "funding": { 2163 | "url": "https://github.com/sponsors/isaacs" 2164 | } 2165 | }, 2166 | "node_modules/picocolors": { 2167 | "version": "1.1.1", 2168 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 2169 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 2170 | "dev": true, 2171 | "license": "ISC" 2172 | }, 2173 | "node_modules/picomatch": { 2174 | "version": "4.0.2", 2175 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", 2176 | "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 2177 | "dev": true, 2178 | "license": "MIT", 2179 | "engines": { 2180 | "node": ">=12" 2181 | }, 2182 | "funding": { 2183 | "url": "https://github.com/sponsors/jonschlinkert" 2184 | } 2185 | }, 2186 | "node_modules/pify": { 2187 | "version": "2.3.0", 2188 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 2189 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 2190 | "dev": true, 2191 | "license": "MIT", 2192 | "engines": { 2193 | "node": ">=0.10.0" 2194 | } 2195 | }, 2196 | "node_modules/pirates": { 2197 | "version": "4.0.6", 2198 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", 2199 | "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", 2200 | "dev": true, 2201 | "license": "MIT", 2202 | "engines": { 2203 | "node": ">= 6" 2204 | } 2205 | }, 2206 | "node_modules/postcss": { 2207 | "version": "8.4.49", 2208 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", 2209 | "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", 2210 | "dev": true, 2211 | "funding": [ 2212 | { 2213 | "type": "opencollective", 2214 | "url": "https://opencollective.com/postcss/" 2215 | }, 2216 | { 2217 | "type": "tidelift", 2218 | "url": "https://tidelift.com/funding/github/npm/postcss" 2219 | }, 2220 | { 2221 | "type": "github", 2222 | "url": "https://github.com/sponsors/ai" 2223 | } 2224 | ], 2225 | "license": "MIT", 2226 | "dependencies": { 2227 | "nanoid": "^3.3.7", 2228 | "picocolors": "^1.1.1", 2229 | "source-map-js": "^1.2.1" 2230 | }, 2231 | "engines": { 2232 | "node": "^10 || ^12 || >=14" 2233 | } 2234 | }, 2235 | "node_modules/postcss-import": { 2236 | "version": "15.1.0", 2237 | "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", 2238 | "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", 2239 | "dev": true, 2240 | "license": "MIT", 2241 | "dependencies": { 2242 | "postcss-value-parser": "^4.0.0", 2243 | "read-cache": "^1.0.0", 2244 | "resolve": "^1.1.7" 2245 | }, 2246 | "engines": { 2247 | "node": ">=14.0.0" 2248 | }, 2249 | "peerDependencies": { 2250 | "postcss": "^8.0.0" 2251 | } 2252 | }, 2253 | "node_modules/postcss-js": { 2254 | "version": "4.0.1", 2255 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", 2256 | "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", 2257 | "dev": true, 2258 | "license": "MIT", 2259 | "dependencies": { 2260 | "camelcase-css": "^2.0.1" 2261 | }, 2262 | "engines": { 2263 | "node": "^12 || ^14 || >= 16" 2264 | }, 2265 | "funding": { 2266 | "type": "opencollective", 2267 | "url": "https://opencollective.com/postcss/" 2268 | }, 2269 | "peerDependencies": { 2270 | "postcss": "^8.4.21" 2271 | } 2272 | }, 2273 | "node_modules/postcss-load-config": { 2274 | "version": "4.0.2", 2275 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", 2276 | "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", 2277 | "dev": true, 2278 | "funding": [ 2279 | { 2280 | "type": "opencollective", 2281 | "url": "https://opencollective.com/postcss/" 2282 | }, 2283 | { 2284 | "type": "github", 2285 | "url": "https://github.com/sponsors/ai" 2286 | } 2287 | ], 2288 | "license": "MIT", 2289 | "dependencies": { 2290 | "lilconfig": "^3.0.0", 2291 | "yaml": "^2.3.4" 2292 | }, 2293 | "engines": { 2294 | "node": ">= 14" 2295 | }, 2296 | "peerDependencies": { 2297 | "postcss": ">=8.0.9", 2298 | "ts-node": ">=9.0.0" 2299 | }, 2300 | "peerDependenciesMeta": { 2301 | "postcss": { 2302 | "optional": true 2303 | }, 2304 | "ts-node": { 2305 | "optional": true 2306 | } 2307 | } 2308 | }, 2309 | "node_modules/postcss-nested": { 2310 | "version": "6.2.0", 2311 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", 2312 | "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", 2313 | "dev": true, 2314 | "funding": [ 2315 | { 2316 | "type": "opencollective", 2317 | "url": "https://opencollective.com/postcss/" 2318 | }, 2319 | { 2320 | "type": "github", 2321 | "url": "https://github.com/sponsors/ai" 2322 | } 2323 | ], 2324 | "license": "MIT", 2325 | "dependencies": { 2326 | "postcss-selector-parser": "^6.1.1" 2327 | }, 2328 | "engines": { 2329 | "node": ">=12.0" 2330 | }, 2331 | "peerDependencies": { 2332 | "postcss": "^8.2.14" 2333 | } 2334 | }, 2335 | "node_modules/postcss-nested/node_modules/postcss-selector-parser": { 2336 | "version": "6.1.2", 2337 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", 2338 | "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", 2339 | "dev": true, 2340 | "license": "MIT", 2341 | "dependencies": { 2342 | "cssesc": "^3.0.0", 2343 | "util-deprecate": "^1.0.2" 2344 | }, 2345 | "engines": { 2346 | "node": ">=4" 2347 | } 2348 | }, 2349 | "node_modules/postcss-selector-parser": { 2350 | "version": "6.0.10", 2351 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", 2352 | "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", 2353 | "dev": true, 2354 | "license": "MIT", 2355 | "dependencies": { 2356 | "cssesc": "^3.0.0", 2357 | "util-deprecate": "^1.0.2" 2358 | }, 2359 | "engines": { 2360 | "node": ">=4" 2361 | } 2362 | }, 2363 | "node_modules/postcss-value-parser": { 2364 | "version": "4.2.0", 2365 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 2366 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 2367 | "dev": true, 2368 | "license": "MIT" 2369 | }, 2370 | "node_modules/queue-microtask": { 2371 | "version": "1.2.3", 2372 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2373 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2374 | "dev": true, 2375 | "funding": [ 2376 | { 2377 | "type": "github", 2378 | "url": "https://github.com/sponsors/feross" 2379 | }, 2380 | { 2381 | "type": "patreon", 2382 | "url": "https://www.patreon.com/feross" 2383 | }, 2384 | { 2385 | "type": "consulting", 2386 | "url": "https://feross.org/support" 2387 | } 2388 | ], 2389 | "license": "MIT" 2390 | }, 2391 | "node_modules/read-cache": { 2392 | "version": "1.0.0", 2393 | "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", 2394 | "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", 2395 | "dev": true, 2396 | "license": "MIT", 2397 | "dependencies": { 2398 | "pify": "^2.3.0" 2399 | } 2400 | }, 2401 | "node_modules/readdirp": { 2402 | "version": "4.0.2", 2403 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", 2404 | "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", 2405 | "dev": true, 2406 | "license": "MIT", 2407 | "engines": { 2408 | "node": ">= 14.16.0" 2409 | }, 2410 | "funding": { 2411 | "type": "individual", 2412 | "url": "https://paulmillr.com/funding/" 2413 | } 2414 | }, 2415 | "node_modules/regexparam": { 2416 | "version": "2.0.2", 2417 | "resolved": "https://registry.npmjs.org/regexparam/-/regexparam-2.0.2.tgz", 2418 | "integrity": "sha512-A1PeDEYMrkLrfyOwv2jwihXbo9qxdGD3atBYQA9JJgreAx8/7rC6IUkWOw2NQlOxLp2wL0ifQbh1HuidDfYA6w==", 2419 | "license": "MIT", 2420 | "engines": { 2421 | "node": ">=8" 2422 | } 2423 | }, 2424 | "node_modules/resolve": { 2425 | "version": "1.22.10", 2426 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", 2427 | "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", 2428 | "dev": true, 2429 | "license": "MIT", 2430 | "dependencies": { 2431 | "is-core-module": "^2.16.0", 2432 | "path-parse": "^1.0.7", 2433 | "supports-preserve-symlinks-flag": "^1.0.0" 2434 | }, 2435 | "bin": { 2436 | "resolve": "bin/resolve" 2437 | }, 2438 | "engines": { 2439 | "node": ">= 0.4" 2440 | }, 2441 | "funding": { 2442 | "url": "https://github.com/sponsors/ljharb" 2443 | } 2444 | }, 2445 | "node_modules/reusify": { 2446 | "version": "1.0.4", 2447 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2448 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2449 | "dev": true, 2450 | "license": "MIT", 2451 | "engines": { 2452 | "iojs": ">=1.0.0", 2453 | "node": ">=0.10.0" 2454 | } 2455 | }, 2456 | "node_modules/rollup": { 2457 | "version": "4.29.1", 2458 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.29.1.tgz", 2459 | "integrity": "sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==", 2460 | "dev": true, 2461 | "license": "MIT", 2462 | "dependencies": { 2463 | "@types/estree": "1.0.6" 2464 | }, 2465 | "bin": { 2466 | "rollup": "dist/bin/rollup" 2467 | }, 2468 | "engines": { 2469 | "node": ">=18.0.0", 2470 | "npm": ">=8.0.0" 2471 | }, 2472 | "optionalDependencies": { 2473 | "@rollup/rollup-android-arm-eabi": "4.29.1", 2474 | "@rollup/rollup-android-arm64": "4.29.1", 2475 | "@rollup/rollup-darwin-arm64": "4.29.1", 2476 | "@rollup/rollup-darwin-x64": "4.29.1", 2477 | "@rollup/rollup-freebsd-arm64": "4.29.1", 2478 | "@rollup/rollup-freebsd-x64": "4.29.1", 2479 | "@rollup/rollup-linux-arm-gnueabihf": "4.29.1", 2480 | "@rollup/rollup-linux-arm-musleabihf": "4.29.1", 2481 | "@rollup/rollup-linux-arm64-gnu": "4.29.1", 2482 | "@rollup/rollup-linux-arm64-musl": "4.29.1", 2483 | "@rollup/rollup-linux-loongarch64-gnu": "4.29.1", 2484 | "@rollup/rollup-linux-powerpc64le-gnu": "4.29.1", 2485 | "@rollup/rollup-linux-riscv64-gnu": "4.29.1", 2486 | "@rollup/rollup-linux-s390x-gnu": "4.29.1", 2487 | "@rollup/rollup-linux-x64-gnu": "4.29.1", 2488 | "@rollup/rollup-linux-x64-musl": "4.29.1", 2489 | "@rollup/rollup-win32-arm64-msvc": "4.29.1", 2490 | "@rollup/rollup-win32-ia32-msvc": "4.29.1", 2491 | "@rollup/rollup-win32-x64-msvc": "4.29.1", 2492 | "fsevents": "~2.3.2" 2493 | } 2494 | }, 2495 | "node_modules/run-parallel": { 2496 | "version": "1.2.0", 2497 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2498 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2499 | "dev": true, 2500 | "funding": [ 2501 | { 2502 | "type": "github", 2503 | "url": "https://github.com/sponsors/feross" 2504 | }, 2505 | { 2506 | "type": "patreon", 2507 | "url": "https://www.patreon.com/feross" 2508 | }, 2509 | { 2510 | "type": "consulting", 2511 | "url": "https://feross.org/support" 2512 | } 2513 | ], 2514 | "license": "MIT", 2515 | "dependencies": { 2516 | "queue-microtask": "^1.2.2" 2517 | } 2518 | }, 2519 | "node_modules/sade": { 2520 | "version": "1.8.1", 2521 | "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", 2522 | "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", 2523 | "dev": true, 2524 | "license": "MIT", 2525 | "dependencies": { 2526 | "mri": "^1.1.0" 2527 | }, 2528 | "engines": { 2529 | "node": ">=6" 2530 | } 2531 | }, 2532 | "node_modules/shebang-command": { 2533 | "version": "2.0.0", 2534 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2535 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2536 | "dev": true, 2537 | "license": "MIT", 2538 | "dependencies": { 2539 | "shebang-regex": "^3.0.0" 2540 | }, 2541 | "engines": { 2542 | "node": ">=8" 2543 | } 2544 | }, 2545 | "node_modules/shebang-regex": { 2546 | "version": "3.0.0", 2547 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2548 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2549 | "dev": true, 2550 | "license": "MIT", 2551 | "engines": { 2552 | "node": ">=8" 2553 | } 2554 | }, 2555 | "node_modules/signal-exit": { 2556 | "version": "4.1.0", 2557 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 2558 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 2559 | "dev": true, 2560 | "license": "ISC", 2561 | "engines": { 2562 | "node": ">=14" 2563 | }, 2564 | "funding": { 2565 | "url": "https://github.com/sponsors/isaacs" 2566 | } 2567 | }, 2568 | "node_modules/source-map-js": { 2569 | "version": "1.2.1", 2570 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 2571 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 2572 | "dev": true, 2573 | "license": "BSD-3-Clause", 2574 | "engines": { 2575 | "node": ">=0.10.0" 2576 | } 2577 | }, 2578 | "node_modules/string-width": { 2579 | "version": "5.1.2", 2580 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 2581 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 2582 | "dev": true, 2583 | "license": "MIT", 2584 | "dependencies": { 2585 | "eastasianwidth": "^0.2.0", 2586 | "emoji-regex": "^9.2.2", 2587 | "strip-ansi": "^7.0.1" 2588 | }, 2589 | "engines": { 2590 | "node": ">=12" 2591 | }, 2592 | "funding": { 2593 | "url": "https://github.com/sponsors/sindresorhus" 2594 | } 2595 | }, 2596 | "node_modules/string-width-cjs": { 2597 | "name": "string-width", 2598 | "version": "4.2.3", 2599 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2600 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2601 | "dev": true, 2602 | "license": "MIT", 2603 | "dependencies": { 2604 | "emoji-regex": "^8.0.0", 2605 | "is-fullwidth-code-point": "^3.0.0", 2606 | "strip-ansi": "^6.0.1" 2607 | }, 2608 | "engines": { 2609 | "node": ">=8" 2610 | } 2611 | }, 2612 | "node_modules/string-width-cjs/node_modules/ansi-regex": { 2613 | "version": "5.0.1", 2614 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2615 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2616 | "dev": true, 2617 | "license": "MIT", 2618 | "engines": { 2619 | "node": ">=8" 2620 | } 2621 | }, 2622 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 2623 | "version": "8.0.0", 2624 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2625 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2626 | "dev": true, 2627 | "license": "MIT" 2628 | }, 2629 | "node_modules/string-width-cjs/node_modules/strip-ansi": { 2630 | "version": "6.0.1", 2631 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2632 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2633 | "dev": true, 2634 | "license": "MIT", 2635 | "dependencies": { 2636 | "ansi-regex": "^5.0.1" 2637 | }, 2638 | "engines": { 2639 | "node": ">=8" 2640 | } 2641 | }, 2642 | "node_modules/strip-ansi": { 2643 | "version": "7.1.0", 2644 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 2645 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 2646 | "dev": true, 2647 | "license": "MIT", 2648 | "dependencies": { 2649 | "ansi-regex": "^6.0.1" 2650 | }, 2651 | "engines": { 2652 | "node": ">=12" 2653 | }, 2654 | "funding": { 2655 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 2656 | } 2657 | }, 2658 | "node_modules/strip-ansi-cjs": { 2659 | "name": "strip-ansi", 2660 | "version": "6.0.1", 2661 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2662 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2663 | "dev": true, 2664 | "license": "MIT", 2665 | "dependencies": { 2666 | "ansi-regex": "^5.0.1" 2667 | }, 2668 | "engines": { 2669 | "node": ">=8" 2670 | } 2671 | }, 2672 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 2673 | "version": "5.0.1", 2674 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2675 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2676 | "dev": true, 2677 | "license": "MIT", 2678 | "engines": { 2679 | "node": ">=8" 2680 | } 2681 | }, 2682 | "node_modules/sucrase": { 2683 | "version": "3.35.0", 2684 | "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", 2685 | "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", 2686 | "dev": true, 2687 | "license": "MIT", 2688 | "dependencies": { 2689 | "@jridgewell/gen-mapping": "^0.3.2", 2690 | "commander": "^4.0.0", 2691 | "glob": "^10.3.10", 2692 | "lines-and-columns": "^1.1.6", 2693 | "mz": "^2.7.0", 2694 | "pirates": "^4.0.1", 2695 | "ts-interface-checker": "^0.1.9" 2696 | }, 2697 | "bin": { 2698 | "sucrase": "bin/sucrase", 2699 | "sucrase-node": "bin/sucrase-node" 2700 | }, 2701 | "engines": { 2702 | "node": ">=16 || 14 >=14.17" 2703 | } 2704 | }, 2705 | "node_modules/supports-preserve-symlinks-flag": { 2706 | "version": "1.0.0", 2707 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2708 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2709 | "dev": true, 2710 | "license": "MIT", 2711 | "engines": { 2712 | "node": ">= 0.4" 2713 | }, 2714 | "funding": { 2715 | "url": "https://github.com/sponsors/ljharb" 2716 | } 2717 | }, 2718 | "node_modules/svelte": { 2719 | "version": "5.16.0", 2720 | "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.16.0.tgz", 2721 | "integrity": "sha512-Ygqsiac6UogVED2ruKclU+pOeMThxWtp9LG+li7BXeDKC2paVIsRTMkNmcON4Zejerd1s5sZHWx6ZtU85xklVg==", 2722 | "dev": true, 2723 | "license": "MIT", 2724 | "dependencies": { 2725 | "@ampproject/remapping": "^2.3.0", 2726 | "@jridgewell/sourcemap-codec": "^1.5.0", 2727 | "@types/estree": "^1.0.5", 2728 | "acorn": "^8.12.1", 2729 | "acorn-typescript": "^1.4.13", 2730 | "aria-query": "^5.3.1", 2731 | "axobject-query": "^4.1.0", 2732 | "clsx": "^2.1.1", 2733 | "esm-env": "^1.2.1", 2734 | "esrap": "^1.3.2", 2735 | "is-reference": "^3.0.3", 2736 | "locate-character": "^3.0.0", 2737 | "magic-string": "^0.30.11", 2738 | "zimmerframe": "^1.1.2" 2739 | }, 2740 | "engines": { 2741 | "node": ">=18" 2742 | } 2743 | }, 2744 | "node_modules/svelte-check": { 2745 | "version": "4.1.1", 2746 | "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.1.1.tgz", 2747 | "integrity": "sha512-NfaX+6Qtc8W/CyVGS/F7/XdiSSyXz+WGYA9ZWV3z8tso14V2vzjfXviKaTFEzB7g8TqfgO2FOzP6XT4ApSTUTw==", 2748 | "dev": true, 2749 | "license": "MIT", 2750 | "dependencies": { 2751 | "@jridgewell/trace-mapping": "^0.3.25", 2752 | "chokidar": "^4.0.1", 2753 | "fdir": "^6.2.0", 2754 | "picocolors": "^1.0.0", 2755 | "sade": "^1.7.4" 2756 | }, 2757 | "bin": { 2758 | "svelte-check": "bin/svelte-check" 2759 | }, 2760 | "engines": { 2761 | "node": ">= 18.0.0" 2762 | }, 2763 | "peerDependencies": { 2764 | "svelte": "^4.0.0 || ^5.0.0-next.0", 2765 | "typescript": ">=5.0.0" 2766 | } 2767 | }, 2768 | "node_modules/svelte-spa-router": { 2769 | "version": "4.0.1", 2770 | "resolved": "https://registry.npmjs.org/svelte-spa-router/-/svelte-spa-router-4.0.1.tgz", 2771 | "integrity": "sha512-2JkmUQ2f9jRluijL58LtdQBIpynSbem2eBGp4zXdi7aDY1znbR6yjw0KsonD0aq2QLwf4Yx4tBJQjxIjgjXHKg==", 2772 | "license": "MIT", 2773 | "dependencies": { 2774 | "regexparam": "2.0.2" 2775 | }, 2776 | "funding": { 2777 | "url": "https://github.com/sponsors/ItalyPaleAle" 2778 | } 2779 | }, 2780 | "node_modules/svg.draggable.js": { 2781 | "version": "2.2.2", 2782 | "resolved": "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz", 2783 | "integrity": "sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==", 2784 | "dev": true, 2785 | "license": "MIT", 2786 | "dependencies": { 2787 | "svg.js": "^2.0.1" 2788 | }, 2789 | "engines": { 2790 | "node": ">= 0.8.0" 2791 | } 2792 | }, 2793 | "node_modules/svg.easing.js": { 2794 | "version": "2.0.0", 2795 | "resolved": "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz", 2796 | "integrity": "sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==", 2797 | "dev": true, 2798 | "license": "MIT", 2799 | "dependencies": { 2800 | "svg.js": ">=2.3.x" 2801 | }, 2802 | "engines": { 2803 | "node": ">= 0.8.0" 2804 | } 2805 | }, 2806 | "node_modules/svg.filter.js": { 2807 | "version": "2.0.2", 2808 | "resolved": "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz", 2809 | "integrity": "sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==", 2810 | "dev": true, 2811 | "license": "MIT", 2812 | "dependencies": { 2813 | "svg.js": "^2.2.5" 2814 | }, 2815 | "engines": { 2816 | "node": ">= 0.8.0" 2817 | } 2818 | }, 2819 | "node_modules/svg.js": { 2820 | "version": "2.7.1", 2821 | "resolved": "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz", 2822 | "integrity": "sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==", 2823 | "dev": true, 2824 | "license": "MIT" 2825 | }, 2826 | "node_modules/svg.pathmorphing.js": { 2827 | "version": "0.1.3", 2828 | "resolved": "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz", 2829 | "integrity": "sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==", 2830 | "dev": true, 2831 | "license": "MIT", 2832 | "dependencies": { 2833 | "svg.js": "^2.4.0" 2834 | }, 2835 | "engines": { 2836 | "node": ">= 0.8.0" 2837 | } 2838 | }, 2839 | "node_modules/svg.resize.js": { 2840 | "version": "1.4.3", 2841 | "resolved": "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz", 2842 | "integrity": "sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==", 2843 | "dev": true, 2844 | "license": "MIT", 2845 | "dependencies": { 2846 | "svg.js": "^2.6.5", 2847 | "svg.select.js": "^2.1.2" 2848 | }, 2849 | "engines": { 2850 | "node": ">= 0.8.0" 2851 | } 2852 | }, 2853 | "node_modules/svg.resize.js/node_modules/svg.select.js": { 2854 | "version": "2.1.2", 2855 | "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz", 2856 | "integrity": "sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==", 2857 | "dev": true, 2858 | "license": "MIT", 2859 | "dependencies": { 2860 | "svg.js": "^2.2.5" 2861 | }, 2862 | "engines": { 2863 | "node": ">= 0.8.0" 2864 | } 2865 | }, 2866 | "node_modules/svg.select.js": { 2867 | "version": "3.0.1", 2868 | "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz", 2869 | "integrity": "sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==", 2870 | "dev": true, 2871 | "license": "MIT", 2872 | "dependencies": { 2873 | "svg.js": "^2.6.5" 2874 | }, 2875 | "engines": { 2876 | "node": ">= 0.8.0" 2877 | } 2878 | }, 2879 | "node_modules/tailwind-merge": { 2880 | "version": "2.6.0", 2881 | "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz", 2882 | "integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==", 2883 | "dev": true, 2884 | "license": "MIT", 2885 | "funding": { 2886 | "type": "github", 2887 | "url": "https://github.com/sponsors/dcastil" 2888 | } 2889 | }, 2890 | "node_modules/tailwindcss": { 2891 | "version": "3.4.17", 2892 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", 2893 | "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", 2894 | "dev": true, 2895 | "license": "MIT", 2896 | "dependencies": { 2897 | "@alloc/quick-lru": "^5.2.0", 2898 | "arg": "^5.0.2", 2899 | "chokidar": "^3.6.0", 2900 | "didyoumean": "^1.2.2", 2901 | "dlv": "^1.1.3", 2902 | "fast-glob": "^3.3.2", 2903 | "glob-parent": "^6.0.2", 2904 | "is-glob": "^4.0.3", 2905 | "jiti": "^1.21.6", 2906 | "lilconfig": "^3.1.3", 2907 | "micromatch": "^4.0.8", 2908 | "normalize-path": "^3.0.0", 2909 | "object-hash": "^3.0.0", 2910 | "picocolors": "^1.1.1", 2911 | "postcss": "^8.4.47", 2912 | "postcss-import": "^15.1.0", 2913 | "postcss-js": "^4.0.1", 2914 | "postcss-load-config": "^4.0.2", 2915 | "postcss-nested": "^6.2.0", 2916 | "postcss-selector-parser": "^6.1.2", 2917 | "resolve": "^1.22.8", 2918 | "sucrase": "^3.35.0" 2919 | }, 2920 | "bin": { 2921 | "tailwind": "lib/cli.js", 2922 | "tailwindcss": "lib/cli.js" 2923 | }, 2924 | "engines": { 2925 | "node": ">=14.0.0" 2926 | } 2927 | }, 2928 | "node_modules/tailwindcss/node_modules/chokidar": { 2929 | "version": "3.6.0", 2930 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 2931 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 2932 | "dev": true, 2933 | "license": "MIT", 2934 | "dependencies": { 2935 | "anymatch": "~3.1.2", 2936 | "braces": "~3.0.2", 2937 | "glob-parent": "~5.1.2", 2938 | "is-binary-path": "~2.1.0", 2939 | "is-glob": "~4.0.1", 2940 | "normalize-path": "~3.0.0", 2941 | "readdirp": "~3.6.0" 2942 | }, 2943 | "engines": { 2944 | "node": ">= 8.10.0" 2945 | }, 2946 | "funding": { 2947 | "url": "https://paulmillr.com/funding/" 2948 | }, 2949 | "optionalDependencies": { 2950 | "fsevents": "~2.3.2" 2951 | } 2952 | }, 2953 | "node_modules/tailwindcss/node_modules/chokidar/node_modules/glob-parent": { 2954 | "version": "5.1.2", 2955 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2956 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2957 | "dev": true, 2958 | "license": "ISC", 2959 | "dependencies": { 2960 | "is-glob": "^4.0.1" 2961 | }, 2962 | "engines": { 2963 | "node": ">= 6" 2964 | } 2965 | }, 2966 | "node_modules/tailwindcss/node_modules/picomatch": { 2967 | "version": "2.3.1", 2968 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2969 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2970 | "dev": true, 2971 | "license": "MIT", 2972 | "engines": { 2973 | "node": ">=8.6" 2974 | }, 2975 | "funding": { 2976 | "url": "https://github.com/sponsors/jonschlinkert" 2977 | } 2978 | }, 2979 | "node_modules/tailwindcss/node_modules/postcss-selector-parser": { 2980 | "version": "6.1.2", 2981 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", 2982 | "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", 2983 | "dev": true, 2984 | "license": "MIT", 2985 | "dependencies": { 2986 | "cssesc": "^3.0.0", 2987 | "util-deprecate": "^1.0.2" 2988 | }, 2989 | "engines": { 2990 | "node": ">=4" 2991 | } 2992 | }, 2993 | "node_modules/tailwindcss/node_modules/readdirp": { 2994 | "version": "3.6.0", 2995 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2996 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2997 | "dev": true, 2998 | "license": "MIT", 2999 | "dependencies": { 3000 | "picomatch": "^2.2.1" 3001 | }, 3002 | "engines": { 3003 | "node": ">=8.10.0" 3004 | } 3005 | }, 3006 | "node_modules/thenify": { 3007 | "version": "3.3.1", 3008 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", 3009 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", 3010 | "dev": true, 3011 | "license": "MIT", 3012 | "dependencies": { 3013 | "any-promise": "^1.0.0" 3014 | } 3015 | }, 3016 | "node_modules/thenify-all": { 3017 | "version": "1.6.0", 3018 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 3019 | "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", 3020 | "dev": true, 3021 | "license": "MIT", 3022 | "dependencies": { 3023 | "thenify": ">= 3.1.0 < 4" 3024 | }, 3025 | "engines": { 3026 | "node": ">=0.8" 3027 | } 3028 | }, 3029 | "node_modules/to-regex-range": { 3030 | "version": "5.0.1", 3031 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3032 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3033 | "dev": true, 3034 | "license": "MIT", 3035 | "dependencies": { 3036 | "is-number": "^7.0.0" 3037 | }, 3038 | "engines": { 3039 | "node": ">=8.0" 3040 | } 3041 | }, 3042 | "node_modules/ts-interface-checker": { 3043 | "version": "0.1.13", 3044 | "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", 3045 | "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", 3046 | "dev": true, 3047 | "license": "Apache-2.0" 3048 | }, 3049 | "node_modules/typescript": { 3050 | "version": "5.6.3", 3051 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", 3052 | "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", 3053 | "dev": true, 3054 | "license": "Apache-2.0", 3055 | "bin": { 3056 | "tsc": "bin/tsc", 3057 | "tsserver": "bin/tsserver" 3058 | }, 3059 | "engines": { 3060 | "node": ">=14.17" 3061 | } 3062 | }, 3063 | "node_modules/update-browserslist-db": { 3064 | "version": "1.1.1", 3065 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", 3066 | "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", 3067 | "dev": true, 3068 | "funding": [ 3069 | { 3070 | "type": "opencollective", 3071 | "url": "https://opencollective.com/browserslist" 3072 | }, 3073 | { 3074 | "type": "tidelift", 3075 | "url": "https://tidelift.com/funding/github/npm/browserslist" 3076 | }, 3077 | { 3078 | "type": "github", 3079 | "url": "https://github.com/sponsors/ai" 3080 | } 3081 | ], 3082 | "license": "MIT", 3083 | "dependencies": { 3084 | "escalade": "^3.2.0", 3085 | "picocolors": "^1.1.0" 3086 | }, 3087 | "bin": { 3088 | "update-browserslist-db": "cli.js" 3089 | }, 3090 | "peerDependencies": { 3091 | "browserslist": ">= 4.21.0" 3092 | } 3093 | }, 3094 | "node_modules/util-deprecate": { 3095 | "version": "1.0.2", 3096 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3097 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 3098 | "dev": true, 3099 | "license": "MIT" 3100 | }, 3101 | "node_modules/vite": { 3102 | "version": "6.0.11", 3103 | "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", 3104 | "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", 3105 | "dev": true, 3106 | "license": "MIT", 3107 | "dependencies": { 3108 | "esbuild": "^0.24.2", 3109 | "postcss": "^8.4.49", 3110 | "rollup": "^4.23.0" 3111 | }, 3112 | "bin": { 3113 | "vite": "bin/vite.js" 3114 | }, 3115 | "engines": { 3116 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 3117 | }, 3118 | "funding": { 3119 | "url": "https://github.com/vitejs/vite?sponsor=1" 3120 | }, 3121 | "optionalDependencies": { 3122 | "fsevents": "~2.3.3" 3123 | }, 3124 | "peerDependencies": { 3125 | "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 3126 | "jiti": ">=1.21.0", 3127 | "less": "*", 3128 | "lightningcss": "^1.21.0", 3129 | "sass": "*", 3130 | "sass-embedded": "*", 3131 | "stylus": "*", 3132 | "sugarss": "*", 3133 | "terser": "^5.16.0", 3134 | "tsx": "^4.8.1", 3135 | "yaml": "^2.4.2" 3136 | }, 3137 | "peerDependenciesMeta": { 3138 | "@types/node": { 3139 | "optional": true 3140 | }, 3141 | "jiti": { 3142 | "optional": true 3143 | }, 3144 | "less": { 3145 | "optional": true 3146 | }, 3147 | "lightningcss": { 3148 | "optional": true 3149 | }, 3150 | "sass": { 3151 | "optional": true 3152 | }, 3153 | "sass-embedded": { 3154 | "optional": true 3155 | }, 3156 | "stylus": { 3157 | "optional": true 3158 | }, 3159 | "sugarss": { 3160 | "optional": true 3161 | }, 3162 | "terser": { 3163 | "optional": true 3164 | }, 3165 | "tsx": { 3166 | "optional": true 3167 | }, 3168 | "yaml": { 3169 | "optional": true 3170 | } 3171 | } 3172 | }, 3173 | "node_modules/vitefu": { 3174 | "version": "1.0.4", 3175 | "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.4.tgz", 3176 | "integrity": "sha512-y6zEE3PQf6uu/Mt6DTJ9ih+kyJLr4XcSgHR2zUkM8SWDhuixEJxfJ6CZGMHh1Ec3vPLoEA0IHU5oWzVqw8ulow==", 3177 | "dev": true, 3178 | "license": "MIT", 3179 | "workspaces": [ 3180 | "tests/deps/*", 3181 | "tests/projects/*" 3182 | ], 3183 | "peerDependencies": { 3184 | "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" 3185 | }, 3186 | "peerDependenciesMeta": { 3187 | "vite": { 3188 | "optional": true 3189 | } 3190 | } 3191 | }, 3192 | "node_modules/which": { 3193 | "version": "2.0.2", 3194 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3195 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3196 | "dev": true, 3197 | "license": "ISC", 3198 | "dependencies": { 3199 | "isexe": "^2.0.0" 3200 | }, 3201 | "bin": { 3202 | "node-which": "bin/node-which" 3203 | }, 3204 | "engines": { 3205 | "node": ">= 8" 3206 | } 3207 | }, 3208 | "node_modules/wrap-ansi": { 3209 | "version": "8.1.0", 3210 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 3211 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 3212 | "dev": true, 3213 | "license": "MIT", 3214 | "dependencies": { 3215 | "ansi-styles": "^6.1.0", 3216 | "string-width": "^5.0.1", 3217 | "strip-ansi": "^7.0.1" 3218 | }, 3219 | "engines": { 3220 | "node": ">=12" 3221 | }, 3222 | "funding": { 3223 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 3224 | } 3225 | }, 3226 | "node_modules/wrap-ansi-cjs": { 3227 | "name": "wrap-ansi", 3228 | "version": "7.0.0", 3229 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 3230 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 3231 | "dev": true, 3232 | "license": "MIT", 3233 | "dependencies": { 3234 | "ansi-styles": "^4.0.0", 3235 | "string-width": "^4.1.0", 3236 | "strip-ansi": "^6.0.0" 3237 | }, 3238 | "engines": { 3239 | "node": ">=10" 3240 | }, 3241 | "funding": { 3242 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 3243 | } 3244 | }, 3245 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 3246 | "version": "5.0.1", 3247 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 3248 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 3249 | "dev": true, 3250 | "license": "MIT", 3251 | "engines": { 3252 | "node": ">=8" 3253 | } 3254 | }, 3255 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 3256 | "version": "4.3.0", 3257 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 3258 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 3259 | "dev": true, 3260 | "license": "MIT", 3261 | "dependencies": { 3262 | "color-convert": "^2.0.1" 3263 | }, 3264 | "engines": { 3265 | "node": ">=8" 3266 | }, 3267 | "funding": { 3268 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 3269 | } 3270 | }, 3271 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 3272 | "version": "8.0.0", 3273 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 3274 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 3275 | "dev": true, 3276 | "license": "MIT" 3277 | }, 3278 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 3279 | "version": "4.2.3", 3280 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 3281 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 3282 | "dev": true, 3283 | "license": "MIT", 3284 | "dependencies": { 3285 | "emoji-regex": "^8.0.0", 3286 | "is-fullwidth-code-point": "^3.0.0", 3287 | "strip-ansi": "^6.0.1" 3288 | }, 3289 | "engines": { 3290 | "node": ">=8" 3291 | } 3292 | }, 3293 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 3294 | "version": "6.0.1", 3295 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3296 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3297 | "dev": true, 3298 | "license": "MIT", 3299 | "dependencies": { 3300 | "ansi-regex": "^5.0.1" 3301 | }, 3302 | "engines": { 3303 | "node": ">=8" 3304 | } 3305 | }, 3306 | "node_modules/yaml": { 3307 | "version": "2.6.1", 3308 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", 3309 | "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", 3310 | "dev": true, 3311 | "license": "ISC", 3312 | "bin": { 3313 | "yaml": "bin.mjs" 3314 | }, 3315 | "engines": { 3316 | "node": ">= 14" 3317 | } 3318 | }, 3319 | "node_modules/zimmerframe": { 3320 | "version": "1.1.2", 3321 | "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz", 3322 | "integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==", 3323 | "dev": true, 3324 | "license": "MIT" 3325 | } 3326 | } 3327 | } 3328 | --------------------------------------------------------------------------------