From 868e9b7d27c061157351b80c61f0de9c7f482805 Mon Sep 17 00:00:00 2001 From: Sven Kribitz Date: Sat, 3 May 2025 21:28:33 +0200 Subject: [PATCH] initial commit --- .vscode/launch.json | 20 +- .vscode/tasks.json | 14 + angular.json | 10 + electron/main.js | 82 ++ electron/preload.js | 9 + package-lock.json | 1047 ++++++++++++++++- package.json | 12 +- src/app/app.component.css | 169 +++ src/app/app.component.html | 335 +----- src/app/app.component.ts | 5 +- .../custom-title-bar.component.css | 73 ++ .../custom-title-bar.component.html | 11 + .../custom-title-bar.component.spec.ts | 23 + .../custom-title-bar.component.ts | 37 + .../task-list/task-list.component.css | 20 + .../task-list/task-list.component.html | 7 + .../task-list/task-list.component.spec.ts | 23 + .../task-list/task-list.component.ts | 28 + src/assets/icon.png | Bin 0 -> 19825 bytes src/index.html | 2 +- 20 files changed, 1561 insertions(+), 366 deletions(-) create mode 100644 electron/main.js create mode 100644 electron/preload.js create mode 100644 src/app/components/custom-title-bar/custom-title-bar.component.css create mode 100644 src/app/components/custom-title-bar/custom-title-bar.component.html create mode 100644 src/app/components/custom-title-bar/custom-title-bar.component.spec.ts create mode 100644 src/app/components/custom-title-bar/custom-title-bar.component.ts create mode 100644 src/app/components/task-list/task-list.component.css create mode 100644 src/app/components/task-list/task-list.component.html create mode 100644 src/app/components/task-list/task-list.component.spec.ts create mode 100644 src/app/components/task-list/task-list.component.ts create mode 100644 src/assets/icon.png diff --git a/.vscode/launch.json b/.vscode/launch.json index 925af83..3caac7f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -3,18 +3,16 @@ "version": "0.2.0", "configurations": [ { - "name": "ng serve", - "type": "chrome", + "name": "Launch Electron", + "type": "node", "request": "launch", - "preLaunchTask": "npm: start", - "url": "http://localhost:4200/" - }, - { - "name": "ng test", - "type": "chrome", - "request": "launch", - "preLaunchTask": "npm: test", - "url": "http://localhost:9876/debug.html" + "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd", + "windows": { + "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd" + }, + "args": ["electron/main.js"], + "outputCapture": "std", + "preLaunchTask": "build-angular" } ] } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index a298b5b..675df27 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -37,6 +37,20 @@ } } } + }, + { + "label": "build-angular", + "type": "npm", + "script": "build", + "group": "build", + "problemMatcher": [] + }, + { + "label": "start-angular", + "type": "npm", + "script": "start", + "group": "build", + "problemMatcher": [] } ] } diff --git a/angular.json b/angular.json index 40d7378..4f15cbe 100644 --- a/angular.json +++ b/angular.json @@ -24,6 +24,16 @@ { "glob": "**/*", "input": "public" + }, + { + "glob": "**/*", + "input": "src/assets", + "output": "/assets" + }, + { + "glob": "**/*", + "input": "src/favicon.ico", + "output": "/" } ], "styles": [ diff --git a/electron/main.js b/electron/main.js new file mode 100644 index 0000000..a67111f --- /dev/null +++ b/electron/main.js @@ -0,0 +1,82 @@ +const { app, BrowserWindow, ipcMain } = require('electron'); // ipcMain hinzufügen +const path = require('path'); +const fs = require('fs'); // Behalte fs bei, falls du es für die Pfadprüfung brauchst + +// Füge electron-reloader hinzu +try { + require('electron-reloader')(module); +} catch (_) {} + +function createWindow() { + const win = new BrowserWindow({ + width: 1200, + height: 800, + frame: false, + webPreferences: { + contextIsolation: true, + preload: path.join(__dirname, 'preload.js') // Preload-Skript hinzufügen + }, + }); + + // Pfad für neuere Angular-Versionen (v17+) + const indexPath = path.join(__dirname, '../dist/projektmanagement-tool/browser/index.html'); + console.log('Versuche zu laden:', indexPath); + + // Prüfen, ob die Datei existiert, bevor sie geladen wird + if (fs.existsSync(indexPath)) { + win.loadFile(indexPath); + } else { + console.error(`Index-Datei nicht gefunden unter: ${indexPath}`); + // Optional: Lade eine Fehlerseite oder schließe die App + win.loadURL(`data:text/html,

Fehler: index.html nicht gefunden

Pfad: ${indexPath}

`); + } + + // Öffne DevTools für Debugging (auskommentiert, um automatisches Öffnen zu verhindern) + win.webContents.openDevTools(); +} + +// IPC-Handler für Fensteraktionen hinzufügen +ipcMain.on('minimize-window', (event) => { + const window = BrowserWindow.fromWebContents(event.sender); + window?.minimize(); +}); + +ipcMain.on('maximize-window', (event) => { + const window = BrowserWindow.fromWebContents(event.sender); + if (window?.isMaximized()) { + window.unmaximize(); + } else { + window?.maximize(); + } +}); + +ipcMain.on('close-window', (event) => { + const window = BrowserWindow.fromWebContents(event.sender); + window?.close(); +}); + +app.whenReady().then(createWindow); + +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') app.quit(); +}); + +// Fehlerbehandlung beim Starten +app.on('ready', () => { + try { + const distPath = path.join(__dirname, '../dist/projektmanagement-tool'); + if (fs.existsSync(distPath)) { + console.log('Dist-Verzeichnis gefunden:', distPath); + const browserPath = path.join(distPath, 'browser'); + if (fs.existsSync(browserPath)) { + console.log('Browser-Verzeichnis gefunden:', browserPath); + } else { + console.error('Browser-Verzeichnis nicht gefunden!'); + } + } else { + console.error('Dist-Verzeichnis nicht gefunden!'); + } + } catch (error) { + console.error('Fehler beim Überprüfen des Verzeichnisses:', error); + } +}); \ No newline at end of file diff --git a/electron/preload.js b/electron/preload.js new file mode 100644 index 0000000..5511bca --- /dev/null +++ b/electron/preload.js @@ -0,0 +1,9 @@ +// filepath: d:\Emporware Entwicklung\02 Intern\Projektmanagement-Tool\electron\preload.js +const { contextBridge, ipcRenderer } = require('electron'); + +contextBridge.exposeInMainWorld('electronAPI', { + minimize: () => ipcRenderer.send('minimize-window'), + maximize: () => ipcRenderer.send('maximize-window'), + close: () => ipcRenderer.send('close-window') + // Füge hier weitere benötigte Funktionen hinzu +}); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 38c241c..ed54b61 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "@angular/platform-browser": "^19.2.0", "@angular/platform-browser-dynamic": "^19.2.0", "@angular/router": "^19.2.0", + "electron": "^36.1.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.15.0" @@ -24,13 +25,16 @@ "@angular/cli": "^19.2.10", "@angular/compiler-cli": "^19.2.0", "@types/jasmine": "~5.1.0", + "concurrently": "^9.1.2", + "electron-reloader": "^1.2.3", "jasmine-core": "~5.6.0", "karma": "~6.4.0", "karma-chrome-launcher": "~3.2.0", "karma-coverage": "~2.2.0", "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.1.0", - "typescript": "~5.7.2" + "typescript": "~5.7.2", + "wait-on": "^8.0.3" } }, "node_modules/@ampproject/remapping": { @@ -2423,6 +2427,36 @@ "node": ">=14.17.0" } }, + "node_modules/@electron/get": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", @@ -2848,6 +2882,23 @@ "node": ">=18" } }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, "node_modules/@inquirer/checkbox": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.5.tgz", @@ -4875,6 +4926,30 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/@sigstore/bundle": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz", @@ -4955,6 +5030,18 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, "node_modules/@sindresorhus/merge-streams": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", @@ -4975,6 +5062,18 @@ "dev": true, "license": "MIT" }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@tufjs/canonical-json": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", @@ -5046,6 +5145,18 @@ "@types/node": "*" } }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, "node_modules/@types/connect": { "version": "3.4.38", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", @@ -5145,6 +5256,12 @@ "@types/send": "*" } }, + "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", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "license": "MIT" + }, "node_modules/@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", @@ -5176,6 +5293,15 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -5187,7 +5313,6 @@ "version": "22.15.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz", "integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -5217,6 +5342,15 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/retry": { "version": "0.12.2", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", @@ -5277,6 +5411,16 @@ "@types/node": "*" } }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@vitejs/plugin-basic-ssl": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", @@ -5715,6 +5859,13 @@ "dev": true, "license": "MIT" }, + "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/autoprefixer": { "version": "10.4.20", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", @@ -5753,6 +5904,18 @@ "postcss": "^8.1.0" } }, + "node_modules/axios": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", + "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/babel-loader": { "version": "9.2.1", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", @@ -5983,6 +6146,14 @@ "dev": true, "license": "ISC" }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT", + "optional": true + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -6065,6 +6236,15 @@ "ieee754": "^1.1.13" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -6230,6 +6410,33 @@ "node": ">=18" } }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "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", @@ -6534,6 +6741,18 @@ "node": ">=0.10.0" } }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "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", @@ -6561,6 +6780,19 @@ "dev": true, "license": "MIT" }, + "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": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -6641,6 +6873,48 @@ "dev": true, "license": "MIT" }, + "node_modules/concurrently": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.1.2.tgz", + "integrity": "sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -6958,11 +7232,23 @@ "node": ">=4.0" } }, + "node_modules/date-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", + "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "time-zone": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/debug": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -6976,6 +7262,33 @@ } } }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/default-browser": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", @@ -7019,6 +7332,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/define-lazy-prop": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", @@ -7032,6 +7372,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -7068,7 +7436,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/di": { @@ -7192,6 +7560,200 @@ "dev": true, "license": "MIT" }, + "node_modules/electron": { + "version": "36.1.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-36.1.0.tgz", + "integrity": "sha512-gnp3BnbKdGsVc7cm1qlEaZc8pJsR08mIs8H/yTo8gHEtFkGGJbDTVZOYNAfbQlL0aXh+ozv+CnyiNeDNkT1Upg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@electron/get": "^2.0.0", + "@types/node": "^22.7.7", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js" + }, + "engines": { + "node": ">= 12.20.55" + } + }, + "node_modules/electron-is-dev": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-1.2.0.tgz", + "integrity": "sha512-R1oD5gMBPS7PVU8gJwH6CtT0e6VSoD0+SzSnYpNm+dBkcijgA+K7VAMHDfnRq/lkKPZArpzplTW6jfiMYosdzw==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-reloader": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/electron-reloader/-/electron-reloader-1.2.3.tgz", + "integrity": "sha512-aDnACAzNg0QvQhzw7LYOx/nVS10mEtbuG6M0QQvNQcLnJEwFs6is+EGRCnM+KQlQ4KcTbdwnt07nd7ZjHpY4iw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "chokidar": "^3.5.0", + "date-time": "^3.1.0", + "electron-is-dev": "^1.2.0", + "find-up": "^5.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/electron-reloader/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/electron-reloader/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/electron-reloader/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/electron-reloader/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/electron-reloader/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/electron-reloader/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/electron-reloader/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-reloader/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/electron-reloader/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/electron-reloader/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.149", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.149.tgz", @@ -7251,6 +7813,15 @@ "node": ">=0.10.0" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/engine.io": { "version": "6.6.4", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", @@ -7347,7 +7918,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -7401,7 +7971,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7411,7 +7981,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7437,6 +8007,29 @@ "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" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "license": "MIT", + "optional": true + }, "node_modules/esbuild": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", @@ -7508,6 +8101,19 @@ "dev": true, "license": "MIT" }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -7734,6 +8340,26 @@ "node": ">=4" } }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -7811,6 +8437,15 @@ "node": ">=0.8.0" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/fdir": { "version": "6.4.4", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", @@ -7977,6 +8612,22 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -8015,7 +8666,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -8143,6 +8793,21 @@ "node": ">= 0.4" } }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -8185,6 +8850,24 @@ "dev": true, "license": "BSD-2-Clause" }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -8195,6 +8878,23 @@ "node": ">=4" } }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", @@ -8220,7 +8920,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -8229,11 +8929,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, "license": "ISC" }, "node_modules/handle-thing": { @@ -8253,6 +8977,19 @@ "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", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "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", @@ -8405,7 +9142,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true, "license": "BSD-2-Clause" }, "node_modules/http-deceiver": { @@ -8496,6 +9232,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, "node_modules/https-proxy-agent": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", @@ -9117,6 +9866,20 @@ "jiti": "bin/jiti.js" } }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -9157,6 +9920,12 @@ "node": ">=6" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, "node_modules/json-parse-even-better-errors": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", @@ -9174,6 +9943,13 @@ "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", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC", + "optional": true + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -9198,7 +9974,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" @@ -9551,6 +10326,15 @@ "node": ">=10" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -9969,6 +10753,15 @@ "node": ">=8.0" } }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -10028,6 +10821,19 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -10191,6 +10997,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/mini-css-extract-plugin": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", @@ -10422,7 +11237,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/msgpackr": { @@ -10733,6 +11547,18 @@ "node": ">=0.10.0" } }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/npm-bundled": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", @@ -10870,6 +11696,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -10904,7 +11740,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -11060,6 +11895,15 @@ "node": ">=0.10.0" } }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/p-limit": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", @@ -11366,6 +12210,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -11592,6 +12442,15 @@ "dev": true, "license": "MIT" }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", @@ -11630,6 +12489,13 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -11638,6 +12504,16 @@ "license": "MIT", "optional": true }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -11692,6 +12568,18 @@ ], "license": "MIT" }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -11897,6 +12785,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -11949,6 +12843,18 @@ "node": ">=0.10.0" } }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/restore-cursor": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", @@ -12011,6 +12917,24 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/rollup": { "version": "4.34.8", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", @@ -12275,7 +13199,7 @@ "version": "7.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true, + "devOptional": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -12284,6 +13208,13 @@ "node": ">=10" } }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "license": "MIT", + "optional": true + }, "node_modules/send": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", @@ -12349,6 +13280,35 @@ "node": ">= 0.8" } }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", @@ -12965,7 +13925,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true, + "devOptional": true, "license": "BSD-3-Clause" }, "node_modules/ssri": { @@ -13130,6 +14090,18 @@ "node": ">=8" } }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -13351,6 +14323,16 @@ "dev": true, "license": "MIT" }, + "node_modules/time-zone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", + "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/tinyglobby": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", @@ -13531,7 +14513,6 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -13621,7 +14602,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 4.0.0" @@ -14176,6 +15156,26 @@ "node": ">=0.10.0" } }, + "node_modules/wait-on": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-8.0.3.tgz", + "integrity": "sha512-nQFqAFzZDeRxsu7S3C7LbuxslHhk+gnJZHyethuGKAn2IVleIbTB9I3vJSQiSR+DifUqmdzfPMoMPJfLqMF2vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "axios": "^1.8.2", + "joi": "^17.13.3", + "lodash": "^4.17.21", + "minimist": "^1.2.8", + "rxjs": "^7.8.2" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/watchpack": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", @@ -14710,7 +15710,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, "license": "ISC" }, "node_modules/ws": { @@ -14836,6 +15835,16 @@ "node": ">=8" } }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/yocto-queue": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", diff --git a/package.json b/package.json index 5ddd7c1..b6a6bd0 100644 --- a/package.json +++ b/package.json @@ -3,10 +3,10 @@ "version": "0.0.0", "scripts": { "ng": "ng", - "start": "ng serve", + "start": "concurrently \"ng build --watch\" \"wait-on dist/projektmanagement-tool/browser/index.html && echo 'Starting Electron...' && electron.cmd .\"", + "electron": "electron.cmd electron/main.js", "build": "ng build", - "watch": "ng build --watch --configuration development", - "test": "ng test" + "build-electron": "ng build && electron.cmd electron/main.js" }, "private": true, "dependencies": { @@ -17,6 +17,7 @@ "@angular/platform-browser": "^19.2.0", "@angular/platform-browser-dynamic": "^19.2.0", "@angular/router": "^19.2.0", + "electron": "^36.1.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.15.0" @@ -26,12 +27,15 @@ "@angular/cli": "^19.2.10", "@angular/compiler-cli": "^19.2.0", "@types/jasmine": "~5.1.0", + "concurrently": "^9.1.2", + "electron-reloader": "^1.2.3", "jasmine-core": "~5.6.0", "karma": "~6.4.0", "karma-chrome-launcher": "~3.2.0", "karma-coverage": "~2.2.0", "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.1.0", - "typescript": "~5.7.2" + "typescript": "~5.7.2", + "wait-on": "^8.0.3" } } diff --git a/src/app/app.component.css b/src/app/app.component.css index e69de29..3a12b3c 100644 --- a/src/app/app.component.css +++ b/src/app/app.component.css @@ -0,0 +1,169 @@ +:host { + --bright-blue: oklch(51.01% 0.274 263.83); + --electric-violet: oklch(53.18% 0.28 296.97); + --french-violet: oklch(47.66% 0.246 305.88); + --vivid-pink: oklch(69.02% 0.277 332.77); + --hot-red: oklch(61.42% 0.238 15.34); + --orange-red: oklch(63.32% 0.24 31.68); + + --gray-900: oklch(19.37% 0.006 300.98); + --gray-700: oklch(36.98% 0.014 302.71); + --gray-400: oklch(70.9% 0.015 304.04); + + --red-to-pink-to-purple-vertical-gradient: linear-gradient( + 180deg, + var(--orange-red) 0%, + var(--vivid-pink) 50%, + var(--electric-violet) 100% + ); + + --red-to-pink-to-purple-horizontal-gradient: linear-gradient( + 90deg, + var(--orange-red) 0%, + var(--vivid-pink) 50%, + var(--electric-violet) 100% + ); + + --pill-accent: var(--bright-blue); + + font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, + Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", + "Segoe UI Symbol"; + box-sizing: border-box; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + + h1 { + font-size: 3.125rem; + color: var(--gray-900); + font-weight: 500; + line-height: 100%; + letter-spacing: -0.125rem; + margin: 0; + font-family: "Inter Tight", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, + Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", + "Segoe UI Symbol"; + } + + p { + margin: 0; + color: var(--gray-700); + } + + main { + width: 100%; + min-height: 100%; + display: flex; + justify-content: center; + align-items: center; + padding-top: 32px; + height: calc(100vh - 32px); + padding: 1rem; + box-sizing: inherit; + position: relative; + } + + .angular-logo { + max-width: 9.2rem; + } + + .content { + display: flex; + justify-content: space-around; + width: 100%; + max-width: 700px; + margin-bottom: 3rem; + } + + .content h1 { + margin-top: 1.75rem; + } + + .content p { + margin-top: 1.5rem; + } + + .divider { + width: 1px; + background: var(--red-to-pink-to-purple-vertical-gradient); + margin-inline: 0.5rem; + } + + .pill-group { + display: flex; + flex-direction: column; + align-items: start; + flex-wrap: wrap; + gap: 1.25rem; + } + + .pill { + display: flex; + align-items: center; + --pill-accent: var(--bright-blue); + background: color-mix(in srgb, var(--pill-accent) 5%, transparent); + color: var(--pill-accent); + padding-inline: 0.75rem; + padding-block: 0.375rem; + border-radius: 2.75rem; + border: 0; + transition: background 0.3s ease; + font-family: var(--inter-font); + font-size: 0.875rem; + font-style: normal; + font-weight: 500; + line-height: 1.4rem; + letter-spacing: -0.00875rem; + text-decoration: none; + } + + .pill:hover { + background: color-mix(in srgb, var(--pill-accent) 15%, transparent); + } + + .pill-group .pill:nth-child(6n + 1) { + --pill-accent: var(--bright-blue); + } + .pill-group .pill:nth-child(6n + 2) { + --pill-accent: var(--french-violet); + } + .pill-group .pill:nth-child(6n + 3), + .pill-group .pill:nth-child(6n + 4), + .pill-group .pill:nth-child(6n + 5) { + --pill-accent: var(--hot-red); + } + + .pill-group svg { + margin-inline-start: 0.25rem; + } + + .social-links { + display: flex; + align-items: center; + gap: 0.73rem; + margin-top: 1.5rem; + } + + .social-links path { + transition: fill 0.3s ease; + fill: var(--gray-400); + } + + .social-links a:hover svg path { + fill: var(--gray-900); + } + + @media screen and (max-width: 650px) { + .content { + flex-direction: column; + width: max-content; + } + + .divider { + height: 1px; + width: 100%; + background: var(--red-to-pink-to-purple-horizontal-gradient); + margin-block: 1.5rem; + } + } \ No newline at end of file diff --git a/src/app/app.component.html b/src/app/app.component.html index b8daeb7..ea74585 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,335 +1,10 @@ - - - - - - - - - - - +
- -

Hello, {{ title }}

-

Congratulations! Your app is running. 🎉

-
- -
-
- @for (item of [ - { title: 'Explore the Docs', link: 'https://angular.dev' }, - { title: 'Learn with Tutorials', link: 'https://angular.dev/tutorials' }, - { title: 'CLI Docs', link: 'https://angular.dev/tools/cli' }, - { title: 'Angular Language Service', link: 'https://angular.dev/tools/language-service' }, - { title: 'Angular DevTools', link: 'https://angular.dev/tools/devtools' }, - ]; track item.title) { - - {{ item.title }} - - - - - } -
- +

Projektmanagement Tool

+ +
-
- - - - - - - - - - + \ No newline at end of file diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 8dfeab1..84cf135 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,8 +1,11 @@ import { Component } from '@angular/core'; +import { TaskListComponent } from "./components/task-list/task-list.component"; +import { RouterModule } from '@angular/router'; +import { CustomTitleBarComponent } from "./components/custom-title-bar/custom-title-bar.component"; @Component({ selector: 'app-root', - imports: [], + imports: [TaskListComponent, RouterModule, CustomTitleBarComponent], templateUrl: './app.component.html', styleUrl: './app.component.css' }) diff --git a/src/app/components/custom-title-bar/custom-title-bar.component.css b/src/app/components/custom-title-bar/custom-title-bar.component.css new file mode 100644 index 0000000..384e1b8 --- /dev/null +++ b/src/app/components/custom-title-bar/custom-title-bar.component.css @@ -0,0 +1,73 @@ +.title-bar { + display: flex; + justify-content: space-between; + align-items: center; + height: 32px; /* Standardhöhe für Windows-Titelleisten */ + background-color: #202020; /* Beispiel-Hintergrund */ + color: #fff; + position: fixed; /* Oder absolute, je nach Layout */ + top: 0; + left: 0; + right: 0; + z-index: 1000; + } + + .title-bar-drag-region { + flex-grow: 1; + height: 100%; + /* WICHTIG: Macht diesen Bereich ziehbar */ + -webkit-app-region: drag; + display: flex; + align-items: center; + padding-left: 10px; + user-select: none; /* Verhindert Textauswahl beim Ziehen */ + } + + .title { + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + font-size: 12px; + } + + .title-bar-controls { + display: flex; + height: 100%; + /* WICHTIG: Buttons nicht ziehbar machen */ + -webkit-app-region: no-drag; + } + + .title-bar-button { + width: 46px; + height: 100%; + border: none; + background-color: transparent; + color: #fff; + font-family: 'Segoe MDL2 Assets'; /* Windows UI Icons */ + font-size: 10px; + cursor: pointer; + display: flex; + justify-content: center; + align-items: center; + } + + .title-bar-button:hover { + background-color: rgba(255, 255, 255, 0.1); + } + + .title-bar-button:active { + background-color: rgba(255, 255, 255, 0.2); + } + + .close-button:hover { + background-color: #e81123; /* Roter Hintergrund für Schließen-Button */ + } + + .close-button:active { + background-color: #f1707a; + } + .title-bar-icon { + width: 16px; /* Beispielgröße */ + height: 16px; /* Beispielgröße */ + margin-right: 8px; /* Abstand zum Titel */ + /* Verhindert, dass das Icon selbst gezogen werden kann (optional) */ + -webkit-app-region: no-drag; + } \ No newline at end of file diff --git a/src/app/components/custom-title-bar/custom-title-bar.component.html b/src/app/components/custom-title-bar/custom-title-bar.component.html new file mode 100644 index 0000000..f508c34 --- /dev/null +++ b/src/app/components/custom-title-bar/custom-title-bar.component.html @@ -0,0 +1,11 @@ +
+
+ App Icon + ProjektmanagementTool +
+
+ + + +
+
\ No newline at end of file diff --git a/src/app/components/custom-title-bar/custom-title-bar.component.spec.ts b/src/app/components/custom-title-bar/custom-title-bar.component.spec.ts new file mode 100644 index 0000000..40dbe3e --- /dev/null +++ b/src/app/components/custom-title-bar/custom-title-bar.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CustomTitleBarComponent } from './custom-title-bar.component'; + +describe('CustomTitleBarComponent', () => { + let component: CustomTitleBarComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [CustomTitleBarComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(CustomTitleBarComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/custom-title-bar/custom-title-bar.component.ts b/src/app/components/custom-title-bar/custom-title-bar.component.ts new file mode 100644 index 0000000..eb53358 --- /dev/null +++ b/src/app/components/custom-title-bar/custom-title-bar.component.ts @@ -0,0 +1,37 @@ +import { Component } from '@angular/core'; + +// Definiere einen Typ für die API, die durch das Preload-Skript bereitgestellt wird +interface ElectronAPI { + minimize: () => void; + maximize: () => void; + close: () => void; +} + +// Greife sicher auf die API zu +declare global { + interface Window { + electronAPI: ElectronAPI; + } +} + +@Component({ + selector: 'app-custom-title-bar', + standalone: true, + imports: [], + templateUrl: './custom-title-bar.component.html', + styleUrls: ['./custom-title-bar.component.css'] +}) +export class CustomTitleBarComponent { + + minimize(): void { + window.electronAPI?.minimize(); + } + + maximize(): void { + window.electronAPI?.maximize(); + } + + close(): void { + window.electronAPI?.close(); + } +} \ No newline at end of file diff --git a/src/app/components/task-list/task-list.component.css b/src/app/components/task-list/task-list.component.css new file mode 100644 index 0000000..120feba --- /dev/null +++ b/src/app/components/task-list/task-list.component.css @@ -0,0 +1,20 @@ +ul { + list-style: none; + padding: 0; +} + +li { + padding: 8px; + border-bottom: 1px solid #ccc; + display: flex; + align-items: center; +} + +li.completed { + text-decoration: line-through; + color: grey; +} + +input[type="checkbox"] { + margin-right: 10px; +} \ No newline at end of file diff --git a/src/app/components/task-list/task-list.component.html b/src/app/components/task-list/task-list.component.html new file mode 100644 index 0000000..173a3c9 --- /dev/null +++ b/src/app/components/task-list/task-list.component.html @@ -0,0 +1,7 @@ +

Aufgabenliste

+ diff --git a/src/app/components/task-list/task-list.component.spec.ts b/src/app/components/task-list/task-list.component.spec.ts new file mode 100644 index 0000000..9e7d861 --- /dev/null +++ b/src/app/components/task-list/task-list.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TaskListComponent } from './task-list.component'; + +describe('TaskListComponent', () => { + let component: TaskListComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [TaskListComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(TaskListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/components/task-list/task-list.component.ts b/src/app/components/task-list/task-list.component.ts new file mode 100644 index 0000000..0a1052c --- /dev/null +++ b/src/app/components/task-list/task-list.component.ts @@ -0,0 +1,28 @@ +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; // Import CommonModule + +interface Task { + id: number; + title: string; + completed: boolean; +} + +@Component({ + selector: 'app-task-list', + standalone: true, + imports: [CommonModule], // Füge CommonModule hier hinzu + templateUrl: './task-list.component.html', + styleUrls: ['./task-list.component.css'] +}) +export class TaskListComponent { + tasks: Task[] = [ + { id: 1, title: 'Design erstellen', completed: true }, + { id: 2, title: 'Backend implementieren', completed: false }, + { id: 3, title: 'Frontend entwickeln', completed: false }, + { id: 4, title: 'Testing durchführen', completed: false } + ]; + + toggleCompletion(task: Task): void { + task.completed = !task.completed; + } +} diff --git a/src/assets/icon.png b/src/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..78613962987b13274e0c0bfd5e7ee4f7992c28f6 GIT binary patch literal 19825 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 V&704DnICj+n5V0s%Q~loCIEvXhCToQ literal 0 HcmV?d00001 diff --git a/src/index.html b/src/index.html index 86df62c..160a14e 100644 --- a/src/index.html +++ b/src/index.html @@ -3,7 +3,7 @@ ProjektmanagementTool - +