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
+
+
+
+
+
+
+
+

+
Nebula Browser
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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