diff --git a/.github/workflows/desktop-build.yml b/.github/workflows/desktop-build.yml new file mode 100644 index 0000000..603115b --- /dev/null +++ b/.github/workflows/desktop-build.yml @@ -0,0 +1,96 @@ +name: Desktop Build + +on: + push: + branches: [main, neutralino] + workflow_dispatch: + +permissions: + contents: write + +jobs: + build: + runs-on: ${{ matrix.os }} + + strategy: + matrix: + include: + - os: windows-latest + platform: windows + binary_source: Monochrome-win_x64.exe + binary_dest: Monochrome.exe + archive_ext: zip + - os: ubuntu-latest + platform: linux + binary_source: Monochrome-linux_x64 + binary_dest: Monochrome + archive_ext: tar.gz + - os: macos-latest + platform: macos + binary_source: Monochrome-mac_universal + binary_dest: Monochrome + archive_ext: tar.gz + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm install + + - name: Download Neutralino binaries + run: npx neu update + + - name: Build application + run: npm run build + + - name: Prepare Release + run: | + mkdir release + cp dist/Monochrome/resources.neu release/ + cp neutralino.config.json release/ + cp -r extensions release/ + cp dist/Monochrome/${{ matrix.binary_source }} release/${{ matrix.binary_dest }} + shell: bash + + - name: Set Permissions (Linux/macOS) + if: matrix.platform != 'windows' + run: chmod +x release/${{ matrix.binary_dest }} + + # Upload the uncompressed directory as the workflow artifact. + # GitHub will zip this automatically when downloaded, avoiding "zip inside zip". + - name: Upload Artifact + uses: actions/upload-artifact@v4 + with: + name: Monochrome-${{ matrix.platform }} + path: release/ + retention-days: 30 + + # Create an archive specifically for the GitHub Release (tags only) + - name: Create Release Archive (Windows) + if: startsWith(github.ref, 'refs/tags/v') && matrix.platform == 'windows' + run: | + Compress-Archive -Path release/* -DestinationPath monochrome-${{ matrix.platform }}-x64.zip + shell: pwsh + + - name: Create Release Archive (Linux/macOS) + if: startsWith(github.ref, 'refs/tags/v') && matrix.platform != 'windows' + run: | + cd release + tar -czf ../monochrome-${{ matrix.platform }}-x64.tar.gz * + + - name: Create Release + if: startsWith(github.ref, 'refs/tags/v') + uses: softprops/action-gh-release@v1 + with: + files: monochrome-${{ matrix.platform }}-x64.${{ matrix.archive_ext }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index c1ee8f9..5282d6b 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,12 @@ dist # Docker .env + +# Neutralino +.tmp/ +bin/ +*.log +.storage/ +auth_storage/ + +www diff --git a/eslint.config.js b/eslint.config.js index fa49f24..52a909f 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -4,7 +4,7 @@ import prettierConfig from 'eslint-config-prettier'; export default [ { - ignores: ['dist/', 'node_modules/', 'legacy/', 'sw.js'], + ignores: ['**/dist/**', '**/node_modules/**', '**/legacy/**', '**/bin/**'], }, js.configs.recommended, prettierConfig, diff --git a/extensions/js.neutralino.discordrpc/bridge.ps1 b/extensions/js.neutralino.discordrpc/bridge.ps1 new file mode 100644 index 0000000..73b074e --- /dev/null +++ b/extensions/js.neutralino.discordrpc/bridge.ps1 @@ -0,0 +1,91 @@ +# bridge.ps1 - JSON Depth Fix +# $Log = Join-Path $PSScriptRoot "bridge_final.log" +function Log($m) { } + +Log "--- START (DEPTH FIX) ---" + +# 1. PID +$p = Get-Process Monochrome -ErrorAction SilentlyContinue | Select-Object -First 1 +if (-not $p) { $p = Get-Process neutralino-win_x64 -ErrorAction SilentlyContinue | Select-Object -First 1 } +$pid_to_send = if ($p) { $p.Id } else { [System.Diagnostics.Process]::GetCurrentProcess().Id } + +# 2. Discord Connection +function Get-Pipe { + for ($i = 0; $i -le 9; $i++) { + try { + $pn = "discord-ipc-$i" + $p = New-Object System.IO.Pipes.NamedPipeClientStream(".", $pn, [System.IO.Pipes.PipeDirection]::InOut) + $p.Connect(100) + return $p + } catch { } + } + return $null +} +$pipe = Get-Pipe; if (-not $pipe) { Log "Discord Fail"; exit } + +function Send-Packet($op, $json) { + if ($op -eq 1) { Log "Sending Activity: $json" } + $j = [System.Text.Encoding]::UTF8.GetBytes($json) + [byte[]]$pkt = [BitConverter]::GetBytes([int]$op) + [BitConverter]::GetBytes([int]$j.Length) + $j + $pipe.Write($pkt, 0, $pkt.Length); $pipe.Flush() +} + +# 3. Handshake +Send-Packet 0 (@{ v = 1; client_id = "1462186088184549661" } | ConvertTo-Json -Compress) +$h = New-Object byte[] 8; if ($pipe.Read($h, 0, 8) -eq 8) { + $l = [BitConverter]::ToInt32($h, 4); $b = New-Object byte[] $l; $pipe.Read($b, 0, $l) | Out-Null + Log "Handshake OK" +} + +function Set-Activity($d, $s, $img) { + $activity = @{ + details = [string]$d + state = [string]$s + type = 2 + assets = @{ + large_image = if ($img -and $img.StartsWith("http")) { [string]$img } else { "monochrome" } + large_text = "Monochrome" + } + } + + # CRITICAL: -Depth 10 ensures 'assets' is not stringified as a class name + $payload = @{ + cmd = "SET_ACTIVITY" + args = @{ pid = [int]$pid_to_send; activity = $activity } + nonce = [Guid]::NewGuid().ToString() + } | ConvertTo-Json -Compress -Depth 10 + + Send-Packet 1 $payload +} + +Start-Sleep -Seconds 1 +Set-Activity "Idling" "Monochrome" $null + +# 4. Config & WS +$line = [Console]::In.ReadLine() +if (-not $line) { exit } +$config = $line | ConvertFrom-Json + +$ws = New-Object System.Net.WebSockets.ClientWebSocket +try { + $uri = [Uri]"ws://127.0.0.1:$($config.nlPort)?extensionId=$($config.nlExtensionId)&connectToken=$($config.nlConnectToken)" + $ws.ConnectAsync($uri, [System.Threading.CancellationToken]::None).Wait() + Log "WS Connected" +} catch { exit } + +# 5. Loop +$buf = New-Object byte[] 65536 +while ($ws.State -eq "Open") { + $task = $ws.ReceiveAsync((New-Object ArraySegment[byte] -ArgumentList @(,$buf)), [System.Threading.CancellationToken]::None) + while (-not $task.Wait(1000)) { if (-not (Get-Process -Id $pid_to_send -ErrorAction SilentlyContinue)) { exit } } + if ($task.Result.Count -gt 0) { + try { + $raw = [System.Text.Encoding]::UTF8.GetString($buf, 0, $task.Result.Count) + $msg = $raw | ConvertFrom-Json + if ($msg.event -eq "discord:update") { + Set-Activity $msg.data.details $msg.data.state $msg.data.largeImageKey + } + elseif ($msg.event -eq "discord:clear") { Set-Activity "Idling" "Monochrome" $null } + } catch {} + } +} diff --git a/extensions/js.neutralino.discordrpc/bridge.py b/extensions/js.neutralino.discordrpc/bridge.py new file mode 100644 index 0000000..9faed82 --- /dev/null +++ b/extensions/js.neutralino.discordrpc/bridge.py @@ -0,0 +1,142 @@ +# bridge.py - Production Discord RPC Bridge (Linux/macOS) +import sys, json, socket, struct, os, uuid, base64, time + +CLIENT_ID = "1462186088184549661" +LAST_STATUS = "" + +def get_discord_path(): + for i in range(10): + path = os.path.join(os.environ.get('XDG_RUNTIME_DIR', '/tmp'), f'discord-ipc-{i}') + if os.path.exists(path): return path + return None + +def send_packet(s, op, data): + payload = json.dumps(data).encode('utf-8') + header = struct.pack('H", ws.recv(2))[0] + elif length == 127: length = struct.unpack(">Q", ws.recv(8))[0] + + data = b"" + while len(data) < length: + data += ws.recv(length - len(data)) + + msg = json.loads(data.decode('utf-8')) + if msg['event'] == 'discord:update': + d = msg['data'] + set_activity(ds, ppid, d.get('details'), d.get('state'), d.get('largeImageKey')) + elif msg['event'] == 'discord:clear': + set_activity(ds, ppid, "Idling", "Monochrome") + elif msg['event'] == 'windowClose': + break + except socket.timeout: continue + except: continue + + # Cleanup + try: + send_packet(ds, 1, { + "cmd": "SET_ACTIVITY", + "args": {"pid": ppid, "activity": None}, + "nonce": str(uuid.uuid4()) + }) + time.sleep(0.1) + ds.close() + except: pass + +if __name__ == "__main__": + main() diff --git a/js/accounts/auth.js b/js/accounts/auth.js index 2d09d06..2123cc6 100644 --- a/js/accounts/auth.js +++ b/js/accounts/auth.js @@ -2,6 +2,8 @@ import { auth, provider } from './config.js'; import { signInWithPopup, + signInWithRedirect, + getRedirectResult, signOut as firebaseSignOut, onAuthStateChanged, signInWithEmailAndPassword, @@ -26,6 +28,12 @@ export class AuthManager { this.authListeners.forEach((listener) => listener(user)); }); + + // Handle redirect result (for Linux/Mobile where popup might be blocked) + getRedirectResult(auth).catch((error) => { + console.error('Redirect Login failed:', error); + alert(`Login failed: ${error.message}`); + }); } onAuthStateChanged(callback) { @@ -43,11 +51,29 @@ export class AuthManager { } try { + // Check for Linux environment (Neutralino) where popups are often blocked + if (window.NL_OS === 'Linux') { + await signInWithRedirect(auth, provider); + // The page will redirect, so no return value needed immediately + return; + } + const result = await signInWithPopup(auth, provider); // The onAuthStateChanged listener will handle the rest return result.user; } catch (error) { console.error('Login failed:', error); + if (error.code === 'auth/popup-blocked') { + console.log('Popup blocked, falling back to redirect...'); + try { + await signInWithRedirect(auth, provider); + return; + } catch (redirectError) { + console.error('Redirect fallback failed:', redirectError); + alert(`Login failed: ${redirectError.message}`); + throw redirectError; + } + } alert(`Login failed: ${error.message}`); throw error; } diff --git a/js/api.js b/js/api.js index 3ad0e65..17dcae7 100644 --- a/js/api.js +++ b/js/api.js @@ -868,7 +868,6 @@ export class LosslessAPI { const seenTrackIds = new Set(tracks.map((t) => t.id)); const artistsToProcess = artists.slice(0, Math.min(5, artists.length)); - console.log(`Processing ${artistsToProcess.length} artists for recommendations`); const artistPromises = artistsToProcess.map(async (artist) => { try { @@ -876,8 +875,6 @@ export class LosslessAPI { const artistData = await this.getArtist(artist.id, { lightweight: true }); if (artistData && artistData.tracks && artistData.tracks.length > 0) { const newTracks = artistData.tracks.filter((track) => !seenTrackIds.has(track.id)).slice(0, 4); - - console.log(`Found ${newTracks.length} new tracks from ${artist.name}`); return newTracks; } else { console.warn(`No tracks found for artist ${artist.name}`); @@ -897,8 +894,6 @@ export class LosslessAPI { } }); - console.log(`Total recommended tracks found: ${recommendedTracks.length}`); - const shuffled = recommendedTracks.sort(() => 0.5 - Math.random()); return shuffled.slice(0, limit); } diff --git a/js/app.js b/js/app.js index 47d7c79..54f62da 100644 --- a/js/app.js +++ b/js/app.js @@ -13,8 +13,15 @@ import { sidePanelManager } from './side-panel.js'; import { db } from './db.js'; import { syncManager } from './accounts/pocketbase.js'; import { registerSW } from 'virtual:pwa-register'; +import { initializeDiscordRPC } from './discord-rpc.js'; +import * as Neutralino from '@neutralinojs/lib'; import './smooth-scrolling.js'; +// Assign Neutralino to window for global access +if (typeof window !== 'undefined') { + window.Neutralino = Neutralino; +} + // Lazy-loaded modules let settingsModule = null; let downloadsModule = null; @@ -378,6 +385,24 @@ document.addEventListener('DOMContentLoaded', async () => { const { initTracker } = await loadTrackerModule(); initTracker(player); + // Initialize desktop environment (Neutralino) + if (window.Neutralino) { + console.log('Initializing Neutralino desktop environment (Lite Mode)...'); + try { + Neutralino.init(); + + // Register events immediately + Neutralino.events.on('windowClose', () => { + Neutralino.app.exit(); + }); + + // Start RPC immediately after init + initializeDiscordRPC(player); + } catch (error) { + console.error('Failed to initialize desktop environment:', error); + } + } + const castBtn = document.getElementById('cast-btn'); initializeCasting(audioPlayer, castBtn); @@ -497,6 +522,9 @@ document.addEventListener('DOMContentLoaded', async () => { // Update UI with current track info for theme ui.setCurrentTrack(player.currentTrack); + // Update Media Session with new track + player.updateMediaSession(player.currentTrack); + const currentTrackId = player.currentTrack.id; if (currentTrackId === previousTrackId) return; previousTrackId = currentTrackId; diff --git a/js/db.js b/js/db.js index 79466d7..3cda9f3 100644 --- a/js/db.js +++ b/js/db.js @@ -384,8 +384,6 @@ export class MusicDatabase { }); } - console.log(`${storeName}: Adding item with ID ${item.id || item.uuid || item.timestamp}`); - // Critical: Ensure key exists for IndexedDB store.put() const keyPath = store.keyPath; if (keyPath && !item[keyPath]) { diff --git a/js/discord-rpc.js b/js/discord-rpc.js new file mode 100644 index 0000000..0df86fc --- /dev/null +++ b/js/discord-rpc.js @@ -0,0 +1,87 @@ +import { getTrackTitle, getTrackArtists } from './utils.js'; + +export function initializeDiscordRPC(player) { + console.log('[DiscordRPC] Initializing...'); + + const EXTENSION_ID = 'js.neutralino.discordrpc'; + + function sendUpdate(track, isPaused = false) { + if (!track) return; + + let coverUrl = 'monochrome'; + if (track.album?.cover) { + const coverId = track.album.cover.replace(/-/g, '/'); + coverUrl = `https://resources.tidal.com/images/${coverId}/320x320.jpg`; + } + + const data = { + details: getTrackTitle(track), + state: getTrackArtists(track), + largeImageKey: coverUrl, + largeImageText: track.album?.title || 'Monochrome', + smallImageKey: isPaused ? 'pause' : 'play', + smallImageText: isPaused ? 'Paused' : 'Playing', + instance: false, + }; + + if (!isPaused && track.duration) { + const now = Date.now(); + const elapsed = player.audio.currentTime * 1000; + data.startTimestamp = Math.floor((now - elapsed) / 1000); + } + + console.log('[DiscordRPC] Dispatching to', EXTENSION_ID, data); + Neutralino.events.broadcast('discord:update', data).catch(e => console.error('Broadcast failed', e)); + Neutralino.extensions.dispatch(EXTENSION_ID, 'discord:update', data).catch(e => console.error('Dispatch failed', e)); + } + + // Heartbeat & Debug Ping + setInterval(() => { + if (player.currentTrack) { + sendUpdate(player.currentTrack, player.audio.paused); + } else { + const idlingData = { + details: 'Idling', + state: 'Monochrome', + largeImageKey: 'monochrome', + largeImageText: 'Monochrome', + smallImageKey: 'pause', + smallImageText: 'Paused' + }; + Neutralino.events.broadcast('discord:update', idlingData).catch(() => { }); + Neutralino.extensions.dispatch(EXTENSION_ID, 'discord:update', idlingData).catch(() => { }); + } + }, 5000); + + function sendClear() { + Neutralino.events.broadcast('discord:clear', {}).catch(() => { }); + } + + player.audio.addEventListener('play', () => { + sendUpdate(player.currentTrack); + }); + + player.audio.addEventListener('pause', () => { + sendUpdate(player.currentTrack, true); + }); + + player.audio.addEventListener('loadedmetadata', () => { + if (!player.audio.paused) { + sendUpdate(player.currentTrack); + } + }); + + // Send initial status + if (player.currentTrack) { + sendUpdate(player.currentTrack, player.audio.paused); + } else { + Neutralino.events.broadcast('discord:update', { + details: 'Idling', + state: 'Monochrome', + largeImageKey: 'monochrome', + largeImageText: 'Monochrome', + smallImageKey: 'pause', + smallImageText: 'Paused' + }).catch(() => { }); + } +} diff --git a/js/player.js b/js/player.js index 6e46246..643a805 100644 --- a/js/player.js +++ b/js/player.js @@ -402,6 +402,7 @@ export class Player { this.updatePlayingTrackIndicator(); this.updateMediaSession(track); this.updateMediaSessionPlaybackState(); + this.updateNativeWindow(track); try { let streamUrl; @@ -1038,4 +1039,16 @@ export class Player { updateBtn(timerBtn); updateBtn(timerBtnDesktop); } + + async updateNativeWindow(track) { + if (!window.Neutralino) return; + + const trackTitle = getTrackTitle(track); + const artist = getTrackArtists(track); + try { + await Neutralino.window.setTitle(`${trackTitle} • ${artist}`); + } catch (e) { + console.error('Failed to set window title:', e); + } + } } diff --git a/neutralino.config.json b/neutralino.config.json new file mode 100644 index 0000000..f9960eb --- /dev/null +++ b/neutralino.config.json @@ -0,0 +1,53 @@ +{ + "applicationId": "com.monochrome.app", + "applicationName": "Monochrome", + "applicationIcon": "public/assets/512.png", + "author": "Monochrome", + "description": "Lossless music streaming", + "version": "1.0.0", + "defaultMode": "window", + "documentRoot": "www/", + "url": "https://monochrome.tf", + "enableServer": true, + "enableNativeAPI": true, + "enableExtensions": true, + "tokenSecurity": "one-time", + "modes": { + "window": { + "title": "Monochrome", + "icon": "public/assets/512.png", + "width": 1280, + "height": 800, + "minWidth": 800, + "minHeight": 600, + "center": true, + "resizable": true, + "hidden": false, + "borderless": false, + "enableInspector": true, + "openInspectorOnStartup": false, + "exitProcessOnClose": true + } + }, + "port": 5050, + "cli": { + "binaryName": "Monochrome", + "resourcesPath": "www/", + "binaryVersion": "6.5.0", + "clientVersion": "6.5.0" + }, + "extensions": [ + { + "id": "js.neutralino.discordrpc", + "commandLinux": "python3 \"${NL_PATH}/extensions/js.neutralino.discordrpc/bridge.py\"", + "commandMac": "python3 \"${NL_PATH}/extensions/js.neutralino.discordrpc/bridge.py\"", + "commandWindows": "powershell.exe -ExecutionPolicy Bypass -File \"${NL_PATH}/extensions/js.neutralino.discordrpc/bridge.ps1\"" + } + ], + "nativeAllowList": [ + "app.exit", + "window.*", + "extensions.*", + "events.*" + ] +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 5534c1d..088afe7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "@neutralinojs/lib": "^6.5.0", "butterchurn": "^2.6.7", "butterchurn-presets": "^2.4.7", "cookie-session": "^2.1.0", @@ -17,6 +18,7 @@ "pocketbase": "^0.26.5" }, "devDependencies": { + "@neutralinojs/neu": "^11.7.0", "eslint": "^9.39.2", "eslint-config-prettier": "^10.1.8", "globals": "^17.0.0", @@ -26,6 +28,7 @@ "stylelint-config-standard": "^39.0.1", "stylelint-config-standard-scss": "^16.0.0", "vite": "^7.3.0", + "vite-plugin-neutralino": "^1.0.3", "vite-plugin-pwa": "^1.2.0" } }, @@ -78,6 +81,7 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -1606,6 +1610,7 @@ "integrity": "sha512-FA5LmZVF1VziNc0bIdCSA1IoSVnDCqE8HJIZZv2/W8YmoAM50+tnUgJR/gQZwEeIMleuIOnRnHA/UaZRNeV4iQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@keyv/serialize": "^1.1.1" } @@ -1647,6 +1652,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -1690,6 +1696,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -1752,6 +1759,80 @@ "url": "https://github.com/sponsors/JounQin" } }, + "node_modules/@electron/asar": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", + "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/asar/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@electron/asar/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/asar/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", @@ -2567,6 +2648,60 @@ "dev": true, "license": "MIT" }, + "node_modules/@neutralinojs/lib": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@neutralinojs/lib/-/lib-6.5.0.tgz", + "integrity": "sha512-ECgYh+CXAfMR1JVTvDw/kHhjL6LzNNcjk8Va1DZUSBkUwROqFTQ7zseFeuFtwGvutqvlWiwpGmU3s11rg/bdvA==", + "license": "MIT", + "optionalDependencies": { + "@rollup/rollup-darwin-x64": "*", + "@rollup/rollup-linux-x64-gnu": "*" + } + }, + "node_modules/@neutralinojs/neu": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/@neutralinojs/neu/-/neu-11.7.0.tgz", + "integrity": "sha512-fUqvR70a+BpKI9mrD92ldZkVC24Rs8XL/9m7zmOCLgCRys3yuWy7vEsxpHzKMzqTiQJkTYIsLmcR8VMzNIjuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "^3.0.3", + "chalk": "^4.1.0", + "chokidar": "^4.0.3", + "commander": "^7.2.0", + "configstore": "^5.0.1", + "edit-json-file": "^1.6.2", + "follow-redirects": "^1.13.1", + "fs-extra": "^9.0.1", + "pe-library": "^1.0.1", + "png2icons": "^2.0.1", + "postject": "1.0.0-alpha.6", + "recursive-readdir": "^2.2.2", + "resedit": "^2.0.2", + "spawn-command": "^1.0.0", + "tcp-port-used": "^1.0.2", + "uuid": "^8.3.2", + "websocket": "^1.0.35", + "zip-lib": "^1.0.4" + }, + "bin": { + "neu": "bin/neu.js" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/shalithasuranga" + } + }, + "node_modules/@neutralinojs/neu/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2725,7 +2860,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2921,7 +3055,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3141,6 +3274,7 @@ "resolved": "https://registry.npmjs.org/@svta/cml-xml/-/cml-xml-1.0.1.tgz", "integrity": "sha512-11LkJa5kDEcsRMWkVI1ABH3KLCxGoiSVe4kQ293ItVj8ncTTQ7htmCGiJDjS+Cmy35UgF3e/vc0ysJIiWRTx2g==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=20" }, @@ -3189,6 +3323,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3212,6 +3347,7 @@ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -3509,6 +3645,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -3523,6 +3660,16 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -3530,6 +3677,20 @@ "dev": true, "license": "MIT" }, + "node_modules/bufferutil": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.1.0.tgz", + "integrity": "sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/butterchurn": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/butterchurn/-/butterchurn-2.6.7.tgz", @@ -3689,6 +3850,22 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/codem-isoboxer": { "version": "0.3.10", "resolved": "https://registry.npmjs.org/codem-isoboxer/-/codem-isoboxer-0.3.10.tgz", @@ -3746,6 +3923,44 @@ "dev": true, "license": "MIT" }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/configstore/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/configstore/node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -3901,6 +4116,20 @@ "node": ">=4" } }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "dev": true, + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/dashjs": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/dashjs/-/dashjs-5.1.1.tgz", @@ -4072,6 +4301,29 @@ "node": ">=8" } }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -4100,6 +4352,20 @@ "integrity": "sha512-80BnDp2Fn7RxXlEr5HHZblniY4aQ97MOAicdWWpSo0vkQiISSE9wLR4SqxKsu4gCtXFBIPPzy8JMhay4NWRg/Q==", "license": "MIT" }, + "node_modules/edit-json-file": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/edit-json-file/-/edit-json-file-1.8.1.tgz", + "integrity": "sha512-x8L381+GwqxQejPipwrUZIyAg5gDQ9tLVwiETOspgXiaQztLsrOm7luBW5+Pe31aNezuzDY79YyzF+7viCRPXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-value": "^1.0.12", + "iterate-object": "^1.3.4", + "r-json": "^1.2.10", + "set-value": "^4.1.0", + "w-json": "^1.3.10" + } + }, "node_modules/ejs": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", @@ -4286,6 +4552,49 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "dev": true, + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/esbuild": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", @@ -4374,6 +4683,7 @@ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -4522,6 +4832,22 @@ "node": "*" } }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dev": true, + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", @@ -4593,6 +4919,27 @@ "node": ">=0.10.0" } }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "license": "ISC", + "dependencies": { + "type": "^2.7.2" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4764,6 +5111,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-value": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/find-value/-/find-value-1.0.13.tgz", + "integrity": "sha512-epNL4mnl3HUYrwVQtZ8s0nxkE4ogAoSqO1V1fa670Ww1fXp8Yr74zNS9Aib/vLNf0rq0AF/4mboo7ev5XkikXQ==", + "dev": true, + "license": "MIT" + }, "node_modules/flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", @@ -4785,6 +5139,27 @@ "dev": true, "license": "ISC" }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", @@ -5455,6 +5830,25 @@ "node": ">=0.8.19" } }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", @@ -5477,6 +5871,16 @@ "node": ">= 0.4" } }, + "node_modules/ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-alphabetical": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", @@ -5802,6 +6206,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-primitive": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-3.0.1.tgz", + "integrity": "sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -5924,6 +6338,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "dev": true, + "license": "MIT" + }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", @@ -5970,6 +6398,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is2": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.9.tgz", + "integrity": "sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "ip-regex": "^4.1.0", + "is-url": "^1.2.4" + }, + "engines": { + "node": ">=v0.10.0" + } + }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -5984,6 +6427,23 @@ "dev": true, "license": "ISC" }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/iterate-object": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/iterate-object/-/iterate-object-1.3.5.tgz", + "integrity": "sha512-eL23u8oFooYTq6TtJKjp2RYjZnCkUYQvC0T/6fJfWykXJ3quvdDdzKZ3CEjy8b3JGOvLTjDYMEMIp5243R906A==", + "dev": true, + "license": "MIT" + }, "node_modules/jackspeak": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", @@ -6290,6 +6750,22 @@ "dev": true, "license": "MIT" }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -6426,6 +6902,25 @@ "dev": true, "license": "MIT" }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "dev": true, + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-releases": { "version": "2.0.27", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", @@ -6525,6 +7020,16 @@ "node": ">= 0.8" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -6648,6 +7153,16 @@ "node": ">=8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -6702,6 +7217,28 @@ "node": ">=8" } }, + "node_modules/pe-library": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-1.0.1.tgz", + "integrity": "sha512-nh39Mo1eGWmZS7y+mK/dQIqg7S1lp38DpRxkyoHf0ZcUs/HDc+yyTjuOtTvSMZHmfSLuSQaX945u05Y2Q6UWZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14", + "npm": ">=7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -6722,6 +7259,16 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/png2icons": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/png2icons/-/png2icons-2.0.1.tgz", + "integrity": "sha512-GDEQJr8OG4e6JMp7mABtXFSEpgJa1CCpbQiAR+EjhkHJHnUL9zPPtbOrjsMD8gUbikgv3j7x404b0YJsV3aVFA==", + "dev": true, + "license": "MIT", + "bin": { + "png2icons": "png2icons-cli.js" + } + }, "node_modules/pocketbase": { "version": "0.26.5", "resolved": "https://registry.npmjs.org/pocketbase/-/pocketbase-0.26.5.tgz", @@ -6758,6 +7305,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -6841,6 +7389,7 @@ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -6856,6 +7405,32 @@ "dev": true, "license": "MIT" }, + "node_modules/postject": { + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", + "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^9.4.0" + }, + "bin": { + "postject": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/postject/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -6939,6 +7514,23 @@ ], "license": "MIT" }, + "node_modules/r-json": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/r-json/-/r-json-1.3.1.tgz", + "integrity": "sha512-5nhRFfjVMQdrwKUfUlRpDUCocdKtjSnYZ1R/86mpZDV3MfsZ3dYYNjSGuMX+mPBvFvQBhdzxSqxkuLPLv4uFGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "w-json": "1.3.10" + } + }, + "node_modules/r-json/node_modules/w-json": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/w-json/-/w-json-1.3.10.tgz", + "integrity": "sha512-XadVyw0xE+oZ5FGApXsdswv96rOhStzKqL53uSe5UaTadABGkWIg1+DTx8kiZ/VqTZTBneoL0l65RcPe4W3ecw==", + "dev": true, + "license": "MIT" + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -6949,6 +7541,57 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/recursive-readdir/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/recursive-readdir/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -7067,6 +7710,24 @@ "node": ">=0.10.0" } }, + "node_modules/resedit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-2.0.3.tgz", + "integrity": "sha512-oTeemxwoMuxxTYxXUwjkrOPfngTQehlv0/HoYFNkB4uzsP1Un1A9nI8JQKGOFkxpqkC7qkMs0lUsGrvUlbLNUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pe-library": "^1.0.1" + }, + "engines": { + "node": ">=14", + "npm": ">=7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -7342,6 +8003,38 @@ "node": ">= 0.4" } }, + "node_modules/set-value": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-4.1.0.tgz", + "integrity": "sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==", + "dev": true, + "funding": [ + "https://github.com/sponsors/jonschlinkert", + "https://paypal.me/jonathanschlinkert", + "https://jonschlinkert.dev/sponsor" + ], + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "is-primitive": "^3.0.1" + }, + "engines": { + "node": ">=11.0" + } + }, + "node_modules/set-value/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -7536,6 +8229,13 @@ "node": ">= 12" } }, + "node_modules/spawn-command": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-1.0.0.tgz", + "integrity": "sha512-zsboEQnjeF6tSJ8SRnojMr22HyFEaRaohgTt0Kgx3BgzkXYiboh09vpmZVIq1HOLzkFZDgFJJfwGUqSbb5fQQQ==", + "dev": true, + "license": "MIT" + }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", @@ -7795,6 +8495,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-syntax-patches-for-csstree": "^1.0.19", @@ -8174,6 +8875,42 @@ "node": ">=8" } }, + "node_modules/tcp-port-used": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz", + "integrity": "sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4.3.1", + "is2": "^2.0.6" + } + }, + "node_modules/tcp-port-used/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/tcp-port-used/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, + "license": "MIT" + }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -8209,6 +8946,7 @@ "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -8261,6 +8999,13 @@ "node": ">=0.6.x" } }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "dev": true, + "license": "ISC" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -8365,6 +9110,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, "node_modules/ua-parser-js": { "version": "1.0.41", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.41.tgz", @@ -8529,6 +9284,20 @@ "punycode": "^2.1.0" } }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -8536,12 +9305,23 @@ "dev": true, "license": "MIT" }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/vite": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz", "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", @@ -8611,6 +9391,13 @@ } } }, + "node_modules/vite-plugin-neutralino": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/vite-plugin-neutralino/-/vite-plugin-neutralino-1.0.3.tgz", + "integrity": "sha512-E/PSTCp7m7efk7fa4eE12WQ+5XGNP72gkhOv61X4i0n+NcnrwKtJgEgeCDGUXeLp4ngTfU/CP+EF55jmZs/0Jw==", + "dev": true, + "license": "MIT" + }, "node_modules/vite-plugin-pwa": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-1.2.0.tgz", @@ -8642,6 +9429,48 @@ } } }, + "node_modules/w-json": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/w-json/-/w-json-1.3.11.tgz", + "integrity": "sha512-Xa8vTinB5XBIYZlcN8YyHpE625pBU6k+lvCetTQM+FKxRtLJxAY9zUVZbRqCqkMeEGbQpKvGUzwh4wZKGem+ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/websocket": { + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.35.tgz", + "integrity": "sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.63", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/websocket/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/websocket/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -8929,6 +9758,7 @@ "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -9184,6 +10014,13 @@ "node": ">=8" } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, "node_modules/write-file-atomic": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", @@ -9198,6 +10035,16 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/xml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", @@ -9205,6 +10052,17 @@ "dev": true, "license": "MIT" }, + "node_modules/yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.32" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -9212,6 +10070,40 @@ "dev": true, "license": "ISC" }, + "node_modules/yauzl": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", + "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "pend": "~1.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yazl": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-3.3.1.tgz", + "integrity": "sha512-BbETDVWG+VcMUle37k5Fqp//7SDOK2/1+T7X8TD96M3D9G8jK5VLUdQVdVjGi8im7FGkazX7kk5hkU8X4L5Bng==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "^1.0.0" + } + }, + "node_modules/yazl/node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -9224,6 +10116,20 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zip-lib": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/zip-lib/-/zip-lib-1.1.2.tgz", + "integrity": "sha512-PdPYnjxRcbQ7UAhj6Cu8rggpHXFU/6Slhoy2vuA5E/52+i6aSr+9rWup6ll/Mr0mAxV9/YkRni9xGzVc/qh4rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "yauzl": "^3.2.0", + "yazl": "^3.3.1" + }, + "engines": { + "node": ">=18" + } } } } diff --git a/package.json b/package.json index 705726f..384da2c 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "main": "sw.js", "scripts": { "dev": "vite", - "build": "vite build", + "build": "vite build && npx neu build", "preview": "vite preview", "start": "vite preview", "lint:js": "eslint .", @@ -28,6 +28,7 @@ }, "homepage": "https://github.com/SamidyFR/monochrome#readme", "devDependencies": { + "@neutralinojs/neu": "^11.7.0", "eslint": "^9.39.2", "eslint-config-prettier": "^10.1.8", "globals": "^17.0.0", @@ -37,6 +38,7 @@ "stylelint-config-standard": "^39.0.1", "stylelint-config-standard-scss": "^16.0.0", "vite": "^7.3.0", + "vite-plugin-neutralino": "^1.0.3", "vite-plugin-pwa": "^1.2.0" }, "overrides": { @@ -44,6 +46,7 @@ "source-map": "^0.7.4" }, "dependencies": { + "@neutralinojs/lib": "^6.5.0", "cookie-session": "^2.1.0", "jose": "^6.0.11", "butterchurn": "^2.6.7", @@ -51,4 +54,4 @@ "dashjs": "^5.1.1", "pocketbase": "^0.26.5" } -} +} \ No newline at end of file diff --git a/vite.config.js b/vite.config.js index 53b6e30..e631736 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,14 +1,16 @@ import { defineConfig } from 'vite'; import { VitePWA } from 'vite-plugin-pwa'; +import neutralino from 'vite-plugin-neutralino'; import authGatePlugin from './vite-plugin-auth-gate.js'; export default defineConfig({ base: './', build: { - outDir: 'dist', + outDir: 'www', emptyOutDir: true, }, plugins: [ + neutralino(), authGatePlugin(), VitePWA({ registerType: 'prompt',