From cfd2ccf50d99c6acb8c43c19b5afd721fab362f7 Mon Sep 17 00:00:00 2001 From: Andrew Zambazos Date: Fri, 25 Jul 2025 22:46:38 +1200 Subject: [PATCH] Neb added --- bookmarks.json | 1 + index.html | 19 - main.js | 323 ++++-- package-lock.json | 2413 +++++++++++++++++++++++++++++++++++++++- package.json | 27 +- preload.js | 20 +- renderer.js | 46 - renderer/404.css | 81 ++ renderer/404.html | 41 + renderer/home.css | 281 +++++ renderer/home.html | 52 + renderer/home.js | 136 +++ renderer/icons.js | 143 +++ renderer/icons.json | 10 + renderer/index.html | 80 ++ renderer/script.js | 475 ++++++++ renderer/settings.css | 142 +++ renderer/settings.html | 74 ++ renderer/settings.js | 29 + renderer/style.css | 254 +++++ site-history.json | 4 + style.css | 55 - 22 files changed, 4483 insertions(+), 223 deletions(-) create mode 100644 bookmarks.json delete mode 100644 index.html delete mode 100644 renderer.js create mode 100644 renderer/404.css create mode 100644 renderer/404.html create mode 100644 renderer/home.css create mode 100644 renderer/home.html create mode 100644 renderer/home.js create mode 100644 renderer/icons.js create mode 100644 renderer/icons.json create mode 100644 renderer/index.html create mode 100644 renderer/script.js create mode 100644 renderer/settings.css create mode 100644 renderer/settings.html create mode 100644 renderer/settings.js create mode 100644 renderer/style.css create mode 100644 site-history.json delete mode 100644 style.css diff --git a/bookmarks.json b/bookmarks.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/bookmarks.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/index.html b/index.html deleted file mode 100644 index 75babf4..0000000 --- a/index.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - Sleek Electron Browser - - - - - - - - \ No newline at end of file diff --git a/main.js b/main.js index 1707103..c72df3f 100644 --- a/main.js +++ b/main.js @@ -1,92 +1,271 @@ -const { app, BrowserWindow, BrowserView, ipcMain } = require('electron'); // Add ipcMain here -const path = require('node:path'); +const { app, BrowserWindow, ipcMain, session, screen, shell } = require('electron'); +const fs = require('fs'); +const path = require('path'); -let mainWindow; -let browserView; +app.commandLine.appendSwitch('ignore-gpu-blacklist'); +app.commandLine.appendSwitch('enable-gpu-rasterization'); +app.commandLine.appendSwitch('enable-zero-copy'); +app.commandLine.appendSwitch('enable-native-gpu-memory-buffers'); +app.commandLine.appendSwitch('ignore-gpu-blocklist'); +app.commandLine.appendSwitch('enable-accelerated-video-decode'); +app.commandLine.appendSwitch('enable-features', 'VaapiVideoDecoder,CanvasOopRasterization'); +app.commandLine.appendSwitch('no-sandbox'); // Optional, for some setups -const createWindow = () => { - mainWindow = new BrowserWindow({ - width: 1000, - height: 700, - minWidth: 800, - minHeight: 600, - titleBarStyle: 'hiddenInset', - webPreferences: { - preload: path.join(__dirname, 'preload.js'), - nodeIntegration: false, - contextIsolation: true, - webviewTag: false - } +// Set a custom application name +app.setName('Nebula'); + +// --- clear any prior registrations to prevent duplicate‐handler errors --- +ipcMain.removeHandler('window-minimize'); +ipcMain.removeHandler('window-maximize'); +ipcMain.removeHandler('window-close'); + +function createWindow(startUrl) { + // Get the available screen size + const { width, height } = screen.getPrimaryDisplay().workAreaSize; + + // Ensure nativeWindowOpen is disabled + let windowOptions = { + width, + height, + resizable: true, + webPreferences: { + preload: path.join(__dirname, 'preload.js'), + nodeIntegration: true, + contextIsolation: true, // was false + webviewTag: true, + enableRemoteModule: true, // Enable the remote module + nodeIntegrationInSubFrames: true, // ← allow require() inside your + nativeWindowOpen: false // Prevent Electron from creating new windows + }, + fullscreen: false, + autoHideMenuBar: true, + icon: path.join(__dirname, 'assets/images/Logos/Nebula-favicon.png'), + title: 'Nebula', + }; + + if (process.platform === 'darwin') { + Object.assign(windowOptions, { + frame: true, + titleBarStyle: 'hidden', + trafficLightPosition: { x: 15, y: 20 }, + backgroundColor: '#00000000', + transparent: true, }); - - mainWindow.loadFile('index.html'); - - // Open the DevTools. - // mainWindow.webContents.openDevTools(); - - browserView = new BrowserView({ - webPreferences: { - nodeIntegration: false, - contextIsolation: true, - } + } else if (process.platform === 'win32') { + Object.assign(windowOptions, { + frame: true, // Use default Windows title bar. + // removed titleBarOverlay to restore native Windows controls. }); + } else { + windowOptions.frame = true; + } - mainWindow.setBrowserView(browserView); + const win = new BrowserWindow(windowOptions); - const navBarHeight = 80; // Make sure this matches your CSS navbar height - const updateBrowserViewBounds = () => { - const { width, height } = mainWindow.getBounds(); - browserView.setBounds({ x: 0, y: navBarHeight, width: width, height: height - navBarHeight }); - }; + // Handle window.open() calls – load URL in this window + win.webContents.setWindowOpenHandler(({ url }) => { + win.loadURL(url); + return { action: 'deny' }; + }); - updateBrowserViewBounds(); // Set initial bounds - browserView.webContents.loadURL('https://www.google.com'); + // Intercept direct navigations (e.g., user clicks a link) – load URL in this window + win.webContents.on('will-navigate', (event, url) => { + event.preventDefault(); // Prevent navigation in the current window + win.loadURL(url); + }); - mainWindow.on('resize', updateBrowserViewBounds); + // Intercept legacy new-window events – load URL in this window + win.webContents.on('new-window', (event, url) => { + event.preventDefault(); // Prevent new Electron window + win.loadURL(url); + }); - // --- IPC Handlers --- - ipcMain.on('load-url', (event, url) => { - let formattedUrl = url; - // Basic URL formatting: if no protocol, assume https:// - if (!formattedUrl.match(/^[a-zA-Z]+:\/\//)) { - formattedUrl = 'https://' + formattedUrl; - } - browserView.webContents.loadURL(formattedUrl).catch(err => { - console.error('Failed to load URL:', err); - // Optionally send an error back to the renderer - }); + // ensure all embedded tags also use the same window + win.webContents.on('did-attach-webview', (event, webContents) => { + // intercept window.open() inside webview + webContents.setWindowOpenHandler(({ url }) => { + webContents.loadURL(url); + return { action: 'deny' }; }); - - ipcMain.on('go-back', () => { - if (browserView.webContents.canGoBack()) { - browserView.webContents.goBack(); - } + // intercept legacy new-window on webview + webContents.on('new-window', (e, url) => { + e.preventDefault(); + webContents.loadURL(url); }); - - ipcMain.on('go-forward', () => { - if (browserView.webContents.canGoForward()) { - browserView.webContents.goForward(); - } + // intercept navigation on webview (e.g. user clicks link) + webContents.on('will-navigate', (e, url) => { + e.preventDefault(); + webContents.loadURL(url); }); + }); - ipcMain.on('refresh-page', () => { - browserView.webContents.reload(); + win.loadFile('renderer/index.html'); + + // if caller passed in a URL, forward it to the renderer after load + if (startUrl) { + win.webContents.once('did-finish-load', () => { + win.webContents.send('open-url', startUrl); }); - // --- End IPC Handlers --- -}; + } + // Set default zoom to 100% + const zoomFactor = 1.0; + win.webContents.on('did-finish-load', () => { + win.webContents.setZoomFactor(zoomFactor); + }); + + // record site and search history on every navigation + const recordHistory = async (fileName, entry) => { + const filePath = path.join(__dirname, fileName); + let data = []; + try { data = JSON.parse(fs.readFileSync(filePath, 'utf8')); } catch {} + if (data[0] !== entry) { + data.unshift(entry); + if (data.length > 100) data.pop(); + fs.writeFileSync(filePath, JSON.stringify(data, null, 2)); + } + }; + + win.webContents.on('did-navigate', (event, url) => { + recordHistory('site-history.json', url); + const m = /[?&](?:q|query)=([^&]+)/.exec(url); + if (m && m[1]) { + const query = decodeURIComponent(m[1].replace(/\+/g, ' ')); + recordHistory('search-history.json', query); + } + }); +} + +// This method will be called when Electron has finished initialization app.whenReady().then(() => { - createWindow(); - - app.on('activate', () => { - if (BrowserWindow.getAllWindows().length === 0) { - createWindow(); - } - }); + createWindow(); + if (process.platform === 'darwin') { + // Set macOS dock icon using an icns file for proper display. + app.dock.setIcon(path.join(__dirname, 'assets/images/Logos/Nebula-Icon.icns')); + } + app.on('activate', () => { + if (BrowserWindow.getAllWindows().length === 0) createWindow(); + }); }); +// Quit when all windows are closed. app.on('window-all-closed', () => { - if (process.platform !== 'darwin') { - app.quit(); + if (process.platform !== 'darwin') app.quit(); +}); + +// ipcMain handlers + +// --- window control handlers (only registered once now) +ipcMain.handle('window-minimize', event => { + BrowserWindow.fromWebContents(event.sender).minimize(); +}); +ipcMain.handle('window-maximize', event => { + const w = BrowserWindow.fromWebContents(event.sender); + w.isMaximized() ? w.unmaximize() : w.maximize(); +}); +ipcMain.handle('window-close', event => { + BrowserWindow.fromWebContents(event.sender).close(); +}); + +// Add site and search history IPC handlers +ipcMain.handle('load-site-history', async () => { + const filePath = path.join(__dirname, 'site-history.json'); + try { + const data = fs.readFileSync(filePath, 'utf-8'); + return JSON.parse(data); + } catch (err) { + return []; + } +}); + +ipcMain.handle('save-site-history', async (event, history) => { + const filePath = path.join(__dirname, 'site-history.json'); + try { + fs.writeFileSync(filePath, JSON.stringify(history, null, 2)); + return true; + } catch (err) { + return false; + } +}); + +ipcMain.handle('load-search-history', async () => { + const filePath = path.join(__dirname, 'search-history.json'); + try { + const data = fs.readFileSync(filePath, 'utf-8'); + return JSON.parse(data); + } catch (err) { + return []; + } +}); + +ipcMain.handle('save-search-history', async (event, history) => { + const filePath = path.join(__dirname, 'search-history.json'); + try { + fs.writeFileSync(filePath, JSON.stringify(history, null, 2)); + return true; + } catch (err) { + return false; + } +}); + +// debug: log default‐homepage changes from renderer +ipcMain.on('homepage-changed', (event, url) => { + console.log('[MAIN] homepage-changed →', url); +}); + + +ipcMain.handle('clear-browser-data', async () => { + try { + const ses = session.defaultSession; + + // Clear cookies + await ses.clearStorageData({ storages: ['cookies'] }); + + // Clear local storage and other storage data + await ses.clearStorageData({ storages: ['localstorage', 'indexdb', 'filesystem', 'websql'] }); + + // Clear cache + await ses.clearCache(); + + // Clear HTTP authentication cache + await ses.clearAuthCache(); + + // Clear all cookies explicitly to ensure logged-in accounts are logged out + const cookies = await ses.cookies.get({}); + for (const cookie of cookies) { + await ses.cookies.remove(cookie.url, cookie.name); } -}); \ No newline at end of file + + return true; // Indicate success + } catch (error) { + console.error('Failed to clear browser data:', error); + return false; // Indicate failure + } +}); + +ipcMain.handle('get-zoom-factor', event => { + const wc = BrowserWindow.fromWebContents(event.sender).webContents; + return wc.getZoomFactor(); +}); + +ipcMain.handle('zoom-in', event => { + const wc = BrowserWindow.fromWebContents(event.sender).webContents; + const current = wc.getZoomFactor(); + const z = Math.min(current + 0.1, 3); + wc.setZoomFactor(z); + return z; +}); + + +ipcMain.handle('zoom-out', event => { + const wc = BrowserWindow.fromWebContents(event.sender).webContents; + const current = wc.getZoomFactor(); + const z = Math.max(current - 0.1, 0.25); + wc.setZoomFactor(z); + return z; +}); + +// allow renderer to pop a tab into its own window +ipcMain.handle('open-tab-in-new-window', (event, url) => { + createWindow(url); +}); diff --git a/package-lock.json b/package-lock.json index 9cf27ea..db71c9d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,34 @@ { - "name": "nebulabrowser", + "name": "nebula", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "nebulabrowser", + "name": "nebula", "version": "1.0.0", "license": "ISC", "devDependencies": { - "electron": "^37.2.4" + "electron": "^37.2.3", + "electron-builder": "^23.0.0" + } + }, + "node_modules/@develar/schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/@electron/get": { @@ -34,6 +53,142 @@ "global-agent": "^3.0.0" } }, + "node_modules/@electron/universal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.2.1.tgz", + "integrity": "sha512-7323HyMh7KBAl/nPDppdLsC87G6RwRU02dy5FPeGB1eS7rUePh55+WNWiDPLhFQqqVPHzh77M69uhmoT8XnwMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@malept/cross-spawn-promise": "^1.1.0", + "asar": "^3.1.0", + "debug": "^4.3.1", + "dir-compare": "^2.4.0", + "fs-extra": "^9.0.1", + "minimatch": "^3.0.4", + "plist": "^3.0.4" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/universal/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/universal/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", + "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -60,6 +215,16 @@ "node": ">=10" } }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/@types/cacheable-request": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", @@ -73,6 +238,38 @@ "@types/responselike": "^1.0.0" } }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, "node_modules/@types/http-cache-semantics": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", @@ -90,16 +287,43 @@ "@types/node": "*" } }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { - "version": "22.16.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.16.5.tgz", - "integrity": "sha512-bJFoMATwIGaxxx8VJPeM8TonI8t579oRvgAuT8zFugJsJZgzqv0Fu8Mhp68iecjzG7cnN3mO2dJQ5uUM2EFrgQ==", + "version": "22.16.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.16.3.tgz", + "integrity": "sha512-sr4Xz74KOUeYadexo1r8imhRtlVXcs+j3XK3TcoiYk7B1t3YRVJgtaD3cwX73NYb71pmVuMLNRhJ9XKdoDB74g==", "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } }, + "node_modules/@types/plist": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*", + "xmlbuilder": ">=11.0.1" + } + }, "node_modules/@types/responselike": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", @@ -110,6 +334,31 @@ "@types/node": "*" } }, + "node_modules/@types/verror": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz", + "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/yauzl": { "version": "2.10.3", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", @@ -121,6 +370,316 @@ "@types/node": "*" } }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/7zip-bin": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.1.1.tgz", + "integrity": "sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/app-builder-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz", + "integrity": "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==", + "dev": true, + "license": "MIT" + }, + "node_modules/app-builder-lib": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-23.6.0.tgz", + "integrity": "sha512-dQYDuqm/rmy8GSCE6Xl/3ShJg6Ab4bZJMT8KaTKGzT436gl1DN4REP3FCWfXoh75qGTJ+u+WsdnnpO9Jl8nyMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@develar/schema-utils": "~2.6.5", + "@electron/universal": "1.2.1", + "@malept/flatpak-bundler": "^0.4.0", + "7zip-bin": "~5.1.1", + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.9", + "builder-util": "23.6.0", + "builder-util-runtime": "9.1.1", + "chromium-pickle-js": "^0.2.0", + "debug": "^4.3.4", + "ejs": "^3.1.7", + "electron-osx-sign": "^0.6.0", + "electron-publish": "23.6.0", + "form-data": "^4.0.0", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "is-ci": "^3.0.0", + "isbinaryfile": "^4.0.10", + "js-yaml": "^4.1.0", + "lazy-val": "^1.0.5", + "minimatch": "^3.1.2", + "read-config-file": "6.2.0", + "sanitize-filename": "^1.6.3", + "semver": "^7.3.7", + "tar": "^6.1.11", + "temp-file": "^3.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/app-builder-lib/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/app-builder-lib/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/app-builder-lib/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/app-builder-lib/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/asar": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/asar/-/asar-3.2.0.tgz", + "integrity": "sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg==", + "deprecated": "Please use @electron/asar moving forward. There is no API change, just a package name change", + "dev": true, + "license": "MIT", + "dependencies": { + "chromium-pickle-js": "^0.2.0", + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + }, + "optionalDependencies": { + "@types/glob": "^7.1.1" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/bluebird-lst": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", + "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "^3.5.5" + } + }, "node_modules/boolean": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", @@ -130,6 +689,61 @@ "license": "MIT", "optional": true }, + "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/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true, + "license": "MIT" + }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -140,6 +754,108 @@ "node": "*" } }, + "node_modules/buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/builder-util": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-23.6.0.tgz", + "integrity": "sha512-QiQHweYsh8o+U/KNCZFSvISRnvRctb8m/2rB2I1JdByzvNKxPeFLlHFRPQRXab6aYeXc18j9LpsDLJ3sGQmWTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/debug": "^4.1.6", + "@types/fs-extra": "^9.0.11", + "7zip-bin": "~5.1.1", + "app-builder-bin": "4.0.0", + "bluebird-lst": "^1.0.9", + "builder-util-runtime": "9.1.1", + "chalk": "^4.1.1", + "cross-spawn": "^7.0.3", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-ci": "^3.0.0", + "js-yaml": "^4.1.0", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0" + } + }, + "node_modules/builder-util-runtime": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.1.1.tgz", + "integrity": "sha512-azRhYLEoDvRDR8Dhis4JatELC/jUvYjm4cVSj7n9dauGTOM2eeNn9KS0z6YA6oDsjI1xphjNbY6PZZeHPzzqaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/builder-util/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/builder-util/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/builder-util/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/cacheable-lookup": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", @@ -169,6 +885,103 @@ "node": ">=8" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/clone-response": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", @@ -182,6 +995,110 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "buffer": "^5.1.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/debug": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", @@ -277,6 +1194,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", @@ -285,10 +1212,183 @@ "license": "MIT", "optional": true }, + "node_modules/dir-compare": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-2.4.0.tgz", + "integrity": "sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-equal": "1.0.0", + "colors": "1.0.3", + "commander": "2.9.0", + "minimatch": "3.0.4" + }, + "bin": { + "dircompare": "src/cli/dircompare.js" + } + }, + "node_modules/dir-compare/node_modules/commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-readlink": ">= 1.0.0" + }, + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/dir-compare/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dmg-builder": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-23.6.0.tgz", + "integrity": "sha512-jFZvY1JohyHarIAlTbfQOk+HnceGjjAdFjVn3n8xlDWKsYNqbO4muca6qXEZTfGXeQMG7TYim6CeS5XKSfSsGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "23.6.0", + "builder-util": "23.6.0", + "builder-util-runtime": "9.1.1", + "fs-extra": "^10.0.0", + "iconv-lite": "^0.6.2", + "js-yaml": "^4.1.0" + }, + "optionalDependencies": { + "dmg-license": "^1.0.11" + } + }, + "node_modules/dmg-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dmg-builder/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/dmg-builder/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/dmg-license": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", + "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "@types/plist": "^3.0.1", + "@types/verror": "^1.10.3", + "ajv": "^6.10.0", + "crc": "^3.8.0", + "iconv-corefoundation": "^1.1.7", + "plist": "^3.0.4", + "smart-buffer": "^4.0.2", + "verror": "^1.10.0" + }, + "bin": { + "dmg-license": "bin/dmg-license.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", + "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron": { - "version": "37.2.4", - "resolved": "https://registry.npmjs.org/electron/-/electron-37.2.4.tgz", - "integrity": "sha512-F1WDDvY60TpFwGyW+evNB5q0Em8PamcDTVIKB2NaiaKEbNC2Fabn8Wyxy5g+Anirr1K40eKGjfSJhWEUbI1TOw==", + "version": "37.2.3", + "resolved": "https://registry.npmjs.org/electron/-/electron-37.2.3.tgz", + "integrity": "sha512-JRKKn8cRDXDfkC+oWISbYs+c+L6RA776JM0NiB9bn2yV8H/LnBUlVPzKKfsXgrUIokN4YcbCw694vfAdEJwtGw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -304,6 +1404,186 @@ "node": ">= 12.20.55" } }, + "node_modules/electron-builder": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-23.6.0.tgz", + "integrity": "sha512-y8D4zO+HXGCNxFBV/JlyhFnoQ0Y0K7/sFH+XwIbj47pqaW8S6PGYQbjoObolKBR1ddQFPt4rwp4CnwMJrW3HAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs": "^17.0.1", + "app-builder-lib": "23.6.0", + "builder-util": "23.6.0", + "builder-util-runtime": "9.1.1", + "chalk": "^4.1.1", + "dmg-builder": "23.6.0", + "fs-extra": "^10.0.0", + "is-ci": "^3.0.0", + "lazy-val": "^1.0.5", + "read-config-file": "6.2.0", + "simple-update-notifier": "^1.0.7", + "yargs": "^17.5.1" + }, + "bin": { + "electron-builder": "cli.js", + "install-app-deps": "install-app-deps.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/electron-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-builder/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-builder/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-osx-sign": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.6.0.tgz", + "integrity": "sha512-+hiIEb2Xxk6eDKJ2FFlpofCnemCbjbT5jz+BKGpVBrRNT3kWTGs4DfNX6IzGwgi33hUcXF+kFs9JW+r6Wc1LRg==", + "deprecated": "Please use @electron/osx-sign moving forward. Be aware the API is slightly different", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "bluebird": "^3.5.0", + "compare-version": "^0.1.2", + "debug": "^2.6.8", + "isbinaryfile": "^3.0.2", + "minimist": "^1.2.0", + "plist": "^3.0.1" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/electron-osx-sign/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/electron-osx-sign/node_modules/isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-alloc": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/electron-osx-sign/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/electron-publish": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-23.6.0.tgz", + "integrity": "sha512-jPj3y+eIZQJF/+t5SLvsI5eS4mazCbNYqatv5JihbqOstIM13k0d1Z3vAWntvtt13Itl61SO6seicWdioOU5dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/fs-extra": "^9.0.11", + "builder-util": "23.6.0", + "builder-util-runtime": "9.1.1", + "chalk": "^4.1.1", + "fs-extra": "^10.0.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + } + }, + "node_modules/electron-publish/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-publish/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-publish/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", @@ -330,7 +1610,6 @@ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, "license": "MIT", - "optional": true, "engines": { "node": ">= 0.4" } @@ -341,7 +1620,35 @@ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, "license": "MIT", - "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, "engines": { "node": ">= 0.4" } @@ -354,6 +1661,16 @@ "license": "MIT", "optional": true }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -389,6 +1706,31 @@ "@types/yauzl": "^2.9.1" } }, + "node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "optional": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, "node_modules/fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -399,6 +1741,56 @@ "pend": "~1.2.0" } }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -414,6 +1806,98 @@ "node": ">=6 <7 || >=8" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -430,6 +1914,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "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/global-agent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", @@ -487,7 +1993,6 @@ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, "license": "MIT", - "optional": true, "engines": { "node": ">= 0.4" }, @@ -528,6 +2033,23 @@ "dev": true, "license": "ISC" }, + "node_modules/graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -542,6 +2064,61 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/http-cache-semantics": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", @@ -549,6 +2126,21 @@ "dev": true, "license": "BSD-2-Clause" }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/http2-wrapper": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", @@ -563,6 +2155,167 @@ "node": ">=10.19.0" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-corefoundation": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", + "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "cli-truncate": "^2.1.0", + "node-addon-api": "^1.6.3" + }, + "engines": { + "node": "^8.11.2 || >=10" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause", + "optional": true + }, + "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/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -570,6 +2323,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -578,6 +2338,19 @@ "license": "ISC", "optional": true }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -598,6 +2371,20 @@ "json-buffer": "3.0.1" } }, + "node_modules/lazy-val": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, "node_modules/lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", @@ -608,6 +2395,19 @@ "node": ">=8" } }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", @@ -622,6 +2422,52 @@ "node": ">=10" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -632,6 +2478,79 @@ "node": ">=4" } }, + "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/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -639,6 +2558,14 @@ "dev": true, "license": "MIT" }, + "node_modules/node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/normalize-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", @@ -683,6 +2610,26 @@ "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", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -690,6 +2637,21 @@ "dev": true, "license": "MIT" }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -711,6 +2673,16 @@ "once": "^1.3.1" } }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", @@ -724,6 +2696,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/read-config-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.2.0.tgz", + "integrity": "sha512-gx7Pgr5I56JtYz+WuqEbQHj/xWo+5Vwua2jhb1VwM4Wid5PqYmZ4i00ZB0YEGIfkVBsCv9UrjgyqCiQfS/Oosg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dotenv": "^9.0.2", + "dotenv-expand": "^5.1.0", + "js-yaml": "^4.1.0", + "json5": "^2.2.0", + "lazy-val": "^1.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve-alpn": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", @@ -763,6 +2762,30 @@ "node": ">=8.0" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "license": "WTFPL OR ISC", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true, + "license": "ISC" + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -798,6 +2821,101 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/sprintf-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", @@ -806,6 +2924,44 @@ "license": "BSD-3-Clause", "optional": true }, + "node_modules/stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/sumchecker": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", @@ -819,6 +2975,116 @@ "node": ">= 8.0" } }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + } + }, + "node_modules/temp-file/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/temp-file/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/temp-file/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "license": "WTFPL", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, "node_modules/type-fest": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", @@ -850,6 +3116,73 @@ "node": ">= 4.0.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -857,6 +3190,62 @@ "dev": true, "license": "ISC" }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", diff --git a/package.json b/package.json index e6c1089..2f0c995 100644 --- a/package.json +++ b/package.json @@ -1,24 +1,25 @@ { - "name": "nebulabrowser", + "name": "nebula", + "productName": "Nebula", "version": "1.0.0", - "description": "", "main": "main.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "start" : "electron . --disable-gpu-sandbox" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/Bobbybear007/NebulaBrowser.git" + "start": "electron .", + "dist": "electron-builder" }, "keywords": [], "author": "", "license": "ISC", - "bugs": { - "url": "https://github.com/Bobbybear007/NebulaBrowser/issues" - }, - "homepage": "https://github.com/Bobbybear007/NebulaBrowser#readme", + "description": "", "devDependencies": { - "electron": "^37.2.4" + "electron": "^37.2.3", + "electron-builder": "^23.0.0" + }, + "build": { + "appId": "com.andrewzambazos.nebula", + "mac": { + "category": "public.app-category.productivity", + "icon": "assets/images/Logos/Nebula-Icon.ico" + } } } diff --git a/preload.js b/preload.js index 1be6062..881e11e 100644 --- a/preload.js +++ b/preload.js @@ -1,10 +1,18 @@ +// preload.js const { contextBridge, ipcRenderer } = require('electron'); -// Expose a limited set of IPC methods to the renderer process +window.addEventListener('DOMContentLoaded', () => { + console.log("Browser UI loaded."); +}); + +// stubbed preload—no-op or expose an API as needed contextBridge.exposeInMainWorld('electronAPI', { - loadURL: (url) => ipcRenderer.send('load-url', url), - goBack: () => ipcRenderer.send('go-back'), - goForward: () => ipcRenderer.send('go-forward'), - refreshPage: () => ipcRenderer.send('refresh-page'), - // You can add more APIs here as your browser grows + send: (ch, ...args) => ipcRenderer.send(ch, ...args), + invoke: (ch, ...args) => ipcRenderer.invoke(ch, ...args), + on: (ch, fn) => ipcRenderer.on(ch, (e, ...args) => fn(...args)) +}); + +contextBridge.exposeInMainWorld('bookmarksAPI', { + load: () => ipcRenderer.invoke('load-bookmarks'), + save: (data) => ipcRenderer.invoke('save-bookmarks', data) }); \ No newline at end of file diff --git a/renderer.js b/renderer.js deleted file mode 100644 index b701611..0000000 --- a/renderer.js +++ /dev/null @@ -1,46 +0,0 @@ -document.addEventListener('DOMContentLoaded', () => { - const addressBar = document.getElementById('address-bar'); - const goButton = document.getElementById('go-button'); - const backButton = document.getElementById('back-button'); - const forwardButton = document.getElementById('forward-button'); - const refreshButton = document.getElementById('refresh-button'); - - // Load initial URL if present in address bar - const initialUrl = addressBar.value; - if (initialUrl) { - window.electronAPI.loadURL(initialUrl); - } - - goButton.addEventListener('click', () => { - const url = addressBar.value; - if (url) { - window.electronAPI.loadURL(url); - } - }); - - addressBar.addEventListener('keydown', (event) => { - if (event.key === 'Enter') { - const url = addressBar.value; - if (url) { - window.electronAPI.loadURL(url); - } - } - }); - - backButton.addEventListener('click', () => { - window.electronAPI.goBack(); - }); - - forwardButton.addEventListener('click', () => { - window.electronAPI.goForward(); - }); - - refreshButton.addEventListener('click', () => { - window.electronAPI.refreshPage(); - }); - - // You can add more logic here, e.g., to update the address bar - // when the BrowserView navigates to a new URL. This requires - // IPC communication from the main process to the renderer. - // We'll leave that as a potential enhancement for later. -}); \ No newline at end of file diff --git a/renderer/404.css b/renderer/404.css new file mode 100644 index 0000000..5a08c72 --- /dev/null +++ b/renderer/404.css @@ -0,0 +1,81 @@ +/* Load InterVariable */ +@font-face { + font-family: 'InterVariable'; + src: url('../assets/images/fonts/InterVariable.ttf') format('truetype'); + font-weight: 100 900; + font-display: swap; +} + +:root { + --bg: #121418; + --dark-blue: #0B1C2B; + --dark-purple: #1B1035; + --primary: #7B2EFF; + --accent: #00C6FF; + --text: #E0E0E0; +} + +body { + background-color: var(--bg); + color: var(--text); + font-family: 'InterVariable', sans-serif; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + margin: 0; +} + +.container { + text-align: center; + background-color: var(--dark-purple); + padding: 2rem; + border-radius: 20px; + box-shadow: 0 0 12px rgba(0, 0, 0, 0.4); + width: 90%; + max-width: 500px; +} + +.error-icon { + font-size: 4rem; + margin-bottom: 1rem; + color: var(--accent); +} + +h1 { + margin: 0; + font-size: 1.8rem; + color: var(--primary); +} + +p { + margin: 0.5rem 0; + color: var(--text); +} + +.url-line { + font-style: italic; + color: var(--text); +} + +.actions { + margin-top: 1.5rem; + display: flex; + justify-content: center; + gap: 1rem; +} + +button { + padding: 0.6rem 1.2rem; + background-color: var(--primary); + color: var(--text); + border: none; + border-radius: 8px; + font-size: 1rem; + cursor: pointer; + transition: background 0.2s ease; +} + +button:hover { + background-color: var(--accent); +} diff --git a/renderer/404.html b/renderer/404.html new file mode 100644 index 0000000..9530dbc --- /dev/null +++ b/renderer/404.html @@ -0,0 +1,41 @@ + + + + + 404 - Lost in the Void + + + +
+
🪐
+

