├── 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 |
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 |
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 |
--------------------------------------------------------------------------------