diff --git a/.github/workflows/vitest.yml b/.github/workflows/vitest.yml
new file mode 100644
index 0000000..5ad2ada
--- /dev/null
+++ b/.github/workflows/vitest.yml
@@ -0,0 +1,39 @@
+name: 'frontend vitest'
+on:
+ pull_request:
+ paths-ignore:
+ - 'docs/**'
+ push:
+ branches:
+ - main
+ paths-ignore:
+ - 'docs/**'
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+
+ permissions:
+ # Required to checkout the code
+ contents: read
+ # Required to put a comment into the pull-request
+ pull-requests: write
+ defaults:
+ run:
+ working-directory: ./frontend
+ steps:
+ - uses: actions/checkout@v4
+ - name: 'Install Node'
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20.x'
+ - name: 'Install Deps'
+ run: npm install
+ - name: 'Test'
+ run: npx vitest --coverage.enabled true
+ - name: 'Report Coverage'
+ # Set if: always() to also generate the report if tests are failing
+ # Only works if you set `reportOnFailure: true` in your vite config as specified above
+ if: always()
+ uses: davelosert/vitest-coverage-report-action@v2
+ working-directory: ./frontend
diff --git a/.gitignore b/.gitignore
index 7e9f033..55db391 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,5 +15,4 @@
# vendor/
node_modules
/build/bin
-/build/windows
-/frontend/build/
+/build/windows/installer/tmp/
diff --git a/app.go b/app.go
index 649a8eb..c16a644 100644
--- a/app.go
+++ b/app.go
@@ -246,3 +246,20 @@ func (a *App) SetScheduler() error {
// err = s.Shutdown()
return nil
}
+
+type AppContext struct {
+ // AppContext is a struct that contains the context of the app.
+ // It can be used to marshalize the context to JSON.
+ // This struct is intended to be used by the frontend.
+ Version string `json:"version"`
+}
+
+func (a *App) GetContext() string {
+ // Return AppContext in Marshalized JSON
+ // Intended to be used by the frontend.
+ ac := AppContext{
+ Version: Version,
+ }
+ data, _ := json.Marshal(ac)
+ return string(data)
+}
diff --git a/build/README.md b/build/README.md
new file mode 100644
index 0000000..1ae2f67
--- /dev/null
+++ b/build/README.md
@@ -0,0 +1,35 @@
+# Build Directory
+
+The build directory is used to house all the build files and assets for your application.
+
+The structure is:
+
+* bin - Output directory
+* darwin - macOS specific files
+* windows - Windows specific files
+
+## Mac
+
+The `darwin` directory holds files specific to Mac builds.
+These may be customised and used as part of the build. To return these files to the default state, simply delete them
+and
+build with `wails build`.
+
+The directory contains the following files:
+
+- `Info.plist` - the main plist file used for Mac builds. It is used when building using `wails build`.
+- `Info.dev.plist` - same as the main plist file but used when building using `wails dev`.
+
+## Windows
+
+The `windows` directory contains the manifest and rc files used when building with `wails build`.
+These may be customised for your application. To return these files to the default state, simply delete them and
+build with `wails build`.
+
+- `icon.ico` - The icon used for the application. This is used when building using `wails build`. If you wish to
+ use a different icon, simply replace this file with your own. If it is missing, a new `icon.ico` file
+ will be created using the `appicon.png` file in the build directory.
+- `installer/*` - The files used to create the Windows installer. These are used when building using `wails build`.
+- `info.json` - Application details used for Windows builds. The data here will be used by the Windows installer,
+ as well as the application itself (right click the exe -> properties -> details)
+- `wails.exe.manifest` - The main application manifest file.
\ No newline at end of file
diff --git a/build/darwin/Info.dev.plist b/build/darwin/Info.dev.plist
new file mode 100644
index 0000000..04727c2
--- /dev/null
+++ b/build/darwin/Info.dev.plist
@@ -0,0 +1,68 @@
+
+
+
+ CFBundlePackageType
+ APPL
+ CFBundleName
+ {{.Info.ProductName}}
+ CFBundleExecutable
+ {{.Name}}
+ CFBundleIdentifier
+ com.wails.{{.Name}}
+ CFBundleVersion
+ {{.Info.ProductVersion}}
+ CFBundleGetInfoString
+ {{.Info.Comments}}
+ CFBundleShortVersionString
+ {{.Info.ProductVersion}}
+ CFBundleIconFile
+ iconfile
+ LSMinimumSystemVersion
+ 10.13.0
+ NSHighResolutionCapable
+ true
+ NSHumanReadableCopyright
+ {{.Info.Copyright}}
+ {{if .Info.FileAssociations}}
+ CFBundleDocumentTypes
+
+ {{range .Info.FileAssociations}}
+
+ CFBundleTypeExtensions
+
+ {{.Ext}}
+
+ CFBundleTypeName
+ {{.Name}}
+ CFBundleTypeRole
+ {{.Role}}
+ CFBundleTypeIconFile
+ {{.IconName}}
+
+ {{end}}
+
+ {{end}}
+ {{if .Info.Protocols}}
+ CFBundleURLTypes
+
+ {{range .Info.Protocols}}
+
+ CFBundleURLName
+ com.wails.{{.Scheme}}
+ CFBundleURLSchemes
+
+ {{.Scheme}}
+
+ CFBundleTypeRole
+ {{.Role}}
+
+ {{end}}
+
+ {{end}}
+ NSAppTransportSecurity
+
+ NSAllowsLocalNetworking
+
+
+
+
diff --git a/build/darwin/Info.plist b/build/darwin/Info.plist
new file mode 100644
index 0000000..19cc937
--- /dev/null
+++ b/build/darwin/Info.plist
@@ -0,0 +1,63 @@
+
+
+
+ CFBundlePackageType
+ APPL
+ CFBundleName
+ {{.Info.ProductName}}
+ CFBundleExecutable
+ {{.Name}}
+ CFBundleIdentifier
+ com.wails.{{.Name}}
+ CFBundleVersion
+ {{.Info.ProductVersion}}
+ CFBundleGetInfoString
+ {{.Info.Comments}}
+ CFBundleShortVersionString
+ {{.Info.ProductVersion}}
+ CFBundleIconFile
+ iconfile
+ LSMinimumSystemVersion
+ 10.13.0
+ NSHighResolutionCapable
+ true
+ NSHumanReadableCopyright
+ {{.Info.Copyright}}
+ {{if .Info.FileAssociations}}
+ CFBundleDocumentTypes
+
+ {{range .Info.FileAssociations}}
+
+ CFBundleTypeExtensions
+
+ {{.Ext}}
+
+ CFBundleTypeName
+ {{.Name}}
+ CFBundleTypeRole
+ {{.Role}}
+ CFBundleTypeIconFile
+ {{.IconName}}
+
+ {{end}}
+
+ {{end}}
+ {{if .Info.Protocols}}
+ CFBundleURLTypes
+
+ {{range .Info.Protocols}}
+
+ CFBundleURLName
+ com.wails.{{.Scheme}}
+ CFBundleURLSchemes
+
+ {{.Scheme}}
+
+ CFBundleTypeRole
+ {{.Role}}
+
+ {{end}}
+
+ {{end}}
+
+
diff --git a/build/windows/info.json b/build/windows/info.json
new file mode 100644
index 0000000..9727946
--- /dev/null
+++ b/build/windows/info.json
@@ -0,0 +1,15 @@
+{
+ "fixed": {
+ "file_version": "{{.Info.ProductVersion}}"
+ },
+ "info": {
+ "0000": {
+ "ProductVersion": "{{.Info.ProductVersion}}",
+ "CompanyName": "{{.Info.CompanyName}}",
+ "FileDescription": "{{.Info.ProductName}}",
+ "LegalCopyright": "{{.Info.Copyright}}",
+ "ProductName": "{{.Info.ProductName}}",
+ "Comments": "{{.Info.Comments}}"
+ }
+ }
+}
\ No newline at end of file
diff --git a/build/windows/installer/project.nsi b/build/windows/installer/project.nsi
new file mode 100644
index 0000000..654ae2e
--- /dev/null
+++ b/build/windows/installer/project.nsi
@@ -0,0 +1,114 @@
+Unicode true
+
+####
+## Please note: Template replacements don't work in this file. They are provided with default defines like
+## mentioned underneath.
+## If the keyword is not defined, "wails_tools.nsh" will populate them with the values from ProjectInfo.
+## If they are defined here, "wails_tools.nsh" will not touch them. This allows to use this project.nsi manually
+## from outside of Wails for debugging and development of the installer.
+##
+## For development first make a wails nsis build to populate the "wails_tools.nsh":
+## > wails build --target windows/amd64 --nsis
+## Then you can call makensis on this file with specifying the path to your binary:
+## For a AMD64 only installer:
+## > makensis -DARG_WAILS_AMD64_BINARY=..\..\bin\app.exe
+## For a ARM64 only installer:
+## > makensis -DARG_WAILS_ARM64_BINARY=..\..\bin\app.exe
+## For a installer with both architectures:
+## > makensis -DARG_WAILS_AMD64_BINARY=..\..\bin\app-amd64.exe -DARG_WAILS_ARM64_BINARY=..\..\bin\app-arm64.exe
+####
+## The following information is taken from the ProjectInfo file, but they can be overwritten here.
+####
+## !define INFO_PROJECTNAME "MyProject" # Default "{{.Name}}"
+## !define INFO_COMPANYNAME "MyCompany" # Default "{{.Info.CompanyName}}"
+## !define INFO_PRODUCTNAME "MyProduct" # Default "{{.Info.ProductName}}"
+## !define INFO_PRODUCTVERSION "1.0.0" # Default "{{.Info.ProductVersion}}"
+## !define INFO_COPYRIGHT "Copyright" # Default "{{.Info.Copyright}}"
+###
+## !define PRODUCT_EXECUTABLE "Application.exe" # Default "${INFO_PROJECTNAME}.exe"
+## !define UNINST_KEY_NAME "UninstKeyInRegistry" # Default "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}"
+####
+## !define REQUEST_EXECUTION_LEVEL "admin" # Default "admin" see also https://nsis.sourceforge.io/Docs/Chapter4.html
+####
+## Include the wails tools
+####
+!include "wails_tools.nsh"
+
+# The version information for this two must consist of 4 parts
+VIProductVersion "${INFO_PRODUCTVERSION}.0"
+VIFileVersion "${INFO_PRODUCTVERSION}.0"
+
+VIAddVersionKey "CompanyName" "${INFO_COMPANYNAME}"
+VIAddVersionKey "FileDescription" "${INFO_PRODUCTNAME} Installer"
+VIAddVersionKey "ProductVersion" "${INFO_PRODUCTVERSION}"
+VIAddVersionKey "FileVersion" "${INFO_PRODUCTVERSION}"
+VIAddVersionKey "LegalCopyright" "${INFO_COPYRIGHT}"
+VIAddVersionKey "ProductName" "${INFO_PRODUCTNAME}"
+
+# Enable HiDPI support. https://nsis.sourceforge.io/Reference/ManifestDPIAware
+ManifestDPIAware true
+
+!include "MUI.nsh"
+
+!define MUI_ICON "..\icon.ico"
+!define MUI_UNICON "..\icon.ico"
+# !define MUI_WELCOMEFINISHPAGE_BITMAP "resources\leftimage.bmp" #Include this to add a bitmap on the left side of the Welcome Page. Must be a size of 164x314
+!define MUI_FINISHPAGE_NOAUTOCLOSE # Wait on the INSTFILES page so the user can take a look into the details of the installation steps
+!define MUI_ABORTWARNING # This will warn the user if they exit from the installer.
+
+!insertmacro MUI_PAGE_WELCOME # Welcome to the installer page.
+# !insertmacro MUI_PAGE_LICENSE "resources\eula.txt" # Adds a EULA page to the installer
+!insertmacro MUI_PAGE_DIRECTORY # In which folder install page.
+!insertmacro MUI_PAGE_INSTFILES # Installing page.
+!insertmacro MUI_PAGE_FINISH # Finished installation page.
+
+!insertmacro MUI_UNPAGE_INSTFILES # Uinstalling page
+
+!insertmacro MUI_LANGUAGE "English" # Set the Language of the installer
+
+## The following two statements can be used to sign the installer and the uninstaller. The path to the binaries are provided in %1
+#!uninstfinalize 'signtool --file "%1"'
+#!finalize 'signtool --file "%1"'
+
+Name "${INFO_PRODUCTNAME}"
+OutFile "..\..\bin\${INFO_PROJECTNAME}-${ARCH}-installer.exe" # Name of the installer's file.
+InstallDir "$PROGRAMFILES64\${INFO_COMPANYNAME}\${INFO_PRODUCTNAME}" # Default installing folder ($PROGRAMFILES is Program Files folder).
+ShowInstDetails show # This will always show the installation details.
+
+Function .onInit
+ !insertmacro wails.checkArchitecture
+FunctionEnd
+
+Section
+ !insertmacro wails.setShellContext
+
+ !insertmacro wails.webview2runtime
+
+ SetOutPath $INSTDIR
+
+ !insertmacro wails.files
+
+ CreateShortcut "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}"
+ CreateShortCut "$DESKTOP\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}"
+
+ !insertmacro wails.associateFiles
+ !insertmacro wails.associateCustomProtocols
+
+ !insertmacro wails.writeUninstaller
+SectionEnd
+
+Section "uninstall"
+ !insertmacro wails.setShellContext
+
+ RMDir /r "$AppData\${PRODUCT_EXECUTABLE}" # Remove the WebView2 DataPath
+
+ RMDir /r $INSTDIR
+
+ Delete "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk"
+ Delete "$DESKTOP\${INFO_PRODUCTNAME}.lnk"
+
+ !insertmacro wails.unassociateFiles
+ !insertmacro wails.unassociateCustomProtocols
+
+ !insertmacro wails.deleteUninstaller
+SectionEnd
diff --git a/build/windows/installer/wails_tools.nsh b/build/windows/installer/wails_tools.nsh
new file mode 100644
index 0000000..6e5c86d
--- /dev/null
+++ b/build/windows/installer/wails_tools.nsh
@@ -0,0 +1,236 @@
+# DO NOT EDIT - Generated automatically by `wails build`
+
+!include "x64.nsh"
+!include "WinVer.nsh"
+!include "FileFunc.nsh"
+
+!ifndef INFO_PROJECTNAME
+ !define INFO_PROJECTNAME "mazesoba-continent"
+!endif
+!ifndef INFO_COMPANYNAME
+ !define INFO_COMPANYNAME "kakakaya"
+!endif
+!ifndef INFO_PRODUCTNAME
+ !define INFO_PRODUCTNAME "まぜそば大陸"
+!endif
+!ifndef INFO_PRODUCTVERSION
+ !define INFO_PRODUCTVERSION "15.0.0"
+!endif
+!ifndef INFO_COPYRIGHT
+ !define INFO_COPYRIGHT "Copyright 2023-2024 kakakaya"
+!endif
+!ifndef PRODUCT_EXECUTABLE
+ !define PRODUCT_EXECUTABLE "${INFO_PROJECTNAME}.exe"
+!endif
+!ifndef UNINST_KEY_NAME
+ !define UNINST_KEY_NAME "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}"
+!endif
+!define UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINST_KEY_NAME}"
+
+!ifndef REQUEST_EXECUTION_LEVEL
+ !define REQUEST_EXECUTION_LEVEL "admin"
+!endif
+
+RequestExecutionLevel "${REQUEST_EXECUTION_LEVEL}"
+
+!ifdef ARG_WAILS_AMD64_BINARY
+ !define SUPPORTS_AMD64
+!endif
+
+!ifdef ARG_WAILS_ARM64_BINARY
+ !define SUPPORTS_ARM64
+!endif
+
+!ifdef SUPPORTS_AMD64
+ !ifdef SUPPORTS_ARM64
+ !define ARCH "amd64_arm64"
+ !else
+ !define ARCH "amd64"
+ !endif
+!else
+ !ifdef SUPPORTS_ARM64
+ !define ARCH "arm64"
+ !else
+ !error "Wails: Undefined ARCH, please provide at least one of ARG_WAILS_AMD64_BINARY or ARG_WAILS_ARM64_BINARY"
+ !endif
+!endif
+
+!macro wails.checkArchitecture
+ !ifndef WAILS_WIN10_REQUIRED
+ !define WAILS_WIN10_REQUIRED "This product is only supported on Windows 10 (Server 2016) and later."
+ !endif
+
+ !ifndef WAILS_ARCHITECTURE_NOT_SUPPORTED
+ !define WAILS_ARCHITECTURE_NOT_SUPPORTED "This product can't be installed on the current Windows architecture. Supports: ${ARCH}"
+ !endif
+
+ ${If} ${AtLeastWin10}
+ !ifdef SUPPORTS_AMD64
+ ${if} ${IsNativeAMD64}
+ Goto ok
+ ${EndIf}
+ !endif
+
+ !ifdef SUPPORTS_ARM64
+ ${if} ${IsNativeARM64}
+ Goto ok
+ ${EndIf}
+ !endif
+
+ IfSilent silentArch notSilentArch
+ silentArch:
+ SetErrorLevel 65
+ Abort
+ notSilentArch:
+ MessageBox MB_OK "${WAILS_ARCHITECTURE_NOT_SUPPORTED}"
+ Quit
+ ${else}
+ IfSilent silentWin notSilentWin
+ silentWin:
+ SetErrorLevel 64
+ Abort
+ notSilentWin:
+ MessageBox MB_OK "${WAILS_WIN10_REQUIRED}"
+ Quit
+ ${EndIf}
+
+ ok:
+!macroend
+
+!macro wails.files
+ !ifdef SUPPORTS_AMD64
+ ${if} ${IsNativeAMD64}
+ File "/oname=${PRODUCT_EXECUTABLE}" "${ARG_WAILS_AMD64_BINARY}"
+ ${EndIf}
+ !endif
+
+ !ifdef SUPPORTS_ARM64
+ ${if} ${IsNativeARM64}
+ File "/oname=${PRODUCT_EXECUTABLE}" "${ARG_WAILS_ARM64_BINARY}"
+ ${EndIf}
+ !endif
+!macroend
+
+!macro wails.writeUninstaller
+ WriteUninstaller "$INSTDIR\uninstall.exe"
+
+ SetRegView 64
+ WriteRegStr HKLM "${UNINST_KEY}" "Publisher" "${INFO_COMPANYNAME}"
+ WriteRegStr HKLM "${UNINST_KEY}" "DisplayName" "${INFO_PRODUCTNAME}"
+ WriteRegStr HKLM "${UNINST_KEY}" "DisplayVersion" "${INFO_PRODUCTVERSION}"
+ WriteRegStr HKLM "${UNINST_KEY}" "DisplayIcon" "$INSTDIR\${PRODUCT_EXECUTABLE}"
+ WriteRegStr HKLM "${UNINST_KEY}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\""
+ WriteRegStr HKLM "${UNINST_KEY}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S"
+
+ ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2
+ IntFmt $0 "0x%08X" $0
+ WriteRegDWORD HKLM "${UNINST_KEY}" "EstimatedSize" "$0"
+!macroend
+
+!macro wails.deleteUninstaller
+ Delete "$INSTDIR\uninstall.exe"
+
+ SetRegView 64
+ DeleteRegKey HKLM "${UNINST_KEY}"
+!macroend
+
+!macro wails.setShellContext
+ ${If} ${REQUEST_EXECUTION_LEVEL} == "admin"
+ SetShellVarContext all
+ ${else}
+ SetShellVarContext current
+ ${EndIf}
+!macroend
+
+# Install webview2 by launching the bootstrapper
+# See https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#online-only-deployment
+!macro wails.webview2runtime
+ !ifndef WAILS_INSTALL_WEBVIEW_DETAILPRINT
+ !define WAILS_INSTALL_WEBVIEW_DETAILPRINT "Installing: WebView2 Runtime"
+ !endif
+
+ SetRegView 64
+ # If the admin key exists and is not empty then webview2 is already installed
+ ReadRegStr $0 HKLM "SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
+ ${If} $0 != ""
+ Goto ok
+ ${EndIf}
+
+ ${If} ${REQUEST_EXECUTION_LEVEL} == "user"
+ # If the installer is run in user level, check the user specific key exists and is not empty then webview2 is already installed
+ ReadRegStr $0 HKCU "Software\Microsoft\EdgeUpdate\Clients{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
+ ${If} $0 != ""
+ Goto ok
+ ${EndIf}
+ ${EndIf}
+
+ SetDetailsPrint both
+ DetailPrint "${WAILS_INSTALL_WEBVIEW_DETAILPRINT}"
+ SetDetailsPrint listonly
+
+ InitPluginsDir
+ CreateDirectory "$pluginsdir\webview2bootstrapper"
+ SetOutPath "$pluginsdir\webview2bootstrapper"
+ File "tmp\MicrosoftEdgeWebview2Setup.exe"
+ ExecWait '"$pluginsdir\webview2bootstrapper\MicrosoftEdgeWebview2Setup.exe" /silent /install'
+
+ SetDetailsPrint both
+ ok:
+!macroend
+
+# Copy of APP_ASSOCIATE and APP_UNASSOCIATE macros from here https://gist.github.com/nikku/281d0ef126dbc215dd58bfd5b3a5cd5b
+!macro APP_ASSOCIATE EXT FILECLASS DESCRIPTION ICON COMMANDTEXT COMMAND
+ ; Backup the previously associated file class
+ ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" ""
+ WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "${FILECLASS}_backup" "$R0"
+
+ WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "${FILECLASS}"
+
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}" "" `${DESCRIPTION}`
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\DefaultIcon" "" `${ICON}`
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell" "" "open"
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open" "" `${COMMANDTEXT}`
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open\command" "" `${COMMAND}`
+!macroend
+
+!macro APP_UNASSOCIATE EXT FILECLASS
+ ; Backup the previously associated file class
+ ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" `${FILECLASS}_backup`
+ WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "$R0"
+
+ DeleteRegKey SHELL_CONTEXT `Software\Classes\${FILECLASS}`
+!macroend
+
+!macro wails.associateFiles
+ ; Create file associations
+
+!macroend
+
+!macro wails.unassociateFiles
+ ; Delete app associations
+
+!macroend
+
+!macro CUSTOM_PROTOCOL_ASSOCIATE PROTOCOL DESCRIPTION ICON COMMAND
+ DeleteRegKey SHELL_CONTEXT "Software\Classes\${PROTOCOL}"
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}" "" "${DESCRIPTION}"
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}" "URL Protocol" ""
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\DefaultIcon" "" "${ICON}"
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\shell" "" ""
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\shell\open" "" ""
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\shell\open\command" "" "${COMMAND}"
+!macroend
+
+!macro CUSTOM_PROTOCOL_UNASSOCIATE PROTOCOL
+ DeleteRegKey SHELL_CONTEXT "Software\Classes\${PROTOCOL}"
+!macroend
+
+!macro wails.associateCustomProtocols
+ ; Create custom protocols associations
+
+!macroend
+
+!macro wails.unassociateCustomProtocols
+ ; Delete app custom protocol associations
+
+!macroend
diff --git a/build/windows/wails.exe.manifest b/build/windows/wails.exe.manifest
new file mode 100644
index 0000000..17e1a23
--- /dev/null
+++ b/build/windows/wails.exe.manifest
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+ true/pm
+ permonitorv2,permonitor
+
+
+
\ No newline at end of file
diff --git a/frontend/index.html b/frontend/index.html
index 5e2ca21..d0e694d 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -1,15 +1,12 @@
-
-
-
+
+
まぜそば大陸
-
-
-
-
+
+
+
-
diff --git a/frontend/jsconfig.json b/frontend/jsconfig.json
deleted file mode 100644
index 3918b4f..0000000
--- a/frontend/jsconfig.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "compilerOptions": {
- "moduleResolution": "Node",
- "target": "ESNext",
- "module": "ESNext",
- /**
- * svelte-preprocess cannot figure out whether you have
- * a value or a type, so tell TypeScript to enforce using
- * `import type` instead of `import` for Types.
- */
- "importsNotUsedAsValues": "error",
- "isolatedModules": true,
- "resolveJsonModule": true,
- /**
- * To have warnings / errors of the Svelte compiler at the
- * correct position, enable source maps by default.
- */
- "sourceMap": true,
- "esModuleInterop": true,
- "skipLibCheck": true,
- "forceConsistentCasingInFileNames": true,
- "baseUrl": ".",
- /**
- * Typecheck JS in `.svelte` and `.js` files by default.
- * Disable this if you'd like to use dynamic types.
- */
- "checkJs": true
- },
- /**
- * Use global.d.ts instead of compilerOptions.types
- * to avoid limiting type declarations.
- */
- "include": [
- "src/**/*.d.ts",
- "src/**/*.js",
- "src/**/*.svelte"
- ]
-}
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
deleted file mode 100644
index af95362..0000000
--- a/frontend/package-lock.json
+++ /dev/null
@@ -1,1673 +0,0 @@
-{
- "name": "frontend",
- "version": "0.0.0",
- "lockfileVersion": 2,
- "requires": true,
- "packages": {
- "": {
- "name": "frontend",
- "version": "0.0.0",
- "devDependencies": {
- "@sveltejs/vite-plugin-svelte": "^3.0.2",
- "svelte": "^4.2.12",
- "vite": "^5.2.7"
- }
- },
- "node_modules/@ampproject/remapping": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
- "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
- "dev": true,
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@esbuild/aix-ppc64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
- "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "aix"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/android-arm": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
- "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/android-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
- "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/android-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
- "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
- "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
- "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
- "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
- "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-arm": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
- "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
- "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
- "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
- "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
- "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
- "cpu": [
- "mips64el"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
- "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
- "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
- "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
- "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
- "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
- "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
- "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
- "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
- "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
- "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
- "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
- "dev": true,
- "dependencies": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
- "dev": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/set-array": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
- "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
- "dev": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
- "dev": true
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.22",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz",
- "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==",
- "dev": true,
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz",
- "integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-android-arm64": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz",
- "integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz",
- "integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz",
- "integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz",
- "integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz",
- "integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz",
- "integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz",
- "integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz",
- "integrity": "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz",
- "integrity": "sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz",
- "integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz",
- "integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz",
- "integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@sveltejs/vite-plugin-svelte": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.0.2.tgz",
- "integrity": "sha512-MpmF/cju2HqUls50WyTHQBZUV3ovV/Uk8k66AN2gwHogNAG8wnW8xtZDhzNBsFJJuvmq1qnzA5kE7YfMJNFv2Q==",
- "dev": true,
- "dependencies": {
- "@sveltejs/vite-plugin-svelte-inspector": "^2.0.0",
- "debug": "^4.3.4",
- "deepmerge": "^4.3.1",
- "kleur": "^4.1.5",
- "magic-string": "^0.30.5",
- "svelte-hmr": "^0.15.3",
- "vitefu": "^0.2.5"
- },
- "engines": {
- "node": "^18.0.0 || >=20"
- },
- "peerDependencies": {
- "svelte": "^4.0.0 || ^5.0.0-next.0",
- "vite": "^5.0.0"
- }
- },
- "node_modules/@sveltejs/vite-plugin-svelte/node_modules/@sveltejs/vite-plugin-svelte-inspector": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.0.0.tgz",
- "integrity": "sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==",
- "dev": true,
- "dependencies": {
- "debug": "^4.3.4"
- },
- "engines": {
- "node": "^18.0.0 || >=20"
- },
- "peerDependencies": {
- "@sveltejs/vite-plugin-svelte": "^3.0.0",
- "svelte": "^4.0.0 || ^5.0.0-next.0",
- "vite": "^5.0.0"
- }
- },
- "node_modules/@types/estree": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
- "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
- "dev": true
- },
- "node_modules/acorn": {
- "version": "8.11.3",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
- "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
- "dev": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/aria-query": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
- "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
- "dev": true,
- "dependencies": {
- "dequal": "^2.0.3"
- }
- },
- "node_modules/axobject-query": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz",
- "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==",
- "dev": true,
- "dependencies": {
- "dequal": "^2.0.3"
- }
- },
- "node_modules/code-red": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz",
- "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==",
- "dev": true,
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.4.15",
- "@types/estree": "^1.0.1",
- "acorn": "^8.10.0",
- "estree-walker": "^3.0.3",
- "periscopic": "^3.1.0"
- }
- },
- "node_modules/css-tree": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
- "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
- "dev": true,
- "dependencies": {
- "mdn-data": "2.0.30",
- "source-map-js": "^1.0.1"
- },
- "engines": {
- "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
- }
- },
- "node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/deepmerge": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
- "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/dequal": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
- "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/esbuild": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
- "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
- "dev": true,
- "hasInstallScript": true,
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=12"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.20.2",
- "@esbuild/android-arm": "0.20.2",
- "@esbuild/android-arm64": "0.20.2",
- "@esbuild/android-x64": "0.20.2",
- "@esbuild/darwin-arm64": "0.20.2",
- "@esbuild/darwin-x64": "0.20.2",
- "@esbuild/freebsd-arm64": "0.20.2",
- "@esbuild/freebsd-x64": "0.20.2",
- "@esbuild/linux-arm": "0.20.2",
- "@esbuild/linux-arm64": "0.20.2",
- "@esbuild/linux-ia32": "0.20.2",
- "@esbuild/linux-loong64": "0.20.2",
- "@esbuild/linux-mips64el": "0.20.2",
- "@esbuild/linux-ppc64": "0.20.2",
- "@esbuild/linux-riscv64": "0.20.2",
- "@esbuild/linux-s390x": "0.20.2",
- "@esbuild/linux-x64": "0.20.2",
- "@esbuild/netbsd-x64": "0.20.2",
- "@esbuild/openbsd-x64": "0.20.2",
- "@esbuild/sunos-x64": "0.20.2",
- "@esbuild/win32-arm64": "0.20.2",
- "@esbuild/win32-ia32": "0.20.2",
- "@esbuild/win32-x64": "0.20.2"
- }
- },
- "node_modules/estree-walker": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
- "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
- "dev": true,
- "dependencies": {
- "@types/estree": "^1.0.0"
- }
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/is-reference": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz",
- "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==",
- "dev": true,
- "dependencies": {
- "@types/estree": "*"
- }
- },
- "node_modules/kleur": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
- "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/locate-character": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
- "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
- "dev": true
- },
- "node_modules/magic-string": {
- "version": "0.30.7",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz",
- "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==",
- "dev": true,
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.4.15"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/mdn-data": {
- "version": "2.0.30",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
- "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
- "dev": true
- },
- "node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "node_modules/nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/periscopic": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz",
- "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==",
- "dev": true,
- "dependencies": {
- "@types/estree": "^1.0.0",
- "estree-walker": "^3.0.0",
- "is-reference": "^3.0.0"
- }
- },
- "node_modules/picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
- "dev": true
- },
- "node_modules/postcss": {
- "version": "8.4.38",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
- "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "dependencies": {
- "nanoid": "^3.3.7",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.2.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/rollup": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz",
- "integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==",
- "dev": true,
- "dependencies": {
- "@types/estree": "1.0.5"
- },
- "bin": {
- "rollup": "dist/bin/rollup"
- },
- "engines": {
- "node": ">=18.0.0",
- "npm": ">=8.0.0"
- },
- "optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.13.0",
- "@rollup/rollup-android-arm64": "4.13.0",
- "@rollup/rollup-darwin-arm64": "4.13.0",
- "@rollup/rollup-darwin-x64": "4.13.0",
- "@rollup/rollup-linux-arm-gnueabihf": "4.13.0",
- "@rollup/rollup-linux-arm64-gnu": "4.13.0",
- "@rollup/rollup-linux-arm64-musl": "4.13.0",
- "@rollup/rollup-linux-riscv64-gnu": "4.13.0",
- "@rollup/rollup-linux-x64-gnu": "4.13.0",
- "@rollup/rollup-linux-x64-musl": "4.13.0",
- "@rollup/rollup-win32-arm64-msvc": "4.13.0",
- "@rollup/rollup-win32-ia32-msvc": "4.13.0",
- "@rollup/rollup-win32-x64-msvc": "4.13.0",
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/source-map-js": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
- "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/svelte": {
- "version": "4.2.12",
- "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.12.tgz",
- "integrity": "sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug==",
- "dev": true,
- "dependencies": {
- "@ampproject/remapping": "^2.2.1",
- "@jridgewell/sourcemap-codec": "^1.4.15",
- "@jridgewell/trace-mapping": "^0.3.18",
- "@types/estree": "^1.0.1",
- "acorn": "^8.9.0",
- "aria-query": "^5.3.0",
- "axobject-query": "^4.0.0",
- "code-red": "^1.0.3",
- "css-tree": "^2.3.1",
- "estree-walker": "^3.0.3",
- "is-reference": "^3.0.1",
- "locate-character": "^3.0.0",
- "magic-string": "^0.30.4",
- "periscopic": "^3.1.0"
- },
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/svelte-hmr": {
- "version": "0.15.3",
- "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz",
- "integrity": "sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==",
- "dev": true,
- "engines": {
- "node": "^12.20 || ^14.13.1 || >= 16"
- },
- "peerDependencies": {
- "svelte": "^3.19.0 || ^4.0.0"
- }
- },
- "node_modules/vite": {
- "version": "5.2.7",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.7.tgz",
- "integrity": "sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA==",
- "dev": true,
- "dependencies": {
- "esbuild": "^0.20.1",
- "postcss": "^8.4.38",
- "rollup": "^4.13.0"
- },
- "bin": {
- "vite": "bin/vite.js"
- },
- "engines": {
- "node": "^18.0.0 || >=20.0.0"
- },
- "funding": {
- "url": "https://github.com/vitejs/vite?sponsor=1"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.3"
- },
- "peerDependencies": {
- "@types/node": "^18.0.0 || >=20.0.0",
- "less": "*",
- "lightningcss": "^1.21.0",
- "sass": "*",
- "stylus": "*",
- "sugarss": "*",
- "terser": "^5.4.0"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "less": {
- "optional": true
- },
- "lightningcss": {
- "optional": true
- },
- "sass": {
- "optional": true
- },
- "stylus": {
- "optional": true
- },
- "sugarss": {
- "optional": true
- },
- "terser": {
- "optional": true
- }
- }
- },
- "node_modules/vitefu": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz",
- "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==",
- "dev": true,
- "peerDependencies": {
- "vite": "^3.0.0 || ^4.0.0 || ^5.0.0"
- },
- "peerDependenciesMeta": {
- "vite": {
- "optional": true
- }
- }
- }
- },
- "dependencies": {
- "@ampproject/remapping": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
- "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
- "dev": true,
- "requires": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- },
- "@esbuild/aix-ppc64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
- "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
- "dev": true,
- "optional": true
- },
- "@esbuild/android-arm": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
- "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
- "dev": true,
- "optional": true
- },
- "@esbuild/android-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
- "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
- "dev": true,
- "optional": true
- },
- "@esbuild/android-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
- "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
- "dev": true,
- "optional": true
- },
- "@esbuild/darwin-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
- "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
- "dev": true,
- "optional": true
- },
- "@esbuild/darwin-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
- "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
- "dev": true,
- "optional": true
- },
- "@esbuild/freebsd-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
- "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
- "dev": true,
- "optional": true
- },
- "@esbuild/freebsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
- "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-arm": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
- "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
- "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-ia32": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
- "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-loong64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
- "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-mips64el": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
- "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-ppc64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
- "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-riscv64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
- "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-s390x": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
- "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
- "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
- "dev": true,
- "optional": true
- },
- "@esbuild/netbsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
- "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
- "dev": true,
- "optional": true
- },
- "@esbuild/openbsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
- "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
- "dev": true,
- "optional": true
- },
- "@esbuild/sunos-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
- "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
- "dev": true,
- "optional": true
- },
- "@esbuild/win32-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
- "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
- "dev": true,
- "optional": true
- },
- "@esbuild/win32-ia32": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
- "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
- "dev": true,
- "optional": true
- },
- "@esbuild/win32-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
- "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
- "dev": true,
- "optional": true
- },
- "@jridgewell/gen-mapping": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
- "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
- "dev": true,
- "requires": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- },
- "@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
- "dev": true
- },
- "@jridgewell/set-array": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
- "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
- "dev": true
- },
- "@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
- "dev": true
- },
- "@jridgewell/trace-mapping": {
- "version": "0.3.22",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz",
- "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==",
- "dev": true,
- "requires": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "@rollup/rollup-android-arm-eabi": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz",
- "integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==",
- "dev": true,
- "optional": true
- },
- "@rollup/rollup-android-arm64": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz",
- "integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==",
- "dev": true,
- "optional": true
- },
- "@rollup/rollup-darwin-arm64": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz",
- "integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==",
- "dev": true,
- "optional": true
- },
- "@rollup/rollup-darwin-x64": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz",
- "integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==",
- "dev": true,
- "optional": true
- },
- "@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz",
- "integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==",
- "dev": true,
- "optional": true
- },
- "@rollup/rollup-linux-arm64-gnu": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz",
- "integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==",
- "dev": true,
- "optional": true
- },
- "@rollup/rollup-linux-arm64-musl": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz",
- "integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==",
- "dev": true,
- "optional": true
- },
- "@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz",
- "integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==",
- "dev": true,
- "optional": true
- },
- "@rollup/rollup-linux-x64-gnu": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz",
- "integrity": "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==",
- "dev": true,
- "optional": true
- },
- "@rollup/rollup-linux-x64-musl": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz",
- "integrity": "sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==",
- "dev": true,
- "optional": true
- },
- "@rollup/rollup-win32-arm64-msvc": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz",
- "integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==",
- "dev": true,
- "optional": true
- },
- "@rollup/rollup-win32-ia32-msvc": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz",
- "integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==",
- "dev": true,
- "optional": true
- },
- "@rollup/rollup-win32-x64-msvc": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz",
- "integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==",
- "dev": true,
- "optional": true
- },
- "@sveltejs/vite-plugin-svelte": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.0.2.tgz",
- "integrity": "sha512-MpmF/cju2HqUls50WyTHQBZUV3ovV/Uk8k66AN2gwHogNAG8wnW8xtZDhzNBsFJJuvmq1qnzA5kE7YfMJNFv2Q==",
- "dev": true,
- "requires": {
- "@sveltejs/vite-plugin-svelte-inspector": "^2.0.0",
- "debug": "^4.3.4",
- "deepmerge": "^4.3.1",
- "kleur": "^4.1.5",
- "magic-string": "^0.30.5",
- "svelte-hmr": "^0.15.3",
- "vitefu": "^0.2.5"
- },
- "dependencies": {
- "@sveltejs/vite-plugin-svelte-inspector": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.0.0.tgz",
- "integrity": "sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==",
- "dev": true,
- "requires": {
- "debug": "^4.3.4"
- }
- }
- }
- },
- "@types/estree": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
- "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
- "dev": true
- },
- "acorn": {
- "version": "8.11.3",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
- "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
- "dev": true
- },
- "aria-query": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
- "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
- "dev": true,
- "requires": {
- "dequal": "^2.0.3"
- }
- },
- "axobject-query": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz",
- "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==",
- "dev": true,
- "requires": {
- "dequal": "^2.0.3"
- }
- },
- "code-red": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz",
- "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==",
- "dev": true,
- "requires": {
- "@jridgewell/sourcemap-codec": "^1.4.15",
- "@types/estree": "^1.0.1",
- "acorn": "^8.10.0",
- "estree-walker": "^3.0.3",
- "periscopic": "^3.1.0"
- }
- },
- "css-tree": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
- "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
- "dev": true,
- "requires": {
- "mdn-data": "2.0.30",
- "source-map-js": "^1.0.1"
- }
- },
- "debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "deepmerge": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
- "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
- "dev": true
- },
- "dequal": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
- "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
- "dev": true
- },
- "esbuild": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
- "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
- "dev": true,
- "requires": {
- "@esbuild/aix-ppc64": "0.20.2",
- "@esbuild/android-arm": "0.20.2",
- "@esbuild/android-arm64": "0.20.2",
- "@esbuild/android-x64": "0.20.2",
- "@esbuild/darwin-arm64": "0.20.2",
- "@esbuild/darwin-x64": "0.20.2",
- "@esbuild/freebsd-arm64": "0.20.2",
- "@esbuild/freebsd-x64": "0.20.2",
- "@esbuild/linux-arm": "0.20.2",
- "@esbuild/linux-arm64": "0.20.2",
- "@esbuild/linux-ia32": "0.20.2",
- "@esbuild/linux-loong64": "0.20.2",
- "@esbuild/linux-mips64el": "0.20.2",
- "@esbuild/linux-ppc64": "0.20.2",
- "@esbuild/linux-riscv64": "0.20.2",
- "@esbuild/linux-s390x": "0.20.2",
- "@esbuild/linux-x64": "0.20.2",
- "@esbuild/netbsd-x64": "0.20.2",
- "@esbuild/openbsd-x64": "0.20.2",
- "@esbuild/sunos-x64": "0.20.2",
- "@esbuild/win32-arm64": "0.20.2",
- "@esbuild/win32-ia32": "0.20.2",
- "@esbuild/win32-x64": "0.20.2"
- }
- },
- "estree-walker": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
- "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
- "dev": true,
- "requires": {
- "@types/estree": "^1.0.0"
- }
- },
- "fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "dev": true,
- "optional": true
- },
- "is-reference": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz",
- "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==",
- "dev": true,
- "requires": {
- "@types/estree": "*"
- }
- },
- "kleur": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
- "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
- "dev": true
- },
- "locate-character": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
- "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
- "dev": true
- },
- "magic-string": {
- "version": "0.30.7",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz",
- "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==",
- "dev": true,
- "requires": {
- "@jridgewell/sourcemap-codec": "^1.4.15"
- }
- },
- "mdn-data": {
- "version": "2.0.30",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
- "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
- "dev": true
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
- "dev": true
- },
- "periscopic": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz",
- "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==",
- "dev": true,
- "requires": {
- "@types/estree": "^1.0.0",
- "estree-walker": "^3.0.0",
- "is-reference": "^3.0.0"
- }
- },
- "picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
- "dev": true
- },
- "postcss": {
- "version": "8.4.38",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
- "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
- "dev": true,
- "requires": {
- "nanoid": "^3.3.7",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.2.0"
- }
- },
- "rollup": {
- "version": "4.13.0",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz",
- "integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==",
- "dev": true,
- "requires": {
- "@rollup/rollup-android-arm-eabi": "4.13.0",
- "@rollup/rollup-android-arm64": "4.13.0",
- "@rollup/rollup-darwin-arm64": "4.13.0",
- "@rollup/rollup-darwin-x64": "4.13.0",
- "@rollup/rollup-linux-arm-gnueabihf": "4.13.0",
- "@rollup/rollup-linux-arm64-gnu": "4.13.0",
- "@rollup/rollup-linux-arm64-musl": "4.13.0",
- "@rollup/rollup-linux-riscv64-gnu": "4.13.0",
- "@rollup/rollup-linux-x64-gnu": "4.13.0",
- "@rollup/rollup-linux-x64-musl": "4.13.0",
- "@rollup/rollup-win32-arm64-msvc": "4.13.0",
- "@rollup/rollup-win32-ia32-msvc": "4.13.0",
- "@rollup/rollup-win32-x64-msvc": "4.13.0",
- "@types/estree": "1.0.5",
- "fsevents": "~2.3.2"
- }
- },
- "source-map-js": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
- "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
- "dev": true
- },
- "svelte": {
- "version": "4.2.12",
- "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.12.tgz",
- "integrity": "sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug==",
- "dev": true,
- "requires": {
- "@ampproject/remapping": "^2.2.1",
- "@jridgewell/sourcemap-codec": "^1.4.15",
- "@jridgewell/trace-mapping": "^0.3.18",
- "@types/estree": "^1.0.1",
- "acorn": "^8.9.0",
- "aria-query": "^5.3.0",
- "axobject-query": "^4.0.0",
- "code-red": "^1.0.3",
- "css-tree": "^2.3.1",
- "estree-walker": "^3.0.3",
- "is-reference": "^3.0.1",
- "locate-character": "^3.0.0",
- "magic-string": "^0.30.4",
- "periscopic": "^3.1.0"
- }
- },
- "svelte-hmr": {
- "version": "0.15.3",
- "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz",
- "integrity": "sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==",
- "dev": true,
- "requires": {}
- },
- "vite": {
- "version": "5.2.7",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.7.tgz",
- "integrity": "sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA==",
- "dev": true,
- "requires": {
- "esbuild": "^0.20.1",
- "fsevents": "~2.3.3",
- "postcss": "^8.4.38",
- "rollup": "^4.13.0"
- }
- },
- "vitefu": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz",
- "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==",
- "dev": true,
- "requires": {}
- }
- }
-}
diff --git a/frontend/package.json b/frontend/package.json
index dad104d..e4e0ed8 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -6,11 +6,20 @@
"scripts": {
"dev": "vite",
"build": "vite build",
- "preview": "vite preview"
+ "preview": "vite preview",
+ "check": "svelte-check --tsconfig ./tsconfig.json",
+ "test": "vitest"
},
"devDependencies": {
"@sveltejs/vite-plugin-svelte": "^3.0.2",
+ "@tsconfig/svelte": "^5.0.2",
+ "@vitest/coverage-v8": "^1.4.0",
"svelte": "^4.2.12",
- "vite": "^5.2.7"
+ "svelte-check": "^3.6.7",
+ "svelte-preprocess": "^5.1.3",
+ "tslib": "^2.6.2",
+ "typescript": "^5.4.2",
+ "vite": "^5.2.7",
+ "vitest": "^1.4.0"
}
-}
\ No newline at end of file
+}
diff --git a/frontend/package.json.md5 b/frontend/package.json.md5
index 2b28011..b75747e 100755
--- a/frontend/package.json.md5
+++ b/frontend/package.json.md5
@@ -1 +1 @@
-6faf32c9fcd1f3bdc344cce03c10821a
\ No newline at end of file
+97da30c27d059cb72875b607f550fac5
\ No newline at end of file
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
new file mode 100644
index 0000000..986b310
--- /dev/null
+++ b/frontend/pnpm-lock.yaml
@@ -0,0 +1,1698 @@
+lockfileVersion: '6.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+devDependencies:
+ '@sveltejs/vite-plugin-svelte':
+ specifier: ^3.0.2
+ version: 3.0.2(svelte@4.2.12)(vite@5.2.8)
+ '@tsconfig/svelte':
+ specifier: ^5.0.2
+ version: 5.0.2
+ '@vitest/coverage-v8':
+ specifier: ^1.4.0
+ version: 1.4.0(vitest@1.4.0)
+ svelte:
+ specifier: ^4.2.12
+ version: 4.2.12
+ svelte-check:
+ specifier: ^3.6.7
+ version: 3.6.7(svelte@4.2.12)
+ svelte-preprocess:
+ specifier: ^5.1.3
+ version: 5.1.3(svelte@4.2.12)(typescript@5.4.2)
+ tslib:
+ specifier: ^2.6.2
+ version: 2.6.2
+ typescript:
+ specifier: ^5.4.2
+ version: 5.4.2
+ vite:
+ specifier: ^5.2.7
+ version: 5.2.8
+ vitest:
+ specifier: ^1.4.0
+ version: 1.4.0
+
+packages:
+
+ /@ampproject/remapping@2.3.0:
+ resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+ dev: true
+
+ /@babel/helper-string-parser@7.24.1:
+ resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/helper-validator-identifier@7.22.20:
+ resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/parser@7.24.4:
+ resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+ dependencies:
+ '@babel/types': 7.24.0
+ dev: true
+
+ /@babel/types@7.24.0:
+ resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-string-parser': 7.24.1
+ '@babel/helper-validator-identifier': 7.22.20
+ to-fast-properties: 2.0.0
+ dev: true
+
+ /@bcoe/v8-coverage@0.2.3:
+ resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
+ dev: true
+
+ /@esbuild/aix-ppc64@0.20.2:
+ resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [aix]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/android-arm64@0.20.2:
+ resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/android-arm@0.20.2:
+ resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/android-x64@0.20.2:
+ resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/darwin-arm64@0.20.2:
+ resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/darwin-x64@0.20.2:
+ resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/freebsd-arm64@0.20.2:
+ resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/freebsd-x64@0.20.2:
+ resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-arm64@0.20.2:
+ resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-arm@0.20.2:
+ resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-ia32@0.20.2:
+ resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-loong64@0.20.2:
+ resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-mips64el@0.20.2:
+ resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-ppc64@0.20.2:
+ resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-riscv64@0.20.2:
+ resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-s390x@0.20.2:
+ resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-x64@0.20.2:
+ resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/netbsd-x64@0.20.2:
+ resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/openbsd-x64@0.20.2:
+ resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/sunos-x64@0.20.2:
+ resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-arm64@0.20.2:
+ resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-ia32@0.20.2:
+ resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-x64@0.20.2:
+ resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@istanbuljs/schema@0.1.3:
+ resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /@jest/schemas@29.6.3:
+ resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@sinclair/typebox': 0.27.8
+ dev: true
+
+ /@jridgewell/gen-mapping@0.3.5:
+ resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/set-array': 1.2.1
+ '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/trace-mapping': 0.3.25
+ dev: true
+
+ /@jridgewell/resolve-uri@3.1.2:
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+ dev: true
+
+ /@jridgewell/set-array@1.2.1:
+ resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
+ engines: {node: '>=6.0.0'}
+ dev: true
+
+ /@jridgewell/sourcemap-codec@1.4.15:
+ resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
+ dev: true
+
+ /@jridgewell/trace-mapping@0.3.25:
+ resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.4.15
+ dev: true
+
+ /@nodelib/fs.scandir@2.1.5:
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+ dev: true
+
+ /@nodelib/fs.stat@2.0.5:
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /@nodelib/fs.walk@1.2.8:
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.17.1
+ dev: true
+
+ /@rollup/rollup-android-arm-eabi@4.13.0:
+ resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==}
+ cpu: [arm]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-android-arm64@4.13.0:
+ resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-darwin-arm64@4.13.0:
+ resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-darwin-x64@4.13.0:
+ resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-linux-arm-gnueabihf@4.13.0:
+ resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-linux-arm64-gnu@4.13.0:
+ resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-linux-arm64-musl@4.13.0:
+ resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-linux-riscv64-gnu@4.13.0:
+ resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-linux-x64-gnu@4.13.0:
+ resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-linux-x64-musl@4.13.0:
+ resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-win32-arm64-msvc@4.13.0:
+ resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-win32-ia32-msvc@4.13.0:
+ resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@rollup/rollup-win32-x64-msvc@4.13.0:
+ resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@sinclair/typebox@0.27.8:
+ resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
+ dev: true
+
+ /@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.8):
+ resolution: {integrity: sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==}
+ engines: {node: ^18.0.0 || >=20}
+ peerDependencies:
+ '@sveltejs/vite-plugin-svelte': ^3.0.0
+ svelte: ^4.0.0 || ^5.0.0-next.0
+ vite: ^5.0.0
+ dependencies:
+ '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.12)(vite@5.2.8)
+ debug: 4.3.4
+ svelte: 4.2.12
+ vite: 5.2.8
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@sveltejs/vite-plugin-svelte@3.0.2(svelte@4.2.12)(vite@5.2.8):
+ resolution: {integrity: sha512-MpmF/cju2HqUls50WyTHQBZUV3ovV/Uk8k66AN2gwHogNAG8wnW8xtZDhzNBsFJJuvmq1qnzA5kE7YfMJNFv2Q==}
+ engines: {node: ^18.0.0 || >=20}
+ peerDependencies:
+ svelte: ^4.0.0 || ^5.0.0-next.0
+ vite: ^5.0.0
+ dependencies:
+ '@sveltejs/vite-plugin-svelte-inspector': 2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.2.8)
+ debug: 4.3.4
+ deepmerge: 4.3.1
+ kleur: 4.1.5
+ magic-string: 0.30.8
+ svelte: 4.2.12
+ svelte-hmr: 0.15.3(svelte@4.2.12)
+ vite: 5.2.8
+ vitefu: 0.2.5(vite@5.2.8)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@tsconfig/svelte@5.0.2:
+ resolution: {integrity: sha512-BRbo1fOtyVbhfLyuCWw6wAWp+U8UQle+ZXu84MYYWzYSEB28dyfnRBIE99eoG+qdAC0po6L2ScIEivcT07UaMA==}
+ dev: true
+
+ /@types/estree@1.0.5:
+ resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
+ dev: true
+
+ /@types/istanbul-lib-coverage@2.0.6:
+ resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==}
+ dev: true
+
+ /@types/pug@2.0.10:
+ resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==}
+ dev: true
+
+ /@vitest/coverage-v8@1.4.0(vitest@1.4.0):
+ resolution: {integrity: sha512-4hDGyH1SvKpgZnIByr9LhGgCEuF9DKM34IBLCC/fVfy24Z3+PZ+Ii9hsVBsHvY1umM1aGPEjceRkzxCfcQ10wg==}
+ peerDependencies:
+ vitest: 1.4.0
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@bcoe/v8-coverage': 0.2.3
+ debug: 4.3.4
+ istanbul-lib-coverage: 3.2.2
+ istanbul-lib-report: 3.0.1
+ istanbul-lib-source-maps: 5.0.4
+ istanbul-reports: 3.1.7
+ magic-string: 0.30.8
+ magicast: 0.3.3
+ picocolors: 1.0.0
+ std-env: 3.7.0
+ strip-literal: 2.1.0
+ test-exclude: 6.0.0
+ v8-to-istanbul: 9.2.0
+ vitest: 1.4.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@vitest/expect@1.4.0:
+ resolution: {integrity: sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==}
+ dependencies:
+ '@vitest/spy': 1.4.0
+ '@vitest/utils': 1.4.0
+ chai: 4.4.1
+ dev: true
+
+ /@vitest/runner@1.4.0:
+ resolution: {integrity: sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==}
+ dependencies:
+ '@vitest/utils': 1.4.0
+ p-limit: 5.0.0
+ pathe: 1.1.2
+ dev: true
+
+ /@vitest/snapshot@1.4.0:
+ resolution: {integrity: sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==}
+ dependencies:
+ magic-string: 0.30.8
+ pathe: 1.1.2
+ pretty-format: 29.7.0
+ dev: true
+
+ /@vitest/spy@1.4.0:
+ resolution: {integrity: sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==}
+ dependencies:
+ tinyspy: 2.2.1
+ dev: true
+
+ /@vitest/utils@1.4.0:
+ resolution: {integrity: sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==}
+ dependencies:
+ diff-sequences: 29.6.3
+ estree-walker: 3.0.3
+ loupe: 2.3.7
+ pretty-format: 29.7.0
+ dev: true
+
+ /acorn-walk@8.3.2:
+ resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==}
+ engines: {node: '>=0.4.0'}
+ dev: true
+
+ /acorn@8.11.3:
+ resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+ dev: true
+
+ /ansi-styles@5.2.0:
+ resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+ dev: true
+
+ /aria-query@5.3.0:
+ resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
+ dependencies:
+ dequal: 2.0.3
+ dev: true
+
+ /assertion-error@1.1.0:
+ resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
+ dev: true
+
+ /axobject-query@4.0.0:
+ resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==}
+ dependencies:
+ dequal: 2.0.3
+ dev: true
+
+ /balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+ dev: true
+
+ /binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /brace-expansion@1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+ dev: true
+
+ /braces@3.0.2:
+ resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
+ engines: {node: '>=8'}
+ dependencies:
+ fill-range: 7.0.1
+ dev: true
+
+ /buffer-crc32@0.2.13:
+ resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
+ dev: true
+
+ /cac@6.7.14:
+ resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /chai@4.4.1:
+ resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==}
+ engines: {node: '>=4'}
+ dependencies:
+ assertion-error: 1.1.0
+ check-error: 1.0.3
+ deep-eql: 4.1.3
+ get-func-name: 2.0.2
+ loupe: 2.3.7
+ pathval: 1.1.1
+ type-detect: 4.0.8
+ dev: true
+
+ /check-error@1.0.3:
+ resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==}
+ dependencies:
+ get-func-name: 2.0.2
+ dev: true
+
+ /chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+ engines: {node: '>= 8.10.0'}
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.2
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.3
+ dev: true
+
+ /code-red@1.0.4:
+ resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==}
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.4.15
+ '@types/estree': 1.0.5
+ acorn: 8.11.3
+ estree-walker: 3.0.3
+ periscopic: 3.1.0
+ dev: true
+
+ /concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+ dev: true
+
+ /convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+ dev: true
+
+ /cross-spawn@7.0.3:
+ resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
+ engines: {node: '>= 8'}
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+ dev: true
+
+ /css-tree@2.3.1:
+ resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+ dependencies:
+ mdn-data: 2.0.30
+ source-map-js: 1.0.2
+ dev: true
+
+ /debug@4.3.4:
+ resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.2
+ dev: true
+
+ /deep-eql@4.1.3:
+ resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==}
+ engines: {node: '>=6'}
+ dependencies:
+ type-detect: 4.0.8
+ dev: true
+
+ /deepmerge@4.3.1:
+ resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /detect-indent@6.1.0:
+ resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /diff-sequences@29.6.3:
+ resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dev: true
+
+ /es6-promise@3.3.1:
+ resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==}
+ dev: true
+
+ /esbuild@0.20.2:
+ resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==}
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.20.2
+ '@esbuild/android-arm': 0.20.2
+ '@esbuild/android-arm64': 0.20.2
+ '@esbuild/android-x64': 0.20.2
+ '@esbuild/darwin-arm64': 0.20.2
+ '@esbuild/darwin-x64': 0.20.2
+ '@esbuild/freebsd-arm64': 0.20.2
+ '@esbuild/freebsd-x64': 0.20.2
+ '@esbuild/linux-arm': 0.20.2
+ '@esbuild/linux-arm64': 0.20.2
+ '@esbuild/linux-ia32': 0.20.2
+ '@esbuild/linux-loong64': 0.20.2
+ '@esbuild/linux-mips64el': 0.20.2
+ '@esbuild/linux-ppc64': 0.20.2
+ '@esbuild/linux-riscv64': 0.20.2
+ '@esbuild/linux-s390x': 0.20.2
+ '@esbuild/linux-x64': 0.20.2
+ '@esbuild/netbsd-x64': 0.20.2
+ '@esbuild/openbsd-x64': 0.20.2
+ '@esbuild/sunos-x64': 0.20.2
+ '@esbuild/win32-arm64': 0.20.2
+ '@esbuild/win32-ia32': 0.20.2
+ '@esbuild/win32-x64': 0.20.2
+ dev: true
+
+ /estree-walker@3.0.3:
+ resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+ dependencies:
+ '@types/estree': 1.0.5
+ dev: true
+
+ /execa@8.0.1:
+ resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
+ engines: {node: '>=16.17'}
+ dependencies:
+ cross-spawn: 7.0.3
+ get-stream: 8.0.1
+ human-signals: 5.0.0
+ is-stream: 3.0.0
+ merge-stream: 2.0.0
+ npm-run-path: 5.3.0
+ onetime: 6.0.0
+ signal-exit: 4.1.0
+ strip-final-newline: 3.0.0
+ dev: true
+
+ /fast-glob@3.3.2:
+ resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
+ engines: {node: '>=8.6.0'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.5
+ dev: true
+
+ /fastq@1.17.1:
+ resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
+ dependencies:
+ reusify: 1.0.4
+ dev: true
+
+ /fill-range@7.0.1:
+ resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ to-regex-range: 5.0.1
+ dev: true
+
+ /fs.realpath@1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+ dev: true
+
+ /fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /get-func-name@2.0.2:
+ resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==}
+ dev: true
+
+ /get-stream@8.0.1:
+ resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
+ engines: {node: '>=16'}
+ dev: true
+
+ /glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: true
+
+ /glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+ dev: true
+
+ /graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+ dev: true
+
+ /has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /html-escaper@2.0.2:
+ resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
+ dev: true
+
+ /human-signals@5.0.0:
+ resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
+ engines: {node: '>=16.17.0'}
+ dev: true
+
+ /import-fresh@3.3.0:
+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+ engines: {node: '>=6'}
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+ dev: true
+
+ /inflight@1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+ dev: true
+
+ /inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+ dev: true
+
+ /is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+ dependencies:
+ binary-extensions: 2.3.0
+ dev: true
+
+ /is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extglob: 2.1.1
+ dev: true
+
+ /is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+ dev: true
+
+ /is-reference@3.0.2:
+ resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==}
+ dependencies:
+ '@types/estree': 1.0.5
+ dev: true
+
+ /is-stream@3.0.0:
+ resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: true
+
+ /isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+ dev: true
+
+ /istanbul-lib-coverage@3.2.2:
+ resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /istanbul-lib-report@3.0.1:
+ resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
+ engines: {node: '>=10'}
+ dependencies:
+ istanbul-lib-coverage: 3.2.2
+ make-dir: 4.0.0
+ supports-color: 7.2.0
+ dev: true
+
+ /istanbul-lib-source-maps@5.0.4:
+ resolution: {integrity: sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==}
+ engines: {node: '>=10'}
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.25
+ debug: 4.3.4
+ istanbul-lib-coverage: 3.2.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /istanbul-reports@3.1.7:
+ resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==}
+ engines: {node: '>=8'}
+ dependencies:
+ html-escaper: 2.0.2
+ istanbul-lib-report: 3.0.1
+ dev: true
+
+ /js-tokens@9.0.0:
+ resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==}
+ dev: true
+
+ /jsonc-parser@3.2.1:
+ resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==}
+ dev: true
+
+ /kleur@4.1.5:
+ resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /local-pkg@0.5.0:
+ resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==}
+ engines: {node: '>=14'}
+ dependencies:
+ mlly: 1.6.1
+ pkg-types: 1.0.3
+ dev: true
+
+ /locate-character@3.0.0:
+ resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==}
+ dev: true
+
+ /loupe@2.3.7:
+ resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
+ dependencies:
+ get-func-name: 2.0.2
+ dev: true
+
+ /lru-cache@6.0.0:
+ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
+ engines: {node: '>=10'}
+ dependencies:
+ yallist: 4.0.0
+ dev: true
+
+ /magic-string@0.30.8:
+ resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.4.15
+ dev: true
+
+ /magicast@0.3.3:
+ resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==}
+ dependencies:
+ '@babel/parser': 7.24.4
+ '@babel/types': 7.24.0
+ source-map-js: 1.0.2
+ dev: true
+
+ /make-dir@4.0.0:
+ resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
+ engines: {node: '>=10'}
+ dependencies:
+ semver: 7.6.0
+ dev: true
+
+ /mdn-data@2.0.30:
+ resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
+ dev: true
+
+ /merge-stream@2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+ dev: true
+
+ /merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /micromatch@4.0.5:
+ resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ braces: 3.0.2
+ picomatch: 2.3.1
+ dev: true
+
+ /mimic-fn@4.0.0:
+ resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /min-indent@1.0.1:
+ resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+ dependencies:
+ brace-expansion: 1.1.11
+ dev: true
+
+ /minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+ dev: true
+
+ /mkdirp@0.5.6:
+ resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
+ hasBin: true
+ dependencies:
+ minimist: 1.2.8
+ dev: true
+
+ /mlly@1.6.1:
+ resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==}
+ dependencies:
+ acorn: 8.11.3
+ pathe: 1.1.2
+ pkg-types: 1.0.3
+ ufo: 1.5.3
+ dev: true
+
+ /mri@1.2.0:
+ resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /ms@2.1.2:
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+ dev: true
+
+ /nanoid@3.3.7:
+ resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+ dev: true
+
+ /normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /npm-run-path@5.3.0:
+ resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ path-key: 4.0.0
+ dev: true
+
+ /once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+ dependencies:
+ wrappy: 1.0.2
+ dev: true
+
+ /onetime@6.0.0:
+ resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ mimic-fn: 4.0.0
+ dev: true
+
+ /p-limit@5.0.0:
+ resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==}
+ engines: {node: '>=18'}
+ dependencies:
+ yocto-queue: 1.0.0
+ dev: true
+
+ /parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+ dependencies:
+ callsites: 3.1.0
+ dev: true
+
+ /path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /path-key@4.0.0:
+ resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /pathe@1.1.2:
+ resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
+ dev: true
+
+ /pathval@1.1.1:
+ resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==}
+ dev: true
+
+ /periscopic@3.1.0:
+ resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==}
+ dependencies:
+ '@types/estree': 1.0.5
+ estree-walker: 3.0.3
+ is-reference: 3.0.2
+ dev: true
+
+ /picocolors@1.0.0:
+ resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+ dev: true
+
+ /picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+ dev: true
+
+ /pkg-types@1.0.3:
+ resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==}
+ dependencies:
+ jsonc-parser: 3.2.1
+ mlly: 1.6.1
+ pathe: 1.1.2
+ dev: true
+
+ /postcss@8.4.38:
+ resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==}
+ engines: {node: ^10 || ^12 || >=14}
+ dependencies:
+ nanoid: 3.3.7
+ picocolors: 1.0.0
+ source-map-js: 1.2.0
+ dev: true
+
+ /pretty-format@29.7.0:
+ resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/schemas': 29.6.3
+ ansi-styles: 5.2.0
+ react-is: 18.2.0
+ dev: true
+
+ /queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+ dev: true
+
+ /react-is@18.2.0:
+ resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
+ dev: true
+
+ /readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+ dependencies:
+ picomatch: 2.3.1
+ dev: true
+
+ /resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /reusify@1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+ dev: true
+
+ /rimraf@2.7.1:
+ resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
+ hasBin: true
+ dependencies:
+ glob: 7.2.3
+ dev: true
+
+ /rollup@4.13.0:
+ resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+ dependencies:
+ '@types/estree': 1.0.5
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.13.0
+ '@rollup/rollup-android-arm64': 4.13.0
+ '@rollup/rollup-darwin-arm64': 4.13.0
+ '@rollup/rollup-darwin-x64': 4.13.0
+ '@rollup/rollup-linux-arm-gnueabihf': 4.13.0
+ '@rollup/rollup-linux-arm64-gnu': 4.13.0
+ '@rollup/rollup-linux-arm64-musl': 4.13.0
+ '@rollup/rollup-linux-riscv64-gnu': 4.13.0
+ '@rollup/rollup-linux-x64-gnu': 4.13.0
+ '@rollup/rollup-linux-x64-musl': 4.13.0
+ '@rollup/rollup-win32-arm64-msvc': 4.13.0
+ '@rollup/rollup-win32-ia32-msvc': 4.13.0
+ '@rollup/rollup-win32-x64-msvc': 4.13.0
+ fsevents: 2.3.3
+ dev: true
+
+ /run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ dependencies:
+ queue-microtask: 1.2.3
+ dev: true
+
+ /sade@1.8.1:
+ resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
+ engines: {node: '>=6'}
+ dependencies:
+ mri: 1.2.0
+ dev: true
+
+ /sander@0.5.1:
+ resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==}
+ dependencies:
+ es6-promise: 3.3.1
+ graceful-fs: 4.2.11
+ mkdirp: 0.5.6
+ rimraf: 2.7.1
+ dev: true
+
+ /semver@7.6.0:
+ resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dependencies:
+ lru-cache: 6.0.0
+ dev: true
+
+ /shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+ dependencies:
+ shebang-regex: 3.0.0
+ dev: true
+
+ /shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /siginfo@2.0.0:
+ resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
+ dev: true
+
+ /signal-exit@4.1.0:
+ resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+ engines: {node: '>=14'}
+ dev: true
+
+ /sorcery@0.11.0:
+ resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==}
+ hasBin: true
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.4.15
+ buffer-crc32: 0.2.13
+ minimist: 1.2.8
+ sander: 0.5.1
+ dev: true
+
+ /source-map-js@1.0.2:
+ resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /source-map-js@1.2.0:
+ resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /stackback@0.0.2:
+ resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+ dev: true
+
+ /std-env@3.7.0:
+ resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==}
+ dev: true
+
+ /strip-final-newline@3.0.0:
+ resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /strip-indent@3.0.0:
+ resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ min-indent: 1.0.1
+ dev: true
+
+ /strip-literal@2.1.0:
+ resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==}
+ dependencies:
+ js-tokens: 9.0.0
+ dev: true
+
+ /supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+ dependencies:
+ has-flag: 4.0.0
+ dev: true
+
+ /svelte-check@3.6.7(svelte@4.2.12):
+ resolution: {integrity: sha512-tKEjemK9FYCySAseCaIt+ps5o0XRvLC7ECjyJXXtO7vOQhR9E6JavgoUbGP1PCulD2OTcB/fi9RjV3nyF1AROw==}
+ hasBin: true
+ peerDependencies:
+ svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.25
+ chokidar: 3.6.0
+ fast-glob: 3.3.2
+ import-fresh: 3.3.0
+ picocolors: 1.0.0
+ sade: 1.8.1
+ svelte: 4.2.12
+ svelte-preprocess: 5.1.3(svelte@4.2.12)(typescript@5.4.2)
+ typescript: 5.4.2
+ transitivePeerDependencies:
+ - '@babel/core'
+ - coffeescript
+ - less
+ - postcss
+ - postcss-load-config
+ - pug
+ - sass
+ - stylus
+ - sugarss
+ dev: true
+
+ /svelte-hmr@0.15.3(svelte@4.2.12):
+ resolution: {integrity: sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==}
+ engines: {node: ^12.20 || ^14.13.1 || >= 16}
+ peerDependencies:
+ svelte: ^3.19.0 || ^4.0.0
+ dependencies:
+ svelte: 4.2.12
+ dev: true
+
+ /svelte-preprocess@5.1.3(svelte@4.2.12)(typescript@5.4.2):
+ resolution: {integrity: sha512-xxAkmxGHT+J/GourS5mVJeOXZzne1FR5ljeOUAMXUkfEhkLEllRreXpbl3dIYJlcJRfL1LO1uIAPpBpBfiqGPw==}
+ engines: {node: '>= 16.0.0', pnpm: ^8.0.0}
+ requiresBuild: true
+ peerDependencies:
+ '@babel/core': ^7.10.2
+ coffeescript: ^2.5.1
+ less: ^3.11.3 || ^4.0.0
+ postcss: ^7 || ^8
+ postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0
+ pug: ^3.0.0
+ sass: ^1.26.8
+ stylus: ^0.55.0
+ sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0
+ svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0
+ typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0'
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ coffeescript:
+ optional: true
+ less:
+ optional: true
+ postcss:
+ optional: true
+ postcss-load-config:
+ optional: true
+ pug:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ typescript:
+ optional: true
+ dependencies:
+ '@types/pug': 2.0.10
+ detect-indent: 6.1.0
+ magic-string: 0.30.8
+ sorcery: 0.11.0
+ strip-indent: 3.0.0
+ svelte: 4.2.12
+ typescript: 5.4.2
+ dev: true
+
+ /svelte@4.2.12:
+ resolution: {integrity: sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug==}
+ engines: {node: '>=16'}
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/trace-mapping': 0.3.25
+ '@types/estree': 1.0.5
+ acorn: 8.11.3
+ aria-query: 5.3.0
+ axobject-query: 4.0.0
+ code-red: 1.0.4
+ css-tree: 2.3.1
+ estree-walker: 3.0.3
+ is-reference: 3.0.2
+ locate-character: 3.0.0
+ magic-string: 0.30.8
+ periscopic: 3.1.0
+ dev: true
+
+ /test-exclude@6.0.0:
+ resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@istanbuljs/schema': 0.1.3
+ glob: 7.2.3
+ minimatch: 3.1.2
+ dev: true
+
+ /tinybench@2.6.0:
+ resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==}
+ dev: true
+
+ /tinypool@0.8.3:
+ resolution: {integrity: sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw==}
+ engines: {node: '>=14.0.0'}
+ dev: true
+
+ /tinyspy@2.2.1:
+ resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==}
+ engines: {node: '>=14.0.0'}
+ dev: true
+
+ /to-fast-properties@2.0.0:
+ resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+ dependencies:
+ is-number: 7.0.0
+ dev: true
+
+ /tslib@2.6.2:
+ resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
+ dev: true
+
+ /type-detect@4.0.8:
+ resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /typescript@5.4.2:
+ resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+ dev: true
+
+ /ufo@1.5.3:
+ resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==}
+ dev: true
+
+ /v8-to-istanbul@9.2.0:
+ resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==}
+ engines: {node: '>=10.12.0'}
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.25
+ '@types/istanbul-lib-coverage': 2.0.6
+ convert-source-map: 2.0.0
+ dev: true
+
+ /vite-node@1.4.0:
+ resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ dependencies:
+ cac: 6.7.14
+ debug: 4.3.4
+ pathe: 1.1.2
+ picocolors: 1.0.0
+ vite: 5.2.8
+ transitivePeerDependencies:
+ - '@types/node'
+ - less
+ - lightningcss
+ - sass
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ dev: true
+
+ /vite@5.2.8:
+ resolution: {integrity: sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || >=20.0.0
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ dependencies:
+ esbuild: 0.20.2
+ postcss: 8.4.38
+ rollup: 4.13.0
+ optionalDependencies:
+ fsevents: 2.3.3
+ dev: true
+
+ /vitefu@0.2.5(vite@5.2.8):
+ resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==}
+ peerDependencies:
+ vite: ^3.0.0 || ^4.0.0 || ^5.0.0
+ peerDependenciesMeta:
+ vite:
+ optional: true
+ dependencies:
+ vite: 5.2.8
+ dev: true
+
+ /vitest@1.4.0:
+ resolution: {integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@edge-runtime/vm': '*'
+ '@types/node': ^18.0.0 || >=20.0.0
+ '@vitest/browser': 1.4.0
+ '@vitest/ui': 1.4.0
+ happy-dom: '*'
+ jsdom: '*'
+ peerDependenciesMeta:
+ '@edge-runtime/vm':
+ optional: true
+ '@types/node':
+ optional: true
+ '@vitest/browser':
+ optional: true
+ '@vitest/ui':
+ optional: true
+ happy-dom:
+ optional: true
+ jsdom:
+ optional: true
+ dependencies:
+ '@vitest/expect': 1.4.0
+ '@vitest/runner': 1.4.0
+ '@vitest/snapshot': 1.4.0
+ '@vitest/spy': 1.4.0
+ '@vitest/utils': 1.4.0
+ acorn-walk: 8.3.2
+ chai: 4.4.1
+ debug: 4.3.4
+ execa: 8.0.1
+ local-pkg: 0.5.0
+ magic-string: 0.30.8
+ pathe: 1.1.2
+ picocolors: 1.0.0
+ std-env: 3.7.0
+ strip-literal: 2.1.0
+ tinybench: 2.6.0
+ tinypool: 0.8.3
+ vite: 5.2.8
+ vite-node: 1.4.0
+ why-is-node-running: 2.2.2
+ transitivePeerDependencies:
+ - less
+ - lightningcss
+ - sass
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ dev: true
+
+ /which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+ dependencies:
+ isexe: 2.0.0
+ dev: true
+
+ /why-is-node-running@2.2.2:
+ resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==}
+ engines: {node: '>=8'}
+ hasBin: true
+ dependencies:
+ siginfo: 2.0.0
+ stackback: 0.0.2
+ dev: true
+
+ /wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+ dev: true
+
+ /yallist@4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+ dev: true
+
+ /yocto-queue@1.0.0:
+ resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==}
+ engines: {node: '>=12.20'}
+ dev: true
diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte
index e1a6776..9dd2506 100644
--- a/frontend/src/App.svelte
+++ b/frontend/src/App.svelte
@@ -1,7 +1,11 @@
-
-
- {charCounter}
+
+
+
+
{helpMessage}
+
{charCounter}
+
diff --git a/frontend/src/dispatchInput.test.ts b/frontend/src/dispatchInput.test.ts
new file mode 100644
index 0000000..26622e2
--- /dev/null
+++ b/frontend/src/dispatchInput.test.ts
@@ -0,0 +1,248 @@
+import { expect, it, describe, vi, afterEach, assert, beforeAll } from 'vitest'
+import { dispatchInput, countGrapheme, countBytes, weatherCommand, searchCommand } from './dispatchInput'
+import {
+ Post,
+ Chikuwa,
+ GetContext,
+} from '../wailsjs/go/main/App.js'
+import {
+ BrowserOpenURL, Quit,
+} from '../wailsjs/runtime/runtime.js'
+
+
+vi.mock('../wailsjs/go/main/App.js', () => ({
+ Chikuwa: vi.fn().mockImplementation((msg) =>Promise.resolve( `Got ${msg}`)),
+ Post: vi.fn(),
+ GetContext: vi.fn().mockResolvedValue('Mock'),
+}))
+
+
+vi.mock('../wailsjs/runtime/runtime.js', () => ({
+ BrowserOpenURL: vi.fn(),
+ Quit: vi.fn(),
+}))
+
+
+describe('dispatchInput', () => {
+ afterEach(() => {
+ vi.resetAllMocks();
+ });
+
+ it('Post if input is usual messages', () => {
+ const msg = 'Hello, World'
+ dispatchInput(msg)
+ expect(Post).toHaveBeenCalledWith(msg)
+ })
+
+ // Section for /help commands
+ it.each([
+ { input: "/help", helpUrl: 'https://github.com/kakakaya/mazesoba-continent/blob/main/README.md' },
+ { input: "/help command", helpUrl: 'https://github.com/kakakaya/mazesoba-continent/blob/main/docs/SLASH_COMMAND.md' },
+ { input: "/help config", helpUrl: 'https://github.com/kakakaya/mazesoba-continent/blob/main/docs/CONFIG.md' },
+ ])(`Open help page if input=$input`, async ({ input, helpUrl }) => {
+ let resOk = '', resFail = ''
+ await dispatchInput(input).then((res) => { resOk = res }).catch((res) => { resFail = res })
+ assert.equal(resOk, `Open: ${helpUrl}`)
+ assert.equal(resFail, '')
+ expect(BrowserOpenURL).toHaveBeenCalledWith(helpUrl)
+ expect(Post).not.toHaveBeenCalled()
+ })
+
+ it('Show error message if unknown help topic', async () => {
+ const input = '/help unknown-topic'
+ let resOk = '', resFail = ''
+ await dispatchInput(input).then((res) => { resOk = res }).catch((res) => { resFail = res })
+ assert.equal(resOk, '')
+ assert.notEqual(resFail, '')
+ expect(BrowserOpenURL).not.toHaveBeenCalled()
+ expect(Post).not.toHaveBeenCalled()
+
+ })
+
+ // Section for /open commands
+ it.each([
+ { input: "/open search foo", expected: "https://bsky.app/search?q=foo" },
+ { input: "/open search まぜそば大陸", expected: "https://bsky.app/search?q=%E3%81%BE%E3%81%9C%E3%81%9D%E3%81%B0%E5%A4%A7%E9%99%B8" },
+ { input: "/open search two words", expected: "https://bsky.app/search?q=two%20words" },
+ { input: "/open s you can use s for short s", expected: "https://bsky.app/search?q=you%20can%20use%20s%20for%20short%20s" },
+ ])(`Open search page if input=$input`, async ({ input, expected }) => {
+ let resOk = '', resFail = ''
+ await dispatchInput(input).then((res) => { resOk = res }).catch((res) => { resFail = res })
+ expect(resOk).toContain(expected)
+ assert.equal(resFail, '')
+ expect(BrowserOpenURL).toHaveBeenCalledWith(expected)
+ })
+
+ it.each([
+ { input: "/open weather 東京", expected: "https://tenki.jp/search/?keyword=%E6%9D%B1%E4%BA%AC" },
+ { input: "/open weather 100-0001", expected: "https://tenki.jp/search/?keyword=100-0001" },
+ ])(`Open weather page if input=$input`, async ({ input, expected }) => {
+ let resOk = '', resFail = ''
+ await dispatchInput(input).then((res) => { resOk = res }).catch((res) => { resFail = res })
+ expect(resOk).toContain(expected)
+ assert.equal(resFail, '')
+ expect(BrowserOpenURL).toHaveBeenCalledWith(expected)
+ })
+
+ it.each([
+ { input: "/open profile kakakaya.xyz", expected: "https://bsky.app/profile/kakakaya.xyz" },
+ ])(`Open profile page if input=$input`, async ({ input, expected }) => {
+ let resOk = '', resFail = ''
+ await dispatchInput(input).then((res) => { resOk = res }).catch((res) => { resFail = res })
+ expect(resOk).toContain(expected)
+ assert.equal(resFail, '')
+ expect(BrowserOpenURL).toHaveBeenCalledWith(expected)
+ })
+
+ it('Rejects if open target is not recognized', async () => {
+ const input = '/open unknown-target'
+ let resOk = '', resFail = ''
+ await dispatchInput(input).then((res) => { resOk = res }).catch((res) => { resFail = res })
+ assert.equal(resOk, '')
+ assert.notEqual(resFail, '')
+ expect(BrowserOpenURL).not.toHaveBeenCalled()
+ expect(Post).not.toHaveBeenCalled()
+ })
+
+ it.each([
+ //{ input: '/post chikuwa', expected: "ちくわ。" },
+ //{ input: '/post ckw', expected: "ちくわ。" },
+ //{ input: '/post eq', expected: "地震だ!" },
+ //{ input: '/post earthquake', expected: "地震だ!" },
+ //{ input: '/post version', expected: "まぜそば大陸バージョン" },
+ ])('Posts text if input=$input', async ({ input, expected }) => {
+ let resOk = '', resFail = ''
+ await dispatchInput(input).then((res) => { resOk = res }).catch((res) => { resFail = res })
+ assert.equal(resOk, expected)
+ assert.equal(resFail, '')
+ expect(Chikuwa).toHaveBeenCalledWith(expected)
+ expect(Post).not.toHaveBeenCalled()
+ })
+
+ it('Rejects if command is not recognized', async () => {
+ const input = '/unknown-command'
+ let resOk = '', resFail = ''
+ await dispatchInput(input).then((res) => { resOk = res }).catch((res) => { resFail = res })
+ assert.equal(resOk, '')
+ assert.notEqual(resFail, '')
+ expect(BrowserOpenURL).not.toHaveBeenCalled()
+ expect(Post).not.toHaveBeenCalled()
+ })
+
+ it('Quit if input is /quit', async () => {
+ const input = '/quit'
+ let resOk = '', resFail = ''
+ await dispatchInput(input).then((res) => { resOk = res }).catch((res) => { resFail = res })
+ assert.equal(resOk, '沈没!') // This won't be showed in the app
+ assert.equal(resFail, '')
+ expect(Quit).toHaveBeenCalled()
+ expect(Post).not.toHaveBeenCalled()
+ })
+})
+
+describe('dispatchInput with dryrun', () => {
+ afterEach(() => {
+ vi.resetAllMocks();
+ });
+
+ it.each([
+ { input: 'Hello, World', expected: '12' },
+ { input: 'こんにちは', expected: '5' },
+ { input: '👋', expected: '1' },
+ { input: '👩👩👧👧', expected: '1' },
+ ])('Returns length of message if input is usual messages', async ({ input, expected }) => {
+ let resOk = '', resFail = ''
+ await dispatchInput(input, true).then((res) => { resOk = res }).catch((res) => { resFail = res })
+ assert.equal(resOk, expected)
+ assert.equal(resFail, '')
+ expect(BrowserOpenURL).not.toHaveBeenCalled()
+ expect(Post).not.toBeCalled() // not called if dryrun
+ })
+
+ it.each([
+ { input: "/help", expected: 'READMEを開く' },
+ { input: "/help command", expected: 'スラッシュコマンドについて' },
+ { input: "/help config", expected: '設定について' },
+ { input: "/open weather 東京", expected: '天気を調べる:東京' },
+ ])('Returns help message if dryRun is true', async ({ input, expected }) => {
+ let resOk = '', resFail = ''
+ await dispatchInput(input, true).then((res) => { resOk = res }).catch((res) => { resFail = res })
+ expect(resOk).toContain(expected)
+ assert.equal(resFail, '')
+ expect(BrowserOpenURL).not.toHaveBeenCalled()
+ expect(Post).not.toHaveBeenCalled()
+ })
+
+ it.each([
+ { input: '/post chikuwa', expected: "ちくわ。" },
+ { input: '/post ckw', expected: "ちくわ。" },
+ { input: '/post earthquake', expected: "地震だ!" },
+ { input: '/post eq', expected: "地震だ!" },
+ // { input: '/post version', expected: "まぜそば大陸バージョン" },
+ // { input: '/post ver', expected: "まぜそば大陸バージョン" },
+ ])('Returns post message if input=$input and dryRun is true', async ({ input, expected }) => {
+ let resOk = '', resFail = ''
+ await dispatchInput(input, true).then((res) => { resOk = res }).catch((res) => { resFail = res })
+ assert.equal(resOk, expected)
+ assert.equal(resFail, '')
+ expect(Chikuwa).not.toHaveBeenCalled()
+ expect(Post).not.toHaveBeenCalled()
+ })
+
+ it.each([
+ // { input: "/help unknown" },
+ { input: "/open unknown" },
+ { input: '/unknown-command' },
+ ])('Rejects if unknown command or argumnet, input=$input', async ({ input }) => {
+ let resOk = '', resFail = ''
+ await dispatchInput(input, true).then((res) => { resOk = res }).catch((res) => { resFail = res })
+ assert.equal(resOk, '')
+ assert.notEqual(resFail, '')
+ expect(BrowserOpenURL).not.toHaveBeenCalled()
+ expect(Post).not.toHaveBeenCalled()
+ })
+})
+
+describe('countGrapheme', () => {
+ it.each([
+ { input: 'Hello, World', expected: 12 },
+ { input: 'こんにちは', expected: 5 },
+ { input: '👋', expected: 1 },
+ { input: '👩👩👧👧', expected: 1 },
+ ])('return displayed length of input', ({ input, expected }) => {
+ expect(countGrapheme(input)).toBe(expected)
+ })
+})
+
+describe('countBytes', () => {
+ it.each([
+ { input: 'Hello, World', expected: 12 },
+ { input: 'こんにちは', expected: 15 },
+ { input: '👋', expected: 4 },
+ { input: '👩👩👧👧', expected: 25 },
+ ])('return length in UTF-8 bytes of input: $input', ({ input, expected }) => {
+ expect(countBytes(input)).toBe(expected)
+ })
+})
+
+describe('searchCommand', () => {
+ it('searchCommand rejects when no search arguments are provided', async () => {
+ try {
+ await searchCommand();
+ } catch (error) {
+ expect(error).toBe('😕検索ワードを指定してね');
+ }
+ expect(BrowserOpenURL).not.toHaveBeenCalled();
+ });
+})
+
+describe('weatherCommand', () => {
+ it('weatherCommand rejects when no address arguments are provided', async () => {
+ try {
+ await weatherCommand();
+ } catch (error) {
+ expect(error).toBe('😕地名を指定してね');
+ }
+ expect(BrowserOpenURL).not.toHaveBeenCalled();
+ });
+})
diff --git a/frontend/src/dispatchInput.ts b/frontend/src/dispatchInput.ts
new file mode 100644
index 0000000..0f61372
--- /dev/null
+++ b/frontend/src/dispatchInput.ts
@@ -0,0 +1,186 @@
+
+import {
+ Post,
+ Chikuwa,
+ OpenConfigDirectory,
+ OpenLogDirectory,
+ GetContext,
+} from '../wailsjs/go/main/App.js'
+
+import {
+ BrowserOpenURL, Quit,
+} from '../wailsjs/runtime/runtime.js'
+
+const WAIT_FOR_INPUT_MESSAGE = "..."
+
+export async function dispatchInput(input: string, dryRun: boolean = false): Promise {
+ // 1. /で始まる場合はコマンドとして処理
+ // 2. 通常のメッセージの場合はそのままPost
+
+ if (input.startsWith("/")) {
+ input = input.trim()
+ const args = input.split(" ");
+ switch (args.at(0)) {
+ case "/help":
+ const helpTopic = args.at(1) || "";
+ const helpArgs = args.slice(2);
+ switch (helpTopic) {
+ case "":
+ return executeOrDryRun(dryRun, `READMEを開く`, helpCommand, ...helpArgs)
+ case "command":
+ return executeOrDryRun(dryRun, `スラッシュコマンドについて`, helpCommand, "command", ...helpArgs)
+ case "config":
+ case "setting":
+ case "settings":
+ return executeOrDryRun(dryRun, `設定について`, helpCommand, "config", ...helpArgs)
+ default:
+ return Promise.reject(dryRun ? WAIT_FOR_INPUT_MESSAGE : `😕「${helpTopic}ってなに?」`)
+ }
+ case "/open":
+ const openTarget = args.at(1) || "";
+ switch (openTarget) {
+ case "search":
+ case "s":
+ const searchArgs = args.slice(2);
+ return executeOrDryRun(dryRun, `検索:${searchArgs.join(" ")}`, searchCommand, ...searchArgs)
+ case "weather":
+ const addressArgs = args.slice(2);
+ return executeOrDryRun(dryRun, `天気を調べる:${addressArgs.join(" ")}`, weatherCommand, ...addressArgs)
+ case "profile":
+ const profileId = args.at(2) || "";
+ return executeOrDryRun(dryRun, `プロフィールを開く:${profileId}`, openProfileCommand, profileId)
+ case "config":
+ case "setting":
+ case "settings":
+ // Return "Opened config directory" message using executeOrDryRun
+ return executeOrDryRun(dryRun, "設定ファイルの場所を開く", () => OpenConfigDirectory().then(() => "Opened config directory"))
+ case "log":
+ // Return "Opened log directory" message using executeOrDryRun
+ return executeOrDryRun(dryRun, "ログの場所を開く", () => OpenLogDirectory().then(() => "Opened log directory"))
+ default:
+ // If dryRun is false,
+ // return a string that describes openTarget is invalid, with suitable emoji.
+ // otherwise, return a string that app is waiting for next input, with suitable emoji.
+ return Promise.reject(dryRun ? WAIT_FOR_INPUT_MESSAGE : `😕「${openTarget}ってなに?」`)
+ }
+ case "/post":
+ const postTarget = args.at(1) || "";
+ switch (postTarget) {
+ case "chikuwa":
+ case "ckw":
+ const res = await executeOrDryRun(dryRun, `ちくわ。`, Chikuwa, "ちくわ。")
+ return res
+ case "earthquake":
+ case "eq":
+ return executeOrDryRun(dryRun, `地震だ!`, Chikuwa, "地震だ!")
+ case "version":
+ case "ver":
+ let AppContext: { version: string } = { version: "" };
+ return await GetContext()
+ .then((context) => {
+ AppContext = JSON.parse(context);
+ const Version = AppContext.version;
+ return executeOrDryRun(dryRun, `バージョン情報: ${Version}`, Chikuwa, `まぜそば大陸バージョン${Version}が浮上中`);
+ })
+ .catch((err) => {
+ return Promise.reject(err);
+ });
+ default:
+ return Promise.reject(dryRun ? WAIT_FOR_INPUT_MESSAGE : `😕「${postTarget}ってなに?」`)
+ }
+ case "/mzsb":
+ const mzsbTarget = args.at(1) || "";
+ switch (mzsbTarget) {
+ case "egosearch":
+ case "egs":
+ return executeOrDryRun(dryRun, "エゴサーチ", searchCommand, "まぜそば大陸")
+ default:
+ return Promise.reject(dryRun ? WAIT_FOR_INPUT_MESSAGE : `😕「${mzsbTarget}ってなに?」`)
+ }
+ case "/quit":
+ return executeOrDryRun(dryRun, "沈没", () => {
+ Quit();
+ return Promise.resolve("沈没!");
+ });
+ default:
+ if (dryRun) {
+ return Promise.reject(WAIT_FOR_INPUT_MESSAGE);
+ } else {
+ return Promise.reject(`😕「${args.at(0)}の仕方がわからないよ」`)
+ }
+ }
+ }
+ if (dryRun) {
+ return Promise.resolve(countGrapheme(input).toString());
+ }
+ return Post(input)
+}
+
+// A function which executes and returns given command if dryRun = false
+// otherwise returns a string which describes what the command will do
+function executeOrDryRun(dryRun: boolean, description: string, command: (...args: string[]) => Promise, ...args: string[]): Promise {
+ if (dryRun) {
+ return Promise.resolve(description);
+ } else {
+ return command(...args);
+ }
+}
+
+export function helpCommand(...topics: string[]): Promise {
+ const README = 'https://github.com/kakakaya/mazesoba-continent/blob/main/README.md'
+ const COMMAND = 'https://github.com/kakakaya/mazesoba-continent/blob/main/docs/SLASH_COMMAND.md'
+ const CONFIG = 'https://github.com/kakakaya/mazesoba-continent/blob/main/docs/CONFIG.md'
+ if (topics.length == 0) {
+ BrowserOpenURL(README)
+ return Promise.resolve(`Open: ${README}`)
+ }
+ switch (topics.at(0)) {
+ case 'command':
+ BrowserOpenURL(COMMAND)
+ return Promise.resolve(`Open: ${COMMAND}`)
+ case 'config':
+ BrowserOpenURL(CONFIG)
+ return Promise.resolve(`Open: ${CONFIG}`)
+ default:
+ return Promise.reject(`😕「${topics}ってなに?」`)
+ }
+}
+
+export function searchCommand(...searchArgs: string[]): Promise {
+ if (searchArgs.length < 1) {
+ return Promise.reject("😕検索ワードを指定してね")
+ }
+ const params = encodeURIComponent(searchArgs.join(' '))
+ const url = `https://bsky.app/search?q=${params}`
+ BrowserOpenURL(url)
+ return Promise.resolve(`Open: ${url}`)
+}
+
+export function weatherCommand(...addressArgs: string[]): Promise {
+ if (addressArgs.length < 1) {
+ return Promise.reject("😕地名を指定してね")
+ }
+ const params = encodeURIComponent(addressArgs.join(' '))
+ const url = `https://tenki.jp/search/?keyword=${params}`
+
+ BrowserOpenURL(url)
+ return Promise.resolve(`Open: ${url}`)
+}
+
+export function openProfileCommand(profileId: string): Promise {
+ // TODO: Merge this function with searchCommand
+ const url = `https://bsky.app/profile/${profileId}`
+ BrowserOpenURL(url)
+ return Promise.resolve(`Open: ${url}`)
+}
+
+export function countGrapheme(input: string): number {
+ const segmenter = new Intl.Segmenter("ja", {
+ granularity: "grapheme"
+ });
+ return [...segmenter.segment(input)].length;
+}
+
+export function countBytes(input: string): number {
+ return new TextEncoder().encode(input).length
+}
diff --git a/frontend/src/main.d.ts b/frontend/src/main.d.ts
new file mode 100644
index 0000000..2ba4fb5
--- /dev/null
+++ b/frontend/src/main.d.ts
@@ -0,0 +1,5 @@
+///
+import './style.css';
+import App from './App.svelte';
+declare const app: App;
+export default app;
diff --git a/frontend/src/main.js b/frontend/src/main.ts
similarity index 70%
rename from frontend/src/main.js
rename to frontend/src/main.ts
index 95c41a5..746c21a 100644
--- a/frontend/src/main.js
+++ b/frontend/src/main.ts
@@ -2,7 +2,7 @@ import './style.css'
import App from './App.svelte'
const app = new App({
- target: document.getElementById('app')
+ target: document.getElementById('app')!
})
export default app
diff --git a/frontend/src/style.css b/frontend/src/style.css
index 11da1c8..c662c9a 100644
--- a/frontend/src/style.css
+++ b/frontend/src/style.css
@@ -78,7 +78,7 @@ body {
/*
margin: 0%;
padding: 0%;
- */
+ */
font-family: "Nunito", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto",
"Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
sans-serif;
@@ -101,12 +101,47 @@ body {
background: transparent;
color: white;
height: 95vh;
- width: 95vw;
+ width: 100vw;
resize: none;
border: none;
outline: none;
}
+#status-bar {
+ /* position: absolute; */
+ position: fixed;
+ bottom: 0;
+ width: 100%;
+ /* background-color: yellow; */
+ display: flex;
+ color: white;
+ padding: 0px;
+ justify-content: flex-end;
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
+
+ text-align: left;
+}
+
+#status-bar>div {
+ margin-left: 10px;
+ padding: 5px;
+}
+
+#char-counter {
+ color: white;
+ /* background-color: yellowgreen; */
+ padding: 5px;
+ border-radius: 5px;
+}
+
+#message {
+ /* background-color: royalblue; */
+}
+
+#footer {
+ /* background-color: hotpink; */
+}
+
.char-count {
position: absolute;
bottom: 0;
@@ -115,4 +150,4 @@ body {
color: black;
background-color: white;
padding: 2px 5px;
-}
+}
\ No newline at end of file
diff --git a/frontend/src/topping/unicode.d.ts b/frontend/src/topping/unicode.d.ts
new file mode 100644
index 0000000..5ce6767
--- /dev/null
+++ b/frontend/src/topping/unicode.d.ts
@@ -0,0 +1,3 @@
+type ConvertMode = 'circledBlack' | 'circled' | 'doublestruck' | 'frakturBold' | 'fraktur' | 'monospace' | 'sansBold' | 'sansBoldItalic' | 'sans' | 'sansItalic' | 'scriptBold' | 'script' | 'serifBold' | 'serifBoldItalic' | 'squaredBlack' | 'squared';
+export declare function ConvertRichUnicode(text: string, mode: ConvertMode): string;
+export {};
diff --git a/frontend/src/topping/unicode.js b/frontend/src/topping/unicode.js
deleted file mode 100644
index eaadfe3..0000000
--- a/frontend/src/topping/unicode.js
+++ /dev/null
@@ -1,998 +0,0 @@
-const convertMap = {
- frakturDict: {
- A: "𝔄",
- B: "𝔅",
- C: "ℭ",
- D: "𝔇",
- E: "𝔈",
- F: "𝔉",
- G: "𝔊",
- H: "ℌ",
- I: "ℑ",
- J: "𝔍",
- K: "𝔎",
- L: "𝔏",
- M: "𝔐",
- N: "𝔑",
- O: "𝔒",
- P: "𝔓",
- Q: "𝔔",
- R: "ℜ",
- S: "𝔖",
- T: "𝔗",
- U: "𝔘",
- V: "𝔙",
- W: "𝔚",
- X: "𝔛",
- Y: "𝔜",
- Z: "ℨ",
- a: "𝔞",
- b: "𝔟",
- c: "𝔠",
- d: "𝔡",
- e: "𝔢",
- f: "𝔣",
- g: "𝔤",
- h: "𝔥",
- i: "𝔦",
- j: "𝔧",
- k: "𝔨",
- l: "𝔩",
- m: "𝔪",
- n: "𝔫",
- o: "𝔬",
- p: "𝔭",
- q: "𝔮",
- r: "𝔯",
- s: "𝔰",
- t: "𝔱",
- u: "𝔲",
- v: "𝔳",
- w: "𝔴",
- x: "𝔵",
- y: "𝔶",
- z: "𝔷"
- },
- frakturBoldDict: {
- A: "𝕬",
- B: "𝕭",
- C: "𝕮",
- D: "𝕯",
- E: "𝕰",
- F: "𝕱",
- G: "𝕲",
- H: "𝕳",
- I: "𝕴",
- J: "𝕵",
- K: "𝕶",
- L: "𝕷",
- M: "𝕸",
- N: "𝕹",
- O: "𝕺",
- P: "𝕻",
- Q: "𝕼",
- R: "𝕽",
- S: "𝕾",
- T: "𝕿",
- U: "𝖀",
- V: "𝖁",
- W: "𝖂",
- X: "𝖃",
- Y: "𝖄",
- Z: "𝖅",
- a: "𝖆",
- b: "𝖇",
- c: "𝖈",
- d: "𝖉",
- e: "𝖊",
- f: "𝖋",
- g: "𝖌",
- h: "𝖍",
- i: "𝖎",
- j: "𝖏",
- k: "𝖐",
- l: "𝖑",
- m: "𝖒",
- n: "𝖓",
- o: "𝖔",
- p: "𝖕",
- q: "𝖖",
- r: "𝖗",
- s: "𝖘",
- t: "𝖙",
- u: "𝖚",
- v: "𝖛",
- w: "𝖜",
- x: "𝖝",
- y: "𝖞",
- z: "𝖟"
- },
- monospaceDict: {
- 0: "𝟶",
- 1: "𝟷",
- 2: "𝟸",
- 3: "𝟹",
- 4: "𝟺",
- 5: "𝟻",
- 6: "𝟼",
- 7: "𝟽",
- 8: "𝟾",
- 9: "𝟿",
- A: "𝙰",
- B: "𝙱",
- C: "𝙲",
- D: "𝙳",
- E: "𝙴",
- F: "𝙵",
- G: "𝙶",
- H: "𝙷",
- I: "𝙸",
- J: "𝙹",
- K: "𝙺",
- L: "𝙻",
- M: "𝙼",
- N: "𝙽",
- O: "𝙾",
- P: "𝙿",
- Q: "𝚀",
- R: "𝚁",
- S: "𝚂",
- T: "𝚃",
- U: "𝚄",
- V: "𝚅",
- W: "𝚆",
- X: "𝚇",
- Y: "𝚈",
- Z: "𝚉",
- a: "𝚊",
- b: "𝚋",
- c: "𝚌",
- d: "𝚍",
- e: "𝚎",
- f: "𝚏",
- g: "𝚐",
- h: "𝚑",
- i: "𝚒",
- j: "𝚓",
- k: "𝚔",
- l: "𝚕",
- m: "𝚖",
- n: "𝚗",
- o: "𝚘",
- p: "𝚙",
- q: "𝚚",
- r: "𝚛",
- s: "𝚜",
- t: "𝚝",
- u: "𝚞",
- v: "𝚟",
- w: "𝚠",
- x: "𝚡",
- y: "𝚢",
- z: "𝚣"
- },
- doublestruckDict: {
- 0: "𝟘",
- 1: "𝟙",
- 2: "𝟚",
- 3: "𝟛",
- 4: "𝟜",
- 5: "𝟝",
- 6: "𝟞",
- 7: "𝟟",
- 8: "𝟠",
- 9: "𝟡",
- A: "𝔸",
- B: "𝔹",
- C: "ℂ",
- D: "𝔻",
- E: "𝔼",
- F: "𝔽",
- G: "𝔾",
- H: "ℍ",
- I: "𝕀",
- J: "𝕁",
- K: "𝕂",
- L: "𝕃",
- M: "𝕄",
- N: "ℕ",
- O: "𝕆",
- P: "ℙ",
- Q: "ℚ",
- R: "ℝ",
- S: "𝕊",
- T: "𝕋",
- U: "𝕌",
- V: "𝕍",
- W: "𝕎",
- X: "𝕏",
- Y: "𝕐",
- Z: "ℤ",
- a: "𝕒",
- b: "𝕓",
- c: "𝕔",
- d: "𝕕",
- e: "𝕖",
- f: "𝕗",
- g: "𝕘",
- h: "𝕙",
- i: "𝕚",
- j: "𝕛",
- k: "𝕜",
- l: "𝕝",
- m: "𝕞",
- n: "𝕟",
- o: "𝕠",
- p: "𝕡",
- q: "𝕢",
- r: "𝕣",
- s: "𝕤",
- t: "𝕥",
- u: "𝕦",
- v: "𝕧",
- w: "𝕨",
- x: "𝕩",
- y: "𝕪",
- z: "𝕫"
- },
- scriptDict: {
- A: "𝒜",
- B: "ℬ",
- C: "𝒞",
- D: "𝒟",
- E: "ℰ",
- F: "ℱ",
- G: "𝒢",
- H: "ℋ",
- I: "ℐ",
- J: "𝒥",
- K: "𝒦",
- L: "ℒ",
- M: "ℳ",
- N: "𝒩",
- O: "𝒪",
- P: "𝒫",
- Q: "𝒬",
- R: "ℛ",
- S: "𝒮",
- T: "𝒯",
- U: "𝒰",
- V: "𝒱",
- W: "𝒲",
- X: "𝒳",
- Y: "𝒴",
- Z: "𝒵",
- a: "𝒶",
- b: "𝒷",
- c: "𝒸",
- d: "𝒹",
- e: "ℯ",
- f: "𝒻",
- g: "ℊ",
- h: "𝒽",
- i: "𝒾",
- j: "𝒿",
- k: "𝓀",
- l: "𝓁",
- m: "𝓂",
- n: "𝓃",
- o: "ℴ",
- p: "𝓅",
- q: "𝓆",
- r: "𝓇",
- s: "𝓈",
- t: "𝓉",
- u: "𝓊",
- v: "𝓋",
- w: "𝓌",
- x: "𝓍",
- y: "𝓎",
- z: "𝓏"
- },
- scriptBoldDict: {
- A: "𝓐",
- B: "𝓑",
- C: "𝓒",
- D: "𝓓",
- E: "𝓔",
- F: "𝓕",
- G: "𝓖",
- H: "𝓗",
- I: "𝓘",
- J: "𝓙",
- K: "𝓚",
- L: "𝓛",
- M: "𝓜",
- N: "𝓝",
- O: "𝓞",
- P: "𝓟",
- Q: "𝓠",
- R: "𝓡",
- S: "𝓢",
- T: "𝓣",
- U: "𝓤",
- V: "𝓥",
- W: "𝓦",
- X: "𝓧",
- Y: "𝓨",
- Z: "𝓩",
- a: "𝓪",
- b: "𝓫",
- c: "𝓬",
- d: "𝓭",
- e: "𝓮",
- f: "𝓯",
- g: "𝓰",
- h: "𝓱",
- i: "𝓲",
- j: "𝓳",
- k: "𝓴",
- l: "𝓵",
- m: "𝓶",
- n: "𝓷",
- o: "𝓸",
- p: "𝓹",
- q: "𝓺",
- r: "𝓻",
- s: "𝓼",
- t: "𝓽",
- u: "𝓾",
- v: "𝓿",
- w: "𝔀",
- x: "𝔁",
- y: "𝔂",
- z: "𝔃"
- },
- circledDict: {
- 0: "⓪",
- 1: "①",
- 2: "②",
- 3: "③",
- 4: "④",
- 5: "⑤",
- 6: "⑥",
- 7: "⑦",
- 8: "⑧",
- 9: "⑨",
- A: "Ⓐ",
- B: "Ⓑ",
- C: "Ⓒ",
- D: "Ⓓ",
- E: "Ⓔ",
- F: "Ⓕ",
- G: "Ⓖ",
- H: "Ⓗ",
- I: "Ⓘ",
- J: "Ⓙ",
- K: "Ⓚ",
- L: "Ⓛ",
- M: "Ⓜ",
- N: "Ⓝ",
- O: "Ⓞ",
- P: "Ⓟ",
- Q: "Ⓠ",
- R: "Ⓡ",
- S: "Ⓢ",
- T: "Ⓣ",
- U: "Ⓤ",
- V: "Ⓥ",
- W: "Ⓦ",
- X: "Ⓧ",
- Y: "Ⓨ",
- Z: "Ⓩ",
- a: "ⓐ",
- b: "ⓑ",
- c: "ⓒ",
- d: "ⓓ",
- e: "ⓔ",
- f: "ⓕ",
- g: "ⓖ",
- h: "ⓗ",
- i: "ⓘ",
- j: "ⓙ",
- k: "ⓚ",
- l: "ⓛ",
- m: "ⓜ",
- n: "ⓝ",
- o: "ⓞ",
- p: "ⓟ",
- q: "ⓠ",
- r: "ⓡ",
- s: "ⓢ",
- t: "ⓣ",
- u: "ⓤ",
- v: "ⓥ",
- w: "ⓦ",
- x: "ⓧ",
- y: "ⓨ",
- z: "ⓩ"
- },
- cicledBlackDict: {
- 0: "⓿",
- 1: "❶",
- 2: "❷",
- 3: "❸",
- 4: "❹",
- 5: "❺",
- 6: "❻",
- 7: "❼",
- 8: "❽",
- 9: "❾",
- A: "🅐",
- B: "🅑",
- C: "🅒",
- D: "🅓",
- E: "🅔",
- F: "🅕",
- G: "🅖",
- H: "🅗",
- I: "🅘",
- J: "🅙",
- K: "🅚",
- L: "🅛",
- M: "🅜",
- N: "🅝",
- O: "🅞",
- P: "🅟",
- Q: "🅠",
- R: "🅡",
- S: "🅢",
- T: "🅣",
- U: "🅤",
- V: "🅥",
- W: "🅦",
- X: "🅧",
- Y: "🅨",
- Z: "🅩",
- a: "🅐",
- b: "🅑",
- c: "🅒",
- d: "🅓",
- e: "🅔",
- f: "🅕",
- g: "🅖",
- h: "🅗",
- i: "🅘",
- j: "🅙",
- k: "🅚",
- l: "🅛",
- m: "🅜",
- n: "🅝",
- o: "🅞",
- p: "🅟",
- q: "🅠",
- r: "🅡",
- s: "🅢",
- t: "🅣",
- u: "🅤",
- v: "🅥",
- w: "🅦",
- x: "🅧",
- y: "🅨",
- z: "🅩"
- },
- squaredDict: {
- A: "🄰",
- B: "🄱",
- C: "🄲",
- D: "🄳",
- E: "🄴",
- F: "🄵",
- G: "🄶",
- H: "🄷",
- I: "🄸",
- J: "🄹",
- K: "🄺",
- L: "🄻",
- M: "🄼",
- N: "🄽",
- O: "🄾",
- P: "🄿",
- Q: "🅀",
- R: "🅁",
- S: "🅂",
- T: "🅃",
- U: "🅄",
- V: "🅅",
- W: "🅆",
- X: "🅇",
- Y: "🅈",
- Z: "🅉",
- a: "🄰",
- b: "🄱",
- c: "🄲",
- d: "🄳",
- e: "🄴",
- f: "🄵",
- g: "🄶",
- h: "🄷",
- i: "🄸",
- j: "🄹",
- k: "🄺",
- l: "🄻",
- m: "🄼",
- n: "🄽",
- o: "🄾",
- p: "🄿",
- q: "🅀",
- r: "🅁",
- s: "🅂",
- t: "🅃",
- u: "🅄",
- v: "🅅",
- w: "🅆",
- x: "🅇",
- y: "🅈",
- z: "🅉"
- },
- squaredBlackDict: {
- A: "🅰",
- B: "🅱",
- C: "🅲",
- D: "🅳",
- E: "🅴",
- F: "🅵",
- G: "🅶",
- H: "🅷",
- I: "🅸",
- J: "🅹",
- K: "🅺",
- L: "🅻",
- M: "🅼",
- N: "🅽",
- O: "🅾",
- P: "🅿",
- Q: "🆀",
- R: "🆁",
- S: "🆂",
- T: "🆃",
- U: "🆄",
- V: "🆅",
- W: "🆆",
- X: "🆇",
- Y: "🆈",
- Z: "🆉",
- a: "🅰",
- b: "🅱",
- c: "🅲",
- d: "🅳",
- e: "🅴",
- f: "🅵",
- g: "🅶",
- h: "🅷",
- i: "🅸",
- j: "🅹",
- k: "🅺",
- l: "🅻",
- m: "🅼",
- n: "🅽",
- o: "🅾",
- p: "🅿",
- q: "🆀",
- r: "🆁",
- s: "🆂",
- t: "🆃",
- u: "🆄",
- v: "🆅",
- w: "🆆",
- x: "🆇",
- y: "🆈",
- z: "🆉"
- },
- serifBoldDict: {
- 0: "𝟎",
- 1: "𝟏",
- 2: "𝟐",
- 3: "𝟑",
- 4: "𝟒",
- 5: "𝟓",
- 6: "𝟔",
- 7: "𝟕",
- 8: "𝟖",
- 9: "𝟗",
- A: "𝐀",
- B: "𝐁",
- C: "𝐂",
- D: "𝐃",
- E: "𝐄",
- F: "𝐅",
- G: "𝐆",
- H: "𝐇",
- I: "𝐈",
- J: "𝐉",
- K: "𝐊",
- L: "𝐋",
- M: "𝐌",
- N: "𝐍",
- O: "𝐎",
- P: "𝐏",
- Q: "𝐐",
- R: "𝐑",
- S: "𝐒",
- T: "𝐓",
- U: "𝐔",
- V: "𝐕",
- W: "𝐖",
- X: "𝐗",
- Y: "𝐘",
- Z: "𝐙",
- a: "𝐚",
- b: "𝐛",
- c: "𝐜",
- d: "𝐝",
- e: "𝐞",
- f: "𝐟",
- g: "𝐠",
- h: "𝐡",
- i: "𝐢",
- j: "𝐣",
- k: "𝐤",
- l: "𝐥",
- m: "𝐦",
- n: "𝐧",
- o: "𝐨",
- p: "𝐩",
- q: "𝐪",
- r: "𝐫",
- s: "𝐬",
- t: "𝐭",
- u: "𝐮",
- v: "𝐯",
- w: "𝐰",
- x: "𝐱",
- y: "𝐲",
- z: "𝐳"
- },
- serifBoldItalicDict: {
- A: "𝑨",
- B: "𝑩",
- C: "𝑪",
- D: "𝑫",
- E: "𝑬",
- F: "𝑭",
- G: "𝑮",
- H: "𝑯",
- I: "𝑰",
- J: "𝑱",
- K: "𝑲",
- L: "𝑳",
- M: "𝑴",
- N: "𝑵",
- O: "𝑶",
- P: "𝑷",
- Q: "𝑸",
- R: "𝑹",
- S: "𝑺",
- T: "𝑻",
- U: "𝑼",
- V: "𝑽",
- W: "𝑾",
- X: "𝑿",
- Y: "𝒀",
- Z: "𝒁",
- a: "𝒂",
- b: "𝒃",
- c: "𝒄",
- d: "𝒅",
- e: "𝒆",
- f: "𝒇",
- g: "𝒈",
- h: "𝒉",
- i: "𝒊",
- j: "𝒋",
- k: "𝒌",
- l: "𝒍",
- m: "𝒎",
- n: "𝒏",
- o: "𝒐",
- p: "𝒑",
- q: "𝒒",
- r: "𝒓",
- s: "𝒔",
- t: "𝒕",
- u: "𝒖",
- v: "𝒗",
- w: "𝒘",
- x: "𝒙",
- y: "𝒚",
- z: "𝒛"
- },
- sansDict: {
- 0: "𝟢",
- 1: "𝟣",
- 2: "𝟤",
- 3: "𝟥",
- 4: "𝟦",
- 5: "𝟧",
- 6: "𝟨",
- 7: "𝟩",
- 8: "𝟪",
- 9: "𝟫",
- A: "𝖠",
- B: "𝖡",
- C: "𝖢",
- D: "𝖣",
- E: "𝖤",
- F: "𝖥",
- G: "𝖦",
- H: "𝖧",
- I: "𝖨",
- J: "𝖩",
- K: "𝖪",
- L: "𝖫",
- M: "𝖬",
- N: "𝖭",
- O: "𝖮",
- P: "𝖯",
- Q: "𝖰",
- R: "𝖱",
- S: "𝖲",
- T: "𝖳",
- U: "𝖴",
- V: "𝖵",
- W: "𝖶",
- X: "𝖷",
- Y: "𝖸",
- Z: "𝖹",
- a: "𝖺",
- b: "𝖻",
- c: "𝖼",
- d: "𝖽",
- e: "𝖾",
- f: "𝖿",
- g: "𝗀",
- h: "𝗁",
- i: "𝗂",
- j: "𝗃",
- k: "𝗄",
- l: "𝗅",
- m: "𝗆",
- n: "𝗇",
- o: "𝗈",
- p: "𝗉",
- q: "𝗊",
- r: "𝗋",
- s: "𝗌",
- t: "𝗍",
- u: "𝗎",
- v: "𝗏",
- w: "𝗐",
- x: "𝗑",
- y: "𝗒",
- z: "𝗓"
- },
- sansBoldDict: {
- 0: "𝟬",
- 1: "𝟭",
- 2: "𝟮",
- 3: "𝟯",
- 4: "𝟰",
- 5: "𝟱",
- 6: "𝟲",
- 7: "𝟳",
- 8: "𝟴",
- 9: "𝟵",
- A: "𝗔",
- B: "𝗕",
- C: "𝗖",
- D: "𝗗",
- E: "𝗘",
- F: "𝗙",
- G: "𝗚",
- H: "𝗛",
- I: "𝗜",
- J: "𝗝",
- K: "𝗞",
- L: "𝗟",
- M: "𝗠",
- N: "𝗡",
- O: "𝗢",
- P: "𝗣",
- Q: "𝗤",
- R: "𝗥",
- S: "𝗦",
- T: "𝗧",
- U: "𝗨",
- V: "𝗩",
- W: "𝗪",
- X: "𝗫",
- Y: "𝗬",
- Z: "𝗭",
- a: "𝗮",
- b: "𝗯",
- c: "𝗰",
- d: "𝗱",
- e: "𝗲",
- f: "𝗳",
- g: "𝗴",
- h: "𝗵",
- i: "𝗶",
- j: "𝗷",
- k: "𝗸",
- l: "𝗹",
- m: "𝗺",
- n: "𝗻",
- o: "𝗼",
- p: "𝗽",
- q: "𝗾",
- r: "𝗿",
- s: "𝘀",
- t: "𝘁",
- u: "𝘂",
- v: "𝘃",
- w: "𝘄",
- x: "𝘅",
- y: "𝘆",
- z: "𝘇"
- },
- sansItalicDict: {
- A: "𝘈",
- B: "𝘉",
- C: "𝘊",
- D: "𝘋",
- E: "𝘌",
- F: "𝘍",
- G: "𝘎",
- H: "𝘏",
- I: "𝘐",
- J: "𝘑",
- K: "𝘒",
- L: "𝘓",
- M: "𝘔",
- N: "𝘕",
- O: "𝘖",
- P: "𝘗",
- Q: "𝘘",
- R: "𝘙",
- S: "𝘚",
- T: "𝘛",
- U: "𝘜",
- V: "𝘝",
- W: "𝘞",
- X: "𝘟",
- Y: "𝘠",
- Z: "𝘡",
- a: "𝘢",
- b: "𝘣",
- c: "𝘤",
- d: "𝘥",
- e: "𝘦",
- f: "𝘧",
- g: "𝘨",
- h: "𝘩",
- i: "𝘪",
- j: "𝘫",
- k: "𝘬",
- l: "𝘭",
- m: "𝘮",
- n: "𝘯",
- o: "𝘰",
- p: "𝘱",
- q: "𝘲",
- r: "𝘳",
- s: "𝘴",
- t: "𝘵",
- u: "𝘶",
- v: "𝘷",
- w: "𝘸",
- x: "𝘹",
- y: "𝘺",
- z: "𝘻"
- },
- sansBoldItalicDict: {
- A: "𝘼",
- B: "𝘽",
- C: "𝘾",
- D: "𝘿",
- E: "𝙀",
- F: "𝙁",
- G: "𝙂",
- H: "𝙃",
- I: "𝙄",
- J: "𝙅",
- K: "𝙆",
- L: "𝙇",
- M: "𝙈",
- N: "𝙉",
- O: "𝙊",
- P: "𝙋",
- Q: "𝙌",
- R: "𝙍",
- S: "𝙎",
- T: "𝙏",
- U: "𝙐",
- V: "𝙑",
- W: "𝙒",
- X: "𝙓",
- Y: "𝙔",
- Z: "𝙕",
- a: "𝙖",
- b: "𝙗",
- c: "𝙘",
- d: "𝙙",
- e: "𝙚",
- f: "𝙛",
- g: "𝙜",
- h: "𝙝",
- i: "𝙞",
- j: "𝙟",
- k: "𝙠",
- l: "𝙡",
- m: "𝙢",
- n: "𝙣",
- o: "𝙤",
- p: "𝙥",
- q: "𝙦",
- r: "𝙧",
- s: "𝙨",
- t: "𝙩",
- u: "𝙪",
- v: "𝙫",
- w: "𝙬",
- x: "𝙭",
- y: "𝙮",
- z: "𝙯"
- }
-}
-
-export function ConvertRichUnicode (text, mode) {
- let dict;
- switch (mode) {
- case 'circledBlack':
- dict = convertMap.cicledBlackDict;
- break;
- case 'circled':
- dict = convertMap.circledDict;
- break;
- case 'doublestruck':
- dict = convertMap.doublestruckDict;
- break;
- case 'frakturBold':
- dict = convertMap.frakturBoldDict;
- break;
- case 'fraktur':
- dict = convertMap.frakturDict;
- break;
- case 'monospace':
- dict = convertMap.monospaceDict;
- break;
- case 'sansBold':
- dict = convertMap.sansBoldDict;
- break;
- case 'sansBoldItalic':
- dict = convertMap.sansBoldItalicDict;
- break;
- case 'sans':
- dict = convertMap.sansDict;
- break;
- case 'sansItalic':
- dict = convertMap.sansItalicDict;
- break;
- case 'scriptBold':
- dict = convertMap.scriptBoldDict;
- break;
- case 'script':
- dict = convertMap.scriptDict;
- break;
- case 'serifBold':
- dict = convertMap.serifBoldDict;
- break;
- case 'serifBoldItalic':
- dict = convertMap.serifBoldItalicDict;
- break;
- case 'squaredBlack':
- dict = convertMap.squaredBlackDict;
- break;
- case 'squared':
- dict = convertMap.squaredDict;
- break;
- default:
- return text;
- }
- let newText = '';
- for (let i = 0; i < text.length; i++) {
- const char = text.charAt(i);
- newText += dict[char] || char;
- }
- return newText;
-}
diff --git a/frontend/src/topping/unicode.test.ts b/frontend/src/topping/unicode.test.ts
new file mode 100644
index 0000000..3779369
--- /dev/null
+++ b/frontend/src/topping/unicode.test.ts
@@ -0,0 +1,26 @@
+import { expect, test, describe } from 'vitest'
+import { ConvertRichUnicode } from "./unicode";
+
+describe.each([
+ { mode: 'circled', expected: 'Ⓗⓔⓛⓛⓞ Ⓦⓞⓡⓛⓓ!' },
+ { mode: 'doublestruck', expected: 'ℍ𝕖𝕝𝕝𝕠 𝕎𝕠𝕣𝕝𝕕!' },
+ { mode: 'frakturBold', expected: '𝕳𝖊𝖑𝖑𝖔 𝖂𝖔𝖗𝖑𝖉!' },
+ { mode: 'fraktur', expected: 'ℌ𝔢𝔩𝔩𝔬 𝔚𝔬𝔯𝔩𝔡!' },
+ { mode: 'monospace', expected: '𝙷𝚎𝚕𝚕𝚘 𝚆𝚘𝚛𝚕𝚍!' },
+ { mode: 'sansBold', expected: '𝗛𝗲𝗹𝗹𝗼 𝗪𝗼𝗿𝗹𝗱!' },
+ { mode: 'sansBoldItalic', expected: '𝙃𝙚𝙡𝙡𝙤 𝙒𝙤𝙧𝙡𝙙!' },
+ { mode: 'sans', expected: '𝖧𝖾𝗅𝗅𝗈 𝖶𝗈𝗋𝗅𝖽!' },
+ { mode: 'sansItalic', expected: '𝘏𝘦𝘭𝘭𝘰 𝘞𝘰𝘳𝘭𝘥!' },
+ { mode: 'scriptBold', expected: '𝓗𝓮𝓵𝓵𝓸 𝓦𝓸𝓻𝓵𝓭!' },
+ { mode: 'script', expected: 'ℋℯ𝓁𝓁ℴ 𝒲ℴ𝓇𝓁𝒹!' },
+ { mode: 'serifBold', expected: '𝐇𝐞𝐥𝐥𝐨 𝐖𝐨𝐫𝐥𝐝!' },
+ { mode: 'serifBoldItalic', expected: '𝑯𝒆𝒍𝒍𝒐 𝑾𝒐𝒓𝒍𝒅!' },
+ { mode: 'squaredBlack', expected: '🅷🅴🅻🅻🅾 🆆🅾🆁🅻🅳!' },
+ { mode: 'squared', expected: '🄷🄴🄻🄻🄾 🅆🄾🅁🄻🄳!' },
+])('ConvertRichUnicode("Hello World!", $mode) returns $expected', ({ mode, expected }) => {
+ const base = 'Hello World!'
+ test(`returns ${expected}`, () => {
+ expect(ConvertRichUnicode(base, mode)).toBe(expected)
+
+ })
+})
diff --git a/frontend/src/topping/unicode.ts b/frontend/src/topping/unicode.ts
new file mode 100644
index 0000000..ebf1c37
--- /dev/null
+++ b/frontend/src/topping/unicode.ts
@@ -0,0 +1,1000 @@
+const convertMap = {
+ frakturDict: new Map([
+ ["A", "𝔄"],
+ ["B", "𝔅"],
+ ["C", "ℭ"],
+ ["D", "𝔇"],
+ ["E", "𝔈"],
+ ["F", "𝔉"],
+ ["G", "𝔊"],
+ ["H", "ℌ"],
+ ["I", "ℑ"],
+ ["J", "𝔍"],
+ ["K", "𝔎"],
+ ["L", "𝔏"],
+ ["M", "𝔐"],
+ ["N", "𝔑"],
+ ["O", "𝔒"],
+ ["P", "𝔓"],
+ ["Q", "𝔔"],
+ ["R", "ℜ"],
+ ["S", "𝔖"],
+ ["T", "𝔗"],
+ ["U", "𝔘"],
+ ["V", "𝔙"],
+ ["W", "𝔚"],
+ ["X", "𝔛"],
+ ["Y", "𝔜"],
+ ["Z", "ℨ"],
+ ["a", "𝔞"],
+ ["b", "𝔟"],
+ ["c", "𝔠"],
+ ["d", "𝔡"],
+ ["e", "𝔢"],
+ ["f", "𝔣"],
+ ["g", "𝔤"],
+ ["h", "𝔥"],
+ ["i", "𝔦"],
+ ["j", "𝔧"],
+ ["k", "𝔨"],
+ ["l", "𝔩"],
+ ["m", "𝔪"],
+ ["n", "𝔫"],
+ ["o", "𝔬"],
+ ["p", "𝔭"],
+ ["q", "𝔮"],
+ ["r", "𝔯"],
+ ["s", "𝔰"],
+ ["t", "𝔱"],
+ ["u", "𝔲"],
+ ["v", "𝔳"],
+ ["w", "𝔴"],
+ ["x", "𝔵"],
+ ["y", "𝔶"],
+ ["z", "𝔷"]
+ ]),
+ frakturBoldDict: new Map([
+ ["A", "𝕬"],
+ ["B", "𝕭"],
+ ["C", "𝕮"],
+ ["D", "𝕯"],
+ ["E", "𝕰"],
+ ["F", "𝕱"],
+ ["G", "𝕲"],
+ ["H", "𝕳"],
+ ["I", "𝕴"],
+ ["J", "𝕵"],
+ ["K", "𝕶"],
+ ["L", "𝕷"],
+ ["M", "𝕸"],
+ ["N", "𝕹"],
+ ["O", "𝕺"],
+ ["P", "𝕻"],
+ ["Q", "𝕼"],
+ ["R", "𝕽"],
+ ["S", "𝕾"],
+ ["T", "𝕿"],
+ ["U", "𝖀"],
+ ["V", "𝖁"],
+ ["W", "𝖂"],
+ ["X", "𝖃"],
+ ["Y", "𝖄"],
+ ["Z", "𝖅"],
+ ["a", "𝖆"],
+ ["b", "𝖇"],
+ ["c", "𝖈"],
+ ["d", "𝖉"],
+ ["e", "𝖊"],
+ ["f", "𝖋"],
+ ["g", "𝖌"],
+ ["h", "𝖍"],
+ ["i", "𝖎"],
+ ["j", "𝖏"],
+ ["k", "𝖐"],
+ ["l", "𝖑"],
+ ["m", "𝖒"],
+ ["n", "𝖓"],
+ ["o", "𝖔"],
+ ["p", "𝖕"],
+ ["q", "𝖖"],
+ ["r", "𝖗"],
+ ["s", "𝖘"],
+ ["t", "𝖙"],
+ ["u", "𝖚"],
+ ["v", "𝖛"],
+ ["w", "𝖜"],
+ ["x", "𝖝"],
+ ["y", "𝖞"],
+ ["z", "𝖟"]
+ ]),
+ monospaceDict: new Map([
+ ["0", "𝟶"],
+ ["1", "𝟷"],
+ ["2", "𝟸"],
+ ["3", "𝟹"],
+ ["4", "𝟺"],
+ ["5", "𝟻"],
+ ["6", "𝟼"],
+ ["7", "𝟽"],
+ ["8", "𝟾"],
+ ["9", "𝟿"],
+ ["A", "𝙰"],
+ ["B", "𝙱"],
+ ["C", "𝙲"],
+ ["D", "𝙳"],
+ ["E", "𝙴"],
+ ["F", "𝙵"],
+ ["G", "𝙶"],
+ ["H", "𝙷"],
+ ["I", "𝙸"],
+ ["J", "𝙹"],
+ ["K", "𝙺"],
+ ["L", "𝙻"],
+ ["M", "𝙼"],
+ ["N", "𝙽"],
+ ["O", "𝙾"],
+ ["P", "𝙿"],
+ ["Q", "𝚀"],
+ ["R", "𝚁"],
+ ["S", "𝚂"],
+ ["T", "𝚃"],
+ ["U", "𝚄"],
+ ["V", "𝚅"],
+ ["W", "𝚆"],
+ ["X", "𝚇"],
+ ["Y", "𝚈"],
+ ["Z", "𝚉"],
+ ["a", "𝚊"],
+ ["b", "𝚋"],
+ ["c", "𝚌"],
+ ["d", "𝚍"],
+ ["e", "𝚎"],
+ ["f", "𝚏"],
+ ["g", "𝚐"],
+ ["h", "𝚑"],
+ ["i", "𝚒"],
+ ["j", "𝚓"],
+ ["k", "𝚔"],
+ ["l", "𝚕"],
+ ["m", "𝚖"],
+ ["n", "𝚗"],
+ ["o", "𝚘"],
+ ["p", "𝚙"],
+ ["q", "𝚚"],
+ ["r", "𝚛"],
+ ["s", "𝚜"],
+ ["t", "𝚝"],
+ ["u", "𝚞"],
+ ["v", "𝚟"],
+ ["w", "𝚠"],
+ ["x", "𝚡"],
+ ["y", "𝚢"],
+ ["z", "𝚣"]
+ ]),
+ doublestruckDict: new Map([
+ ["0", "𝟘"],
+ ["1", "𝟙"],
+ ["2", "𝟚"],
+ ["3", "𝟛"],
+ ["4", "𝟜"],
+ ["5", "𝟝"],
+ ["6", "𝟞"],
+ ["7", "𝟟"],
+ ["8", "𝟠"],
+ ["9", "𝟡"],
+ ["A", "𝔸"],
+ ["B", "𝔹"],
+ ["C", "ℂ"],
+ ["D", "𝔻"],
+ ["E", "𝔼"],
+ ["F", "𝔽"],
+ ["G", "𝔾"],
+ ["H", "ℍ"],
+ ["I", "𝕀"],
+ ["J", "𝕁"],
+ ["K", "𝕂"],
+ ["L", "𝕃"],
+ ["M", "𝕄"],
+ ["N", "ℕ"],
+ ["O", "𝕆"],
+ ["P", "ℙ"],
+ ["Q", "ℚ"],
+ ["R", "ℝ"],
+ ["S", "𝕊"],
+ ["T", "𝕋"],
+ ["U", "𝕌"],
+ ["V", "𝕍"],
+ ["W", "𝕎"],
+ ["X", "𝕏"],
+ ["Y", "𝕐"],
+ ["Z", "ℤ"],
+ ["a", "𝕒"],
+ ["b", "𝕓"],
+ ["c", "𝕔"],
+ ["d", "𝕕"],
+ ["e", "𝕖"],
+ ["f", "𝕗"],
+ ["g", "𝕘"],
+ ["h", "𝕙"],
+ ["i", "𝕚"],
+ ["j", "𝕛"],
+ ["k", "𝕜"],
+ ["l", "𝕝"],
+ ["m", "𝕞"],
+ ["n", "𝕟"],
+ ["o", "𝕠"],
+ ["p", "𝕡"],
+ ["q", "𝕢"],
+ ["r", "𝕣"],
+ ["s", "𝕤"],
+ ["t", "𝕥"],
+ ["u", "𝕦"],
+ ["v", "𝕧"],
+ ["w", "𝕨"],
+ ["x", "𝕩"],
+ ["y", "𝕪"],
+ ["z", "𝕫"]
+ ]),
+ scriptDict: new Map([
+ ["A", "𝒜"],
+ ["B", "ℬ"],
+ ["C", "𝒞"],
+ ["D", "𝒟"],
+ ["E", "ℰ"],
+ ["F", "ℱ"],
+ ["G", "𝒢"],
+ ["H", "ℋ"],
+ ["I", "ℐ"],
+ ["J", "𝒥"],
+ ["K", "𝒦"],
+ ["L", "ℒ"],
+ ["M", "ℳ"],
+ ["N", "𝒩"],
+ ["O", "𝒪"],
+ ["P", "𝒫"],
+ ["Q", "𝒬"],
+ ["R", "ℛ"],
+ ["S", "𝒮"],
+ ["T", "𝒯"],
+ ["U", "𝒰"],
+ ["V", "𝒱"],
+ ["W", "𝒲"],
+ ["X", "𝒳"],
+ ["Y", "𝒴"],
+ ["Z", "𝒵"],
+ ["a", "𝒶"],
+ ["b", "𝒷"],
+ ["c", "𝒸"],
+ ["d", "𝒹"],
+ ["e", "ℯ"],
+ ["f", "𝒻"],
+ ["g", "ℊ"],
+ ["h", "𝒽"],
+ ["i", "𝒾"],
+ ["j", "𝒿"],
+ ["k", "𝓀"],
+ ["l", "𝓁"],
+ ["m", "𝓂"],
+ ["n", "𝓃"],
+ ["o", "ℴ"],
+ ["p", "𝓅"],
+ ["q", "𝓆"],
+ ["r", "𝓇"],
+ ["s", "𝓈"],
+ ["t", "𝓉"],
+ ["u", "𝓊"],
+ ["v", "𝓋"],
+ ["w", "𝓌"],
+ ["x", "𝓍"],
+ ["y", "𝓎"],
+ ["z", "𝓏"]
+ ]),
+ scriptBoldDict: new Map([
+ ["A", "𝓐"],
+ ["B", "𝓑"],
+ ["C", "𝓒"],
+ ["D", "𝓓"],
+ ["E", "𝓔"],
+ ["F", "𝓕"],
+ ["G", "𝓖"],
+ ["H", "𝓗"],
+ ["I", "𝓘"],
+ ["J", "𝓙"],
+ ["K", "𝓚"],
+ ["L", "𝓛"],
+ ["M", "𝓜"],
+ ["N", "𝓝"],
+ ["O", "𝓞"],
+ ["P", "𝓟"],
+ ["Q", "𝓠"],
+ ["R", "𝓡"],
+ ["S", "𝓢"],
+ ["T", "𝓣"],
+ ["U", "𝓤"],
+ ["V", "𝓥"],
+ ["W", "𝓦"],
+ ["X", "𝓧"],
+ ["Y", "𝓨"],
+ ["Z", "𝓩"],
+ ["a", "𝓪"],
+ ["b", "𝓫"],
+ ["c", "𝓬"],
+ ["d", "𝓭"],
+ ["e", "𝓮"],
+ ["f", "𝓯"],
+ ["g", "𝓰"],
+ ["h", "𝓱"],
+ ["i", "𝓲"],
+ ["j", "𝓳"],
+ ["k", "𝓴"],
+ ["l", "𝓵"],
+ ["m", "𝓶"],
+ ["n", "𝓷"],
+ ["o", "𝓸"],
+ ["p", "𝓹"],
+ ["q", "𝓺"],
+ ["r", "𝓻"],
+ ["s", "𝓼"],
+ ["t", "𝓽"],
+ ["u", "𝓾"],
+ ["v", "𝓿"],
+ ["w", "𝔀"],
+ ["x", "𝔁"],
+ ["y", "𝔂"],
+ ["z", "𝔃"]
+ ]),
+ circledDict: new Map([
+ ["0", "⓪"],
+ ["1", "①"],
+ ["2", "②"],
+ ["3", "③"],
+ ["4", "④"],
+ ["5", "⑤"],
+ ["6", "⑥"],
+ ["7", "⑦"],
+ ["8", "⑧"],
+ ["9", "⑨"],
+ ["A", "Ⓐ"],
+ ["B", "Ⓑ"],
+ ["C", "Ⓒ"],
+ ["D", "Ⓓ"],
+ ["E", "Ⓔ"],
+ ["F", "Ⓕ"],
+ ["G", "Ⓖ"],
+ ["H", "Ⓗ"],
+ ["I", "Ⓘ"],
+ ["J", "Ⓙ"],
+ ["K", "Ⓚ"],
+ ["L", "Ⓛ"],
+ ["M", "Ⓜ"],
+ ["N", "Ⓝ"],
+ ["O", "Ⓞ"],
+ ["P", "Ⓟ"],
+ ["Q", "Ⓠ"],
+ ["R", "Ⓡ"],
+ ["S", "Ⓢ"],
+ ["T", "Ⓣ"],
+ ["U", "Ⓤ"],
+ ["V", "Ⓥ"],
+ ["W", "Ⓦ"],
+ ["X", "Ⓧ"],
+ ["Y", "Ⓨ"],
+ ["Z", "Ⓩ"],
+ ["a", "ⓐ"],
+ ["b", "ⓑ"],
+ ["c", "ⓒ"],
+ ["d", "ⓓ"],
+ ["e", "ⓔ"],
+ ["f", "ⓕ"],
+ ["g", "ⓖ"],
+ ["h", "ⓗ"],
+ ["i", "ⓘ"],
+ ["j", "ⓙ"],
+ ["k", "ⓚ"],
+ ["l", "ⓛ"],
+ ["m", "ⓜ"],
+ ["n", "ⓝ"],
+ ["o", "ⓞ"],
+ ["p", "ⓟ"],
+ ["q", "ⓠ"],
+ ["r", "ⓡ"],
+ ["s", "ⓢ"],
+ ["t", "ⓣ"],
+ ["u", "ⓤ"],
+ ["v", "ⓥ"],
+ ["w", "ⓦ"],
+ ["x", "ⓧ"],
+ ["y", "ⓨ"],
+ ["z", "ⓩ"]
+ ]),
+ cicledBlackDict: new Map([
+ ["0", "⓿"],
+ ["1", "❶"],
+ ["2", "❷"],
+ ["3", "❸"],
+ ["4", "❹"],
+ ["5", "❺"],
+ ["6", "❻"],
+ ["7", "❼"],
+ ["8", "❽"],
+ ["9", "❾"],
+ ["A", "🅐"],
+ ["B", "🅑"],
+ ["C", "🅒"],
+ ["D", "🅓"],
+ ["E", "🅔"],
+ ["F", "🅕"],
+ ["G", "🅖"],
+ ["H", "🅗"],
+ ["I", "🅘"],
+ ["J", "🅙"],
+ ["K", "🅚"],
+ ["L", "🅛"],
+ ["M", "🅜"],
+ ["N", "🅝"],
+ ["O", "🅞"],
+ ["P", "🅟"],
+ ["Q", "🅠"],
+ ["R", "🅡"],
+ ["S", "🅢"],
+ ["T", "🅣"],
+ ["U", "🅤"],
+ ["V", "🅥"],
+ ["W", "🅦"],
+ ["X", "🅧"],
+ ["Y", "🅨"],
+ ["Z", "🅩"],
+ ["a", "🅐"],
+ ["b", "🅑"],
+ ["c", "🅒"],
+ ["d", "🅓"],
+ ["e", "🅔"],
+ ["f", "🅕"],
+ ["g", "🅖"],
+ ["h", "🅗"],
+ ["i", "🅘"],
+ ["j", "🅙"],
+ ["k", "🅚"],
+ ["l", "🅛"],
+ ["m", "🅜"],
+ ["n", "🅝"],
+ ["o", "🅞"],
+ ["p", "🅟"],
+ ["q", "🅠"],
+ ["r", "🅡"],
+ ["s", "🅢"],
+ ["t", "🅣"],
+ ["u", "🅤"],
+ ["v", "🅥"],
+ ["w", "🅦"],
+ ["x", "🅧"],
+ ["y", "🅨"],
+ ["z", "🅩"]
+ ]),
+ squaredDict: new Map([
+ ["A", "🄰"],
+ ["B", "🄱"],
+ ["C", "🄲"],
+ ["D", "🄳"],
+ ["E", "🄴"],
+ ["F", "🄵"],
+ ["G", "🄶"],
+ ["H", "🄷"],
+ ["I", "🄸"],
+ ["J", "🄹"],
+ ["K", "🄺"],
+ ["L", "🄻"],
+ ["M", "🄼"],
+ ["N", "🄽"],
+ ["O", "🄾"],
+ ["P", "🄿"],
+ ["Q", "🅀"],
+ ["R", "🅁"],
+ ["S", "🅂"],
+ ["T", "🅃"],
+ ["U", "🅄"],
+ ["V", "🅅"],
+ ["W", "🅆"],
+ ["X", "🅇"],
+ ["Y", "🅈"],
+ ["Z", "🅉"],
+ ["a", "🄰"],
+ ["b", "🄱"],
+ ["c", "🄲"],
+ ["d", "🄳"],
+ ["e", "🄴"],
+ ["f", "🄵"],
+ ["g", "🄶"],
+ ["h", "🄷"],
+ ["i", "🄸"],
+ ["j", "🄹"],
+ ["k", "🄺"],
+ ["l", "🄻"],
+ ["m", "🄼"],
+ ["n", "🄽"],
+ ["o", "🄾"],
+ ["p", "🄿"],
+ ["q", "🅀"],
+ ["r", "🅁"],
+ ["s", "🅂"],
+ ["t", "🅃"],
+ ["u", "🅄"],
+ ["v", "🅅"],
+ ["w", "🅆"],
+ ["x", "🅇"],
+ ["y", "🅈"],
+ ["z", "🅉"]
+ ]),
+ squaredBlackDict: new Map([
+ ["A", "🅰"],
+ ["B", "🅱"],
+ ["C", "🅲"],
+ ["D", "🅳"],
+ ["E", "🅴"],
+ ["F", "🅵"],
+ ["G", "🅶"],
+ ["H", "🅷"],
+ ["I", "🅸"],
+ ["J", "🅹"],
+ ["K", "🅺"],
+ ["L", "🅻"],
+ ["M", "🅼"],
+ ["N", "🅽"],
+ ["O", "🅾"],
+ ["P", "🅿"],
+ ["Q", "🆀"],
+ ["R", "🆁"],
+ ["S", "🆂"],
+ ["T", "🆃"],
+ ["U", "🆄"],
+ ["V", "🆅"],
+ ["W", "🆆"],
+ ["X", "🆇"],
+ ["Y", "🆈"],
+ ["Z", "🆉"],
+ ["a", "🅰"],
+ ["b", "🅱"],
+ ["c", "🅲"],
+ ["d", "🅳"],
+ ["e", "🅴"],
+ ["f", "🅵"],
+ ["g", "🅶"],
+ ["h", "🅷"],
+ ["i", "🅸"],
+ ["j", "🅹"],
+ ["k", "🅺"],
+ ["l", "🅻"],
+ ["m", "🅼"],
+ ["n", "🅽"],
+ ["o", "🅾"],
+ ["p", "🅿"],
+ ["q", "🆀"],
+ ["r", "🆁"],
+ ["s", "🆂"],
+ ["t", "🆃"],
+ ["u", "🆄"],
+ ["v", "🆅"],
+ ["w", "🆆"],
+ ["x", "🆇"],
+ ["y", "🆈"],
+ ["z", "🆉"]
+ ]),
+ serifBoldDict: new Map([
+ ["0", "𝟎"],
+ ["1", "𝟏"],
+ ["2", "𝟐"],
+ ["3", "𝟑"],
+ ["4", "𝟒"],
+ ["5", "𝟓"],
+ ["6", "𝟔"],
+ ["7", "𝟕"],
+ ["8", "𝟖"],
+ ["9", "𝟗"],
+ ["A", "𝐀"],
+ ["B", "𝐁"],
+ ["C", "𝐂"],
+ ["D", "𝐃"],
+ ["E", "𝐄"],
+ ["F", "𝐅"],
+ ["G", "𝐆"],
+ ["H", "𝐇"],
+ ["I", "𝐈"],
+ ["J", "𝐉"],
+ ["K", "𝐊"],
+ ["L", "𝐋"],
+ ["M", "𝐌"],
+ ["N", "𝐍"],
+ ["O", "𝐎"],
+ ["P", "𝐏"],
+ ["Q", "𝐐"],
+ ["R", "𝐑"],
+ ["S", "𝐒"],
+ ["T", "𝐓"],
+ ["U", "𝐔"],
+ ["V", "𝐕"],
+ ["W", "𝐖"],
+ ["X", "𝐗"],
+ ["Y", "𝐘"],
+ ["Z", "𝐙"],
+ ["a", "𝐚"],
+ ["b", "𝐛"],
+ ["c", "𝐜"],
+ ["d", "𝐝"],
+ ["e", "𝐞"],
+ ["f", "𝐟"],
+ ["g", "𝐠"],
+ ["h", "𝐡"],
+ ["i", "𝐢"],
+ ["j", "𝐣"],
+ ["k", "𝐤"],
+ ["l", "𝐥"],
+ ["m", "𝐦"],
+ ["n", "𝐧"],
+ ["o", "𝐨"],
+ ["p", "𝐩"],
+ ["q", "𝐪"],
+ ["r", "𝐫"],
+ ["s", "𝐬"],
+ ["t", "𝐭"],
+ ["u", "𝐮"],
+ ["v", "𝐯"],
+ ["w", "𝐰"],
+ ["x", "𝐱"],
+ ["y", "𝐲"],
+ ["z", "𝐳"]
+ ]),
+ serifBoldItalicDict: new Map([
+ ["A", "𝑨"],
+ ["B", "𝑩"],
+ ["C", "𝑪"],
+ ["D", "𝑫"],
+ ["E", "𝑬"],
+ ["F", "𝑭"],
+ ["G", "𝑮"],
+ ["H", "𝑯"],
+ ["I", "𝑰"],
+ ["J", "𝑱"],
+ ["K", "𝑲"],
+ ["L", "𝑳"],
+ ["M", "𝑴"],
+ ["N", "𝑵"],
+ ["O", "𝑶"],
+ ["P", "𝑷"],
+ ["Q", "𝑸"],
+ ["R", "𝑹"],
+ ["S", "𝑺"],
+ ["T", "𝑻"],
+ ["U", "𝑼"],
+ ["V", "𝑽"],
+ ["W", "𝑾"],
+ ["X", "𝑿"],
+ ["Y", "𝒀"],
+ ["Z", "𝒁"],
+ ["a", "𝒂"],
+ ["b", "𝒃"],
+ ["c", "𝒄"],
+ ["d", "𝒅"],
+ ["e", "𝒆"],
+ ["f", "𝒇"],
+ ["g", "𝒈"],
+ ["h", "𝒉"],
+ ["i", "𝒊"],
+ ["j", "𝒋"],
+ ["k", "𝒌"],
+ ["l", "𝒍"],
+ ["m", "𝒎"],
+ ["n", "𝒏"],
+ ["o", "𝒐"],
+ ["p", "𝒑"],
+ ["q", "𝒒"],
+ ["r", "𝒓"],
+ ["s", "𝒔"],
+ ["t", "𝒕"],
+ ["u", "𝒖"],
+ ["v", "𝒗"],
+ ["w", "𝒘"],
+ ["x", "𝒙"],
+ ["y", "𝒚"],
+ ["z", "𝒛"]
+ ]),
+ sansDict: new Map([
+ ["0", "𝟢"],
+ ["1", "𝟣"],
+ ["2", "𝟤"],
+ ["3", "𝟥"],
+ ["4", "𝟦"],
+ ["5", "𝟧"],
+ ["6", "𝟨"],
+ ["7", "𝟩"],
+ ["8", "𝟪"],
+ ["9", "𝟫"],
+ ["A", "𝖠"],
+ ["B", "𝖡"],
+ ["C", "𝖢"],
+ ["D", "𝖣"],
+ ["E", "𝖤"],
+ ["F", "𝖥"],
+ ["G", "𝖦"],
+ ["H", "𝖧"],
+ ["I", "𝖨"],
+ ["J", "𝖩"],
+ ["K", "𝖪"],
+ ["L", "𝖫"],
+ ["M", "𝖬"],
+ ["N", "𝖭"],
+ ["O", "𝖮"],
+ ["P", "𝖯"],
+ ["Q", "𝖰"],
+ ["R", "𝖱"],
+ ["S", "𝖲"],
+ ["T", "𝖳"],
+ ["U", "𝖴"],
+ ["V", "𝖵"],
+ ["W", "𝖶"],
+ ["X", "𝖷"],
+ ["Y", "𝖸"],
+ ["Z", "𝖹"],
+ ["a", "𝖺"],
+ ["b", "𝖻"],
+ ["c", "𝖼"],
+ ["d", "𝖽"],
+ ["e", "𝖾"],
+ ["f", "𝖿"],
+ ["g", "𝗀"],
+ ["h", "𝗁"],
+ ["i", "𝗂"],
+ ["j", "𝗃"],
+ ["k", "𝗄"],
+ ["l", "𝗅"],
+ ["m", "𝗆"],
+ ["n", "𝗇"],
+ ["o", "𝗈"],
+ ["p", "𝗉"],
+ ["q", "𝗊"],
+ ["r", "𝗋"],
+ ["s", "𝗌"],
+ ["t", "𝗍"],
+ ["u", "𝗎"],
+ ["v", "𝗏"],
+ ["w", "𝗐"],
+ ["x", "𝗑"],
+ ["y", "𝗒"],
+ ["z", "𝗓"]
+ ]),
+ sansBoldDict: new Map([
+ ["0", "𝟬"],
+ ["1", "𝟭"],
+ ["2", "𝟮"],
+ ["3", "𝟯"],
+ ["4", "𝟰"],
+ ["5", "𝟱"],
+ ["6", "𝟲"],
+ ["7", "𝟳"],
+ ["8", "𝟴"],
+ ["9", "𝟵"],
+ ["A", "𝗔"],
+ ["B", "𝗕"],
+ ["C", "𝗖"],
+ ["D", "𝗗"],
+ ["E", "𝗘"],
+ ["F", "𝗙"],
+ ["G", "𝗚"],
+ ["H", "𝗛"],
+ ["I", "𝗜"],
+ ["J", "𝗝"],
+ ["K", "𝗞"],
+ ["L", "𝗟"],
+ ["M", "𝗠"],
+ ["N", "𝗡"],
+ ["O", "𝗢"],
+ ["P", "𝗣"],
+ ["Q", "𝗤"],
+ ["R", "𝗥"],
+ ["S", "𝗦"],
+ ["T", "𝗧"],
+ ["U", "𝗨"],
+ ["V", "𝗩"],
+ ["W", "𝗪"],
+ ["X", "𝗫"],
+ ["Y", "𝗬"],
+ ["Z", "𝗭"],
+ ["a", "𝗮"],
+ ["b", "𝗯"],
+ ["c", "𝗰"],
+ ["d", "𝗱"],
+ ["e", "𝗲"],
+ ["f", "𝗳"],
+ ["g", "𝗴"],
+ ["h", "𝗵"],
+ ["i", "𝗶"],
+ ["j", "𝗷"],
+ ["k", "𝗸"],
+ ["l", "𝗹"],
+ ["m", "𝗺"],
+ ["n", "𝗻"],
+ ["o", "𝗼"],
+ ["p", "𝗽"],
+ ["q", "𝗾"],
+ ["r", "𝗿"],
+ ["s", "𝘀"],
+ ["t", "𝘁"],
+ ["u", "𝘂"],
+ ["v", "𝘃"],
+ ["w", "𝘄"],
+ ["x", "𝘅"],
+ ["y", "𝘆"],
+ ["z", "𝘇"]
+ ]),
+ sansItalicDict: new Map([
+ ["A", "𝘈"],
+ ["B", "𝘉"],
+ ["C", "𝘊"],
+ ["D", "𝘋"],
+ ["E", "𝘌"],
+ ["F", "𝘍"],
+ ["G", "𝘎"],
+ ["H", "𝘏"],
+ ["I", "𝘐"],
+ ["J", "𝘑"],
+ ["K", "𝘒"],
+ ["L", "𝘓"],
+ ["M", "𝘔"],
+ ["N", "𝘕"],
+ ["O", "𝘖"],
+ ["P", "𝘗"],
+ ["Q", "𝘘"],
+ ["R", "𝘙"],
+ ["S", "𝘚"],
+ ["T", "𝘛"],
+ ["U", "𝘜"],
+ ["V", "𝘝"],
+ ["W", "𝘞"],
+ ["X", "𝘟"],
+ ["Y", "𝘠"],
+ ["Z", "𝘡"],
+ ["a", "𝘢"],
+ ["b", "𝘣"],
+ ["c", "𝘤"],
+ ["d", "𝘥"],
+ ["e", "𝘦"],
+ ["f", "𝘧"],
+ ["g", "𝘨"],
+ ["h", "𝘩"],
+ ["i", "𝘪"],
+ ["j", "𝘫"],
+ ["k", "𝘬"],
+ ["l", "𝘭"],
+ ["m", "𝘮"],
+ ["n", "𝘯"],
+ ["o", "𝘰"],
+ ["p", "𝘱"],
+ ["q", "𝘲"],
+ ["r", "𝘳"],
+ ["s", "𝘴"],
+ ["t", "𝘵"],
+ ["u", "𝘶"],
+ ["v", "𝘷"],
+ ["w", "𝘸"],
+ ["x", "𝘹"],
+ ["y", "𝘺"],
+ ["z", "𝘻"]
+ ]),
+ sansBoldItalicDict: new Map([
+ ["A", "𝘼"],
+ ["B", "𝘽"],
+ ["C", "𝘾"],
+ ["D", "𝘿"],
+ ["E", "𝙀"],
+ ["F", "𝙁"],
+ ["G", "𝙂"],
+ ["H", "𝙃"],
+ ["I", "𝙄"],
+ ["J", "𝙅"],
+ ["K", "𝙆"],
+ ["L", "𝙇"],
+ ["M", "𝙈"],
+ ["N", "𝙉"],
+ ["O", "𝙊"],
+ ["P", "𝙋"],
+ ["Q", "𝙌"],
+ ["R", "𝙍"],
+ ["S", "𝙎"],
+ ["T", "𝙏"],
+ ["U", "𝙐"],
+ ["V", "𝙑"],
+ ["W", "𝙒"],
+ ["X", "𝙓"],
+ ["Y", "𝙔"],
+ ["Z", "𝙕"],
+ ["a", "𝙖"],
+ ["b", "𝙗"],
+ ["c", "𝙘"],
+ ["d", "𝙙"],
+ ["e", "𝙚"],
+ ["f", "𝙛"],
+ ["g", "𝙜"],
+ ["h", "𝙝"],
+ ["i", "𝙞"],
+ ["j", "𝙟"],
+ ["k", "𝙠"],
+ ["l", "𝙡"],
+ ["m", "𝙢"],
+ ["n", "𝙣"],
+ ["o", "𝙤"],
+ ["p", "𝙥"],
+ ["q", "𝙦"],
+ ["r", "𝙧"],
+ ["s", "𝙨"],
+ ["t", "𝙩"],
+ ["u", "𝙪"],
+ ["v", "𝙫"],
+ ["w", "𝙬"],
+ ["x", "𝙭"],
+ ["y", "𝙮"],
+ ["z", "𝙯"]
+ ])
+}
+
+type ConvertMode = 'circledBlack' | 'circled' | 'doublestruck' | 'frakturBold' | 'fraktur' | 'monospace' | 'sansBold' | 'sansBoldItalic' | 'sans' | 'sansItalic' | 'scriptBold' | 'script' | 'serifBold' | 'serifBoldItalic' | 'squaredBlack' | 'squared'
+
+export function ConvertRichUnicode(text: string, mode: ConvertMode): string {
+ let dict: Map;
+ switch (mode) {
+ case 'circledBlack':
+ dict = convertMap.cicledBlackDict;
+ break;
+ case 'circled':
+ dict = convertMap.circledDict;
+ break;
+ case 'doublestruck':
+ dict = convertMap.doublestruckDict;
+ break;
+ case 'frakturBold':
+ dict = convertMap.frakturBoldDict;
+ break;
+ case 'fraktur':
+ dict = convertMap.frakturDict;
+ break;
+ case 'monospace':
+ dict = convertMap.monospaceDict;
+ break;
+ case 'sansBold':
+ dict = convertMap.sansBoldDict;
+ break;
+ case 'sansBoldItalic':
+ dict = convertMap.sansBoldItalicDict;
+ break;
+ case 'sans':
+ dict = convertMap.sansDict;
+ break;
+ case 'sansItalic':
+ dict = convertMap.sansItalicDict;
+ break;
+ case 'scriptBold':
+ dict = convertMap.scriptBoldDict;
+ break;
+ case 'script':
+ dict = convertMap.scriptDict;
+ break;
+ case 'serifBold':
+ dict = convertMap.serifBoldDict;
+ break;
+ case 'serifBoldItalic':
+ dict = convertMap.serifBoldItalicDict;
+ break;
+ case 'squaredBlack':
+ dict = convertMap.squaredBlackDict;
+ break;
+ case 'squared':
+ dict = convertMap.squaredDict;
+ break;
+ default:
+ return text;
+ }
+ let newText = '';
+ for (let i = 0; i < text.length; i++) {
+ const char = text.charAt(i);
+ newText += dict.get(char) || char;
+ }
+ return newText;
+}
diff --git a/frontend/svelte.config.js b/frontend/svelte.config.js
new file mode 100644
index 0000000..3630bb3
--- /dev/null
+++ b/frontend/svelte.config.js
@@ -0,0 +1,7 @@
+import sveltePreprocess from 'svelte-preprocess'
+
+export default {
+ // Consult https://github.com/sveltejs/svelte-preprocess
+ // for more information about preprocessors
+ preprocess: sveltePreprocess()
+}
diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json
new file mode 100644
index 0000000..6a087a8
--- /dev/null
+++ b/frontend/tsconfig.json
@@ -0,0 +1,37 @@
+{
+ "extends": "@tsconfig/svelte/tsconfig.json",
+ "compilerOptions": {
+ "target": "ESNext",
+ "useDefineForClassFields": true,
+ "module": "ESNext",
+ "resolveJsonModule": true,
+ "baseUrl": ".",
+ /**
+ * Typecheck JS in `.svelte` and `.js` files by default.
+ * Disable checkJs if you'd like to use dynamic types in JS.
+ * Note that setting allowJs false does not prevent the use
+ * of JS in `.svelte` files.
+ */
+ "allowJs": true,
+ "checkJs": true,
+ // Generate d.ts files
+ "declaration": true,
+ "emitDeclarationOnly": true,
+ "isolatedModules": true
+ },
+ "include": [
+ "src/**/*.d.ts",
+ "src/**/*.ts",
+ "src/**/*.js",
+ "src/**/*.svelte"
+ ],
+ "exclude": [
+ "src/**/*.spec.ts",
+ "src/**/*.test.ts"
+ ],
+ "references": [
+ {
+ "path": "./tsconfig.node.json"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/frontend/tsconfig.node.json b/frontend/tsconfig.node.json
new file mode 100644
index 0000000..05764b1
--- /dev/null
+++ b/frontend/tsconfig.node.json
@@ -0,0 +1,10 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "module": "ESNext",
+ "moduleResolution": "Node"
+ },
+ "include": [
+ "vite.config.ts"
+ ]
+}
diff --git a/frontend/vite.config.js b/frontend/vite.config.js
deleted file mode 100644
index d37616f..0000000
--- a/frontend/vite.config.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import {defineConfig} from 'vite'
-import {svelte} from '@sveltejs/vite-plugin-svelte'
-
-// https://vitejs.dev/config/
-export default defineConfig({
- plugins: [svelte()]
-})
diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts
new file mode 100644
index 0000000..09fd72f
--- /dev/null
+++ b/frontend/vite.config.ts
@@ -0,0 +1,17 @@
+import { defineConfig } from 'vite'
+import { svelte } from '@sveltejs/vite-plugin-svelte'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [svelte()],
+ test: {
+ coverage: {
+ // you can include other reporters, but 'json-summary' is required, json is recommended
+ reporter: ['text', 'json-summary', 'json'],
+ // If you want a coverage reports even if your tests are failing, include the reportOnFailure option
+ reportOnFailure: true,
+ all: false,
+ enabled: true,
+ }
+ }
+})
diff --git a/frontend/wailsjs/go/main/App.d.ts b/frontend/wailsjs/go/main/App.d.ts
index 2f47e69..358c2dc 100755
--- a/frontend/wailsjs/go/main/App.d.ts
+++ b/frontend/wailsjs/go/main/App.d.ts
@@ -5,6 +5,8 @@ export function Chikuwa(arg1:string):Promise;
export function DispatchCommand(arg1:string):Promise;
+export function GetContext():Promise;
+
export function OpenConfigDirectory():Promise;
export function OpenLogDirectory():Promise;
diff --git a/frontend/wailsjs/go/main/App.js b/frontend/wailsjs/go/main/App.js
index d68eadc..236d560 100755
--- a/frontend/wailsjs/go/main/App.js
+++ b/frontend/wailsjs/go/main/App.js
@@ -10,6 +10,10 @@ export function DispatchCommand(arg1) {
return window['go']['main']['App']['DispatchCommand'](arg1);
}
+export function GetContext() {
+ return window['go']['main']['App']['GetContext']();
+}
+
export function OpenConfigDirectory() {
return window['go']['main']['App']['OpenConfigDirectory']();
}
diff --git a/main.go b/main.go
index d920c79..26a68c1 100644
--- a/main.go
+++ b/main.go
@@ -23,7 +23,7 @@ import (
//go:embed all:frontend/dist
var assets embed.FS
-const Version = "v14"
+const Version = "v15"
func main() {
// Create an instance of the app structure
@@ -61,21 +61,6 @@ func main() {
FileMenu.AddText("沈没", keys.CmdOrCtrl("q"), func(_ *menu.CallbackData) {
runtime.Quit(app.ctx)
})
- FileMenu.AddText("Post", keys.CmdOrCtrl("Enter"), func(_ *menu.CallbackData) {
- runtime.EventsEmit(app.ctx, "call-post")
- })
- FileMenu.AddText("設定の場所を開く", keys.CmdOrCtrl(","), func(_ *menu.CallbackData) {
- app.OpenConfigDirectory()
- })
- FileMenu.AddText("ログの場所を開く", keys.CmdOrCtrl("."), func(_ *menu.CallbackData) {
- app.OpenLogDirectory()
- })
-
- // BlueskyCommandMenu := CommandMenu.AddSubmenu("Bluesky")
- WindowMenu := AppMenu.AddSubmenu("Window")
- WindowMenu.AddText("中央に移動する", nil, func(_ *menu.CallbackData) {
- runtime.WindowCenter(app.ctx)
- })
if app.environment.Platform == "darwin" {
AppMenu.Append(menu.EditMenu()) // on macos platform, we should append EditMenu to enable Cmd+C,Cmd+V,Cmd+Z... shortcut
diff --git a/wails.json b/wails.json
index bacc49e..b94f49c 100644
--- a/wails.json
+++ b/wails.json
@@ -13,7 +13,7 @@
"Info": {
"companyName": "kakakaya",
"productName": "まぜそば大陸",
- "productVersion": "14.0.0",
+ "productVersion": "15.0.0",
"copyright": "Copyright 2023-2024 kakakaya",
"comments": "https://github.com/kakakaya/mazesoba-continent"
}