404 - Page Not Found

+

You’ve warped into an unknown sector.

+

Tried to reach:

+ +
+ + +
+
+ + + + diff --git a/renderer/home.css b/renderer/home.css new file mode 100644 index 0000000..7e41204 --- /dev/null +++ b/renderer/home.css @@ -0,0 +1,281 @@ +/* Load InterVariable */ +@font-face { + font-family: 'InterVariable'; + src: url('../assets/images/fonts/InterVariable.ttf') format('truetype'); + font-weight: 100 900; + font-display: swap; +} + +/* Base reset */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + + +body, html { + /* replace solid bg with a subtle gradient */ + margin: 0; + padding: 0; + height: 100%; + background: linear-gradient(145deg, #121418 0%, #1B1035 100%); + color: var(--text); + overflow: hidden; + font-family: 'InterVariable', sans-serif; +} + +/* Center everything */ +.home-container { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; /* Center content vertically */ + height: 100vh; + overflow-y: auto; + text-align: center; + padding: 2rem; +} + + +/* Logo block */ +.logo { + display: flex; + flex-direction: column; + align-items: center; + margin-bottom: 2rem; +} + +.logo-img { + /* bump up logo size and add subtle shadow */ + width: 150px; + height: 150px; + margin-bottom: 1rem; + filter: drop-shadow(0 4px 8px rgba(0,0,0,0.5)); +} + +.logo-text { + font-size: 2rem; + font-weight: bold; +} + +/* Search bar */ +.search-bar { + display: flex; + align-items: center; + background: #ffffff; + border-radius: 70px; + box-shadow: 0 4px 20px rgba(0,0,0,0.2); + padding: 0.25rem; + margin-bottom: 2rem; + width: 500px; + max-width: 90vw; + overflow: hidden; +} + +.search-bar input.search-input { + flex: 1; + border: none; + background: transparent; + padding: 0.75rem 1rem; + font-size: 1rem; + color: #333; +} + +.search-bar button.search-btn { + border: none; + background: linear-gradient(90deg, var(--primary), var(--accent)); + color: white; + padding: 0.75rem; + border-radius: 50%; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + transition: transform 0.2s ease; +} + +.search-bar button.search-btn:hover { + transform: scale(1.1); +} + +.search-bar button.search-btn .material-symbols-outlined { + font-size: 1.25rem; +} + +/* Remove default focus outline */ +.search-bar input.search-input:focus, +.search-bar button.search-btn:focus { + outline: none; + box-shadow: none; +} + +/* Bookmark grid */ +.bookmarks { + display: flex; + justify-content: center; + flex-wrap: wrap; + gap: 1rem; + max-width: 800px; +} + +/* Individual bookmark tile */ +.bookmark { + background: rgba(255,255,255,0.05); + border: 1px solid rgba(255,255,255,0.1); + backdrop-filter: blur(6px); + box-shadow: 0 4px 16px rgba(0,0,0,0.3); + transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out; + color: var(--text); + width: 100px; + height: 100px; + border-radius: 20px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + position: relative; + cursor: pointer; + transform: translateY(0) scale(1); +} + +.bookmark:hover { + transform: translateY(-4px) scale(1.1); + box-shadow: 0 8px 24px rgba(0,0,0,0.5); +} + +.bookmark-icon { + font-size: 1.75rem; + margin-bottom: 0.25rem; + /* accentuate icons & add-button */ + color: var(--accent); +} + +.bookmark-title { + font-size: 0.8rem; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.delete-btn { + position: absolute; + top: 5px; + right: 7px; + background: none; + border: none; + color: red; + font-size: 1rem; + cursor: pointer; +} + +/* Add button style */ +.add-bookmark { + display: flex; + align-items: center; + justify-content: center; + width: 100px; + height: 100px; + border-radius: 50%; + font-size: 2rem; + background: rgba(255,255,255,0.05); + border: 1px dashed rgba(255,255,255,0.3); + backdrop-filter: blur(6px); + transition: transform 0.2s ease-in-out, background 0.3s, border-color 0.3s; + color: white; + transform: scale(1); +} + +.add-bookmark:hover { + transform: scale(1.1); +} + +/* Popup styling */ +.popup { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(18,20,24,0.8); + display: flex; + align-items: center; + justify-content: center; + z-index: 99; +} + +.popup.hidden { + display: none; +} + +.popup-inner { + background: var(--dark-purple); + padding: 2rem; + border-radius: 12px; + display: flex; + flex-direction: column; + gap: 1rem; + color: var(--text); + min-width: 300px; +} + +.popup-inner input { + padding: 0.5rem; + background: var(--dark-blue); + border: none; + color: var(--text); + border-radius: 6px; +} + +.popup-buttons { + display: flex; + justify-content: flex-end; + gap: 1rem; +} + +.popup-buttons button { + padding: 0.5rem 1rem; + background: var(--primary); + border: none; + border-radius: 6px; + color: white; + cursor: pointer; +} + +.popup-buttons button:hover { + background: var(--accent); +} + +/* Color Palette */ +:root { + --bg: #121418; + --dark-blue: #0B1C2B; + --dark-purple: #1B1035; + --primary: #7B2EFF; + --accent: #00C6FF; + --text: #E0E0E0; +} + +/* Icon grid styling */ +.icon-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(40px, 1fr)); + gap: 8px; + max-height: 200px; + overflow-y: auto; + margin-bottom: 8px; +} +.icon-item { + cursor: pointer; + padding: 4px; + border: 1px solid transparent; + border-radius: 4px; + text-align: center; +} +.icon-item:hover { + background: rgba(0, 0, 0, 0.1); +} +.icon-item.selected { + border-color: #0078d4; + background: rgba(0, 120, 212, 0.1); +} diff --git a/renderer/home.html b/renderer/home.html new file mode 100644 index 0000000..27f5e01 --- /dev/null +++ b/renderer/home.html @@ -0,0 +1,52 @@ + + + + + New Tab + + + + + +
+ + + + +
+ +
+
+ + + + + + + + diff --git a/renderer/home.js b/renderer/home.js new file mode 100644 index 0000000..c9644b1 --- /dev/null +++ b/renderer/home.js @@ -0,0 +1,136 @@ +import { icons } from './icons.js'; + +const BOOKMARKS_KEY = 'steamos_browser_bookmarks'; + +const bookmarkList = document.getElementById('bookmarkList'); +const titleInput = document.getElementById('titleInput'); +const urlInput = document.getElementById('urlInput'); +const saveBookmarkBtn = document.getElementById('saveBookmarkBtn'); +const cancelBtn = document.getElementById('cancelBtn'); +const addPopup = document.getElementById('addPopup'); +const searchBtn = document.getElementById('searchBtn'); +const searchInput = document.getElementById('searchInput'); +const iconFilter = document.getElementById('iconFilter'); +const iconGrid = document.getElementById('iconGrid'); +const selectedIconInput= document.getElementById('selectedIcon'); +let selectedIcon = icons[0]; + +let bookmarks = JSON.parse(localStorage.getItem(BOOKMARKS_KEY)) || []; + +function saveBookmarks() { + localStorage.setItem(BOOKMARKS_KEY, JSON.stringify(bookmarks)); +} + +function renderBookmarks() { + const list = JSON.parse(localStorage.getItem(BOOKMARKS_KEY) || '[]'); + bookmarkList.innerHTML = ''; + + // Render each bookmark + list.forEach((b, index) => { + const box = document.createElement('div'); + box.className = 'bookmark'; + + // prepend icon + const iconEl = document.createElement('span'); + iconEl.className = 'material-symbols-outlined'; + iconEl.textContent = b.icon || 'bookmark'; + box.appendChild(iconEl); + + const label = document.createElement('span'); + label.className = 'bookmark-title'; + label.textContent = b.title; + + const close = document.createElement('button'); + close.textContent = '×'; + close.className = 'delete-btn'; + close.onclick = (e) => { + e.stopPropagation(); + bookmarks.splice(index, 1); + saveBookmarks(); + renderBookmarks(); + }; + + box.onclick = () => window.location.href = b.url; + + box.appendChild(label); + box.appendChild(close); + bookmarkList.appendChild(box); + }); + + // Add "+" box + const addBox = document.createElement('div'); + addBox.className = 'bookmark add-bookmark'; + addBox.textContent = '+'; + addBox.onclick = () => addPopup.classList.remove('hidden'); + + bookmarkList.appendChild(addBox); +} + +// draw the icon‐grid, filtering by the search term +function renderIconGrid(filter = '') { + iconGrid.innerHTML = ''; + icons + .filter(name => name.includes(filter)) + .forEach(name => { + const span = document.createElement('span'); + span.className = 'material-symbols-outlined icon-item'; + span.textContent = name; + span.onclick = () => { + iconGrid.querySelectorAll('.icon-item') + .forEach(el => el.classList.remove('selected')); + span.classList.add('selected'); + selectedIcon = name; + selectedIconInput.value = name; + }; + iconGrid.appendChild(span); + }); + const first = iconGrid.querySelector('.icon-item'); + if (first) first.click(); +} + +// filter as the user types +iconFilter.addEventListener('input', () => + renderIconGrid(iconFilter.value.trim().toLowerCase()) +); + +// initial render +renderIconGrid(); + +saveBookmarkBtn.onclick = () => { + const title = titleInput.value.trim(); + const url = urlInput.value.trim(); + const icon = selectedIcon; + if (!title || !url) return; + + bookmarks.push({ title, url, icon }); + saveBookmarks(); + renderBookmarks(); + + titleInput.value = ''; + urlInput.value = ''; + addPopup.classList.add('hidden'); +}; + +cancelBtn.onclick = () => { + addPopup.classList.add('hidden'); +}; + +searchBtn.addEventListener('click', () => { + const input = searchInput.value.trim(); + const hasProtocol = /^https?:\/\//i.test(input); + const looksLikeUrl = hasProtocol || /\./.test(input); + let target; + if (looksLikeUrl) { + target = hasProtocol ? input : `https://${input}`; + } else { + target = `https://www.google.com/search?q=${encodeURIComponent(input)}`; + } + window.location.href = target; +}); + +searchInput.addEventListener('keydown', e => { + if (e.key === 'Enter') searchBtn.click(); +}); + +// initial render from localStorage +renderBookmarks(); diff --git a/renderer/icons.js b/renderer/icons.js new file mode 100644 index 0000000..dd332b0 --- /dev/null +++ b/renderer/icons.js @@ -0,0 +1,143 @@ +export const icons = [ + 'home', + 'star', + 'bookmark', + 'favorite', + 'public', + 'search', + 'settings', + '3d_rotation', + 'ac_unit', + 'access_alarm', + 'access_alarms', + 'access_time', + 'accessibility', + 'accessibility_new', + 'accessible', + 'accessible_forward', + 'account_balance', + 'account_balance_wallet', + 'account_box', + 'account_circle', + 'adb', + 'add', + 'add_a_photo', + 'add_alarm', + 'add_alert', + 'add_box', + 'add_business', + 'add_call', + 'add_circle', + 'add_circle_outline', + 'add_comment', + 'add_home', + 'add_ic_call', + 'add_link', + 'add_location', + 'add_photo_alternate', + 'add_road', + 'add_shopping_cart', + 'add_task', + 'add_to_drive', + 'add_to_home_screen', + 'add_to_photos', + 'add_to_queue', + 'adjust', + 'admin_panel_settings', + 'agriculture', + 'airline_seat_flat', + 'airline_seat_flat_angled', + 'airline_seat_individual_suite', + 'airline_seat_legroom_extra', + 'airline_seat_legroom_normal', + 'airline_seat_legroom_reduced', + 'airline_seat_recline_extra', + 'airline_seat_recline_normal', + 'airplanemode_active', + 'airplanemode_inactive', + 'airplay', + 'airport_shuttle', + 'alarm', + 'alarm_add', + 'alarm_off', + 'alarm_on', + 'album', + 'align_horizontal_center', + 'align_horizontal_left', + 'align_horizontal_right', + 'align_vertical_bottom', + 'align_vertical_center', + 'align_vertical_top', + 'all_inbox', + 'all_inclusive', + 'all_out', + 'alt_route', + 'analytics', + 'anchor', + 'android', + 'animation', + 'announcement', + 'apartment', + 'api', + 'app_blocking', + 'app_registration', + 'app_settings_alt', + 'approval', + 'apps', + 'archive', + 'area_chart', + 'arrow_back', + 'arrow_back_ios', + 'arrow_circle_down', + 'arrow_circle_up', + 'arrow_downward', + 'arrow_drop_down', + 'arrow_drop_down_circle', + 'arrow_drop_up', + 'arrow_forward', + 'arrow_forward_ios', + 'arrow_left', + 'arrow_right', + 'arrow_right_alt', + 'arrow_upward', + 'art_track', + 'article', + 'aspect_ratio', + 'assessment', + 'assignment', + 'assignment_ind', + 'assignment_late', + 'assignment_return', + 'assignment_returned', + 'assignment_turned_in', + 'assistant', + 'assistant_photo', + 'atm', + 'attach_email', + 'attach_file', + 'attach_money', + 'attachment', + 'attractions', + 'attribution', + 'audiotrack', + 'auto_awesome', + 'auto_awesome_mosaic', + 'auto_delete', + 'auto_fix_high', + 'auto_fix_normal', + 'auto_fix_off', + 'auto_graph', + 'auto_stories', + 'autorenew', + 'av_timer', + 'baby_changing_station', + 'backpack', + 'backspace', + 'backup', + 'badge', + 'zoom_in', + 'zoom_out', + 'zoom_out_map' +]; + +//Icons from fonts.google.com/icons \ No newline at end of file diff --git a/renderer/icons.json b/renderer/icons.json new file mode 100644 index 0000000..99093e0 --- /dev/null +++ b/renderer/icons.json @@ -0,0 +1,10 @@ +[ + "home", + "star", + "bookmark", + "favorite", + "public", + "search", + "settings" + // … add as many icon names as you like … +] diff --git a/renderer/index.html b/renderer/index.html new file mode 100644 index 0000000..eb9769d --- /dev/null +++ b/renderer/index.html @@ -0,0 +1,80 @@ + + + + + Nebula Browser + + + + +
+ + + +
+ +
+ + + + + \ No newline at end of file diff --git a/renderer/script.js b/renderer/script.js new file mode 100644 index 0000000..39cc621 --- /dev/null +++ b/renderer/script.js @@ -0,0 +1,475 @@ +const ipcRenderer = window.electronAPI; + +// 1) cache hot DOM references +const urlBox = document.getElementById('url'); +const tabBarEl = document.getElementById('tab-bar'); +const webviewsEl = document.getElementById('webviews'); +const menuPopup = document.getElementById('menu-popup'); +const contextMenu = document.getElementById('context-menu'); +const menuItems = contextMenu ? contextMenu.querySelectorAll('li') : []; + +// Select all text on focus and prevent mouseup from deselecting +urlBox.addEventListener('focus', () => urlBox.select()); +urlBox.addEventListener('mouseup', e => e.preventDefault()); +// Add Enter key navigation +urlBox.addEventListener('keydown', (e) => { + if (e.key === 'Enter') { + navigate(); + } +}); + + +let tabs = []; +let activeTabId = null; +const allowedInternalPages = ['settings', 'home']; +let bookmarks = []; + +function createTab(inputUrl) { + inputUrl = inputUrl || 'browser://home'; + console.log('[DEBUG] createTab() inputUrl =', inputUrl); + const id = crypto.randomUUID(); + const resolvedUrl = resolveInternalUrl(inputUrl); + console.log('[DEBUG] createTab() resolvedUrl =', resolvedUrl); + + const webview = document.createElement('webview'); + + webview.id = `tab-${id}`; + webview.src = resolvedUrl; + webview.setAttribute('allowpopups', ''); + webview.setAttribute('partition', 'persist:default'); + webview.classList.add('active'); + + webview.addEventListener('did-fail-load', handleLoadFail(id)); + webview.addEventListener('page-title-updated', e => updateTabMetadata(id, 'title', e.title)); + webview.addEventListener('page-favicon-updated', e => { + if (e.favicons.length > 0) updateTabMetadata(id, 'favicon', e.favicons[0]); + }); + + webview.addEventListener('did-navigate', e => handleNavigation(id, e.url)); // was using inputUrl + webview.addEventListener('did-navigate-in-page', e => handleNavigation(id, e.url)); // was using inputUrl + + // catch any target="_blank" or window.open() calls and open them as new tabs + webview.addEventListener('new-window', e => { + e.preventDefault(); + createTab(e.url); + }); + + webviewsEl.appendChild(webview); + + tabs.push({ + id, + url: inputUrl, // ← save the original input like "browser://home" + title: 'New Tab', + favicon: null, + history: [inputUrl], + historyIndex: 0 + }); + + setActiveTab(id); + renderTabs(); +} + + + +function resolveInternalUrl(url) { + if (url.startsWith('browser://')) { + const page = url.replace('browser://', ''); + if (allowedInternalPages.includes(page)) return `${page}.html`; + else return '404.html'; + } + return url.startsWith('http') ? url : `https://${url}`; +} + + +function handleLoadFail(tabId) { + return (event) => { + if (!event.validatedURL.includes('browser://') && event.errorCode !== -3) { + const webview = document.getElementById(`tab-${tabId}`); + webview.src = `404.html?url=${encodeURIComponent(tabs.find(t => t.id === tabId).url)}`; + } + }; +} + +function updateTabMetadata(id, key, value) { + const tab = tabs.find(t => t.id === id); + if (tab) { + tab[key] = value; + renderTabs(); + } +} + +function navigate() { + const input = urlBox.value.trim(); + const tab = tabs.find(t => t.id === activeTabId); + const webview = document.getElementById(`tab-${activeTabId}`); + if (!tab || !webview) return; + + // decide if this is a search query or a URL/internal page + const hasProtocol = /^https?:\/\//i.test(input); + const isInternal = input.startsWith('browser://'); + const isLikelyUrl = hasProtocol || input.includes('.'); + let resolved; + if (!isInternal && !isLikelyUrl) { + resolved = `https://www.google.com/search?q=${encodeURIComponent(input)}`; + } else { + resolved = resolveInternalUrl(input); + } + + // Push to history using the original input + tab.history = tab.history.slice(0, tab.historyIndex + 1); + tab.history.push(input); + tab.historyIndex++; + + tab.url = input; + webview.src = resolved; + + renderTabs(); + updateNavButtons(); +} + +function handleNavigation(tabId, newUrl) { + const tab = tabs.find(t => t.id === tabId); + if (!tab) return; + + // --- record every real navigation into history --- + if (tab.history[tab.historyIndex] !== newUrl) { + tab.history = tab.history.slice(0, tab.historyIndex + 1); + tab.history.push(newUrl); + tab.historyIndex++; + } + + // translate local files back to our browser:// scheme + const isHome = newUrl.endsWith('home.html'); + const isSettings = newUrl.endsWith('settings.html'); + const displayUrl = isHome + ? 'browser://home' + : isSettings + ? 'browser://settings' + : newUrl; + + tab.url = displayUrl; + + if (tabId === activeTabId) { + urlBox.value = displayUrl === 'browser://home' ? '' : displayUrl; + } + + renderTabs(); + updateNavButtons(); +} + + +function setActiveTab(id) { + tabs.forEach(t => { + const w = document.getElementById(`tab-${t.id}`); + if (w) w.classList.remove('active'); + }); + + const activeWebview = document.getElementById(`tab-${id}`); + if (activeWebview) activeWebview.classList.add('active'); + + activeTabId = id; + + const tab = tabs.find(t => t.id === id); + if (tab) { + // If the tab URL represents the home page, keep the URL bar blank. + urlBox.value = tab.url === 'browser://home' ? '' : tab.url; + renderTabs(); + updateNavButtons(); + updateZoomUI(); // ← update zoom display for new active tab + } +} + +function closeTab(id) { + const w = document.getElementById(`tab-${id}`); + if (w) w.remove(); + + tabs = tabs.filter(t => t.id !== id); + + if (id === activeTabId) { + if (tabs.length > 0) setActiveTab(tabs[0].id); + } + + renderTabs(); + updateNavButtons(); +} + +// 2) streamline renderTabs with a fragment +function renderTabs() { + const frag = document.createDocumentFragment(); + tabs.forEach(tab => { + const el = document.createElement('div'); + el.className = 'tab' + (tab.id === activeTabId ? ' active' : ''); + + if (tab.favicon) { + const icon = document.createElement('img'); + icon.src = tab.favicon; + icon.style.width = '16px'; + icon.style.height = '16px'; + icon.style.marginRight = '6px'; + el.appendChild(icon); + } + + el.appendChild(document.createTextNode(tab.title || new URL(tab.url).hostname)); + + const closeBtn = document.createElement('button'); + closeBtn.textContent = '×'; + closeBtn.onclick = (e) => { + e.stopPropagation(); + closeTab(tab.id); + }; + + // 2a) make tab draggable + el.draggable = true; + el.addEventListener('dragstart', e => { + e.dataTransfer.setData('tabId', tab.id); + }); + + // 2b) on dragend outside window, open in new window and close here + el.addEventListener('dragend', e => { + if ( + e.clientX < 0 || e.clientX > window.innerWidth || + e.clientY < 0 || e.clientY > window.innerHeight + ) { + ipcRenderer.invoke('open-tab-in-new-window', tab.url); + closeTab(tab.id); + } + }); + + el.onclick = () => setActiveTab(tab.id); + el.appendChild(closeBtn); + frag.appendChild(el); + }); + // add the “+” at the end + const plus = document.createElement('div'); + plus.className = 'tab'; plus.textContent = '+'; plus.onclick = () => createTab(); + frag.appendChild(plus); + + tabBarEl.innerHTML = ''; // clear once + tabBarEl.appendChild(frag); // append in one shot +} + +// 1) handle URL sent by main for a detached window +ipcRenderer.on('open-url', (event, url) => { + tabs = []; + activeTabId = null; + webviewsEl.innerHTML = ''; + tabBarEl.innerHTML = ''; + createTab(url); +}); + +function goBack() { + const webview = document.getElementById(`tab-${activeTabId}`); + if (webview && webview.canGoBack()) { + webview.goBack(); + } +} + +function goForward() { + const webview = document.getElementById(`tab-${activeTabId}`); + if (webview && webview.canGoForward()) { + webview.goForward(); + } +} + +function updateNavButtons() { + const webview = document.getElementById(`tab-${activeTabId}`); + const backBtn = document.querySelector('.nav-left button:nth-child(1)'); + const forwardBtn = document.querySelector('.nav-left button:nth-child(2)'); + + backBtn.disabled = !webview || !webview.canGoBack(); + forwardBtn.disabled = !webview || !webview.canGoForward(); +} + +function reload() { + const webview = document.getElementById(`tab-${activeTabId}`); + if (webview) { + webview.reload(); + updateNavButtons(); // keep back/forward buttons in sync after a reload + } +} + + +function openSettings() { + urlBox.value = 'browser://settings'; + navigate(); +} + +// Toggle menu dropdown +const menuBtn = document.getElementById('menu-btn'); + +menuBtn.addEventListener('click', () => { + menuPopup.classList.toggle('hidden'); + if (!menuPopup.classList.contains('hidden')) { + updateZoomUI(); // ← refresh zoom % whenever menu opens + } +}); + +window.addEventListener('DOMContentLoaded', () => { + createTab(); + // only now bind the reload button (guaranteed to exist) + const reloadBtn = document.getElementById('reload-btn'); + reloadBtn.addEventListener('click', reload); + + // bind zoom buttons (single binding) + const zoomInBtn = document.getElementById('zoom-in-btn'); + const zoomOutBtn = document.getElementById('zoom-out-btn'); + zoomInBtn.addEventListener('click', zoomIn); + zoomOutBtn.addEventListener('click', zoomOut); + + // wire up back/forward buttons + const backBtn = document.querySelector('.nav-left button:nth-child(1)'); + const forwardBtn = document.querySelector('.nav-left button:nth-child(2)'); + backBtn.addEventListener('click', goBack); + forwardBtn.addEventListener('click', goForward); + + // window control bindings + const minBtn = document.getElementById('min-btn'); + const maxBtn = document.getElementById('max-btn'); + const closeBtn = document.getElementById('close-btn'); + if (minBtn && maxBtn && closeBtn) { + if (process.platform !== 'darwin') { + minBtn.addEventListener('click', () => ipcRenderer.invoke('window-minimize')); + maxBtn.addEventListener('click', () => ipcRenderer.invoke('window-maximize')); + closeBtn.addEventListener('click', () => ipcRenderer.invoke('window-close')); + } else { + document.getElementById('window-controls').style.display = 'none'; + } + } + + // update initial zoom display + ipcRenderer.invoke('get-zoom-factor').then(z => { + document.getElementById('zoom-percent').textContent = `${Math.round(z * 100)}%`; + }); + + // menu‐related code (moved here so #context-menu exists) + const items = menu ? menu.querySelectorAll('li') : []; + + function showContextMenu(x, y) { + if (!menu) return; + menu.style.top = `${y}px`; + menu.style.left = `${x}px`; + menu.classList.add('visible'); + } + + document.addEventListener('contextmenu', e => { + if (e.target.tagName === 'WEBVIEW' || + e.composedPath().some(el => el.id === 'webviews')) { + e.preventDefault(); + showContextMenu(e.clientX, e.clientY); + } + }); + + document.addEventListener('click', () => { + if (menu) menu.classList.remove('visible'); + }); + + items.forEach(item => { + item.addEventListener('click', async () => { + const action = item.dataset.action; + const win = remote.getCurrentWindow(); + + switch (action) { + case 'save-page': { + const { canceled, filePath } = await remote.dialog.showSaveDialog(win, { defaultPath: 'page.html' }); + if (!canceled && filePath) win.webContents.savePage(filePath, 'HTMLComplete'); + break; + } + case 'select-all': + document.execCommand('selectAll'); + break; + case 'screenshot': { + const image = await win.webContents.capturePage(); + const { canceled, filePath } = await remote.dialog.showSaveDialog(win, { defaultPath: 'screenshot.png' }); + if (!canceled && filePath) fs.writeFileSync(filePath, image.toPNG()); + break; + } + case 'view-source': { + const html = document.documentElement.outerHTML; + const { canceled, filePath } = await remote.dialog.showSaveDialog(win, { defaultPath: 'source.html' }); + if (!canceled && filePath) fs.writeFileSync(filePath, html); + break; + } + case 'inspect-accessibility': + win.webContents.inspectAccessibilityNode(e.clientX, e.clientY); + break; + case 'inspect-element': + win.webContents.inspectElement(e.clientX, e.clientY); + break; + } + + menu.classList.remove('visible'); + }); + }); + + // ipcRenderer.invoke('load-bookmarks').then(bs => { + // bookmarks = bs; + // console.log('[DEBUG] Loaded bookmarks:', bookmarks); + // }); +}); + +// zoom helpers +function updateZoomUI() { + const zp = document.getElementById('zoom-percent'); + if (zp) { + ipcRenderer.invoke('get-zoom-factor').then(zf => { + // just show "NN%", not "Zoom: NN%" + zp.textContent = `${Math.round(zf * 100)}%`; + }); + } +} + +function zoomIn() { ipcRenderer.invoke('zoom-in').then(updateZoomUI); } +function zoomOut() { ipcRenderer.invoke('zoom-out').then(updateZoomUI); } + +const fs = require('fs'); +const { remote } = require('electron'); + +// 4) unify context-menu wiring +function showContextMenu(x,y) { + if (!contextMenu) return; + contextMenu.style.top = `${y}px`; + contextMenu.style.left = `${x}px`; + contextMenu.classList.add('visible'); +} +document.addEventListener('contextmenu', e => { + if (e.target.tagName==='WEBVIEW' || e.composedPath().some(el=>el.id==='webviews')) { + e.preventDefault(); + showContextMenu(e.clientX, e.clientY); + } +}); +document.addEventListener('click', ()=> contextMenu && contextMenu.classList.remove('visible')); +menuItems.forEach(item => item.addEventListener('click', async evt => { + const action = item.dataset.action; + const win = remote.getCurrentWindow(); + + switch (action) { + case 'save-page': { + const { canceled, filePath } = await remote.dialog.showSaveDialog(win, { defaultPath: 'page.html' }); + if (!canceled && filePath) win.webContents.savePage(filePath, 'HTMLComplete'); + break; + } + case 'select-all': + document.execCommand('selectAll'); + break; + case 'screenshot': { + const image = await win.webContents.capturePage(); + const { canceled, filePath } = await remote.dialog.showSaveDialog(win, { defaultPath: 'screenshot.png' }); + if (!canceled && filePath) fs.writeFileSync(filePath, image.toPNG()); + break; + } + case 'view-source': { + const html = document.documentElement.outerHTML; + const { canceled, filePath } = await remote.dialog.showSaveDialog(win, { defaultPath: 'source.html' }); + if (!canceled && filePath) fs.writeFileSync(filePath, html); + break; + } + case 'inspect-accessibility': + win.webContents.inspectAccessibilityNode(e.clientX, e.clientY); + break; + case 'inspect-element': + win.webContents.inspectElement(e.clientX, e.clientY); + break; + } + + contextMenu.classList.remove('visible'); +})); diff --git a/renderer/settings.css b/renderer/settings.css new file mode 100644 index 0000000..ccbb253 --- /dev/null +++ b/renderer/settings.css @@ -0,0 +1,142 @@ +:root { + --bg: #121418; + --dark-blue: #0B1C2B; + --dark-purple: #1B1035; + --primary: #7B2EFF; + --accent: #00C6FF; + --text: #E0E0E0; +} + +/* Load InterVariable */ +@font-face { + font-family: 'InterVariable'; + src: url('../assets/images/fonts/InterVariable.ttf') format('truetype'); + font-weight: 100 900; + font-display: swap; +} + +body { + background-color: var(--bg); + color: var(--text); + font-family: 'InterVariable', sans-serif; + margin: 0; + padding: 2rem; + display: flex; + justify-content: center; + align-items: flex-start; + height: 100vh; +} + +.container { + background-color: var(--dark-purple); + padding: 2rem; + border-radius: 16px; + box-shadow: 0 0 10px rgba(0,0,0,0.5); + max-width: 500px; + width: 100%; +} + +h1 { + font-size: 1.5rem; + margin-bottom: 1.5rem; + color: var(--primary); +} + +.setting-group { + display: flex; + flex-direction: column; + margin-bottom: 1rem; +} + +label { + font-weight: bold; + margin-bottom: 0.5rem; +} + +input { + padding: 0.6rem; + font-size: 1rem; + border: none; + border-radius: 8px; + margin-bottom: 0.75rem; + background-color: var(--dark-blue); + color: var(--text); +} + +button { + padding: 0.6rem; + font-size: 1rem; + background-color: var(--primary); + color: var(--text); + border: none; + border-radius: 8px; + cursor: pointer; + transition: background 0.2s ease-in-out; +} + +button:hover { + background-color: var(--accent); +} + +.note { + font-size: 0.8rem; + color: #aaa; + margin-top: 1rem; +} + +.status { + position: fixed; + bottom: 20px; + left: 50%; + transform: translateX(-50%); + display: flex; + align-items: center; + gap: 0.5rem; + background-color: rgba(18,20,24,0.8); + color: white; + padding: 0.8rem 1.2rem; + border-radius: 8px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.5); + font-size: 1rem; + z-index: 1000; +} + +.status.hidden { + display: none; +} + +.spinner { + width: 16px; + height: 16px; + border: 2px solid transparent; + border-top: 2px solid white; + border-radius: 50%; + animation: spin 0.8s linear infinite; +} + +@keyframes spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +.setting-group input, +.setting-group button { + width: 100%; + box-sizing: border-box; +} + +/* small-screen adjustments */ +@media (max-width: 480px) { + .container { + padding: 1rem; + border-radius: 0; + box-shadow: none; + } + h1 { + font-size: 1.25rem; + } +} diff --git a/renderer/settings.html b/renderer/settings.html new file mode 100644 index 0000000..c634784 --- /dev/null +++ b/renderer/settings.html @@ -0,0 +1,74 @@ + + + + + Settings + + + + + +
+

⚙️ Browser Settings

+ +
+ + +
+ +

Settings are stored locally on this device.

+
+ + + + + + + + + + diff --git a/renderer/settings.js b/renderer/settings.js new file mode 100644 index 0000000..5af8503 --- /dev/null +++ b/renderer/settings.js @@ -0,0 +1,29 @@ +const { ipcRenderer } = require('electron'); + +const clearBtn = document.getElementById('clear-data-btn'); +const statusDiv = document.getElementById('status'); +const statusText = document.getElementById('status-text'); + +function showStatus(message) { + statusText.textContent = message; + statusDiv.classList.remove('hidden'); // Ensure the hidden class is removed + setTimeout(() => { + statusDiv.classList.add('hidden'); // Add the hidden class back after 2 seconds + }, 2000); +} + +clearBtn.onclick = async () => { + statusDiv.classList.remove('hidden'); // Show spinner immediately + statusText.textContent = 'Clearing all browser data...'; // Update text while clearing + + try { + // Invoke the main process to clear cookies, local storage, and cache + const ok = await ipcRenderer.invoke('clear-browser-data'); + showStatus(ok + ? 'All browser data and bookmarks cleared!' + : 'Failed to clear browser data.'); + } catch (error) { + console.error('Error clearing browser data:', error); + showStatus('An error occurred while clearing data.'); + } +}; diff --git a/renderer/style.css b/renderer/style.css new file mode 100644 index 0000000..6dca7aa --- /dev/null +++ b/renderer/style.css @@ -0,0 +1,254 @@ +html, body { + height: 100%; + margin: 0; + padding: 0; + background: #111; + color: white; + font-family: 'Segoe UI', sans-serif; +} + +#tab-bar { + display: flex; + padding-left: 80px; /* leave room for macOS traffic lights */ + overflow-x: auto; /* allow scrolling when many tabs */ + /* custom scrollbar styling */ + scrollbar-color: #444 #2a2a3c; /* thumb and track for Firefox */ + scrollbar-width: thin; /* slimmer track */ +} + +#tab-bar > * { + flex: 1 1 0; + text-align: center; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +/* NAVBAR LAYOUT */ +#nav { + display: flex; + justify-content: space-between; + align-items: center; + padding: 6px 10px; + background: #1e1e2e; + gap: 12px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); +} + +.nav-left, +.nav-center, +.nav-right { + display: flex; + align-items: center; + gap: 8px; +} + +.nav-center { + flex: 1; + background: #2a2a3c; + padding: 4px 6px; + border-radius: 6px; +} + +#favicon { + width: 16px; + height: 16px; + margin-right: 4px; +} + +#url { + flex: 1; + background: transparent; + border: none; + color: white; + font-size: 14px; + outline: none; +} + +#url::placeholder { + color: rgba(255, 255, 255, 0.5); +} + +#nav button { + background: #333; + color: white; + border: none; + padding: 6px 10px; + border-radius: 5px; + cursor: pointer; + transition: background 0.2s; +} + +#nav button:hover { + background: #555; +} + +/* MENU DROPDOWN */ +.menu-wrapper { + position: relative; +} + +#menu-popup { + position: absolute; + top: 30px; + right: 0; + background: #2a2a3c; + border-radius: 4px; + padding: 4px; + display: flex; + flex-direction: column; + min-width: 200px; /* wider dropdown */ + box-shadow: 0 2px 6px rgba(0,0,0,0.4); + z-index: 100; +} + +#menu-popup button { + background: none; + border: none; + color: white; + text-align: left; + padding: 6px 10px; + border-radius: 4px; +} + +#menu-popup button:hover { + background: #444; +} + +.hidden { + display: none; +} + +#menu-popup.hidden { + display: none; +} + +/* WEBVIEWS */ +#webviews { + flex: 1; + display: flex; + width: 100%; + position: relative; +} + +#webviews webview { + flex: 1; + display: none; + border: none; +} + +#webviews webview.active { + display: flex; +} + +/* TABS */ +.tab { + display: flex; + align-items: center; + gap: 6px; + padding: 6px 8px; + margin: 4px 4px 0 0; + background: #222; + border-radius: 8px 8px 0 0; + cursor: pointer; + transition: background 0.2s, flex 0.2s; + min-width: 80px; /* prevent tabs from getting too small */ +} + +.tab:hover { + background: #333; +} + +.tab.active { + background: #444; + font-weight: bold; + flex: 3 1 0; /* increased grow factor for larger active tab */ + min-width: 120px; /* larger min width for the active tab */ +} + +.tab img { + width: 16px; + height: 16px; + margin-right: 6px; + border-radius: 2px; +} + +.tab button { + margin-left: 8px; + background: none; + border: none; + color: #f55; + font-weight: bold; + cursor: pointer; +} + +/* ZOOM CONTROLS */ +.zoom-controls { + display: flex; + align-items: center; + gap: 8px; + padding: 6px 10px; +} +.zoom-controls .zoom-label { + flex: 1; + font-size: 14px; +} +.zoom-controls button { + background: none; + border: none; + color: white; + font-size: 16px; + cursor: pointer; + padding: 2px 6px; + border-radius: 4px; +} +.zoom-controls button:hover { + background: #444; +} +#zoom-percent { + min-width: 36px; + text-align: center; + font-size: 14px; +} + +/* window controls (Windows only) */ +#window-controls { + position: absolute; + top: 0; + right: 0; + display: flex; + gap: 2px; + padding: 4px; + z-index: 200; +} +#window-controls button { + width: 46px; + height: 28px; + background: transparent; + border: none; + color: white; + font-size: 12px; + cursor: pointer; + transition: background 0.2s; +} +#window-controls button:hover { + background: rgba(255,255,255,0.1); +} +#window-controls #close-btn:hover { + background: #e81123; +} + +#tab-bar::-webkit-scrollbar { + height: 8px; /* horizontal scrollbar height */ +} +#tab-bar::-webkit-scrollbar-track { + background: #2a2a3c; + border-radius: 4px; +} +#tab-bar::-webkit-scrollbar-thumb { + background: #444; + border-radius: 4px; +} +#tab-bar::-webkit-scrollbar-thumb:hover { + background: #555; +} diff --git a/site-history.json b/site-history.json new file mode 100644 index 0000000..313cae7 --- /dev/null +++ b/site-history.json @@ -0,0 +1,4 @@ +[ + "file:///X:/Projects/Code/NebulaBrowser/renderer/index.html", + "file:///X:/Projects/Code/SteamOS_Browser/renderer/index.html" +] \ No newline at end of file diff --git a/style.css b/style.css deleted file mode 100644 index f074e0c..0000000 --- a/style.css +++ /dev/null @@ -1,55 +0,0 @@ -body { - margin: 0; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; - display: flex; - flex-direction: column; - height: 100vh; - overflow: hidden; /* Prevent body scroll, BrowserView will handle its own scroll */ - background-color: #f0f0f0; -} - -.navbar { - display: flex; - align-items: center; - padding: 10px; - background-color: #333; - color: white; - box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); - height: 60px; /* Adjust based on navBarHeight in main.js */ - flex-shrink: 0; /* Prevent navbar from shrinking */ -} - -.navbar button { - background-color: #555; - color: white; - border: none; - padding: 8px 15px; - margin: 0 5px; - border-radius: 4px; - cursor: pointer; - font-size: 16px; - transition: background-color 0.2s ease; -} - -.navbar button:hover { - background-color: #777; -} - -.navbar button:active { - background-color: #222; -} - -.navbar #address-bar { - flex-grow: 1; - padding: 8px 10px; - border: 1px solid #777; - border-radius: 4px; - font-size: 16px; - background-color: #444; - color: white; - outline: none; -} - -.navbar #address-bar:focus { - border-color: #007bff; -} \ No newline at end of file