diff --git a/.gitignore b/.gitignore index 34c4656..71802b2 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,8 @@ node_modules/ # Ignore build artifacts dist/ .idea +out/ +json_files/ # Ignore environment-specific settings *.log @@ -15,4 +17,4 @@ yarn-error.log* .env.* # Keep the .env file -!.env +!.env \ No newline at end of file diff --git a/CEO/package-lock.json b/CEO/package-lock.json index 471427f..2b2fb4b 100644 --- a/CEO/package-lock.json +++ b/CEO/package-lock.json @@ -10,24 +10,433 @@ "license": "ISC", "dependencies": { "dotenv": "^16.4.5", - "electron": "^32.0.1", "ping": "^0.4.4", "uuid": "^10.0.0" }, "devDependencies": { - "@types/electron": "^1.6.10", - "@types/node": "^22.6.1", + "@electron-forge/cli": "^6.0.0", + "@electron-forge/maker-deb": "^6.0.0", + "@electron-forge/maker-rpm": "^6.0.0", + "@electron-forge/maker-squirrel": "^6.0.0", + "@electron-forge/maker-zip": "^6.0.0", "@types/ping": "^0.4.4", "@types/uuid": "^10.0.0", "copyfiles": "^2.4.1", - "electronmon": "^2.0.3", + "del-cli": "^5.0.0", + "electron": "^33.0.2", "typescript": "^5.6.2" } }, + "node_modules/@babel/code-frame": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.0.tgz", + "integrity": "sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@electron-forge/cli": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-6.4.2.tgz", + "integrity": "sha512-bM6YVTV0uUEpIL1jkpARlSm4Li26XZn+avC/lyTdpPqnd65T/oXZNkrAD+2Jb0RlgplOaM21qWm7ybtvKDGDyA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.electron-forge-cli?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "MIT", + "dependencies": { + "@electron-forge/core": "6.4.2", + "@electron-forge/shared-types": "6.4.2", + "@electron/get": "^2.0.0", + "chalk": "^4.0.0", + "commander": "^4.1.1", + "debug": "^4.3.1", + "fs-extra": "^10.0.0", + "listr2": "^5.0.3", + "semver": "^7.2.1" + }, + "bin": { + "electron-forge": "dist/electron-forge.js", + "electron-forge-vscode-nix": "script/vscode.sh", + "electron-forge-vscode-win": "script/vscode.cmd" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/cli/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@electron-forge/cli/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron-forge/core": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-6.4.2.tgz", + "integrity": "sha512-VtrFZ1Q7NG1ov0jJO/tUvUiYdWZ0Y31xw762is/jfpRPD6V/soOpwJJAoWoPK9TZVkTm2pkS8S5LikCMbNCLxw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.electron-forge-core?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "MIT", + "dependencies": { + "@electron-forge/core-utils": "6.4.2", + "@electron-forge/maker-base": "6.4.2", + "@electron-forge/plugin-base": "6.4.2", + "@electron-forge/publisher-base": "6.4.2", + "@electron-forge/shared-types": "6.4.2", + "@electron-forge/template-base": "6.4.2", + "@electron-forge/template-vite": "6.4.2", + "@electron-forge/template-vite-typescript": "6.4.2", + "@electron-forge/template-webpack": "6.4.2", + "@electron-forge/template-webpack-typescript": "6.4.2", + "@electron/get": "^2.0.0", + "@electron/rebuild": "^3.2.10", + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.3.1", + "electron-packager": "^17.1.2", + "fast-glob": "^3.2.7", + "filenamify": "^4.1.0", + "find-up": "^5.0.0", + "fs-extra": "^10.0.0", + "got": "^11.8.5", + "interpret": "^3.1.1", + "listr2": "^5.0.3", + "lodash": "^4.17.20", + "log-symbols": "^4.0.0", + "node-fetch": "^2.6.7", + "progress": "^2.0.3", + "rechoir": "^0.8.0", + "resolve-package": "^1.0.1", + "semver": "^7.2.1", + "source-map-support": "^0.5.13", + "sudo-prompt": "^9.1.1", + "username": "^5.1.0", + "yarn-or-npm": "^3.0.1" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/core-utils": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/core-utils/-/core-utils-6.4.2.tgz", + "integrity": "sha512-CjB3aakmRsXAMMDYc8PxNTMf4FdI29y4PErfv7eCXlL5oo3JW0VSKZIV7R8/Po0S0got85q2kmhZgCKuxL1BNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "6.4.2", + "@electron/rebuild": "^3.2.10", + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.3.1", + "find-up": "^5.0.0", + "fs-extra": "^10.0.0", + "log-symbols": "^4.0.0", + "semver": "^7.2.1", + "yarn-or-npm": "^3.0.1" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/core-utils/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron-forge/core/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron-forge/maker-base": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-6.4.2.tgz", + "integrity": "sha512-zW3GH+LqDK9nxQmQEFkJPR8RqiX0lVk6a4mXll3ngujN1fPevO4ivUAWmaEVeC1dH/hXbN7s9m0S6a37MigftQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "6.4.2", + "fs-extra": "^10.0.0", + "which": "^2.0.2" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/maker-deb": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-6.4.2.tgz", + "integrity": "sha512-tlV8ffivgBP94vtYXgAeXgzeKCaRyLuWH9LT8PQW1QrYbAFpCMmuwk/zFaJkyMklImCWmDFTPYMEqdEJGd7Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/maker-base": "6.4.2", + "@electron-forge/shared-types": "6.4.2" + }, + "engines": { + "node": ">= 14.17.5" + }, + "optionalDependencies": { + "electron-installer-debian": "^3.2.0" + } + }, + "node_modules/@electron-forge/maker-rpm": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-rpm/-/maker-rpm-6.4.2.tgz", + "integrity": "sha512-+hfbY5pYbAer0y07OtOzVgVBHoTRmemqqZ//T0mKJpyK2ThHKGTvyW8FFlr5jlQs5LoDCM2WHKE8oGtRhivsMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/maker-base": "6.4.2", + "@electron-forge/shared-types": "6.4.2" + }, + "engines": { + "node": ">= 14.17.5" + }, + "optionalDependencies": { + "electron-installer-redhat": "^3.2.0" + } + }, + "node_modules/@electron-forge/maker-squirrel": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-6.4.2.tgz", + "integrity": "sha512-ukK3RcFaBrQXUzR52PsHxfwDq5XKSnj6A1kkXiyHWqgj+HIU97prBScBb5JRtasPvYN+nDdQO2vlInsLaqcx9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/maker-base": "6.4.2", + "@electron-forge/shared-types": "6.4.2", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 14.17.5" + }, + "optionalDependencies": { + "electron-winstaller": "^5.0.0" + } + }, + "node_modules/@electron-forge/maker-zip": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-6.4.2.tgz", + "integrity": "sha512-k2nfhhnxcYbUS7rCKCisuqEalxtH9l73+lrtfL0aQZiE/BLbDXyNckDIDOPvX0tBEg62nVzUdJonZwOhZVvAMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/maker-base": "6.4.2", + "@electron-forge/shared-types": "6.4.2", + "cross-zip": "^4.0.0", + "fs-extra": "^10.0.0", + "got": "^11.8.5" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/plugin-base": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-6.4.2.tgz", + "integrity": "sha512-g6AAtQ7fZ94djBmwcnWasQ8xgaNVNjgaQ00GLK0NkmQ7n0PNbsnlMDuw9vdfTiL6WaLg5nxNSYc9bFJP/rtyeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "6.4.2" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/publisher-base": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-6.4.2.tgz", + "integrity": "sha512-Tnf9O8MFzdT1gsb5EDDaQUoslt7gUuUywtsr+lT/fpBlBQbei2fvioTwvZ1Q1cmsKnld7XhRh6unfgdWLTZzgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "6.4.2" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/shared-types": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.4.2.tgz", + "integrity": "sha512-DKOUMsdTXZIq8XiqY0Hi3C+dam/JKUnvfBjwcUeyZqPdgEE1qry8xZmmjorXuLrRf1Jq8rhxYGQInSK4af0QYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/rebuild": "^3.2.10", + "electron-packager": "^17.1.2", + "listr2": "^5.0.3" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/template-base": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-6.4.2.tgz", + "integrity": "sha512-vsQh+64Fr2Vxg6k8DAahWq4MAdB2F2qTig+LgIJENv8ksbzC1YIq05SBAS/g2674cdr7WdwyukMy2rgxe3rhnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "6.4.2", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "fs-extra": "^10.0.0", + "username": "^5.1.0" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/template-vite": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-vite/-/template-vite-6.4.2.tgz", + "integrity": "sha512-NX7jHRblBmIqufMbqWgpI/VnpgF/qMSTq9ZPmDSXamBhid336MC6+DoWzDpXceQZEp0m/jpMLR04ynr8O4jGlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "6.4.2", + "@electron-forge/template-base": "6.4.2", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + } + }, + "node_modules/@electron-forge/template-vite-typescript": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-vite-typescript/-/template-vite-typescript-6.4.2.tgz", + "integrity": "sha512-h3pn6onvC/nLglmJuelYU82Qzrh0l6MqvbBGoT39bbDoRLIqmlhWTWppHgDJVXAGrSoH+9BEpptipeBQWirFwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "6.4.2", + "@electron-forge/template-base": "6.4.2", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + } + }, + "node_modules/@electron-forge/template-webpack": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-6.4.2.tgz", + "integrity": "sha512-9QYr/td4cmnGOj8UF25W6An/eI+JXj9T/b+KFybL3cQ87H1yrQOn2T84Bm5/JaB4SPdIu4FdKRjqwR7C7R0g2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "6.4.2", + "@electron-forge/template-base": "6.4.2", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/template-webpack-typescript": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-6.4.2.tgz", + "integrity": "sha512-MPAZQ4v6piCED7NT1LTVQf61o6Eg/laNoKbhbrFBSH1i20OUwbtV2MLj6Op292ynI9+1qdHKmFgctr6qPTCAQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "6.4.2", + "@electron-forge/template-base": "6.4.2", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron/asar": { + "version": "3.2.14", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.14.tgz", + "integrity": "sha512-hc52QkesULqbxTRC1vOmSBN1YndUkieoNMfvpe988h0MEoGGqbijkOqv4/2M9PufBJxiTVoDdBmBFfXPowZDQg==", + "dev": true, + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, "node_modules/@electron/get": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "dev": true, "dependencies": { "debug": "^4.1.1", "env-paths": "^2.2.0", @@ -48,6 +457,7 @@ "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, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -61,6 +471,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -69,14 +480,269 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, "engines": { "node": ">= 4.0.0" } }, + "node_modules/@electron/osx-sign": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.1.tgz", + "integrity": "sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==", + "dev": true, + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/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, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/rebuild": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.6.1.tgz", + "integrity": "sha512-f6596ZHpEq/YskUd8emYvOUne89ij8mQgjYFA5ru25QwbrRO+t1SImofdDv7kKOuWCmVOuU5tvfkbgGxIl3E/w==", + "dev": true, + "dependencies": { + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.1.1", + "detect-libc": "^2.0.1", + "fs-extra": "^10.0.0", + "got": "^11.7.0", + "node-abi": "^3.45.0", + "node-api-version": "^0.2.0", + "node-gyp": "^9.0.0", + "ora": "^5.1.0", + "read-binary-file-arch": "^1.0.6", + "semver": "^7.3.5", + "tar": "^6.0.5", + "yargs": "^17.0.1" + }, + "bin": { + "electron-rebuild": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@electron/rebuild/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, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/rebuild/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/rebuild/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, + "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/@electron/rebuild/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, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/windows-sign": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.1.3.tgz", + "integrity": "sha512-OqVSdAe+/88fIjvTDWiy+5Ho1nXsiBhE5RTsIQ6M/zcxcDAEP2TlQCkOyusItnmzXRN+XTFaK9gKhiZ6KGyXQw==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "dependencies": { + "cross-dirname": "^0.1.0", + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8", + "postject": "^1.0.0-alpha.6" + }, + "bin": { + "electron-windows-sign": "bin/electron-windows-sign.js" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/windows-sign/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", + "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" + } + ], + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.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==", + "dev": true, "engines": { "node": ">=10" }, @@ -88,6 +754,7 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, "dependencies": { "defer-to-connect": "^2.0.0" }, @@ -95,10 +762,20 @@ "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, + "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", "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", @@ -106,47 +783,84 @@ "@types/responselike": "^1.0.0" } }, - "node_modules/@types/electron": { - "version": "1.6.10", - "resolved": "https://registry.npmjs.org/@types/electron/-/electron-1.6.10.tgz", - "integrity": "sha512-MOCVyzIwkBEloreoCVrTV108vSf8fFIJPsGruLCoAoBZdxtnJUqKA4lNonf/2u1twSjAspPEfmEheC+TLm/cMw==", - "deprecated": "This is a stub types definition for electron (https://github.com/electron/electron). electron provides its own type definitions, so you don't need @types/electron installed!", + "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, + "optional": true, "dependencies": { - "electron": "*" + "@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", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true }, "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==", + "dev": true, "dependencies": { "@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/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true + }, "node_modules/@types/node": { "version": "22.6.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.6.1.tgz", "integrity": "sha512-V48tCfcKb/e6cVUigLAaJDAILdMP0fUW6BidkPK4GpGjXcfbnoHasCZDwz3N3yVt5we2RHm4XTQCpv0KJz9zqw==", + "dev": true, "dependencies": { "undici-types": "~6.19.2" } }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true + }, "node_modules/@types/ping": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/@types/ping/-/ping-0.4.4.tgz", "integrity": "sha512-ifvo6w2f5eJYlXm+HiVx67iJe8WZp87sfa683nlqED5Vnt9Z93onkokNoWqOG21EaE8fMxyKPobE+mkPEyxsdw==", - "dev": true + "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==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -155,17 +869,91 @@ "version": "10.0.0", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", - "dev": true + "dev": true, + "license": "MIT" }, "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==", + "dev": true, "optional": true, "dependencies": { "@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, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dev": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", + "dev": true, + "dependencies": { + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -190,16 +978,221 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/are-we-there-yet/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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" + } + ] + }, + "node_modules/are-we-there-yet/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.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", + "optional": true, + "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/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, + "engines": { + "node": ">=8" + } + }, + "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, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/author-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz", + "integrity": "sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, "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 }, + "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" + } + ] + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bl/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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" + } + ] + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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 + }, "node_modules/boolean": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "dev": true, "optional": true }, "node_modules/brace-expansion": { @@ -224,18 +1217,188 @@ "node": ">=8" } }, + "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" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "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==", + "dev": true, "engines": { "node": "*" } }, + "node_modules/buffer-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", + "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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 + }, + "node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/cacache/node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/cacache/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, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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==", + "dev": true, "engines": { "node": ">=10.6.0" } @@ -244,6 +1407,7 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -257,40 +1421,147 @@ "node": ">=8" } }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", + "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", + "dev": true, + "dependencies": { + "camelcase": "^6.3.0", + "map-obj": "^4.1.0", + "quick-lru": "^5.1.1", + "type-fest": "^1.2.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk/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==", + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/chalk/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==", + "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, + "optional": true + }, + "node_modules/clean-stack": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clean-stack/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" }, "engines": { "node": ">=8" } }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "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": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -302,10 +1573,20 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "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==", + "dev": true, "dependencies": { "mimic-response": "^1.0.0" }, @@ -331,12 +1612,52 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "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, + "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, + "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 }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, "node_modules/copyfiles": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", @@ -362,10 +1683,105 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, + "node_modules/cross-dirname": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", + "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn-windows-exe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cross-spawn-windows-exe/-/cross-spawn-windows-exe-1.2.0.tgz", + "integrity": "sha512-mkLtJJcYbDCxEG7Js6eUnUNndWjyUZwJ3H7bErmmtOYU/Zb99DyUkpamuIZE0b3bhmJyZ7D90uS6f+CGxRRjOw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-cross-spawn-windows-exe?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "@malept/cross-spawn-promise": "^1.1.0", + "is-wsl": "^2.2.0", + "which": "^2.0.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cross-spawn-windows-exe/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/cross-zip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cross-zip/-/cross-zip-4.0.1.tgz", + "integrity": "sha512-n63i0lZ0rvQ6FXiGQ+/JFCKAUyPFhLQYJIqKaa+tSJtfKeULF/IDNDAbdnSIxgS4NTuw2b0+lj8LzfITuq+ZxQ==", + "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", + "engines": { + "node": ">=12.10" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -378,10 +1794,57 @@ } } }, + "node_modules/decamelize": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", + "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "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==", + "dev": true, "dependencies": { "mimic-response": "^3.1.0" }, @@ -396,6 +1859,7 @@ "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==", + "dev": true, "engines": { "node": ">=10" }, @@ -403,10 +1867,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "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==", + "dev": true, "engines": { "node": ">=10" } @@ -415,6 +1892,7 @@ "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==", + "dev": true, "optional": true, "dependencies": { "es-define-property": "^1.0.0", @@ -432,6 +1910,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, "optional": true, "dependencies": { "define-data-property": "^1.0.1", @@ -445,12 +1924,82 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/del": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-7.1.0.tgz", + "integrity": "sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==", + "dev": true, + "dependencies": { + "globby": "^13.1.2", + "graceful-fs": "^4.2.10", + "is-glob": "^4.0.3", + "is-path-cwd": "^3.0.0", + "is-path-inside": "^4.0.0", + "p-map": "^5.5.0", + "rimraf": "^3.0.2", + "slash": "^4.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del-cli": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/del-cli/-/del-cli-5.1.0.tgz", + "integrity": "sha512-xwMeh2acluWeccsfzE7VLsG3yTr7nWikbfw+xhMnpRrF15pGSkw+3/vJZWlGoE4I86UiLRNHicmKt4tkIX9Jtg==", + "dev": true, + "dependencies": { + "del": "^7.1.0", + "meow": "^10.1.3" + }, + "bin": { + "del": "cli.js", + "del-cli": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, "optional": true }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/dotenv": { "version": "16.4.5", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", @@ -463,10 +2012,12 @@ } }, "node_modules/electron": { - "version": "32.0.1", - "resolved": "https://registry.npmjs.org/electron/-/electron-32.0.1.tgz", - "integrity": "sha512-5Hd5Jaf9niYVR2hZxoRd3gOrcxPOxQV1XPV5WaoSfT9jLJHFadhlKtuSDIk3U6rQZke+aC7GqPPAv55nWFCMsA==", + "version": "33.0.2", + "resolved": "https://registry.npmjs.org/electron/-/electron-33.0.2.tgz", + "integrity": "sha512-C2WksfP0COsMHbYXSJG68j6S3TjuGDrw/YT42B526yXalIlNQZ2GeAYKryg6AEMkIp3p8TUfDRD0+HyiyCt/nw==", + "dev": true, "hasInstallScript": true, + "license": "MIT", "dependencies": { "@electron/get": "^2.0.0", "@types/node": "^20.9.0", @@ -479,30 +2030,469 @@ "node": ">= 12.20.55" } }, - "node_modules/electron/node_modules/@types/node": { - "version": "20.16.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.6.tgz", - "integrity": "sha512-T7PpxM/6yeDE+AdlVysT62BX6/bECZOmQAgiFg5NoBd5MQheZ3tzal7f1wvzfiEcmrcJNRi2zRr2nY2zF+0uqw==", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/electronmon": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/electronmon/-/electronmon-2.0.3.tgz", - "integrity": "sha512-vpsNupi9sCzOCvx8GACbSHKEImkNF2a6pU5Io2yabARbJeQ/8ZuY7t/43LilF6Qw0nZ0MbKQt4sO3x0F3drpQQ==", + "node_modules/electron-installer-common": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/electron-installer-common/-/electron-installer-common-0.10.3.tgz", + "integrity": "sha512-mYbP+6i+nHMIm0WZHXgGdmmXMe+KXncl6jZYQNcCF9C1WsNA9C5SZ2VP4TLQMSIoFO+X4ugkMEA5uld1bmyEvA==", "dev": true, + "license": "Apache-2.0", + "optional": true, "dependencies": { - "chalk": "^3.0.0", - "import-from": "^3.0.0", - "runtime-required": "^1.1.0", - "watchboy": "^0.4.3" - }, - "bin": { - "electronmon": "bin/cli.js" + "@malept/cross-spawn-promise": "^1.0.0", + "asar": "^3.0.0", + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "glob": "^7.1.4", + "lodash": "^4.17.15", + "parse-author": "^2.0.0", + "semver": "^7.1.1", + "tmp-promise": "^3.0.2" }, "engines": { - "node": ">=10.0.0" + "node": ">= 10.0.0" + }, + "funding": { + "url": "https://github.com/electron-userland/electron-installer-common?sponsor=1" + }, + "optionalDependencies": { + "@types/fs-extra": "^9.0.1" + } + }, + "node_modules/electron-installer-common/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", + "optional": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/electron-installer-common/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", + "optional": true, + "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-installer-common/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-installer-debian": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/electron-installer-debian/-/electron-installer-debian-3.2.0.tgz", + "integrity": "sha512-58ZrlJ1HQY80VucsEIG9tQ//HrTlG6sfofA3nRGr6TmkX661uJyu4cMPPh6kXW+aHdq/7+q25KyQhDrXvRL7jw==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin", + "linux" + ], + "dependencies": { + "@malept/cross-spawn-promise": "^1.0.0", + "debug": "^4.1.1", + "electron-installer-common": "^0.10.2", + "fs-extra": "^9.0.0", + "get-folder-size": "^2.0.1", + "lodash": "^4.17.4", + "word-wrap": "^1.2.3", + "yargs": "^16.0.2" + }, + "bin": { + "electron-installer-debian": "src/cli.js" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-installer-debian/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", + "optional": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/electron-installer-debian/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", + "optional": true, + "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-installer-redhat": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/electron-installer-redhat/-/electron-installer-redhat-3.4.0.tgz", + "integrity": "sha512-gEISr3U32Sgtj+fjxUAlSDo3wyGGq6OBx7rF5UdpIgbnpUvMN4W5uYb0ThpnAZ42VEJh/3aODQXHbFS4f5J3Iw==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin", + "linux" + ], + "dependencies": { + "@malept/cross-spawn-promise": "^1.0.0", + "debug": "^4.1.1", + "electron-installer-common": "^0.10.2", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "word-wrap": "^1.2.3", + "yargs": "^16.0.2" + }, + "bin": { + "electron-installer-redhat": "src/cli.js" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-installer-redhat/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", + "optional": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/electron-installer-redhat/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", + "optional": true, + "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-packager": { + "version": "17.1.2", + "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-17.1.2.tgz", + "integrity": "sha512-XofXdikjYI7MVBcnXeoOvRR+yFFFHOLs3J7PF5KYQweigtgLshcH4W660PsvHr4lYZ03JBpLyEcUB8DzHZ+BNw==", + "deprecated": "Please use @electron/packager moving forward. There is no API change, just a package name change", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@electron/asar": "^3.2.1", + "@electron/get": "^2.0.0", + "@electron/notarize": "^1.2.3", + "@electron/osx-sign": "^1.0.5", + "@electron/universal": "^1.3.2", + "cross-spawn-windows-exe": "^1.2.0", + "debug": "^4.0.1", + "extract-zip": "^2.0.0", + "filenamify": "^4.1.0", + "fs-extra": "^11.1.0", + "galactus": "^1.0.0", + "get-package-info": "^1.0.0", + "junk": "^3.1.0", + "parse-author": "^2.0.0", + "plist": "^3.0.0", + "rcedit": "^3.0.1", + "resolve": "^1.1.6", + "semver": "^7.1.3", + "yargs-parser": "^21.1.1" + }, + "bin": { + "electron-packager": "bin/electron-packager.js" + }, + "engines": { + "node": ">= 14.17.5" + }, + "funding": { + "url": "https://github.com/electron/electron-packager?sponsor=1" + } + }, + "node_modules/electron-packager/node_modules/@electron/notarize": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.4.tgz", + "integrity": "sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-packager/node_modules/@electron/notarize/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-packager/node_modules/@electron/universal": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz", + "integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "^3.2.1", + "@malept/cross-spawn-promise": "^1.1.0", + "debug": "^4.3.1", + "dir-compare": "^3.0.0", + "fs-extra": "^9.0.1", + "minimatch": "^3.0.4", + "plist": "^3.0.4" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/electron-packager/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-packager/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/electron-packager/node_modules/dir-compare": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", + "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-equal": "^1.0.0", + "minimatch": "^3.0.4" + } + }, + "node_modules/electron-packager/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/electron-packager/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-packager/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/electron-winstaller": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", + "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.21", + "temp": "^0.9.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "@electron/windows-sign": "^1.1.2" + } + }, + "node_modules/electron-winstaller/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/electron-winstaller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optional": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-winstaller/node_modules/universalify": { + "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", + "optional": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/electron/node_modules/@types/node": { + "version": "20.17.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.2.tgz", + "integrity": "sha512-OOHK4sjXqkL7yQ7VEEHcf6+0jSvKjWqwnaCtY7AKD/VLEvRHMsxxu7eI8ErnjxHS8VwmekD4PeVCpu4qZEZSxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" } }, "node_modules/emoji-regex": { @@ -511,10 +2501,21 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, "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==", + "dev": true, "dependencies": { "once": "^1.4.0" } @@ -523,14 +2524,31 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, "engines": { "node": ">=6" } }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, "optional": true, "dependencies": { "get-intrinsic": "^1.2.4" @@ -543,6 +2561,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, "optional": true, "engines": { "node": ">= 0.4" @@ -552,6 +2571,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, "optional": true }, "node_modules/escalade": { @@ -567,6 +2587,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, "optional": true, "engines": { "node": ">=10" @@ -575,10 +2596,135 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, "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==", + "dev": true, "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -594,14 +2740,68 @@ "@types/yauzl": "^2.9.1" } }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, "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==", + "dev": true, "dependencies": { "pend": "~1.2.0" } }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -614,6 +2814,62 @@ "node": ">=8" } }, + "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, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flora-colossus": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flora-colossus/-/flora-colossus-2.0.0.tgz", + "integrity": "sha512-dz4HxH6pOvbUzZpZ/yXhafjbR2I8cenK5xL0KtBFb7U2ADsR+OwXifnxZjij/pZWF775uSCMzWVd+jDik2H2IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "fs-extra": "^10.1.0" + }, + "engines": { + "node": ">= 12" + } + }, + "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, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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, + "dependencies": { + "minipass": "^3.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", @@ -624,11 +2880,55 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "optional": true, + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/galactus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/galactus/-/galactus-1.0.0.tgz", + "integrity": "sha512-R1fam6D4CyKQGNlvJne4dkNF+PvUUl7TAJInvTGa9fti9qAv95quQz29GXapA4d8Ec266mJJxFVh82M4GIIGDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "flora-colossus": "^2.0.0", + "fs-extra": "^10.1.0" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/gar": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/gar/-/gar-1.0.4.tgz", + "integrity": "sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -638,10 +2938,36 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-folder-size": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz", + "integrity": "sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "gar": "^1.0.4", + "tiny-each-async": "2.0.3" + }, + "bin": { + "get-folder-size": "bin/get-folder-size" + } + }, + "node_modules/get-installed-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/get-installed-path/-/get-installed-path-2.1.1.tgz", + "integrity": "sha512-Qkn9eq6tW5/q9BDVdMpB8tOHljX9OSP0jRC5TRNVA4qRc839t4g8KQaR8t0Uv0EFVL0MlyG7m/ofjEgAROtYsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-modules": "1.0.0" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, "optional": true, "dependencies": { "es-errors": "^1.3.0", @@ -657,10 +2983,179 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-package-info": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz", + "integrity": "sha512-SCbprXGAPdIhKAXiG+Mk6yeoFH61JlYunqdFQFHDtLjJlDjFf6x07dsS8acO+xWt52jpdVo49AlVDnUVK1sDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "^3.1.1", + "debug": "^2.2.0", + "lodash.get": "^4.0.0", + "read-pkg-up": "^2.0.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/get-package-info/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/get-package-info/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-package-info/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/get-package-info/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-package-info/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/get-package-info/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/get-package-info/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-package-info/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-package-info/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/get-package-info/node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-package-info/node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-package-info/node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-package-info/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, "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==", + "dev": true, "dependencies": { "pump": "^3.0.0" }, @@ -692,10 +3187,23 @@ "url": "https://github.com/sponsors/isaacs" } }, + "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, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "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==", + "dev": true, "optional": true, "dependencies": { "boolean": "^3.0.1", @@ -713,6 +3221,7 @@ "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, "optional": true, "dependencies": { "lru-cache": "^6.0.0" @@ -724,10 +3233,56 @@ "node": ">=10" } }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/globalthis": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, "optional": true, "dependencies": { "define-properties": "^1.1.3" @@ -739,10 +3294,30 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, "optional": true, "dependencies": { "get-intrinsic": "^1.1.3" @@ -755,6 +3330,7 @@ "version": "11.8.6", "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -778,12 +3354,32 @@ "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==" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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, + "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", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "optional": true, "dependencies": { "es-define-property": "^1.0.0" @@ -796,6 +3392,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, "optional": true, "engines": { "node": ">= 0.4" @@ -808,6 +3405,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, "optional": true, "engines": { "node": ">= 0.4" @@ -816,11 +3414,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "optional": true, + "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -828,15 +3432,42 @@ "node": ">= 0.4" } }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/http-cache-semantics": { "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==" + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true }, "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==", + "dev": true, "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" @@ -845,18 +3476,84 @@ "node": ">=10.19.0" } }, - "node_modules/import-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, "dependencies": { - "resolve-from": "^5.0.0" + "ms": "^2.0.0" + } + }, + "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, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">=8" + "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" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -874,6 +3571,82 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "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", @@ -883,6 +3656,33 @@ "node": ">=8" } }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -892,41 +3692,381 @@ "node": ">=0.12.0" } }, + "node_modules/is-path-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", + "integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, "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==" + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true }, "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==", + "dev": true, "optional": true }, + "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, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "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==", + "dev": true, "dependencies": { "json-buffer": "3.0.1" } }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "node_modules/listr2": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", + "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.19", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.8.0", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/listr2/node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2/node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/listr2/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, "engines": { "node": ">=8" } @@ -935,7 +4075,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "optional": true, + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -943,10 +4083,111 @@ "node": ">=10" } }, + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/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, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/make-fetch-happen/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, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/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, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, "optional": true, "dependencies": { "escape-string-regexp": "^4.0.0" @@ -955,6 +4196,68 @@ "node": ">=10" } }, + "node_modules/mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/meow": { + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", + "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.2", + "camelcase-keys": "^7.0.0", + "decamelize": "^5.0.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.2", + "read-pkg-up": "^8.0.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^1.2.2", + "yargs-parser": "^20.2.9" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -968,10 +4271,29 @@ "node": ">=8.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, "engines": { "node": ">=4" } @@ -988,6 +4310,119 @@ "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, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "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, + "dependencies": { + "minipass": "^3.0.0", + "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", @@ -1003,7 +4438,127 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-abi": { + "version": "3.71.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", + "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-api-version": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.0.tgz", + "integrity": "sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + } + }, + "node_modules/node-api-version/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/node-gyp/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, "node_modules/noms": { "version": "0.0.0", @@ -1015,10 +4570,53 @@ "readable-stream": "~1.0.31" } }, + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "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==", + "dev": true, "engines": { "node": ">=10" }, @@ -1026,10 +4624,50 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "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==", + "dev": true, "optional": true, "engines": { "node": ">= 0.4" @@ -1039,14 +4677,189 @@ "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, "dependencies": { "wrappy": "1" } }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", + "dev": true, + "dependencies": { + "aggregate-error": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-author": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", + "integrity": "sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "author-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, "engines": { "node": ">=8" } @@ -1060,10 +4873,42 @@ "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "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==" + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true }, "node_modules/picomatch": { "version": "2.3.1", @@ -1078,12 +4923,13 @@ } }, "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, "node_modules/ping": { @@ -1094,6 +4940,127 @@ "node": ">=4.0.0" } }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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, + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/postject": { + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", + "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "commander": "^9.4.0" + }, + "bin": { + "postject": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/postject/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -1104,23 +5071,149 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, "engines": { "node": ">=0.4.0" } }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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" + } + ] + }, "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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rcedit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-3.1.0.tgz", + "integrity": "sha512-WRlRdY1qZbu1L11DklT07KuHfRk42l0NFFJdaExELEu4fEQ982bP5Z6OWGPj/wLLIuKRQDCxZJGAwoFsxhZhNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn-windows-exe": "^1.1.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, + "node_modules/read-pkg": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", + "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", + "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0", + "read-pkg": "^6.0.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, "engines": { "node": ">=10" }, @@ -1140,11 +5233,34 @@ "string_decoder": "~0.10.x" } }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/redent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", + "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", + "dev": true, + "dependencies": { + "indent-string": "^5.0.0", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/require-directory": { "version": "2.1.1", @@ -1155,24 +5271,63 @@ "node": ">=0.10.0" } }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "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==" + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": ">=0.10.0" + } + }, + "node_modules/resolve-package": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-package/-/resolve-package-1.0.1.tgz", + "integrity": "sha512-rzB7NnQpOkPHBWFPP3prUMqOP6yg3HkRGgcvR+lDyvyHoY3fZLFLYDkPXh78SPVBAE6VTCk/V+j8we4djg6o4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-installed-path": "^2.0.3" + }, + "engines": { + "node": ">=4", + "npm": ">=2" } }, "node_modules/responselike": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, "dependencies": { "lowercase-keys": "^2.0.0" }, @@ -1180,10 +5335,66 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "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==", + "dev": true, "optional": true, "dependencies": { "boolean": "^3.0.1", @@ -1197,13 +5408,37 @@ "node": ">=8.0" } }, - "node_modules/runtime-required": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/runtime-required/-/runtime-required-1.1.0.tgz", - "integrity": "sha512-yX97f5E0WfNpcQnfVjap6vzQcvErkYYCx6eTK4siqGEdC8lglwypUFgZVTX7ShvIlgfkC4XGFl9O1KTYcff0pw==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, - "engines": { - "node": ">=4.0.0" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" } }, "node_modules/safe-buffer": { @@ -1212,10 +5447,18 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, + "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, + "optional": true + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -1224,12 +5467,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, "optional": true }, "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==", + "dev": true, "optional": true, "dependencies": { "type-fest": "^0.13.1" @@ -1241,11 +5486,183 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "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, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "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, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dev": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/socks-proxy-agent/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, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.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, + "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, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "dev": true + }, "node_modules/sprintf-js": { "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==", - "optional": true + "dev": true + }, + "node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } }, "node_modules/string_decoder": { "version": "0.10.31", @@ -1279,10 +5696,76 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-outer/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/sudo-prompt": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", + "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/sumchecker": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, "dependencies": { "debug": "^4.1.0" }, @@ -1290,6 +5773,108 @@ "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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "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/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, "node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -1330,6 +5915,34 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/tiny-each-async": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz", + "integrity": "sha512-5ROII7nElnAirvFn8g7H7MtpfV1daMcyfTGQwsn/x2VtyV+VPiO5CjReCJtWLvoKTDEDmZocf3cNPraiMnBXLA==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "optional": true, + "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, + "optional": true, + "dependencies": { + "tmp": "^0.2.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -1342,10 +5955,60 @@ "node": ">=8.0" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/trim-newlines": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", + "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-repeated/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/tslib": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "dev": true, + "license": "0BSD" + }, "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==", + "dev": true, "optional": true, "engines": { "node": ">=10" @@ -1370,30 +6033,40 @@ "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true }, - "node_modules/unixify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", - "integrity": "sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==", + "node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", "dev": true, "dependencies": { - "normalize-path": "^2.1.1" + "unique-slug": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/unixify/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", "dev": true, "dependencies": { - "remove-trailing-separator": "^1.0.1" + "imurmurhash": "^0.1.4" }, "engines": { - "node": ">=0.10.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "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, + "engines": { + "node": ">= 10.0.0" } }, "node_modules/untildify": { @@ -1405,6 +6078,20 @@ "node": ">=8" } }, + "node_modules/username": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/username/-/username-5.1.0.tgz", + "integrity": "sha512-PCKbdWw85JsYMvmCv5GH3kXmM66rCd9m1hBEDutPNv94b/pqCMT4NtcKyeWYvLFiE8b+ha1Jdl8XAaUdPn5QTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^1.0.0", + "mem": "^4.3.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -1423,19 +6110,76 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/watchboy": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/watchboy/-/watchboy-0.4.3.tgz", - "integrity": "sha512-GHs1HxwvxSMBsqd/WfTOZhj5gBdMqf5HQpfgtKxDfZRxrlYPDdVLRB61LCeRzJaWANmvSIMlfmRVDwVmJFgAKA==", + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "dependencies": { - "lodash.difference": "^4.5.0", - "micromatch": "^4.0.2", - "pify": "^4.0.1", - "unixify": "^1.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.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, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">=8.0.0" + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/wrap-ansi": { @@ -1458,7 +6202,17 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "engines": { + "node": ">=8.0" + } }, "node_modules/xtend": { "version": "4.0.2", @@ -1482,7 +6236,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true + "dev": true }, "node_modules/yargs": { "version": "16.2.0", @@ -1511,14 +6265,118 @@ "node": ">=10" } }, + "node_modules/yarn-or-npm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/yarn-or-npm/-/yarn-or-npm-3.0.1.tgz", + "integrity": "sha512-fTiQP6WbDAh5QZAVdbMQkecZoahnbOjClTQhzv74WX5h2Uaidj1isf9FDes11TKtsZ0/ZVfZsqZ+O3x6aLERHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.5", + "pkg-dir": "^4.2.0" + }, + "bin": { + "yarn-or-npm": "bin/index.js", + "yon": "bin/index.js" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/yarn-or-npm/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/yarn-or-npm/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/yarn-or-npm/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/yarn-or-npm/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yarn-or-npm/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yarn-or-npm/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "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==", + "dev": true, "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } + }, + "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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/CEO/package.json b/CEO/package.json index 3416073..3bbd272 100644 --- a/CEO/package.json +++ b/CEO/package.json @@ -4,25 +4,68 @@ "version": "1.0.0", "description": "Aplicatie P2P pentru stocarea resurselor digitale", "scripts": { - "clean": "del-cli dist", - "start": "tsc && copyfiles -u 1 'src/**/*' dist && electron dist/main/main.js" + "clean": "del-cli dist && del-cli out", + "build-dist": "tsc && copyfiles -u 1 'src/**/*' dist", + "start-dev": "tsc && copyfiles -u 1 'src/**/*' dist && electron dist/main/main.js", + "start": "npm run clean && npm run build-dist && electron-forge start", + "package": "npm run clean && npm run build-dist && electron-forge package", + "make": "npm run clean && npm run build-dist && electron-forge make" }, "main": "dist/main/main.js", "author": "Cerbu Andrei - Mihnea", "license": "ISC", "dependencies": { "dotenv": "^16.4.5", - "electron": "^32.0.1", "ping": "^0.4.4", "uuid": "^10.0.0" }, "devDependencies": { - "@types/electron": "^1.6.10", - "@types/node": "^22.6.1", + "@electron-forge/cli": "^6.0.0", + "@electron-forge/maker-deb": "^6.0.0", + "@electron-forge/maker-rpm": "^6.0.0", + "@electron-forge/maker-squirrel": "^6.0.0", + "@electron-forge/maker-zip": "^6.0.0", "@types/ping": "^0.4.4", "@types/uuid": "^10.0.0", "copyfiles": "^2.4.1", "del-cli": "^5.0.0", + "electron": "^33.0.2", "typescript": "^5.6.2" + }, + "config": { + "forge": { + "packagerConfig": { + "name": "CeoApp", + "icon": "../app_icons/icon.ico", + "ignore": [ + "src", + ".idea", + "tsconfig.json" + ] + }, + "makers": [ + { + "name": "@electron-forge/maker-squirrel", + "config": { + "name": "CEOApp", + "setupIcon": "../app_icons/icon.ico" + } + }, + { + "name": "@electron-forge/maker-zip", + "platforms": ["darwin"], + "config": { + "icon": "../app_icons/icon.icns" + } + }, + { + "name": "@electron-forge/maker-deb", + "platforms": ["linux"], + "config": { + "icon": "../app_icons/icon.png" + } + } + ] + } } } diff --git a/CEO/render/assets/2581896.png b/CEO/render/assets/2581896.png new file mode 100644 index 0000000..6a3d2a0 Binary files /dev/null and b/CEO/render/assets/2581896.png differ diff --git a/CEO/render/assets/background.png b/CEO/render/assets/background.png deleted file mode 100644 index fc8f921..0000000 Binary files a/CEO/render/assets/background.png and /dev/null differ diff --git a/CEO/render/assets/cloud-computing.webp b/CEO/render/assets/cloud-computing.webp new file mode 100644 index 0000000..1272400 Binary files /dev/null and b/CEO/render/assets/cloud-computing.webp differ diff --git a/CEO/render/assets/loading.gif b/CEO/render/assets/loading.gif deleted file mode 100644 index aaac076..0000000 Binary files a/CEO/render/assets/loading.gif and /dev/null differ diff --git a/CEO/render/assets/mail_2772213.png b/CEO/render/assets/mail_2772213.png new file mode 100644 index 0000000..0563cd5 Binary files /dev/null and b/CEO/render/assets/mail_2772213.png differ diff --git a/CEO/render/assets/refresh-data.webp b/CEO/render/assets/refresh-data.webp new file mode 100644 index 0000000..cb54150 Binary files /dev/null and b/CEO/render/assets/refresh-data.webp differ diff --git a/CEO/render/css/announcement.css b/CEO/render/css/announcement.css new file mode 100644 index 0000000..d4a8d8c --- /dev/null +++ b/CEO/render/css/announcement.css @@ -0,0 +1,133 @@ +body, html { + height: 100vh; + width: 100vw; + margin: 0; + padding: 0; + font-family: "Pridi", sans-serif; + background-color: #4A628A; +} + +h4, h1 { + margin: 0; +} + +.page { + height: 100vh; + width: 100vw; + display: flex; + justify-content: center; + align-items: center; +} + +.container { + border-radius: 10px; + background: linear-gradient(to bottom, rgba(74, 98, 138, 0.0) 30%, rgba(186, 237, 255, 0.7)); + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-evenly; + height: 90%; + width: 35%; +} + +.header { + text-align: center; + padding: 16px; +} + +.title { + font-size: 48px; + font-weight: 500; + color: white; +} + +.subheading { + padding-top: 8px; + font-size: 16px; + color: rgba(255, 255, 255, 0.8); +} + +.announcement-form { + display: flex; + flex-direction: column; + align-items: center; + width: 80%; +} + +textarea { + height: 230px; + width: 100%; + padding: 15px; + font-size: 1em; + border-radius: 8px; + border: 1px solid #ccc; + resize: none; + background-color: #3A4A6C; /* Darker background for the textarea */ + color: #f0f0f0; /* Light text color */ + transition: border-color 0.3s ease, box-shadow 0.3s ease; +} + +textarea::placeholder { + opacity: 0.7; + color: white; +} + +/* Customize the textarea scrollbar */ +textarea::-webkit-scrollbar { + width: 10px; /* Width of the scrollbar */ +} + +textarea::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0.1); /* Track background color */ + border-radius: 10px; /* Rounded corners for the track */ +} + +textarea::-webkit-scrollbar-thumb { + background-color: rgba(74, 98, 138, 0.8); /* Scrollbar handle color */ + border-radius: 10px; /* Rounded corners for the scrollbar handle */ +} + +textarea::-webkit-scrollbar-thumb:hover { + background-color: rgba(74, 98, 138, 1); /* Darker color on hover */ +} + +textarea:focus { + outline: none; + border-color: #4A628A; + box-shadow: 0 0 5px rgba(74, 98, 138, 0.5); + background-color: #334466; /* Slightly brighter background on focus */ +} + + +.announcement-form-footer { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; + margin-top: 20px; + gap: 10px; /* Space between buttons */ +} + +button#submitAnnouncement { + width: 100%; + padding: 16px; + font-weight: 300; + background-color: #4A628A; + color: white; + border: none; + border-radius: 8px; + cursor: pointer; + transition: background-color 0.3s ease, transform 0.2s ease; +} + +button#backButton { + background-color: transparent; /* No background */ + border: none; /* Remove default button border */ + color: #4A628A; /* Set text color */ + font-size: 1em; /* Set font size */ + cursor: pointer; /* Add pointer cursor for interactivity */ + text-decoration: underline; /* Underline text */ + padding: 0; /* Remove default padding */ +} diff --git a/CEO/render/css/departments_management.css b/CEO/render/css/departments_management.css deleted file mode 100644 index c215647..0000000 --- a/CEO/render/css/departments_management.css +++ /dev/null @@ -1,176 +0,0 @@ -/* Global styles for body and background */ -body, html { - height: 100%; - width: 100%; - margin: 0; - padding: 0; - font-family: "Roboto", sans-serif; - font-weight: 500; - font-style: normal; - background-image: url('../assets/background.png'); - background-size: cover; - background-repeat: no-repeat; -} - -/* Container starts hidden */ -.container { - opacity: 0; - display: flex; - flex-direction: row; - justify-content: space-evenly; - align-items: center; - min-height: 100vh; - text-align: center; -} - -/* Container styling to match your previous design */ -.left_block, .right_block { - background-color: rgba(83, 92, 145, 0.71); - padding: 2rem; - border-radius: 1rem; - box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.9); - color: white; -} - -.left_block { - width: 45%; -} - -.right_block { - width: 45%; -} - -h1 { - margin-bottom: 2rem; - font-size: 2rem; - color: white; -} - -/* Enable scrolling in the departments container */ -#departments-container { - max-height: 50vh; /* Limit the height of the container */ - overflow-y: auto; /* Enable vertical scrolling */ -} - -/* Scrollbar styling for departments container */ -#departments-container::-webkit-scrollbar { - width: 10px; -} - -#departments-container::-webkit-scrollbar-track { - background: #1B1A55; -} - -#departments-container::-webkit-scrollbar-thumb { - background: #535C91; - border: 2px solid #1B1A55; -} - -#departments-container::-webkit-scrollbar-thumb:hover { - background: #555; -} - -/* Form styling */ -form { - display: flex; - flex-direction: column; - gap: 1.5rem; -} - -label { - font-size: 1rem; - color: white; -} - -input[type="text"] { - padding: 0.8rem; - font-size: 1rem; - border-radius: 5px; - border: 1px solid #ccc; - width: 100%; -} - -button[type="submit"], #createDepartmentButton { - background-color: #23BDEE; - color: white; - padding: 0.8rem; - font-size: 1rem; - border: none; - border-radius: 5px; - cursor: pointer; - text-transform: uppercase; -} - -button[type="submit"]:hover, #createDepartmentButton:hover { - background-color: #1da1cb; -} - -/* Department card styling */ -.department-card { - background-color: #ffffff; - color: #333; - padding: 1rem; - margin: 1rem 0; - border-radius: 5px; - display: flex; - justify-content: space-between; - align-items: center; -} - -.department-card button { - padding: 0.5rem 1rem; - margin-left: 10px; - border: none; - border-radius: 5px; - cursor: pointer; -} - -.modify-button { - background-color: #4CAF50; - color: white; -} - -.delete-button { - background-color: #f44336; - color: white; -} - -/* Modal styles */ -.modal { - display: none; - position: fixed; - z-index: 1; - left: 0; - top: 0; - width: 100%; - height: 100%; - overflow: auto; - background-color: rgba(0, 0, 0, 0.5); -} - -.modal-content { - background-color: white; - margin: 15% auto; - padding: 20px; - border: 1px solid #888; - width: 50%; -} - -.close { - color: #aaa; - float: right; - font-size: 28px; - font-weight: bold; -} - -.close:hover, .close:focus { - color: black; - text-decoration: none; - cursor: pointer; -} - -/* Footer style */ -.footer { - margin-top: 20px; - text-align: right; -} diff --git a/CEO/render/css/loading.css b/CEO/render/css/loading.css new file mode 100644 index 0000000..a365a5a --- /dev/null +++ b/CEO/render/css/loading.css @@ -0,0 +1,59 @@ +body, html { + height: 100vh; + width: 100vw; + margin: 0; + padding: 0; + + font-family: "Pridi", sans-serif; /* Use sans-serif fallback */ + background-color: #4A628A; +} + +h4, h2, h1{ + margin: 0; +} + +.container{ + height: 100vh; + width: 100vw; + display: flex; + flex-direction: column; + justify-content: space-evenly; + align-items: center; +} + +.title{ + font-size: 48px; + font-weight: 500; + letter-spacing: -1px; + color: white; +} + +img{ + width: 200px; + height: 200px; +} + +p{ + color: white; +} + +.loading-section{ + display: flex; + flex-direction: column; + align-items: center; +} + +.spinner { + margin-bottom: 8px; + width: 15px; + height: 15px; + border: 3px solid #f3f3f3; + border-top: 3px solid #2196F3; + border-radius: 50%; + animation: spin 1s linear infinite; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} \ No newline at end of file diff --git a/CEO/render/css/login.css b/CEO/render/css/login.css index 2e9d6d5..d9062ef 100644 --- a/CEO/render/css/login.css +++ b/CEO/render/css/login.css @@ -1,110 +1,143 @@ body, html { - height: 100%; - width: 100%; + height: 100vh; + width: 100vw; margin: 0; padding: 0; - font-family: "Roboto", sans-serif; - font-weight: 500; - font-style: normal; + font-family: "Pridi", sans-serif; /* Use sans-serif fallback */ + background-color: #4A628A; +} - background-image: url('../assets/background.png'); - background-size: cover; - background-repeat: no-repeat; +h4, h2, h1{ + margin: 0; +} +.page{ + height: 100vh; + width: 100vw; + display: flex; + justify-content: center; + align-items: center; } .container { - opacity: 0; - - display: flex; - flex-direction: row; - justify-content: space-evenly; - align-items: center; - min-height: 100vh; -} - -.header { - color: #1B1A55; - font-size: 4vh; - text-transform: uppercase; - line-height: 2.5rem; - margin-bottom: 10rem; -} - -.login-form { - background-color: #535C91; - opacity: 71; - padding: 9vh 3vh 5vh; - border-radius: 1rem; - box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.9); - width: 25%; -} - -.login-form-title { - margin: 0 0 5vh 0; - text-align: center; -} - -.login-form-title h2 { - color: #FFFFFF; - font-size: 5vh; - margin: 0; - padding: 0; -} - -.login-form hr { - width: 40%; -} - -.login-form-content { - display: flex; - flex-wrap: wrap; - justify-content: center; -} - -input { - text-align: center; - color: white; - font-weight: bold; - font-size: 1.2rem; - width: 70%; - padding: 1rem; - margin: 0.7rem; - background-color: #1B1A55; border-radius: 10px; -} - -button { - font-weight: bold; + background: linear-gradient(to bottom, rgba(74, 98, 138, 0.0) 30%, rgba(186, 237, 255, 0.7)); + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-evenly; + height: 90%; width: 35%; - font-size: 1rem; - padding: 10px; - border: none; - border-radius: 5px; - margin-top: 1rem; - cursor: pointer; } -button:hover { - filter: brightness(85%); +.header{ + text-align: center; + padding-bottom: 16px; + padding-top: 16px; +} + +.title{ + font-size: 48px; + font-weight: 500; + letter-spacing: -1px; + color: white; +} + +.subheading{ + padding-top: 8px; + font-size: 16px; + letter-spacing: -0.5px; + color: rgba(255,255,255, 0.8); +} + +.login-form{ + display: flex; + flex-direction: column; + align-items: center; + width: 80%; +} + +.login-title { + font-size: 24px; + font-weight: 500; + color: white; + margin-bottom: 16px; +} + +.login-form-content input { + width: 100%; + padding: 15px; + margin: 10px 0; + border: 1px solid #ccc; /* Light gray border */ + border-radius: 8px; /* Rounded corners */ + font-size: 1em; + font-family: inherit; + box-sizing: border-box; + background-color: #f9f9f9; /* Light background */ + color: #333; /* Dark text color */ + transition: border-color 0.3s ease, box-shadow 0.3s ease; /* Smooth transition for interaction */ +} + +/* Placeholder Text Styling */ +.login-form-content input::placeholder { + color: #aaa; /* Lighter color for placeholders */ +} + +/* Focus State Styling */ +.login-form-content input:focus { + outline: none; /* Remove default focus outline */ + border-color: #4A628A; /* Blue border on focus */ + box-shadow: 0 0 5px rgba(74, 98, 138, 0.5); /* Subtle shadow for focus */ + background-color: #fff; /* Slightly brighter background on focus */ +} + +/* Input Field Hover Effect */ +.login-form-content input:hover { + border-color: #888; /* Darker gray border on hover */ +} + +/* Disabled Input Styling */ +.login-form-content input:disabled { + background-color: #e0e0e0; /* Light gray background for disabled input */ + cursor: not-allowed; /* Show "not allowed" cursor */ + opacity: 0.7; /* Slight transparency */ } .login-form-footer { - margin-top: 3vh; display: flex; - flex-wrap: wrap; - align-content: center; + width: 100%; + flex-direction: column; + justify-content: space-between; /* Align buttons next to each other */ align-items: center; - justify-content: space-evenly; + gap: 10px; /* Space between buttons */ + margin-top: 20px; +} + +/* Styling for buttons */ +.login-form-footer button { + flex: 1; /* Ensure buttons are equal width */ + padding: 16px; + font-weight: 300; + border: none; + border-radius: 8px; + cursor: pointer; + transition: background-color 0.3s ease, transform 0.2s ease; +} + +button[name="underline"] { + background-color: transparent; /* No background */ + border: none; /* Remove default button border */ + color: #4A628A; /* Set text color */ + font-size: 1em; /* Set font size */ + cursor: pointer; /* Add pointer cursor for interactivity */ + text-decoration: underline; /* Underline text */ + padding: 0; /* Remove default padding */ } button[name="submit"] { - background-color: #F44336; - color: white; + width: 100%; + background-color: #4A628A; /* Blue background */ + color: white; /* White text color */ } - -button[name="signup"] { - background-color: #2196F3; - color: white; -} \ No newline at end of file diff --git a/CEO/render/css/main_menu.css b/CEO/render/css/main_menu.css index f80103b..47169e2 100644 --- a/CEO/render/css/main_menu.css +++ b/CEO/render/css/main_menu.css @@ -1,245 +1,208 @@ body, html { - height: 100%; - width: 100%; + height: 100vh; + width: 100vw; margin: 0; padding: 0; - font-family: "Roboto", sans-serif; + font-family: "Pridi", sans-serif; /* Use sans-serif fallback */ + background-color: #4A628A; +} + +h4, h2, h1{ + margin: 0; +} + +.title{ + font-size: 32px; font-weight: 500; - font-style: normal; - - background-image: url('../assets/background.png'); - background-size: cover; - background-repeat: no-repeat; -} - -.overlay { - display: none; - position: fixed; - width: 100%; - height: 100%; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.85); - z-index: 2; - cursor: pointer; -} - -.ceo-validation-form { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 300px; - padding: 20px; - background: #1B1A55; - border-radius: 10px; - cursor: default; -} - -.ceo-validation-form h2 { - text-align: center; + letter-spacing: -1px; color: white; } -.ceo-validation-form p { - color: white; - text-align: center; - font-size: 1rem; - padding: 0.5rem; -} - -.form-actions { - text-align: center; - padding-top: 20px; -} - -.form-actions button { - padding: 10px 20px; - margin: 0 10px; - border: none; - border-radius: 5px; - cursor: pointer; -} - -input { - text-align: center; - color: white; - font-weight: bold; - font-size: 1.2rem; - width: 80%; - padding: 1rem; - margin: 0.7rem; - background-color: #1B1A55; - border-radius: 10px; -} - -#back_button { - background-color: #f44336; - width: 35%; - height: auto; +.user{ + display: inline; color: white; } - -#submit_button { - background-color: #4CAF50; - width: 35%; - height: auto; - color: white; -} - -.container { - opacity: 0; - display: flex; - flex-direction: row; - justify-content: space-evenly; - align-items: center; - min-height: 100vh; - text-align: center; -} - -.left_block { - display: flex; - flex-direction: column; - background-color: #535C91; - opacity: 71; - padding: 2rem; - border-radius: 1rem; - box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.9); - color: white; -} - -.left_block_top { - display: flex; +.navbar{ + padding-top: 8px; + padding-right: 32px; + padding-left: 32px; + height: 10%; + display:flex; flex-direction: row; justify-content: space-between; - text-align: left; + align-items: center; } - -.left_block_top h1 { - padding: 0; - margin: 0; -} - -.left_block_top img { - margin: 0 3vw 0 5vw; - width: 8vw; - height: 8vw; -} - -.left_block_content { - margin: 2rem 0 2rem 0; -} - -.left_block_buttons { +.welcome{ display: flex; flex-direction: row; - align-content: center; align-items: center; +} + +img{ + padding-right: 8px; + width:25px; + height: auto; +} + +.page{ + height: 100vh; + width: 100vw; + display: flex; + justify-content: center; + align-items: center; +} + +.container{ + width:100%; + height:100%; + display: flex; + flex-direction: row; justify-content: center; } -button { - margin: 0 1rem 0 1rem; - width: 15vw; - height: 10vh; - border: none; - border-radius: 10px; - color: white; - font-size: 1rem; - font-weight: bold; - text-transform: uppercase; +.left_block{ + background: linear-gradient(to bottom, #131A24, #4A628A); + width: 25%; + display: flex; + flex-direction: column; +} + +.notification-title{ + padding-top: 16px; + padding-bottom: 16px; + text-align: center; + height: 10%; + display: flex; + justify-content: center; + align-items: center; +} + +.notifications{ + overflow-y: auto; + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + flex-grow: 1; /* Allow it to take available space */ + max-height: calc(90% - 80px); +} + +.right_block_content button:last-child { + background-color: #FF6347; +} + +.right_block_content button:nth-child(8) { + background-color: #FF6347; +} + +.right_block_content button:last-child:hover { + background-color: #fd4c29; +} + +.alert, .logout-button{ cursor: pointer; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); - outline: none; - transition: background-color 0.3s ease; + border-radius: 15px; + width: 80%; + min-height: 64px; + height: auto; + padding:12px; + background: #FF6347; + font-weight: bold; + font-size: 12px; +} +.notification{ + cursor: pointer; + border-radius: 15px; + width: 80%; + min-height: 64px; + height: auto; + padding:12px; + background: rgba(186, 229, 255); + font-weight: bold; + font-size: 12px; } -button:hover { - filter: brightness(85%); +.notification:hover{ + background: #d9efff; } -.left_block_footer { +.alert:hover, .logout-button:hover{ + background: rgb(244, 44, 44); +} + +.notif-title{ + font-size: 24px; + font-weight: 300; + letter-spacing: -1px; + color: white; +} + +.left-content{ + height: 90%; + width: 100%; + display: flex; + flex-direction: column; + justify-content: space-around; + align-items: center; +} + +.left_block_footer{ display: flex; align-items: center; - justify-content: end; + justify-content: center; + width: 100%; + padding-bottom: 16px; } -.right_block { - display: flex; +.right_block_content{ + height: 90%; +} + +.right_block{ + width: 75%; + display:flex; flex-direction: column; - background-color: #535C91; - opacity: 71; - padding: 2rem; - border-radius: 1rem; - box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.9); - color: white; + justify-content: center; } -.notifications { - display: flex; - margin: 1rem 2rem 2rem 3rem; - flex-direction: column; - align-items: start; - height: 40vh; /* Fixed height */ - width: 80%; /* Full width */ - overflow: auto; /* Enable scrolling */ - font-size: 1.2rem; - color: white; - font-weight: bold; -} - -.notifications::-webkit-scrollbar { - width: 10px; -} - -.notifications::-webkit-scrollbar-track { - background: #1B1A55; -} - -.notifications::-webkit-scrollbar-thumb { - background: #535C91; - border: 2px solid #1B1A55; -} - -.notifications::-webkit-scrollbar-thumb:hover { - background: #555; -} - -button[name="logout"] { - margin: 0; - padding: 0; - width: 10vw; - height: 5vh; - background-color: #F44336; -} - -button[name="alert"] { - margin: 0.7rem; - background-color: #F44336; -} - -button[name="notification"] { - margin: 0.7rem; - background-color: #23BDEE; +.right_block_content { + display: grid; + grid-template-columns: repeat(3, 1fr); /* 3 equal-width columns */ + gap: 8px; /* Spacing between buttons */ + padding: 32px; /* Optional padding */ } button[name="menu_button"] { - margin: 0.7rem; - background-color: #1B1A55; + padding: 10px 20px; + font-size: 16px; + background-color: rgba(186,229,244,0.4); /* Button background */ + color: white; + border: none; + border-radius: 8px; + cursor: pointer; + transition: background-color 0.3s ease, transform 0.2s ease; } -/* Disclaimer Modal Styles */ -#disclaimer-modal { - display: none; /* Initially hidden */ +button[name="menu_button"]:hover { + background-color: #3B5173; /* Darker background on hover */ } -.cancel-button { - background-color: #f44336; /* Red color for cancel */ +.notifications::-webkit-scrollbar { + width: 4px; /* Width of the scrollbar */ } -.submit-button { - background-color: #4CAF50; /* Green color foQQr submit */ +.notifications::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0.1); /* Track background color */ + border-radius: 10px; /* Rounded corners for the track */ } + +.notifications::-webkit-scrollbar-thumb { + background-color: rgba(74, 98, 138, 0.8); /* Scrollbar handle color */ + border-radius: 10px; /* Rounded corners for the scrollbar handle */ +} + +.notifications::-webkit-scrollbar-thumb:hover { + background-color: rgba(74, 98, 138, 1); /* Darker color on hover */ +} \ No newline at end of file diff --git a/CEO/render/css/normalizer.css b/CEO/render/css/normalizer.css new file mode 100644 index 0000000..98fe5ba --- /dev/null +++ b/CEO/render/css/normalizer.css @@ -0,0 +1,41 @@ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, hr +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} \ No newline at end of file diff --git a/CEO/render/css/overview_departments.css b/CEO/render/css/overview_departments.css new file mode 100644 index 0000000..36cf2af --- /dev/null +++ b/CEO/render/css/overview_departments.css @@ -0,0 +1,215 @@ +body, html { + height: 100vh; + width: 100vw; + margin: 0; + padding: 0; + + font-family: "Pridi", sans-serif; /* Use sans-serif fallback */ + background-color: #4A628A; +} + +h4, h2, h1{ + margin: 0; +} + +.page{ + height: 100vh; + width: 100vw; + display: flex; + justify-content: center; + align-items: center; +} + +.container { + border-radius: 10px; + background: linear-gradient(to bottom, rgba(74, 98, 138, 0.0) 30%, rgba(186, 237, 255, 0.7)); + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-evenly; + height: 90%; + width: 35%; +} + +.header{ + text-align: center; + padding-bottom: 16px; + padding-top: 32px; +} + +.title{ + font-size: 24px; + font-weight: 500; + color: white; + margin-bottom: 32px; +} + +.departments-container{ + overflow-y: hidden; + width: 100%; + height: 370px; + max-height: 370px; + display: flex; + flex-direction: column; + gap: 8px; + align-items: center; +} + +.department-name{ + width:70%; + font-size: 16px; + letter-spacing: -0.5px; + color: rgba(255,255,255, 1); +} + +.user-management-container{ + display: flex; + flex-direction: column; + align-items: center; + width: 80%; +} + +.footer { + display: flex; + width: 100%; + flex-direction: row; + justify-content: space-between; /* Align buttons next to each other */ + align-items: center; + gap: 10px; /* Space between buttons */ + margin-top: 20px; +} + +/* Styling for buttons */ +.user-management-container button, .modal button { + flex: 1; /* Ensure buttons are equal width */ + padding: 8px 16px 8px 16px; + font-weight: 300; + border: none; + border-radius: 8px; + cursor: pointer; + transition: background-color 0.3s ease, transform 0.2s ease; +} + +button[name="underline"] { + background-color: transparent; /* No background */ + border: none; /* Remove default button border */ + color: #4A628A; /* Set text color */ + font-size: 1em; /* Set font size */ + cursor: pointer; /* Add pointer cursor for interactivity */ + text-decoration: underline; /* Underline text */ + padding: 0; /* Remove default padding */ +} + +.department-card{ + width: 100%; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 8px; +} + +.delete-button { + width: auto; + margin-right: 8px; + background-color: #ED4B4B; /* Blue background */ + color: white; /* White text color */ +} + +button[name="submit"] { + width: 100%; + background-color: #4A628A; /* Blue background */ + color: white; /* White text color */ +} + +.departments-container::-webkit-scrollbar { + width: 4px; /* Width of the scrollbar */ +} + +.departments-container::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0.1); /* Track background color */ + border-radius: 10px; /* Rounded corners for the track */ +} + +.departments-container::-webkit-scrollbar-thumb { + background-color: rgba(74, 98, 138, 0.8); /* Scrollbar handle color */ + border-radius: 10px; /* Rounded corners for the scrollbar handle */ +} + +.departments-container::-webkit-scrollbar-thumb:hover { + background-color: rgba(74, 98, 138, 1); /* Darker color on hover */ +} + +.departments-container:empty { + overflow-y: hidden; +} + +.user-name{ + padding-top: 8px; + font-size: 20px; + letter-spacing: -0.5px; + color: rgba(255,255,255, 1); +} + +.user-department{ + font-weight: lighter; + padding-top: 8px; + font-size: 14px; + letter-spacing: -0.5px; + color: rgba(255,255,255, 0.8); +} + +.modal { + display: none; /* Hidden by default */ + position: fixed; + z-index: 1; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + backdrop-filter: blur(5px);/* Black with opacity */ +} + +.modal-content { + background-color: #fefefe; + margin: 15% auto; + padding: 16px; + border: 1px solid #888; + width: 100%; + max-width: 400px; + border-radius: 8px; + text-align: center; +} + +.close-button { + float: right; + font-size: 24px; + font-weight: bold; + cursor: pointer; + color: #aaa; +} + +.close-button:hover, +.close-button:focus { + color: black; + text-decoration: none; + cursor: pointer; +} + +input{ + width: 100%; + padding: 15px; + margin-bottom: 16px; + border: 1px solid #ccc; /* Light gray border */ + border-radius: 8px; /* Rounded corners */ + font-size: 12px; + font-family: inherit; + box-sizing: border-box; + background-color: #f9f9f9; /* Light background */ + color: #333; /* Dark text color */ + transition: border-color 0.3s ease, box-shadow 0.3s ease; /* Smooth transition for interaction */ +} + + diff --git a/CEO/render/css/overview_users.css b/CEO/render/css/overview_users.css new file mode 100644 index 0000000..b792daf --- /dev/null +++ b/CEO/render/css/overview_users.css @@ -0,0 +1,153 @@ +body, html { + height: 100vh; + width: 100vw; + margin: 0; + padding: 0; + + font-family: "Pridi", sans-serif; /* Use sans-serif fallback */ + background-color: #4A628A; +} + +h4, h2, h1{ + margin: 0; +} + +.page{ + height: 100vh; + width: 100vw; + display: flex; + justify-content: center; + align-items: center; +} + +.container { + border-radius: 10px; + background: linear-gradient(to bottom, rgba(74, 98, 138, 0.0) 30%, rgba(186, 237, 255, 0.7)); + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-evenly; + height: 90%; + width: 35%; +} + +.header{ + text-align: center; + padding-bottom: 16px; + padding-top: 32px; +} + +.title{ + font-size: 24px; + font-weight: 500; + color: white; + margin-bottom: 32px; +} + +.users-container{ + overflow-y: hidden; + width: 100%; + height: 370px; + max-height: 370px; + display: flex; + flex-direction: column; + gap: 8px; + align-items: center; +} + +.user-management-container{ + display: flex; + flex-direction: column; + align-items: center; + width: 80%; +} + +.footer { + display: flex; + width: 100%; + flex-direction: column; + justify-content: space-between; /* Align buttons next to each other */ + align-items: center; + gap: 10px; /* Space between buttons */ + margin-top: 20px; +} + +/* Styling for buttons */ +.user-management-container button { + flex: 1; /* Ensure buttons are equal width */ + padding: 16px; + font-weight: 300; + border: none; + border-radius: 8px; + cursor: pointer; + transition: background-color 0.3s ease, transform 0.2s ease; +} + +button[name="underline"] { + background-color: transparent; /* No background */ + border: none; /* Remove default button border */ + color: #4A628A; /* Set text color */ + font-size: 1em; /* Set font size */ + cursor: pointer; /* Add pointer cursor for interactivity */ + text-decoration: underline; /* Underline text */ + padding: 0; /* Remove default padding */ +} + +.user-info{ + display: flex; + flex-direction: column; + width: 70%; +} + +.user-card{ + width: 100%; + display: flex; + flex-direction: row; + justify-content: center; + align-items: stretch; +} + +.delete-button { + width: auto; + margin-right: 8px; + background-color: #ED4B4B; /* Blue background */ + color: white; /* White text color */ +} + +.users-container::-webkit-scrollbar { + width: 4px; /* Width of the scrollbar */ +} + +.users-container::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0.1); /* Track background color */ + border-radius: 10px; /* Rounded corners for the track */ +} + +.users-container::-webkit-scrollbar-thumb { + background-color: rgba(74, 98, 138, 0.8); /* Scrollbar handle color */ + border-radius: 10px; /* Rounded corners for the scrollbar handle */ +} + +.users-container::-webkit-scrollbar-thumb:hover { + background-color: rgba(74, 98, 138, 1); /* Darker color on hover */ +} + +.users-container:empty { + overflow-y: hidden; +} + +.user-name{ + padding-top: 8px; + font-size: 20px; + letter-spacing: -0.5px; + color: rgba(255,255,255, 1); +} + +.user-department{ + font-weight: lighter; + padding-top: 8px; + font-size: 14px; + letter-spacing: -0.5px; + color: rgba(255,255,255, 0.8); +} \ No newline at end of file diff --git a/CEO/render/css/profile.css b/CEO/render/css/profile.css index 5bbe960..67879da 100644 --- a/CEO/render/css/profile.css +++ b/CEO/render/css/profile.css @@ -1,110 +1,136 @@ body, html { - height: 100%; - width: 100%; + height: 100vh; + width: 100vw; margin: 0; padding: 0; - font-family: "Roboto", sans-serif; - font-weight: 500; - font-style: normal; + font-family: "Pridi", sans-serif; /* Use sans-serif fallback */ + background-color: #4A628A; +} - background-image: url('../assets/background.png'); - background-size: cover; - background-repeat: no-repeat; +h4, h2, h1{ + margin: 0; +} +.page{ + height: 100vh; + width: 100vw; + display: flex; + justify-content: center; + align-items: center; } .container { - opacity: 0; - + border-radius: 10px; + background: linear-gradient(to bottom, rgba(74, 98, 138, 0.0) 30%, rgba(186, 237, 255, 0.7)); + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); display: flex; - flex-direction: row; - justify-content: space-evenly; + flex-direction: column; align-items: center; - min-height: 100vh; - text-align: center; /* Center the text for all child elements */ + justify-content: space-evenly; + height: 90%; + width: 35%; } -.header { - color: #1B1A55; - font-size: 4vh; - text-transform: uppercase; - line-height: 2.5rem; - margin-bottom: 10rem; -} - -.profile-form { - background-color: #535C91; - opacity: 71; - padding: 13vh 3vh 5vh; - border-radius: 1rem; - box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.9); - width: 25%; -} - -.profile-form-title { - margin-bottom: 5vh; -} - -.profile-form hr { - width: 40%; -} - -.profile-form-title h2 { - color: #FFFFFF; - margin: 0; - padding: 0; +.header{ text-align: center; - font-size: 5vh; + padding-bottom: 16px; + padding-top: 16px; } -.profile-form-content { +.title{ + font-size: 48px; + font-weight: 500; + letter-spacing: -1px; + color: white; +} + +.subheading{ + padding-top: 8px; + font-size: 16px; + letter-spacing: -0.5px; + color: rgba(255,255,255, 0.8); +} + +.profile-form{ display: flex; - flex-wrap: wrap; - justify-content: center; + flex-direction: column; + align-items: center; + width: 80%; +} + +.profile-form-content input { + width: 100%; + padding: 15px; + margin: 10px 0; + border: 1px solid #ccc; /* Light gray border */ + border-radius: 8px; /* Rounded corners */ + font-size: 1em; + font-family: inherit; + box-sizing: border-box; + background-color: #f9f9f9; /* Light background */ + color: #333; /* Dark text color */ + transition: border-color 0.3s ease, box-shadow 0.3s ease; /* Smooth transition for interaction */ +} + +/* Placeholder Text Styling */ +.profile-form-content input::placeholder { + color: #aaa; /* Lighter color for placeholders */ +} + +/* Focus State Styling */ +.profile-form-content input:focus { + outline: none; /* Remove default focus outline */ + border-color: #4A628A; /* Blue border on focus */ + box-shadow: 0 0 5px rgba(74, 98, 138, 0.5); /* Subtle shadow for focus */ + background-color: #fff; /* Slightly brighter background on focus */ +} + +/* Input Field Hover Effect */ +.profile-form-content input:hover { + border-color: #888; /* Darker gray border on hover */ +} + +/* Disabled Input Styling */ +.profile-form-content input:disabled { + background-color: #e0e0e0; /* Light gray background for disabled input */ + cursor: not-allowed; /* Show "not allowed" cursor */ + opacity: 0.7; /* Slight transparency */ } .profile-form-footer { - margin-top: 7vh; display: flex; - flex-direction: row; - justify-content: center; + width: 100%; + flex-direction: column; + justify-content: space-between; /* Align buttons next to each other */ + align-items: center; + gap: 10px; /* Space between buttons */ + margin-top: 20px; } -input { - text-align: center; - color: white; - font-weight: bold; - font-size: 1.2rem; - width: 70%; - padding: 1rem; - margin: 0.7rem; - background-color: #1B1A55; - border-radius: 10px; -} - -button { - font-weight: bold; - width: 35%; - font-size: 1rem; - padding: 10px; +/* Styling for buttons */ +.profile-form button { + flex: 1; /* Ensure buttons are equal width */ + padding: 16px; + font-weight: 300; border: none; - border-radius: 5px; - margin-top: 1rem; + border-radius: 8px; cursor: pointer; + transition: background-color 0.3s ease, transform 0.2s ease; } -button:hover { - filter: brightness(85%); +button[name="underline"] { + background-color: transparent; /* No background */ + border: none; /* Remove default button border */ + color: #4A628A; /* Set text color */ + font-size: 1em; /* Set font size */ + cursor: pointer; /* Add pointer cursor for interactivity */ + text-decoration: underline; /* Underline text */ + padding: 0; /* Remove default padding */ } button[name="submit"] { - background-color: #F44336; - color: white; + width: 100%; + background-color: #4A628A; /* Blue background */ + color: white; /* White text color */ } - -button[name="login"] { - background-color: #2196F3; - color: white; - margin-right: 5rem; -} \ No newline at end of file diff --git a/CEO/render/css/reset_password.css b/CEO/render/css/reset_password.css index 2e9d6d5..c1cd8a6 100644 --- a/CEO/render/css/reset_password.css +++ b/CEO/render/css/reset_password.css @@ -1,110 +1,151 @@ body, html { - height: 100%; - width: 100%; + height: 100vh; + width: 100vw; margin: 0; padding: 0; - font-family: "Roboto", sans-serif; - font-weight: 500; - font-style: normal; + font-family: "Pridi", sans-serif; /* Use sans-serif fallback */ + background-color: #4A628A; +} - background-image: url('../assets/background.png'); - background-size: cover; - background-repeat: no-repeat; +h4, h2, h1{ + margin: 0; +} +.page{ + height: 100vh; + width: 100vw; + display: flex; + justify-content: center; + align-items: center; } .container { - opacity: 0; - - display: flex; - flex-direction: row; - justify-content: space-evenly; - align-items: center; - min-height: 100vh; -} - -.header { - color: #1B1A55; - font-size: 4vh; - text-transform: uppercase; - line-height: 2.5rem; - margin-bottom: 10rem; -} - -.login-form { - background-color: #535C91; - opacity: 71; - padding: 9vh 3vh 5vh; - border-radius: 1rem; - box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.9); - width: 25%; -} - -.login-form-title { - margin: 0 0 5vh 0; - text-align: center; -} - -.login-form-title h2 { - color: #FFFFFF; - font-size: 5vh; - margin: 0; - padding: 0; -} - -.login-form hr { - width: 40%; -} - -.login-form-content { - display: flex; - flex-wrap: wrap; - justify-content: center; -} - -input { - text-align: center; - color: white; - font-weight: bold; - font-size: 1.2rem; - width: 70%; - padding: 1rem; - margin: 0.7rem; - background-color: #1B1A55; border-radius: 10px; -} - -button { - font-weight: bold; + background: linear-gradient(to bottom, rgba(74, 98, 138, 0.0) 30%, rgba(186, 237, 255, 0.7)); + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; + height: 90%; width: 35%; - font-size: 1rem; - padding: 10px; - border: none; - border-radius: 5px; - margin-top: 1rem; - cursor: pointer; } -button:hover { - filter: brightness(85%); +.header{ + display: flex; + width: 80%; + flex-direction: column; + align-items: center; + justify-content: center; + height: 20%; + text-align: center; + padding-bottom: 16px; + padding-top: 16px; +} + +.title{ + font-size: 48px; + font-weight: 500; + letter-spacing: -1px; + color: white; +} + +.subheading{ + font-size: 16px; + letter-spacing: -0.5px; + padding-top: 8px; + color: rgba(255,255,255, 0.8); +} + +.login-form{ + height: 80%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-around; + width: 80%; +} + +.login-title { + font-size: 24px; + font-weight: 500; + color: white; + margin-bottom: 16px; +} + +.login-form-content input { + width: 100%; + padding: 15px; + margin: 10px 0; + border: 1px solid #ccc; /* Light gray border */ + border-radius: 8px; /* Rounded corners */ + font-size: 1em; + font-family: inherit; + box-sizing: border-box; + background-color: #f9f9f9; /* Light background */ + color: #333; /* Dark text color */ + transition: border-color 0.3s ease, box-shadow 0.3s ease; /* Smooth transition for interaction */ +} + +/* Placeholder Text Styling */ +.login-form-content input::placeholder { + color: #aaa; /* Lighter color for placeholders */ +} + +/* Focus State Styling */ +.login-form-content input:focus { + outline: none; /* Remove default focus outline */ + border-color: #4A628A; /* Blue border on focus */ + box-shadow: 0 0 5px rgba(74, 98, 138, 0.5); /* Subtle shadow for focus */ + background-color: #fff; /* Slightly brighter background on focus */ +} + +/* Input Field Hover Effect */ +.login-form-content input:hover { + border-color: #888; /* Darker gray border on hover */ +} + +/* Disabled Input Styling */ +.login-form-content input:disabled { + background-color: #e0e0e0; /* Light gray background for disabled input */ + cursor: not-allowed; /* Show "not allowed" cursor */ + opacity: 0.7; /* Slight transparency */ } .login-form-footer { - margin-top: 3vh; display: flex; - flex-wrap: wrap; - align-content: center; + width: 100%; + flex-direction: column; + justify-content: space-between; /* Align buttons next to each other */ align-items: center; - justify-content: space-evenly; + gap: 10px; /* Space between buttons */ + margin-top: 20px; +} + +/* Styling for buttons */ +.login-form-footer button { + flex: 1; /* Ensure buttons are equal width */ + padding: 16px; + font-weight: 300; + border: none; + border-radius: 8px; + cursor: pointer; + transition: background-color 0.3s ease, transform 0.2s ease; +} + +button[name="underline"] { + background-color: transparent; /* No background */ + border: none; /* Remove default button border */ + color: #4A628A; /* Set text color */ + font-size: 1em; /* Set font size */ + cursor: pointer; /* Add pointer cursor for interactivity */ + text-decoration: underline; /* Underline text */ + padding: 0; /* Remove default padding */ } button[name="submit"] { - background-color: #F44336; - color: white; + width: 100%; + background-color: #4A628A; /* Blue background */ + color: white; /* White text color */ } - -button[name="signup"] { - background-color: #2196F3; - color: white; -} \ No newline at end of file diff --git a/CEO/render/css/share_file.css b/CEO/render/css/share_file.css index 671485b..1a11178 100644 --- a/CEO/render/css/share_file.css +++ b/CEO/render/css/share_file.css @@ -1,191 +1,162 @@ body, html { - height: 100%; - width: 100%; + height: 100vh; + width: 100vw; margin: 0; padding: 0; - font-family: "Roboto", sans-serif; - font-weight: 500; - font-style: normal; + font-family: "Pridi", sans-serif; /* Use sans-serif fallback */ + background-color: #4A628A; +} - background-image: url('../assets/background.png'); - background-size: cover; - background-repeat: no-repeat; +h4, h2, h1{ + margin: 0; +} +.page{ + height: 100vh; + width: 100vw; + display: flex; + justify-content: center; + align-items: center; } .container { - opacity: 0; - - display: flex; - flex-direction: row; - justify-content: space-evenly; - align-items: center; - min-height: 100vh; - text-align: center; -} - -h1, h2 { - padding: 0; - margin: 0; -} - -h2 { - font-size: 1rem; -} - -.left_block { - display: flex; - flex-direction: column; - background-color: #535C91; - opacity: 71; - padding: 2rem; - border-radius: 1rem; - box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.9); - color: white; -} - -.left_block_top { - display: flex; - flex-direction: row; - justify-content: space-between; -} - -.left_block_top_left { - display: flex; - flex-direction: column; - justify-content: start; - text-align: left; -} - -.left_block_top_left hr { - margin: 0 0 1rem 0; - width: 45%; -} - -.left_block_top_right { - width: 10vw; - - display: flex; - flex-wrap: wrap; - align-content: center; - justify-content: center; - - padding: 0 2vh 0 2vh; - background-color: #1B1A55; - margin: 0 0 0 5vw; - border-radius: 1rem; -} - -.left_block_content { - display: flex; - justify-content: start; - align-items: center; - margin: 2rem 0 2rem 0; -} - -.left_block_buttons { - display: flex; - flex-direction: row; - align-content: center; - align-items: center; - justify-content: center; -} - -button { - margin: 0 1rem 0 1rem; - width: 10vw; - height: 5vh; - - border: none; border-radius: 10px; - - color: white; - font-size: 1rem; - font-weight: bold; - - text-transform: uppercase; - cursor: pointer; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); - outline: none; - transition: background-color 0.3s ease; -} - -button:hover { - filter: brightness(85%); -} - -.left_block_footer { + background: linear-gradient(to bottom, rgba(74, 98, 138, 0.0) 30%, rgba(186, 237, 255, 0.7)); + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); display: flex; + flex-direction: column; align-items: center; - justify-content: end; + height: 90%; + width: 35%; } -.right_block { - display: flex; - flex-direction: column; - background-color: #535C91; - opacity: 71; - padding: 2rem 4rem 2rem 2rem; - border-radius: 1rem; - box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.9); +.header{ + text-align: center; + padding-bottom: 16px; + padding-top: 32px; +} + +.title{ + font-size: 48px; + font-weight: 500; + letter-spacing: -1px; color: white; } -.choose_user_form_title { - display: flex; - flex-wrap: wrap; - flex-direction: column; - justify-content: left; - align-content: start; +.subheading{ + padding-top: 8px; + font-size: 16px; + letter-spacing: -0.5px; + color: rgba(255,255,255, 0.8); } -.choose_user_form_title hr { +.form{ + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; width: 80%; + height: 100%; + overflow: hidden; +} + +.footer { + padding-bottom: 16px; + display: flex; + width: 100%; + flex-direction: row; + justify-content: space-between; /* Align buttons next to each other */ + align-items: center; + gap: 10px; /* Space between buttons */ +} + +.filename-title{ + font-size: 16px; + font-weight: 300; + color: white; + padding: 48px 24px 48px 24px; + background-color: rgba(0,0,0,0.25); + border-radius: 10px; + margin-top: 16px; + box-shadow: 2px 2px 2px 1px rgb(0 0 0 / 20%); +} + +.users_block{ + padding-top: 16px; +} + +label{ + margin-top: 8px; + color: white; } .choose_user_form_content { + overflow-y: hidden; + width: 100%; + height: auto; + max-height: 180px; display: flex; - margin: 1rem 7rem 2rem 0.5rem; flex-direction: column; - align-items: start; + align-items: flex-start; +} - height: 20vh; /* Fixed height */ - width: 100%; /* Full width */ - overflow: auto; /* Enable scrolling */ - - font-size: 1.2rem; +h5{ + font-size: 20px; + font-weight: 300; + text-align: center; color: white; - font-weight: bold; } -.choose_user_form_content::-webkit-scrollbar { - width: 10px; /* Reduced width of the scrollbar by 2px */ +/* Styling for buttons */ +.form button { + flex: 1; /* Ensure buttons are equal width */ + padding: 16px; + font-weight: 300; + border: none; + border-radius: 8px; + cursor: pointer; + transition: background-color 0.3s ease, transform 0.2s ease; } -.choose_user_form_content::-webkit-scrollbar-track { - background: #1B1A55; /* Updated track color */ -} - -.choose_user_form_content::-webkit-scrollbar-thumb { - background: #535C91; /* Updated handle color */ - border: 2px solid #1B1A55; /* Adding a border to effectively reduce the thumb size */ -} - -.choose_user_form_content::-webkit-scrollbar-thumb:hover { - background: #555; /* Updated handle color on hover */ -} - -button[name="back"] { - background-color: #23BDEE; +button[name="underline"] { + background-color: transparent; /* No background */ + border: none; /* Remove default button border */ + color: #4A628A; /* Set text color */ + font-size: 1em; /* Set font size */ + cursor: pointer; /* Add pointer cursor for interactivity */ + text-decoration: underline; /* Underline text */ + padding: 0; /* Remove default padding */ } button[name="submit"] { - background-color: #F44336; + width: 100%; + background-color: #4A628A; /* Blue background */ + color: white; /* White text color */ } -button[name="select_file"] { - margin: 0; - width: 8vw; - background-color: #1B1A55; +button[name="submit"]:hover { + background-color: #3B5173; /* Darker background on hover */ +} + +.choose_user_form_content::-webkit-scrollbar { + width: 4px; /* Width of the scrollbar */ +} + +.choose_user_form_content::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0.1); /* Track background color */ + border-radius: 10px; /* Rounded corners for the track */ +} + +.choose_user_form_content::-webkit-scrollbar-thumb { + background-color: rgba(74, 98, 138, 0.8); /* Scrollbar handle color */ + border-radius: 10px; /* Rounded corners for the scrollbar handle */ +} + +.choose_user_form_content::-webkit-scrollbar-thumb:hover { + background-color: rgba(74, 98, 138, 1); /* Darker color on hover */ +} + +.choose_user_form_content:empty { + overflow-y: hidden; } \ No newline at end of file diff --git a/CEO/render/css/sign_up.css b/CEO/render/css/sign_up.css deleted file mode 100644 index 09b4634..0000000 --- a/CEO/render/css/sign_up.css +++ /dev/null @@ -1,117 +0,0 @@ -body, html { - height: 100%; - width: 100%; - margin: 0; - padding: 0; - font-family: "Roboto", sans-serif; - font-weight: 500; - font-style: normal; - background-image: url('../assets/background.png'); - background-size: cover; - background-repeat: no-repeat; -} - -.container { - min-height: 100vh; -} - -.step { - display: flex; - flex-direction: row; - justify-content: space-evenly; - align-items: center; - min-height: 100vh; - opacity: 0; /* Make steps invisible by default */ - visibility: hidden; /* Hide steps by default */ - transition: opacity 0.5s ease, visibility 0.5s ease; /* Smooth transition */ -} - -.step.active { - opacity: 1; /* Show the active step */ - visibility: visible; /* Make it visible */ -} - -.header { - color: #1B1A55; - font-size: 4vh; - text-transform: uppercase; - line-height: 2.5rem; - margin-bottom: 10rem; -} - -.signup-form { - background-color: #535C91; - opacity: 71; - padding: 9vh 3vh 5vh; - border-radius: 1rem; - box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.9); - width: 25%; -} - -.signup-form-title { - margin: 0 0 5vh 0; - text-align: center; -} - -.signup-form-title h2 { - color: #FFFFFF; - font-size: 5vh; - margin: 0; - padding: 0; -} - -.signup-form hr { - width: 40%; -} - -.signup-form-content { - display: flex; - flex-wrap: wrap; - justify-content: center; -} - -input { - text-align: center; - color: white; - font-weight: bold; - font-size: 1.2rem; - width: 70%; - padding: 1rem; - margin: 0.7rem; - background-color: #1B1A55; - border-radius: 10px; -} - -button { - font-weight: bold; - width: 35%; - font-size: 1rem; - padding: 10px; - border: none; - border-radius: 5px; - margin-top: 1rem; - cursor: pointer; -} - -button:hover { - filter: brightness(85%); -} - -.signup-form-footer { - margin-top: 3vh; - display: flex; - flex-wrap: wrap; - align-content: center; - align-items: center; - justify-content: space-evenly; -} - -button[name="back"] { - background-color: #F44336; - color: white; -} - -button[name="continue"] { - background-color: #2196F3; - color: white; -} diff --git a/CEO/render/css/uc_not_found.css b/CEO/render/css/uc_not_found.css deleted file mode 100644 index df2f3d6..0000000 --- a/CEO/render/css/uc_not_found.css +++ /dev/null @@ -1,59 +0,0 @@ -body, html { - height: 100%; - width: 100%; - margin: 0; - padding: 0; - - font-family: "Roboto", sans-serif; - font-weight: 500; - font-style: normal; - - background-image: url('../assets/background.png'); - background-size: cover; - background-repeat: no-repeat; -} - -.container { - opacity: 0; - - display: flex; - flex-direction: column; - justify-content: space-evenly; - align-items: center; - min-height: 100vh; -} - -.header { - color: #1B1A55; - font-size: 4vh; - text-transform: uppercase; - text-align: center; -} - -.loading-section { - display: flex; - flex-direction: column; - align-items: center; - text-align: center; - color: white; -} - -.spinner { - width: 50px; - height: 50px; - border: 6px solid #f3f3f3; - border-top: 6px solid #2196F3; - border-radius: 50%; - animation: spin 1s linear infinite; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -.loading-section p { - font-size: 1.5rem; - color: white; - margin-top: 1rem; -} diff --git a/CEO/render/css/users_management.css b/CEO/render/css/users_management.css deleted file mode 100644 index fa3806b..0000000 --- a/CEO/render/css/users_management.css +++ /dev/null @@ -1,141 +0,0 @@ -/* Global styles for body and background */ -body, html { - height: 100%; - width: 100%; - margin: 0; - padding: 0; - font-family: "Roboto", sans-serif; - font-weight: 500; - font-style: normal; - background-image: url('../assets/background.png'); - background-size: cover; - background-repeat: no-repeat; -} - -/* Container starts hidden */ -.container { - opacity: 0; - display: flex; - flex-direction: row; - justify-content: space-evenly; - align-items: center; - min-height: 100vh; - text-align: center; -} - -/* Container styling to match your previous design */ -.user-management-container { - background-color: rgba(83, 92, 145, 0.71); - padding: 2rem; - border-radius: 1rem; - box-shadow: 10px 10px 15px rgba(0, 0, 0, 0.2); - color: white; - width: 80%; - max-width: 1000px; -} - -/* User card styling */ -.user-card { - background-color: #fff; - color: #333; - border-radius: 10px; - padding: 15px; - margin: 15px 0; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - transition: transform 0.3s ease, box-shadow 0.3s ease; -} - -.user-card:hover { - transform: translateY(-5px); - box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2); -} - -/* User name */ -.user-name { - font-size: 1.5rem; - font-weight: bold; - margin-bottom: 10px; -} - -/* User department */ -.user-department { - font-size: 1.2rem; - color: #555; - margin-bottom: 10px; -} - -/* Delete button */ -.delete-button { - padding: 10px 20px; - background-color: #f44336; - border: none; - border-radius: 5px; - color: white; - cursor: pointer; - font-weight: bold; - transition: background-color 0.3s ease, box-shadow 0.3s ease; - text-transform: uppercase; -} - -.delete-button:hover { - background-color: #d32f2f; - box-shadow: 0 3px 8px rgba(0, 0, 0, 0.15); -} - -/* Footer buttons */ -button { - margin: 0 1rem 0 1rem; - width: 10vw; - height: 5vh; - - border: none; - border-radius: 10px; - - color: white; - font-size: 1rem; - font-weight: bold; - - text-transform: uppercase; - cursor: pointer; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); - outline: none; - transition: background-color 0.3s ease; -} - -button:hover { - filter: brightness(85%); -} - -button[name="back"] { - background-color: #23BDEE; -} - -/* Footer class */ -.footer { - margin-top: 20px; - display: flex; - justify-content: flex-end; -} - -/* Scrollable user container */ -#users-container { - max-height: 50vh; - overflow-y: auto; -} - -#users-container::-webkit-scrollbar { - width: 10px; -} - -#users-container::-webkit-scrollbar-track { - background: #1B1A55; -} - -#users-container::-webkit-scrollbar-thumb { - background: #535C91; - border: 2px solid #1B1A55; -} - -#users-container::-webkit-scrollbar-thumb:hover { - background: #555; -} diff --git a/CEO/render/css/welcome.css b/CEO/render/css/welcome.css deleted file mode 100644 index df2f3d6..0000000 --- a/CEO/render/css/welcome.css +++ /dev/null @@ -1,59 +0,0 @@ -body, html { - height: 100%; - width: 100%; - margin: 0; - padding: 0; - - font-family: "Roboto", sans-serif; - font-weight: 500; - font-style: normal; - - background-image: url('../assets/background.png'); - background-size: cover; - background-repeat: no-repeat; -} - -.container { - opacity: 0; - - display: flex; - flex-direction: column; - justify-content: space-evenly; - align-items: center; - min-height: 100vh; -} - -.header { - color: #1B1A55; - font-size: 4vh; - text-transform: uppercase; - text-align: center; -} - -.loading-section { - display: flex; - flex-direction: column; - align-items: center; - text-align: center; - color: white; -} - -.spinner { - width: 50px; - height: 50px; - border: 6px solid #f3f3f3; - border-top: 6px solid #2196F3; - border-radius: 50%; - animation: spin 1s linear infinite; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -.loading-section p { - font-size: 1.5rem; - color: white; - margin-top: 1rem; -} diff --git a/CEO/render/html/announcement.html b/CEO/render/html/announcement.html new file mode 100644 index 0000000..b414c29 --- /dev/null +++ b/CEO/render/html/announcement.html @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + Send Announcement + + +
+
+
+

TeamVault

+

Send an Important Announcement

+
+
+ + +
+
+
+ + + + + diff --git a/CEO/render/js/backup_retreive.html b/CEO/render/html/backup_retrieve.html similarity index 56% rename from CEO/render/js/backup_retreive.html rename to CEO/render/html/backup_retrieve.html index ce01128..4d346ef 100644 --- a/CEO/render/js/backup_retreive.html +++ b/CEO/render/html/backup_retrieve.html @@ -4,10 +4,13 @@ - + - + + + + Welcome @@ -15,8 +18,9 @@
-

BACKUP FETCHER

+

Team Vault

+ Backup Fetcher

Backup is not searched, please wait...

diff --git a/CEO/render/html/departments_management.html b/CEO/render/html/departments_management.html deleted file mode 100644 index 5d801cb..0000000 --- a/CEO/render/html/departments_management.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - Manage Departments - - -
-
-

Departments

-
- -
- -
-
-

Create New Department

-
- - - -
-
-
- - - - - diff --git a/CEO/render/html/login.html b/CEO/render/html/login.html index 32b4986..6024f97 100644 --- a/CEO/render/html/login.html +++ b/CEO/render/html/login.html @@ -4,32 +4,38 @@ - + + + + Login +
-

DO WE KNOW

-

EACH OTHER?

+

TeamVault

+

Do we know each other?

+
diff --git a/CEO/render/html/main_menu.html b/CEO/render/html/main_menu.html index c6f91f5..2cb1d0a 100644 --- a/CEO/render/html/main_menu.html +++ b/CEO/render/html/main_menu.html @@ -1,74 +1,65 @@ - - - - - - + + + + + + + + + + + + - - + + - - + Main Page - Main Page - - - -
-
-

Are you sure?

-

This operation cannot be reverted. Do you want to proceed with resetting the database?

-
- - -
-
-
+ + +
-
-
-

WELCOME BACK,

-

-

Hope you have a productive day!

-
- +
+

Notifications

-
-
- - +
+
+
-
- - - + -
- - -
-
- -
-
- -
-
-
-
-
-

NOTIFICATIONS

-
-
-
+
+ + +
+ + + + + + + + + +
+
- - +
+ + diff --git a/CEO/render/html/overview_departments.html b/CEO/render/html/overview_departments.html new file mode 100644 index 0000000..8b0b4cd --- /dev/null +++ b/CEO/render/html/overview_departments.html @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + Manage Departments + + +
+
+
+

Manage Departments

+
+ +
+ +
+
+
+ + + + + + + + diff --git a/CEO/render/html/overview_users.html b/CEO/render/html/overview_users.html new file mode 100644 index 0000000..8c9b680 --- /dev/null +++ b/CEO/render/html/overview_users.html @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + Manage Users + + +
+
+
+

Manage Users

+
+ +
+ +
+
+
+ + diff --git a/CEO/render/html/profile.html b/CEO/render/html/profile.html index c5db853..e7f6ea0 100644 --- a/CEO/render/html/profile.html +++ b/CEO/render/html/profile.html @@ -4,9 +4,12 @@ - + + + + @@ -14,22 +17,24 @@ Profile -
-
-
-

Profile

-
-
-
- - - -
- -
+
+
+
+
+

Profile

+

Who are you?

+
+
+ + + +
+ +
+
diff --git a/CEO/render/html/reset_database.html b/CEO/render/html/reset_database.html new file mode 100644 index 0000000..059ba2c --- /dev/null +++ b/CEO/render/html/reset_database.html @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + UC Not Found + + +
+
+

TeamVault

+
+ Connecting to server +
+
+

Please wait while we reset the database.

+
+
+ + diff --git a/CEO/render/html/reset_password.html b/CEO/render/html/reset_password.html index 8bf382e..46c1535 100644 --- a/CEO/render/html/reset_password.html +++ b/CEO/render/html/reset_password.html @@ -3,33 +3,37 @@ + + + + Reset Password +
-

RESET

-

YOUR PASSWORD

+

TeamVault

+

Forgot your password? No worries, it happens to the best of us!

- +
diff --git a/CEO/render/html/send_announcement.html b/CEO/render/html/send_announcement.html new file mode 100644 index 0000000..5cd83b2 --- /dev/null +++ b/CEO/render/html/send_announcement.html @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + Sending Announcement + + +
+
+

TeamVault

+
+ Sending announcement +
+
+

Sending announcement to all users. Please wait...

+
+
+ + diff --git a/CEO/render/html/share_file.html b/CEO/render/html/share_file.html index 6163a09..c0b8a6e 100644 --- a/CEO/render/html/share_file.html +++ b/CEO/render/html/share_file.html @@ -4,46 +4,42 @@ - + + + + Share File - + +
-
-
-
-

SHARE A FILE

-
-

First select the file you want to share

-

(can be whatever resource from the system)

-
-
-

-
+
+
+

Share a File

+

First select the file you want to share.

+ +
+
Users
+

Select the users you want to share the file with.

+
+ +
+
-
- -
- -
-
-

USERS

-
-
-
- -
-
+
diff --git a/CEO/render/html/sign_up.html b/CEO/render/html/sign_up.html deleted file mode 100644 index 4a1bdcc..0000000 --- a/CEO/render/html/sign_up.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - Signup Process - - - -
- -
-
-

LET US MEET

-

EACH OTHER

-
- -
- - - -
- - - - - diff --git a/CEO/render/html/uc_not_found.html b/CEO/render/html/uc_not_found.html index fb3ce49..9de2618 100644 --- a/CEO/render/html/uc_not_found.html +++ b/CEO/render/html/uc_not_found.html @@ -4,9 +4,12 @@ - - + + + + + @@ -15,9 +18,9 @@
-

SEARCHING FOR THE

-

SERVER...

+

TeamVault

+ Connecting to server

Please wait while we try to connect to the server.

diff --git a/CEO/render/html/users_management.html b/CEO/render/html/users_management.html deleted file mode 100644 index 209e056..0000000 --- a/CEO/render/html/users_management.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - Manage Users - - -
-
-

Manage Users

-
- -
- -
-
- - diff --git a/CEO/render/html/welcome.html b/CEO/render/html/welcome.html index ffcc348..2acb6f5 100644 --- a/CEO/render/html/welcome.html +++ b/CEO/render/html/welcome.html @@ -4,10 +4,13 @@ - + - + + + + Welcome @@ -15,7 +18,7 @@
-

WELCOME TO THE APP

+

Welcome to TeamVault

diff --git a/CEO/render/js/announcement.js b/CEO/render/js/announcement.js new file mode 100644 index 0000000..b24ec85 --- /dev/null +++ b/CEO/render/js/announcement.js @@ -0,0 +1,22 @@ +document.addEventListener('DOMContentLoaded', function () { + const submitButton = document.getElementById('submitAnnouncement'); + const buttonBack = document.getElementById('backButton'); + const announcementTextarea = document.getElementById('announcementMessage'); + + buttonBack.addEventListener('click', function () { + fadeOut('main_menu'); + }); + + submitButton.addEventListener('click', async function () { + const message = announcementTextarea.value.trim(); + + if (message === '') { + await window.electronAPI.showAlert('Please enter a message before sending.'); + return; + } + + // Send the announcement message via the electronAPI + window.electronAPI.startAnnouncementWorker(message); + fadeOut('send_announcement'); + }); +}); diff --git a/CEO/render/js/departments_management.js b/CEO/render/js/departments_management.js deleted file mode 100644 index b357b0d..0000000 --- a/CEO/render/js/departments_management.js +++ /dev/null @@ -1,216 +0,0 @@ -document.addEventListener('DOMContentLoaded', async () => { - const backButton = document.getElementById('backButton'); - const form = document.getElementById('new-department-form'); - const modifyModal = document.getElementById('modify-department-modal'); - const closeModal = document.getElementById('close-modal'); - const confirmModifyButton = document.getElementById('confirm-modify'); - let currentDepartmentId = null; - - // Retrieve operation codes via IPC - const operationCodes = await window.electronAPI.getOperationsCodes(); - if (!operationCodes) { - await window.electronAPI.showAlert('Internal error of the application.'); - return; - } - - // Open the TCP socket right after fetching the operation codes - if (!await window.electronAPI.openUcSocket()) { - await window.electronAPI.showAlert('Failed to open socket. Internal error of the application.'); - return; - } - - let codeGetDepartments = operationCodes.GET_DEPARTMENTS; - let codeCreateDepartment = operationCodes.CREATE_DEPARTMENT; - let codeModifyDepartment = operationCodes.MODIFY_DEPARTMENT; - let codeDeleteDepartment = operationCodes.DELETE_DEPARTMENT; - let codeOk = operationCodes.OK; - - // Set up the back button - close the socket before going back - backButton.addEventListener('click', async () => { - await window.electronAPI.closeUcSocket(); // Close the socket when going back - fadeOut('main_menu'); // Navigate to the main menu - }); - - // Set up the form for creating new departments - form.addEventListener('submit', async function (event) { - event.preventDefault(); // Prevent the form from refreshing the page - const departmentName = document.getElementById('departmentName').value; - - if (departmentName.trim()) { - await createDepartment(departmentName); // Call createDepartment function when the form is submitted - } - }); - - // Fetch the departments on page load - await fetchDepartments(); - - // Fetch departments and render them in the left block - async function fetchDepartments() { - const departmentsContainer = document.getElementById('departments-container'); - - // Send the request to get the departments - if (!await window.electronAPI.sendUcMessage(codeGetDepartments)) { - await window.electronAPI.showAlert("Failed to send request."); - await redirectToMainMenu(); - return; - } - - const response = await waitForResponse(); - if (!response || response.operationCode !== codeOk) { - await window.electronAPI.showAlert("Unable to fetch departments."); - await redirectToMainMenu(); - return; - } - - departmentsContainer.innerHTML = ''; // Clear any existing data - - const departments = response.metaInfo.departments; - - // Filter out CEO department - const filteredDepartments = departments.filter(department => department.name.toLowerCase() !== 'ceo'); - - // Check if there are no departments after filtering - if (!filteredDepartments.length) { - const noDepartmentsMessage = document.createElement('p'); - noDepartmentsMessage.textContent = 'No departments exist.'; - noDepartmentsMessage.classList.add('no-departments-message'); // Add a class for styling - departmentsContainer.appendChild(noDepartmentsMessage); - return; - } - - // Iterate over the remaining departments and render them - filteredDepartments.forEach(department => { - const departmentDiv = document.createElement('div'); - departmentDiv.classList.add('department-card'); - - // Create department name div - const nameDiv = document.createElement('div'); - nameDiv.classList.add('department-name'); - nameDiv.textContent = department.name; - - // Create modify button - const modifyButton = document.createElement('button'); - modifyButton.textContent = 'Modify'; - modifyButton.classList.add('modify-button'); - modifyButton.dataset.departmentId = department.id; - - // Create delete button - const deleteButton = document.createElement('button'); - deleteButton.textContent = 'Delete'; - deleteButton.classList.add('delete-button'); - deleteButton.dataset.departmentId = department.id; - - // Append department info and buttons to the department div - departmentDiv.appendChild(nameDiv); - departmentDiv.appendChild(modifyButton); - departmentDiv.appendChild(deleteButton); - - // Append department div to the container - departmentsContainer.appendChild(departmentDiv); - }); - - // Add click event listeners for all dynamically created buttons - addEventListenersToButtons(); - } - - // Add event listeners to dynamically created buttons - function addEventListenersToButtons() { - const modifyButtons = document.querySelectorAll('.modify-button'); - const deleteButtons = document.querySelectorAll('.delete-button'); - - modifyButtons.forEach(button => { - button.addEventListener('click', () => { - currentDepartmentId = button.dataset.departmentId; - openModifyModal(); // Open the modal when modify button is clicked - }); - }); - - deleteButtons.forEach(button => { - button.addEventListener('click', () => { - const departmentId = button.dataset.departmentId; - deleteDepartment(departmentId); - }); - }); - } - - // Open the modify modal - function openModifyModal() { - modifyModal.style.display = 'block'; - } - - // Close the modify modal - function closeModifyModal() { - modifyModal.style.display = 'none'; - currentDepartmentId = null; - } - - // Handle modify modal close event - closeModal.addEventListener('click', closeModifyModal); - - // Handle department modification - confirmModifyButton.addEventListener('click', async () => { - const newDepartmentName = document.getElementById('new-department-name').value; - if (newDepartmentName.trim() && currentDepartmentId) { - await modifyDepartment(currentDepartmentId, newDepartmentName); - closeModifyModal(); // Close the modal after modification - } - }); - - async function modifyDepartment(departmentId, newName) { - if (!await window.electronAPI.sendUcMessage(codeModifyDepartment, { - departmentId: departmentId, - newDepartmentName: newName - })) { - await window.electronAPI.showAlert('Failed to send modification request.'); - return; - } - - const response = await waitForResponse(); - if (response && response.operationCode === codeOk) { - await window.electronAPI.showAlert(`Department modified: ${newName}`); - await fetchDepartments(); // Refresh the department list after modification - } else { - await window.electronAPI.showAlert('Failed to modify the department.'); - } - } - - async function deleteDepartment(departmentId) { - const confirmDelete = confirm("Are you sure you want to delete this department?"); - if (confirmDelete) { - if (!await window.electronAPI.sendUcMessage(codeDeleteDepartment, { departmentId })) { - await window.electronAPI.showAlert('Failed to send delete request.'); - return; - } - - const response = await waitForResponse(); - if (response && response.operationCode === codeOk) { - await window.electronAPI.showAlert("Department deleted successfully."); - await fetchDepartments(); // Refresh the department list after deletion - } else { - await window.electronAPI.showAlert("Failed to delete the department."); - } - } - } - - // Function to create a new department - async function createDepartment(departmentName) { - if (!await window.electronAPI.sendUcMessage(codeCreateDepartment, { departmentName })) { - await window.electronAPI.showAlert('Failed to send create request.'); - return; - } - - const response = await waitForResponse(); - if (response && response.operationCode === codeOk) { - await window.electronAPI.showAlert(`New department created: ${departmentName}`); - await fetchDepartments(); // Refresh the department list - } else { - await window.electronAPI.showAlert("Failed to create department."); - } - } - - // Redirect to main menu - async function redirectToMainMenu() { - await window.electronAPI.closeUcSocket(); - fadeOut('main_menu'); - } -}); diff --git a/CEO/render/js/helpers.js b/CEO/render/js/helpers.js index 78cbf06..b770ad0 100644 --- a/CEO/render/js/helpers.js +++ b/CEO/render/js/helpers.js @@ -24,12 +24,24 @@ function fadeOut(destination) { async function waitForResponse() { return new Promise((resolve) => { const idResponseCheck = setInterval(async () => { - const status = await window.electronAPI.hasResponseArrived(); - if (status) { + if (await window.electronAPI.hasResponseArrived()) { clearInterval(idResponseCheck); - const response = await window.electronAPI.getLastUcResult(); - resolve(response || null); // Resolve the response or null if not available + resolve(await window.electronAPI.getLastUcResult()); // Resolve the response or null if not available } }, 100); // Check every 100 milliseconds if the response has arrived }); } + +function toggleScroll(idComponent, scrollHeight = 180) { + const element = document.getElementById(idComponent); // Using getElementById + if (!element) { + console.error(`Element with ID '${idComponent}' not found.`); + return; + } + if (element.scrollHeight > scrollHeight) { + element.style.overflowY = 'auto'; // Enable scroll if content overflows + } else { + element.style.overflowY = 'hidden'; // Disable scroll if content fits + } +} + diff --git a/CEO/render/js/login.js b/CEO/render/js/login.js index 3262e93..5d56b1b 100644 --- a/CEO/render/js/login.js +++ b/CEO/render/js/login.js @@ -1,3 +1,8 @@ +let codeLogin = ''; +let codeFindByEmail = ''; +let codeFindKeyByUser = ''; +let codeOk = ''; + document.addEventListener('DOMContentLoaded', async function () { const submitButton = document.getElementById('submit'); const resetPasswordButton = document.getElementById('resetPassword'); @@ -9,10 +14,10 @@ document.addEventListener('DOMContentLoaded', async function () { return; } - const codeLogin = operationCodes.LOGIN; - const codeFindByEmail = operationCodes.FIND_BY_EMAIL; - const codeFindKeyByUser = operationCodes.FIND_KEY_BY_USER_ID; - const codeOk = operationCodes.OK; + codeLogin = operationCodes.LOGIN; + codeFindByEmail = operationCodes.FIND_BY_EMAIL; + codeFindKeyByUser = operationCodes.FIND_KEY_BY_USER_ID; + codeOk = operationCodes.OK; resetPasswordButton.addEventListener('click', function (e) { e.preventDefault(); @@ -66,79 +71,88 @@ document.addEventListener('DOMContentLoaded', async function () { await window.electronAPI.closeUcSocket(); await window.electronAPI.changeContent('main_menu'); }); - - async function attemptLogin(email, password) { - const app_type = await window.electronAPI.readUserConfig('app_type'); - const messageData = { email, password, app_type }; - - // Send the login message to the server - if (!await window.electronAPI.sendUcMessage(codeLogin, messageData)) { - await window.electronAPI.showAlert('Failed to send login request.'); - return false; - } - - // Wait for the response using waitForResponse - const response = await waitForResponse(); - if (response && response.operationCode === codeOk) { - await window.electronAPI.resetApplicationInfo(); - await window.electronAPI.resetUserConfig(); - await window.electronAPI.writeUserConfig('app_type', app_type); - await window.electronAPI.writeUserConfig('user_info', { email, password }); - return true; - }else if(response && respone.operationCode !== codeOk){ - await window.electronAPI.showAlert(response.metaInfo.message); - return false; - } - - await window.electronAPI.showAlert('Invalid login response received.'); - return false; - } - - async function fetchAndStoreUserInfo(userEmail) { - if (!await window.electronAPI.sendUcMessage(codeFindByEmail, { email: userEmail })) { - await window.electronAPI.showAlert('Failed to send request to fetch user info.'); - return false; - } - - // Wait for the response using waitForResponse - const response = await waitForResponse(); - if (response && response.operationCode === codeOk) { - let userInfo = await window.electronAPI.readUserConfig('user_info'); - if (!userInfo) { - userInfo = {}; - } - - userInfo.id = response.metaInfo.id; - userInfo.departmentId = response.metaInfo.departmentId; - userInfo.name = response.metaInfo.name || 'User'; - - await window.electronAPI.writeUserConfig('user_info', userInfo); - return true; - } - - await window.electronAPI.showAlert('Failed to fetch user info from server.'); - return false; - } - - async function fetchAndStoreEncryptionKey(userId) { - if (!await window.electronAPI.sendUcMessage(codeFindKeyByUser, { userId })) { - await window.electronAPI.showAlert('Failed to send request to fetch encryption key.'); - return false; - } - - // Wait for the response using waitForResponse - const response = await waitForResponse(); - if (response && response.operationCode === codeOk) { - const encryptionKey = { - key: response.metaInfo.key.key, - iv: response.metaInfo.key.iv, - }; - - await window.electronAPI.writeUserConfig('encryption_key', encryptionKey); - return true; - } - - await window.electronAPI.showAlert('Failed to fetch encryption key from server.'); - return false; - } }); + +async function attemptLogin(email, password) { + const app_type = await window.electronAPI.readUserConfig('app_type'); + const messageData = {email, password, app_type}; + + // Send the login message to the server + if (!await window.electronAPI.sendUcMessage(codeLogin, messageData)) { + await window.electronAPI.showAlert('Failed to send login request.'); + return false; + } + + // Wait for the response using waitForResponse + const response = await waitForResponse(); + + if (!response) { + await window.electronAPI.showAlert('No response from server.'); + return false; + } + + if (response.operationCode !== codeOk) { + await window.electronAPI.showAlert(response.metaInfo.message); + return false; + } + + const user_info = await window.electronAPI.readUserConfig('user_info'); + if (!user_info || (user_info && user_info.email !== email)) { + await window.electronAPI.resetApplicationInfo(); + await window.electronAPI.resetMemory(); + await window.electronAPI.resetUserConfig(); + await window.electronAPI.writeUserConfig('app_type', app_type); + await window.electronAPI.writeUserConfig('user_info', {email, password}); + return true; + } + + return true; +} + +async function fetchAndStoreUserInfo(userEmail) { + if (!await window.electronAPI.sendUcMessage(codeFindByEmail, {email: userEmail})) { + await window.electronAPI.showAlert('Failed to send request to fetch user info.'); + return false; + } + + // Wait for the response using waitForResponse + const response = await waitForResponse(); + if (response && response.operationCode === codeOk) { + let userInfo = await window.electronAPI.readUserConfig('user_info'); + if (!userInfo) { + userInfo = {}; + } + + userInfo.id = response.metaInfo.id; + userInfo.departmentId = response.metaInfo.departmentId; + userInfo.name = response.metaInfo.name || 'User'; + + await window.electronAPI.writeUserConfig('user_info', userInfo); + return true; + } + + await window.electronAPI.showAlert('Failed to fetch user info from server.'); + return false; +} + +async function fetchAndStoreEncryptionKey(userId) { + if (!await window.electronAPI.sendUcMessage(codeFindKeyByUser, {userId})) { + await window.electronAPI.showAlert('Failed to send request to fetch encryption key.'); + return false; + } + + // Wait for the response using waitForResponse + const response = await waitForResponse(); + if (response && response.operationCode === codeOk) { + const encryptionKey = { + key: response.metaInfo.key.key, + iv: response.metaInfo.key.iv, + }; + + await window.electronAPI.writeUserConfig('encryption_key', encryptionKey); + return true; + } + + await window.electronAPI.showAlert('Failed to fetch encryption key from server.'); + return false; +} diff --git a/CEO/render/js/main_menu.js b/CEO/render/js/main_menu.js index a2418b7..27ad798 100644 --- a/CEO/render/js/main_menu.js +++ b/CEO/render/js/main_menu.js @@ -3,25 +3,15 @@ document.addEventListener('DOMContentLoaded', async function () { const backupButton = document.getElementById('backup-dir'); const shareButton = document.getElementById('share-dir'); - const departmentButton = document.getElementById('department-dir'); const changeInfoButton = document.getElementById('change-info'); const shareFileButton = document.getElementById('share-file'); - - const manageUsersButton = document.getElementById('manage-users'); - const manageDepartmentsButton = document.getElementById('manage-departments'); - - const resetDatabaseButton = document.getElementById('reset-database'); - const restoreBackupButton = document.getElementById('restore-backup'); - const logoutButton = document.getElementById('logout'); - - const disclaimerModal = document.getElementById('disclaimer-modal'); - const cancelDisclaimerButton = document.getElementById('disclaimer-cancel'); - const submitDisclaimerButton = document.getElementById('disclaimer-submit'); - - await fetchUserInfo(); - await checkAndSetAllDirectories(); + const restoreBackupButton = document.getElementById('restore-backup'); + const buttonOverviewDepartments = document.getElementById('overview-departments'); + const buttonOverviewUsers = document.getElementById('overview-users'); + const buttonResetDatabase = document.getElementById('reset-database'); + const buttonSendAnnouncement = document.getElementById('send-announcement'); backupButton.addEventListener('click', async function () { await setPath('backupDirectory'); @@ -31,8 +21,28 @@ document.addEventListener('DOMContentLoaded', async function () { await setPath('shareDirectory'); }); - departmentButton.addEventListener('click', async function () { - await setPath('departmentDirectory'); + buttonResetDatabase.addEventListener('click', async function () { + // Show a confirmation dialog + const userConfirmed = await showConfirmationDialog("Are you sure you want to reset the database? This action cannot be undone."); + + // If the user confirms, perform the database reset + if (userConfirmed) { + await resetDatabase(); + } else { + window.electronAPI.showAlert("Database reset canceled."); + } + }); + + buttonSendAnnouncement.addEventListener('click', async function () { + fadeOut('announcement'); + }); + + buttonOverviewDepartments.addEventListener('click', async function () { + fadeOut('overview_departments'); + }); + + buttonOverviewUsers.addEventListener('click', async function () { + fadeOut('overview_users'); }); changeInfoButton.addEventListener('click', function () { @@ -43,191 +53,203 @@ document.addEventListener('DOMContentLoaded', async function () { fadeOut('share_file'); }); - manageUsersButton.addEventListener('click', function () { - fadeOut('users_management'); - }); - - manageDepartmentsButton.addEventListener('click', function () { - fadeOut('departments_management' + - ''); - }); - - resetDatabaseButton.addEventListener('click', function () { - disclaimerModal.style.display = 'block'; // Show disclaimer modal - }); - - cancelDisclaimerButton.addEventListener('click', function () { - disclaimerModal.style.display = 'none'; // Hide modal if cancel is clicked - }); - - submitDisclaimerButton.addEventListener('click', async function () { - disclaimerModal.style.display = 'none'; // Hide modal - await resetDatabase(); // Perform database reset - fadeOut('login'); // Fade out and go back to login - }); - logoutButton.addEventListener('click', async function () { fadeOut('login'); }); + // Add event listener for the restore backup button restoreBackupButton.addEventListener('click', async function () { await restoreBackup(); }); - - async function restoreBackup() { - const backupDirectory = await window.electronAPI.readApplicationInfo('backupDirectory'); - - if (backupDirectory && backupDirectory.path) { - await window.electronAPI.showAlert('You have already set a backup directory. You cannot restore again.'); - return; - } - - const destinationPath = await window.electronAPI.selectDirectory(); - if (!destinationPath) return; - - await window.electronAPI.startBackupRetrieval(destinationPath); - fadeOut('backup_retrieve'); - } - - async function checkAndSetAllDirectories() { - await attachNotificationButton('backupDirectory', 'Set your backup directory!', 'backup_alert', 'alert'); - await attachNotificationButton('shareDirectory', 'Set your share directory!', 'share_alert', 'alert'); - await attachNotificationButton('departmentDirectory', 'Set your department directory!', 'department_alert', 'alert'); - } - - async function checkPathExistence(pathKey) { - return await window.electronAPI.readApplicationInfo(pathKey); - } - - async function setPath(pathKey) { - const path = await window.electronAPI.selectDirectory(); - if (path === undefined) return; - - const id = await window.electronAPI.createMemoryEntry() - console.log({id, path}) - await window.electronAPI.writeApplicationInfo(pathKey, {id, path}); - } - - async function attachNotificationButton(pathKey, buttonText, buttonId, buttonName) { - const path = await checkPathExistence(pathKey); - if (!path) { - const notificationsDiv = document.getElementById('notifications'); - const button = document.createElement('button'); - button.id = buttonId; - button.name = buttonName; - button.textContent = buttonText; - button.addEventListener('click', async function () { - await setPath(pathKey); - button.remove(); - }); - notificationsDiv.appendChild(button); - } - } - - async function fetchUserInfo() { - const usernameField = document.getElementById('username-field'); - let userInfo = await window.electronAPI.readUserConfig('user_info'); - if (userInfo && userInfo.name) { - usernameField.textContent = userInfo.name; - } else { - console.error("Username field is not available in the DOM."); - } - } - - async function loadReceivedFiles() { - const shareDirectoryData = await window.electronAPI.readApplicationInfo('shareDirectory'); - if (!shareDirectoryData || !shareDirectoryData.id) { - console.log('No received files or directory ID found.'); - return; - } - - const directoryId = shareDirectoryData.id; - const directoryStructure = await window.electronAPI.readMemoryEntry(directoryId); - if (!directoryStructure || !directoryStructure.structure) { - console.log('No received files found in the directory structure.'); - return; - } - - const notificationsDiv = document.getElementById('notifications'); - const existingButtons = Array.from(notificationsDiv.children).map(button => button.getAttribute('data-filepath')); - - Object.keys(directoryStructure.structure).forEach(userName => { - const userFiles = directoryStructure.structure[userName]; - Object.keys(userFiles).forEach(fileName => { - const filePath = userFiles[fileName]; - if (!existingButtons.includes(filePath)) { - const button = document.createElement('button'); - button.setAttribute('data-filepath', filePath); - button.name = 'notification'; - button.textContent = `You received a file "${fileName}" from ${userName}`; - button.addEventListener('click', () => handleFileReceivedButtonPressed(filePath, button)); - notificationsDiv.appendChild(button); - } - }); - }); - } - - async function removeReceivedFile(filePath) { - const shareDirectoryData = await window.electronAPI.readApplicationInfo('shareDirectory'); - if (!shareDirectoryData || !shareDirectoryData.id) { - console.log('No directory ID found to update.'); - return; - } - - const directoryId = shareDirectoryData.id; - let directoryStructure = await window.electronAPI.readMemoryEntry(directoryId); - - if (directoryStructure && directoryStructure.structure) { - for (let userName in directoryStructure.structure) { - let userFiles = directoryStructure.structure[userName]; - if (userFiles[filePath]) { - delete userFiles[filePath]; - if (Object.keys(userFiles).length === 0) { - delete directoryStructure.structure[userName]; - } - await window.electronAPI.updateMemoryEntry(directoryId, directoryStructure); - console.log(`File ${filePath} removed from memory.`); - return; - } - } - } else { - console.log('No directory structure found in memory to update.'); - } - } - - async function handleFileReceivedButtonPressed(filePath, button) { - await window.electronAPI.showFileInExplorer(filePath) - .then(() => console.log('File explorer opened for: ' + filePath)) - .catch(error => console.error('Error opening file explorer:', error)); - - button.remove(); - await removeReceivedFile(filePath); - } - - async function resetDatabase() { - const operationCodes = await window.electronAPI.getOperationsCodes(); - if (!operationCodes) { - await window.electronAPI.showAlert('Internal error of the application. Failed to retrieve operation codes.'); - return; - } - - const codeOk = operationCodes.OK; - const codeResetDatabase = operationCodes.RESET_DATABASE; - - if(!await window.electronAPI.openUcSocket()){ - await window.electronAPI.showAlert('Internal application error.'); - return; - } - - // Send the request to reset the database - if (!await window.electronAPI.sendUcMessage(codeResetDatabase)) { - await window.electronAPI.showAlert('Failed to send reset database request.'); - return; - } - - // Wait for the response - await waitForResponse(); - await window.electronAPI.changeContent('login'); - } - }); + +async function initialSetup(){ + await checkAndSetAllDirectories(); + await loadReceivedFiles(); + await fetchUserInfo(); +} + +async function restoreBackup() { + const backupDirectory = await window.electronAPI.readApplicationInfo('backupDirectory'); + + if (backupDirectory && backupDirectory.path) { + // If backup directory is already set, display an alert + await window.electronAPI.showAlert('You have already set a backup directory. You cannot restore again.'); + return; + } + + // Prompt the user to choose the destination for the restored backup + const destinationPath = await window.electronAPI.selectDirectory(); + if (!destinationPath) { + return; // User canceled the directory selection + } + + // Call the IPC method to initiate the backup retrieval process + window.electronAPI.startBackupRetrieval(destinationPath); + + // Switch the content to the 'backup_retrieve' page + fadeOut('backup_retrieve'); +} + +async function checkAndSetAllDirectories() { + await attachNotificationButton('backupDirectory', 'Set your backup directory!', 'backup_alert', 'alert'); + await attachNotificationButton('shareDirectory', 'Set your share directory!', 'share_alert', 'alert'); + await attachNotificationButton('departmentDirectory', 'Set your department directory!', 'department_alert', 'alert'); +} + +async function checkPathExistence(pathKey) { + return await window.electronAPI.readApplicationInfo(pathKey); +} + +async function setPath(pathKey) { + const path = await window.electronAPI.selectDirectory(); + if (path === undefined) return; + + const id = await window.electronAPI.createMemoryEntry() + console.log({id, path}) + await window.electronAPI.writeApplicationInfo(pathKey, {id, path}); +} + +async function attachNotificationButton(pathKey, buttonText, buttonId, buttonName) { + const path = await checkPathExistence(pathKey); + if (!path) { + const notificationsDiv = document.getElementById('notifications'); + const button = document.createElement('button'); + button.className='alert'; + button.id = buttonId; + button.name = buttonName; + button.textContent = buttonText; + button.addEventListener('click', async function () { + await setPath(pathKey); + button.remove(); // Remove button after setting the path + }); + notificationsDiv.appendChild(button); + } +} + +async function fetchUserInfo() { + const usernameField = document.getElementById('username-field'); + + // Read the user credentials from the userConfig + let userInfo = await window.electronAPI.readUserConfig('user_info'); + if (userInfo && userInfo.name) { + usernameField.textContent = userInfo.name; + return; + } + + // Update the greeting with the fetched user's name + if (usernameField) { + usernameField.textContent = userInfo.name; // Update the h1 with the user's name + } else { + console.error("Username field is not available in the DOM."); + } +} + +async function loadReceivedFiles() { + // Read the shareDirectory from applicationInfo + const shareDirectoryData = await window.electronAPI.readApplicationInfo('shareDirectory'); + + if (!shareDirectoryData || !shareDirectoryData.id) { + console.log('No received files or directory ID found.'); + return; + } + + const directoryId = shareDirectoryData.id; + + // Fetch the directory structure (JSON objects with user names and file paths) + const directoryStructure = await window.electronAPI.readMemoryEntry(directoryId); + + if (!directoryStructure || !directoryStructure.structure) { + console.log('No received files found in the directory structure.'); + return; + } + + const notificationsDiv = document.getElementById('notifications'); + const existingButtons = Array.from(notificationsDiv.children).map(button => button.getAttribute('data-filepath')); + + // Iterate over each user and their files in the structure + Object.keys(directoryStructure.structure).forEach(userName => { + const userFiles = directoryStructure.structure[userName]; + + // Iterate over each file of the user + Object.keys(userFiles).forEach(fileName => { + const filePath = userFiles[fileName]; + + // Check if a button for this file path already exists + if (!existingButtons.includes(filePath)) { + const button = document.createElement('button'); + button.setAttribute('data-filepath', filePath); // Set a custom attribute to track the file path + button.className = 'notification'; + button.name = 'notification'; + button.textContent = `You received a file "${fileName}" from ${userName}`; // Display the userName and file name + button.addEventListener('click', () => handleFileReceivedButtonPressed(filePath, button)); + notificationsDiv.appendChild(button); + } + }); + }); +} + +async function removeReceivedFile(filePath) { + // Read the shareDirectory from applicationInfo + const shareDirectoryData = await window.electronAPI.readApplicationInfo('shareDirectory'); + + if (!shareDirectoryData || !shareDirectoryData.id) { + console.log('No directory ID found to update.'); + return; + } + + const directoryId = shareDirectoryData.id; + + // Fetch the directory structure + let directoryStructure = await window.electronAPI.readMemoryEntry(directoryId); + + if (directoryStructure && directoryStructure.structure) { + // Iterate over each user and their files + for (let userName in directoryStructure.structure) { + let userFiles = directoryStructure.structure[userName]; + + // Check if the file exists and remove it + if (userFiles[filePath]) { + delete userFiles[filePath]; + + // Remove the user if no more files are left + if (Object.keys(userFiles).length === 0) { + delete directoryStructure.structure[userName]; + } + + // Update the directory structure in memory + await window.electronAPI.updateMemoryEntry(directoryId, directoryStructure); + console.log(`File ${filePath} removed from memory.`); + return; + } + } + } else { + console.log('No directory structure found in memory to update.'); + } +} + +async function handleFileReceivedButtonPressed(filePath, button) { + console.log('Notification button clicked!'); + + // Open the file in the file explorer + await window.electronAPI.showFileInExplorer(filePath) + .then(() => console.log('File explorer opened for: ' + filePath)) + .catch(error => console.error('Error opening file explorer:', error)); + + // Remove the button after opening the file + button.remove(); + + // Remove the file from memory + await removeReceivedFile(filePath); +} + +async function showConfirmationDialog(message) { + return new Promise((resolve) => { + const userResponse = window.confirm(message); // Show native confirmation dialog + resolve(userResponse); // Resolve with true (OK) or false (Cancel) + }); +} + +async function resetDatabase(){ + fadeOut('reset_database'); +} diff --git a/CEO/render/js/overview_departments.js b/CEO/render/js/overview_departments.js new file mode 100644 index 0000000..0d2ddb3 --- /dev/null +++ b/CEO/render/js/overview_departments.js @@ -0,0 +1,209 @@ +let codeOk = ''; +let codeGetDepartments = ''; +let codeCreateDepartment = ''; +let codeModifyDepartment = ''; +let codeDeleteDepartment = ''; + +document.addEventListener('DOMContentLoaded', async () => { + const backButton = document.getElementById('backButton'); + const createButton = document.getElementById('createDepartmentButton'); + const closeCreateModalButton = document.getElementById('closeCreateModal'); + const confirmCreateButton = document.getElementById('confirmCreateButton'); + + if (!await window.electronAPI.openUcSocket()) { + await window.electronAPI.showAlert('Internal error of the application. Unable to open socket.'); + return; + } + + backButton.addEventListener('click', async () => { + await window.electronAPI.closeUcSocket(); + fadeOut('main_menu'); + }); + + // Show the Create Department Modal + createButton.addEventListener('click', () => { + document.getElementById('createDepartmentModal').style.display = 'block'; + }); + + // Close Modals + closeCreateModalButton.addEventListener('click', () => { + document.getElementById('createDepartmentModal').style.display = 'none'; + }); + + // Confirm Create Department + confirmCreateButton.addEventListener('click', async () => { + const departmentName = document.getElementById('newDepartmentName').value.trim(); + if (!departmentName) { + window.electronAPI.showAlert("Please enter a department name."); + return; + } + + await createDepartment(departmentName); + document.getElementById('createDepartmentModal').style.display = 'none'; + }); +}); + +// Example usage to render these dummy departments +async function fetchDepartments() { + const departmentsContainer = document.getElementById('departments-container'); + departmentsContainer.innerHTML = ''; // Clear any existing data + + // Retrieve the operation codes via IPC + const operationCodes = await window.electronAPI.getOperationsCodes(); + if (!operationCodes) { + await window.electronAPI.showAlert('Internal error of the application. Failed to retrieve operation codes.'); + return; + } + + codeOk = operationCodes.OK; + codeGetDepartments = operationCodes.GET_DEPARTMENTS; + codeCreateDepartment = operationCodes.CREATE_DEPARTMENT; + codeModifyDepartment = operationCodes.MODIFY_DEPARTMENT; + codeDeleteDepartment = operationCodes.DELETE_DEPARTMENT; + + // Send the login message to the server + if (!await window.electronAPI.sendUcMessage(codeGetDepartments)) { + await window.electronAPI.showAlert('Failed to send login request.'); + return false; + } + + // Wait for the response using waitForResponse + const response = await waitForResponse(); + + if(!response || response.operationCode !== codeOk){ + await window.electronAPI.showAlert('Could not fetch departments.'); + return false; + } + + const departments = response.metaInfo.departments; + + const filteredDepartments = departments.filter(department => department.name.toLowerCase() !== 'ceo'); + + if (!filteredDepartments.length) { + const noDepartmentsMessage = document.createElement('p'); + noDepartmentsMessage.textContent = 'No departments exist.'; + noDepartmentsMessage.classList.add('no-departments-message'); + departmentsContainer.appendChild(noDepartmentsMessage); + return; + } + + filteredDepartments.forEach(department => { + const departmentDiv = document.createElement('div'); + departmentDiv.classList.add('department-card'); + + const nameDiv = document.createElement('div'); + nameDiv.classList.add('department-name'); + nameDiv.textContent = department.name; + + // Create and add Modify button + const modifyButton = document.createElement('button'); + modifyButton.textContent = 'Modify'; + modifyButton.classList.add('modify-button'); + modifyButton.dataset.departmentId = department.id; + + modifyButton.addEventListener('click', () => { + console.log(`Modify button clicked for department ID: ${department.id}`); + openModifyModal(department.id, department.name); // Call the function to open the modify modal + }); + + // Create and add Delete button + const deleteButton = document.createElement('button'); + deleteButton.textContent = 'Delete'; + deleteButton.classList.add('delete-button'); + deleteButton.dataset.departmentId = department.id; + + deleteButton.addEventListener('click', async () => { + console.log(`Delete button clicked for department ID: ${department.id}`); + await deleteDepartment(department.id); // Call the function to delete the department + }); + + departmentDiv.appendChild(nameDiv); + departmentDiv.appendChild(modifyButton); + departmentDiv.appendChild(deleteButton); + + departmentsContainer.appendChild(departmentDiv); + }); + + toggleScroll('departments-container', 370); +} + + +async function createDepartment(departmentName) { + if (!await window.electronAPI.sendUcMessage(codeCreateDepartment, { departmentName: departmentName })) { + await window.electronAPI.showAlert('Failed to send login request.'); + return false; + } + + // Wait for the response using waitForResponse + const response = await waitForResponse(); + + if(!response || response.operationCode !== codeOk){ + await window.electronAPI.showAlert('Could not create new department.'); + return false; + } + + await fetchDepartments(); +} + +async function modifyDepartment(departmentId, newDepartmentName) { + if (!await window.electronAPI.sendUcMessage(codeModifyDepartment, { departmentId: departmentId, newDepartmentName: newDepartmentName })) { + await window.electronAPI.showAlert('Failed to send modify request.'); + return false; + } + + // Wait for the response using waitForResponse + const response = await waitForResponse(); + + if(!response || response.operationCode !== codeOk){ + await window.electronAPI.showAlert('Could not modify department.'); + console.log(response.metaInfo.message); + return false; + } + + await fetchDepartments(); +} + +async function deleteDepartment(departmentId) { + const confirmDelete = confirm("Are you sure you want to delete this department?"); + if (!confirmDelete) return; + + if (!await window.electronAPI.sendUcMessage(codeDeleteDepartment, { departmentId: departmentId })) { + await window.electronAPI.showAlert('Failed to send delete request.'); + return false; + } + + const response = await waitForResponse(); + + if(!response || response.operationCode !== codeOk){ + await window.electronAPI.showAlert('Could not delete department.'); + return false; + } + + await fetchDepartments(); +} + +// Show the Modify Department Modal +function openModifyModal(departmentId, departmentName) { + document.getElementById('confirmModifyButton').value = departmentId; + document.getElementById('modifiedDepartmentName').value = departmentName; + document.getElementById('modifyDepartmentModal').style.display = 'block'; + + document.getElementById('closeModifyModal').addEventListener('click', () => { + document.getElementById('modifyDepartmentModal').style.display = 'none'; + }); + + document.getElementById('confirmModifyButton').addEventListener('click', async () => { + const newDepartmentName = document.getElementById('modifiedDepartmentName').value.trim(); + const departmentId = document.getElementById('confirmModifyButton').value; + + console.log(newDepartmentName, departmentId); + + if (!newDepartmentName || !departmentId) { + window.electronAPI.showAlert("Please enter a new department name."); + return; + } + await modifyDepartment(departmentId, newDepartmentName); + document.getElementById('modifyDepartmentModal').style.display = 'none'; + }); + +} diff --git a/CEO/render/js/overview_users.js b/CEO/render/js/overview_users.js new file mode 100644 index 0000000..23c9127 --- /dev/null +++ b/CEO/render/js/overview_users.js @@ -0,0 +1,150 @@ +let codeGetDepartments = ''; +let codeGetUsers = ''; +let codeDeleteUser = ''; +let codeOk = ''; + +document.addEventListener('DOMContentLoaded', async () => { + const backButton = document.getElementById('backButton'); + backButton.addEventListener('click', async () => { + await window.electronAPI.closeUcSocket(); + fadeOut('main_menu'); + }); +}); + +async function fetchData() { + const operationCodes = await window.electronAPI.getOperationsCodes(); + if (!operationCodes) { + await window.electronAPI.showAlert('Internal error of the application. Failed to retrieve operation codes.'); + return; + } + + codeGetDepartments = operationCodes.GET_DEPARTMENTS; + codeGetUsers = operationCodes.GET_USERS; + codeDeleteUser = operationCodes.DELETE_USER; + codeOk = operationCodes.OK; + + // Open the TCP socket right after fetching the operation codes + if (!await window.electronAPI.openUcSocket()) { + alert('Failed to open socket. Internal error of the application.'); + return; + } + + // Fetch departments + const departmentsResponse = await fetchDepartments(); + if (!departmentsResponse || departmentsResponse.operationCode !== codeOk) { + alert('Failed to fetch departments. Redirecting to main menu...'); + await redirectToMainMenu(); + return; + } + + const departments = departmentsResponse.metaInfo.departments; + + // Fetch users + const usersResponse = await fetchUsers(); + if (!usersResponse || usersResponse.operationCode !== codeOk) { + alert('Failed to fetch users. Redirecting to main menu...'); + await redirectToMainMenu(); + return; + } + + const users = usersResponse.metaInfo.users; + + const usersContainer = document.getElementById('users-container'); + usersContainer.innerHTML = ''; // Clear the container + + // Filter out users in the CEO department + const ceoDepartment = departments.find(dept => dept.name.toLowerCase() === 'ceo'); + const filteredUsers = users.filter(user => user.departmentId !== ceoDepartment.id); + + // Check if there are no users after filtering + if (!filteredUsers.length) { + const noUsersMessage = document.createElement('p'); + noUsersMessage.textContent = 'No users exist.'; + noUsersMessage.classList.add('no-users-message'); // Add a class for styling + usersContainer.appendChild(noUsersMessage); + fadeIn(); // Fade in the container when the message is loaded + return; + } + + // Render users if there are any + filteredUsers.forEach(user => { + const userDiv = document.createElement('div'); + userDiv.classList.add('user-card'); + + // Create user info div + const userInfoDiv = document.createElement('div'); + userInfoDiv.classList.add('user-info'); + + // Create user name paragraph + const nameP = document.createElement('p'); + nameP.classList.add('user-name'); + nameP.textContent = user.name; + + console.log(user) + + console.log(departments) + + // Find and display user's department name + const department = departments.find(dept => dept.id === user.departmentId); + const departmentName = department ? department.name : 'Unknown'; + + // Create user department paragraph + const departmentP = document.createElement('p'); + departmentP.classList.add('user-department'); + departmentP.textContent = `Department: ${departmentName}`; + + // Append name and department to user info div + userInfoDiv.appendChild(nameP); + userInfoDiv.appendChild(departmentP); + + // Create delete button + const deleteButton = document.createElement('button'); + deleteButton.textContent = 'Delete'; + deleteButton.classList.add('delete-button'); + deleteButton.onclick = () => deleteUser(user.id); + + // Append user info div and delete button to user card + userDiv.appendChild(userInfoDiv); + userDiv.appendChild(deleteButton); + + // Append user card to the container + usersContainer.appendChild(userDiv); + }); +} + +async function fetchDepartments() { + // Send the request to get departments + if (!await window.electronAPI.sendUcMessage(codeGetDepartments)) { + return null; + } + return await waitForResponse(); +} + +async function fetchUsers() { + // Send the request to get users + if (!await window.electronAPI.sendUcMessage(codeGetUsers)) { + return null; + } + return await waitForResponse(); +} + +async function deleteUser(userId) { + // Send the request to delete the user + if (!await window.electronAPI.sendUcMessage(codeDeleteUser, {id: userId})) { + alert('Failed to send request to delete user.'); + return; + } + + const response = await waitForResponse(); + if (!response || response.operationCode !== codeOk) { + alert('Failed to delete user.'); + return; + } + + await fetchData(); +} + +async function redirectToMainMenu() { + await window.electronAPI.closeUcSocket(); + fadeOut('main_menu'); +} diff --git a/CEO/render/js/profile.js b/CEO/render/js/profile.js index c942e50..44f715e 100644 --- a/CEO/render/js/profile.js +++ b/CEO/render/js/profile.js @@ -10,8 +10,8 @@ document.addEventListener('DOMContentLoaded', async function () { usernameInput.value = name; passwordInput.value = password; - const backButton = document.querySelector('button[name="login"]'); - const submitButton = document.querySelector('button[name="submit"]'); + const backButton = document.getElementById('back'); + const submitButton = document.getElementById('submit'); // Get operation codes from the backend const operationCodes = await window.electronAPI.getOperationsCodes(); @@ -39,7 +39,8 @@ document.addEventListener('DOMContentLoaded', async function () { const name = usernameInput.value; const password = passwordInput.value; - const { id, departmentId, app_type } = await window.electronAPI.readUserConfig('user_info'); // Fetch login data + const { id, departmentId } = await window.electronAPI.readUserConfig('user_info'); // Fetch login data + const app_type = await window.electronAPI.readUserConfig('app_type'); // Fetch app type // Prepare the data to be sent via the UC socket const messageData = { diff --git a/CEO/render/js/reset_database.js b/CEO/render/js/reset_database.js new file mode 100644 index 0000000..d640c5a --- /dev/null +++ b/CEO/render/js/reset_database.js @@ -0,0 +1,31 @@ +document.addEventListener('DOMContentLoaded', async function () { + const operationCodes = await window.electronAPI.getOperationsCodes(); + if (!operationCodes) { + await window.electronAPI.showAlert('Internal error of the application. Failed to retrieve operation codes.'); + return; + } + + const codeResetDatabase = operationCodes.RESET_DATABASE; + const codeOk = operationCodes.OK; + + // Open a TCP socket to the stored IP + if (!await window.electronAPI.openUcSocket()) { + await window.electronAPI.showAlert('Internal error of the application. Unable to open socket.'); + return; + } + + if (!await window.electronAPI.sendUcMessage(codeResetDatabase)) { + await window.electronAPI.showAlert('Failed to send login request.'); + return; + } + + const response = await waitForResponse(); + if (response && response.operationCode !== codeOk) { + await window.electronAPI.showAlert('Database reset failed.'); + return; + } + + await window.electronAPI.closeUcSocket(); + await new Promise(resolve => setTimeout(resolve, 2000)); + fadeOut('login'); +}); \ No newline at end of file diff --git a/CEO/render/js/reset_password.js b/CEO/render/js/reset_password.js index 06a2f67..667ae4c 100644 --- a/CEO/render/js/reset_password.js +++ b/CEO/render/js/reset_password.js @@ -1,3 +1,6 @@ +let codeResetPassword = ''; +let codeOk = ''; + document.addEventListener('DOMContentLoaded', async function () { const backToLoginButton = document.getElementById('backToLogin'); const resetPasswordButton = document.getElementById('resetPassword'); @@ -9,8 +12,8 @@ document.addEventListener('DOMContentLoaded', async function () { return; } - const codeResetPassword = operationCodes.RESET_PASSWORD; - const codeOk = operationCodes.OK; + codeResetPassword = operationCodes.RESET_PASSWORD; + codeOk = operationCodes.OK; // Back to login backToLoginButton.addEventListener('click', function (e) { @@ -45,19 +48,19 @@ document.addEventListener('DOMContentLoaded', async function () { await window.electronAPI.showAlert('Password reset successfully.'); window.electronAPI.changeContent('login'); }); - - async function attemptResetPassword(email, newPassword) { - const app_type = await window.electronAPI.readUserConfig('app_type'); - const messageData = { email, newPassword, app_type }; - - if (!await window.electronAPI.sendUcMessage(codeResetPassword, messageData)) return false; - - const response = await waitForResponse(); - if (response && response.operationCode === codeOk) { - return true; - } else { - await window.electronAPI.showAlert(response?.metaInfo?.message || 'Error resetting password.'); - return false; - } - } }); + +async function attemptResetPassword(email, newPassword) { + const app_type = await window.electronAPI.readUserConfig('app_type'); + const messageData = { email, newPassword, app_type }; + + if (!await window.electronAPI.sendUcMessage(codeResetPassword, messageData)) return false; + + const response = await waitForResponse(); + if (response && response.operationCode === codeOk) { + return true; + } else { + await window.electronAPI.showAlert(response?.metaInfo?.message || 'Error resetting password.'); + return false; + } +} diff --git a/CEO/render/js/share_file.js b/CEO/render/js/share_file.js index 2053302..5b5eb45 100644 --- a/CEO/render/js/share_file.js +++ b/CEO/render/js/share_file.js @@ -1,62 +1,13 @@ +let pathToFile = ''; +let fetchUsersInterval = null; + document.addEventListener('DOMContentLoaded', async function () { - let user_info = {}; - let pathToFile = ''; + const selectFileButton = document.getElementById('selectFile'); + const submitButton = document.getElementById('submitButton'); + const backButton = document.getElementById('backButton'); - user_info = await window.electronAPI.readUserConfig('user_info'); - if (!user_info) { - await window.electronAPI.showAlert('No user_info entry found.'); - return; - } - - // Function to update the file name display - function updateFileName() { - const fileNameElement = document.getElementById('fileName'); - if (!fileNameElement) { - return; - } - - if (pathToFile.trim() === '') { - fileNameElement.textContent = 'No file chosen'; - } else { - fileNameElement.textContent = pathToFile.split('\\').pop().split('/').pop(); - } - } - - updateFileName(); - - // Fetch user information from applicationInfo and create checkboxes for selecting users - async function fetchUsersAndCreateCheckboxes() { - const usersInfoId = await window.electronAPI.readApplicationInfo('active_users_info'); - if (!usersInfoId) { - await window.electronAPI.showAlert('Internal error.'); - return; - } - - const usersInfo = await window.electronAPI.readMemoryEntry(usersInfoId); - if (!usersInfo || usersInfo.length === 0) { - await window.electronAPI.showAlert('No active users found.'); - await window.electronAPI.changeContent('main_menu'); - return; - } - - const usersDiv = document.querySelector('.choose_user_form_content'); - usersDiv.innerHTML = ''; - usersInfo.forEach(user => { - const checkbox = document.createElement('input'); - checkbox.type = 'checkbox'; - checkbox.name = 'users'; - checkbox.value = user.ip; // Store user's IP in the value - - const label = document.createElement('label'); - label.innerHTML = `${user.user_info.name}`; // Display user's name - label.insertBefore(checkbox, label.firstChild); - - usersDiv.appendChild(label); - }); - } - - // Event listener for selecting the file - document.getElementById('selectFile').addEventListener('click', async function () { + selectFileButton.addEventListener('click', async function (event) { + event.preventDefault(); try { pathToFile = await window.electronAPI.selectFile(); updateFileName(); @@ -64,14 +15,7 @@ document.addEventListener('DOMContentLoaded', async function () { console.error('Error opening file dialog:', error); } }); - - // Event listener for back button to navigate to main menu - document.getElementById('backButton').addEventListener('click', function () { - fadeOut('main_menu'); - }); - - // Submit button logic to queue file send tasks and then navigate to main_menu.html - document.getElementById('submitButton').addEventListener('click', async function (event) { + submitButton.addEventListener('click', async function (event) { event.preventDefault(); // Check if a file was chosen @@ -80,6 +24,11 @@ document.addEventListener('DOMContentLoaded', async function () { return; } + const user_info = await window.electronAPI.readUserConfig('user_info'); + if (!user_info) { + return; + } + const form = document.getElementById('userDestForm'); const checkboxes = form.querySelectorAll('input[name="users"]'); const selectedUserIps = Array.from(checkboxes) @@ -100,19 +49,78 @@ document.addEventListener('DOMContentLoaded', async function () { userName: user_info.name // Sender's username from userConfig }; await window.electronAPI.addTaskToSendFileQueue(task); - + await window.electronAPI.showAlert('File sent to the queue.'); console.log(`Task added to send file to IP ${selectedUserIp}`); } catch (error) { console.error(`Error processing IP ${selectedUserIp}:`, error); } } - - // Navigate back to the main menu after all tasks are queued - fadeOut('main_menu'); // Navigate to the main menu + }); + backButton.addEventListener('click', function (event) { + event.preventDefault(); + fadeOut('main_menu'); }); - // Fetch users and create checkboxes every 5 seconds (in case of updates) setInterval(fetchUsersAndCreateCheckboxes, 5000); - - fetchUsersAndCreateCheckboxes().then(() => console.log('User checkboxes rendered')); }); + +// Function to update the file name display +function updateFileName() { + const fileNameElement = document.getElementById('selectFile'); + if (!fileNameElement) { + return; + } + + if (pathToFile.trim() === '') { + fileNameElement.textContent = 'No file chosen'; + } else { + fileNameElement.textContent = pathToFile.split('\\').pop().split('/').pop(); + } +} + +async function fetchUsersAndCreateCheckboxes() { + // Step 1: Get the currently checked users before refreshing the list + const selectedUserIps = new Set( + Array.from(document.querySelectorAll('input[name="users"]:checked')) + .map(checkbox => checkbox.value) + ); + + const usersInfoId = await window.electronAPI.readApplicationInfo('active_users_info'); + if (!usersInfoId) { + await window.electronAPI.showAlert('Internal error.'); + return; + } + + const usersInfo = await window.electronAPI.readMemoryEntry(usersInfoId); + if (!usersInfo || usersInfo.length === 0) { + await window.electronAPI.showAlert('No active users found.'); + clearInterval(fetchUsersInterval); + fetchUsersInterval = null; + await window.electronAPI.changeContent('main_menu'); + return; + } + + const usersDiv = document.getElementById('choose_user_form_content'); + usersDiv.innerHTML = ''; // Clear the list before updating + + usersInfo.forEach(user => { + const checkbox = document.createElement('input'); + checkbox.type = 'checkbox'; + checkbox.name = 'users'; + checkbox.value = user.ip; // Store user's IP in the value + + // Step 2: Check if this user was previously selected + if (selectedUserIps.has(user.ip)) { + checkbox.checked = true; // Restore checked state + } + + const label = document.createElement('label'); + label.innerHTML = `${user.user_info.name}`; // Display user's name + label.insertBefore(checkbox, label.firstChild); + + usersDiv.appendChild(label); + }); + + toggleScroll('choose_user_form_content'); +} + diff --git a/CEO/render/js/sign_up.js b/CEO/render/js/sign_up.js deleted file mode 100644 index 2ec0477..0000000 --- a/CEO/render/js/sign_up.js +++ /dev/null @@ -1,134 +0,0 @@ -document.addEventListener('DOMContentLoaded', async function () { - const nextToStep2Button = document.getElementById('nextToStep2'); - const backToStep1Button = document.getElementById('backToStep1'); - const submitSignupButton = document.getElementById('submitSignup'); - const backToLogin = document.getElementById('backToLogin'); - - const step1 = document.getElementById('step1'); - const step2 = document.getElementById('step2'); - - // This object will hold the user data - let userData = { - email: null, - name: null, - password: null, - app_type: null, - departmentId: null - }; - - if (!await window.electronAPI.openUcSocket()) { - alert('Internal error of the application.'); - return; - } - - const operationCodes = await window.electronAPI.getOperationsCodes(); - if (!operationCodes) { - await window.electronAPI.showAlert('Internal error of the application.'); - return; - } - - const codeGetDepartments = operationCodes.GET_DEPARTMENTS; - const codeSignUp = operationCodes.SIGN_UP; - const codeOk = operationCodes.OK; - - let departments = await getDepartments(); - if (departments === null) { - await window.electronAPI.showAlert('Failed to fetch departments.'); - return; - } - console.log(departments); - - // Handle form submission for Step 1 (Profile Information) - nextToStep2Button.addEventListener('click', async function (e) { - e.preventDefault(); // Prevent the default form submission - - // Collect data from Step 1 inputs - userData.email = document.querySelector('input[name="email"]').value; - userData.name = document.querySelector('input[name="name"]').value; - userData.password = document.querySelector('input[name="password"]').value; - userData.app_type = await window.electronAPI.readUserConfig('app_type'); - - // Move to Step 2 - const departmentList = document.getElementById('departmentList'); - departmentList.innerHTML = ''; // Clear existing departments - - // Populate department list - departments.forEach(department => { - if (department.name !== 'CEO' && department.name !== 'ADMIN') { - const label = document.createElement('label'); - label.innerHTML = ` - - ${department.name} - `; - departmentList.appendChild(label); - } - }); - - switchStep(step1, step2); - }); - - // Handle form submission for Step 2 (Department Selection) - submitSignupButton.addEventListener('click', async function (e) { - e.preventDefault(); // Prevent form from being submitted in the usual way - - // Get the selected department - userData.departmentId = document.querySelector('input[name="dept"]:checked')?.value; - if (!userData.departmentId) { - await window.electronAPI.showAlert('Please select a department.'); - return; - } - - if (!await attemptSignUp()) { - switchStep(step2, step1); - return; - } - - await window.electronAPI.showAlert('Signup successful!'); - await window.electronAPI.changeContent('login'); - }); - - // Back to Step 1 from Step 2 - backToStep1Button.addEventListener('click', function () { - switchStep(step2, step1); - }); - - // Back to login - backToLogin.addEventListener('click', async function (e) { - e.preventDefault(); - await window.electronAPI.closeUcSocket(); - await window.electronAPI.changeContent('login'); - }); - - async function getDepartments() { - if (!await window.electronAPI.sendUcMessage(codeGetDepartments)) return null; - - const response = await waitForResponse(); - if (response && response.operationCode === codeOk) { - return response.metaInfo.departments; - } - return null; - } - - async function attemptSignUp() { - if (!await window.electronAPI.sendUcMessage(codeSignUp, userData)) return false; - - const response = await waitForResponse(); - if (response && response.operationCode === codeOk) { - return true; - } - await window.electronAPI.showAlert(`Signup failed: ${response?.metaInfo?.message || 'Unknown error'}`); - return false; - } - - // Function to switch between steps - function switchStep(fromStep, toStep) { - fromStep.classList.remove('active'); // Fade out the current step - setTimeout(() => { - fromStep.style.display = 'none'; // Hide the current step after transition - toStep.style.display = 'flex'; // Ensure display is flex for the next step - setTimeout(() => { - toStep.classList.add('active'); // Fade in the next step - }, 20); // Small delay to allow display change before applying opacity - }, 500); // Transition duration (0.5s) - } -}); diff --git a/CEO/render/js/users_management.js b/CEO/render/js/users_management.js deleted file mode 100644 index 5444917..0000000 --- a/CEO/render/js/users_management.js +++ /dev/null @@ -1,142 +0,0 @@ -document.addEventListener('DOMContentLoaded', async () => { - const backButton = document.getElementById('backButton'); - backButton.addEventListener('click', async () => { - await window.electronAPI.closeUcSocket(); - fadeOut('main_menu'); - }); - - const operationCodes = await window.electronAPI.getOperationsCodes(); - if (!operationCodes) { - alert('Internal error of the application.'); - return; - } - - // Open the TCP socket right after fetching the operation codes - if (!await window.electronAPI.openUcSocket()) { - alert('Failed to open socket. Internal error of the application.'); - return; - } - - let codeGetDepartments = operationCodes.GET_DEPARTMENTS; - let codeGetUsers = operationCodes.GET_USERS; - let codeDeleteUser = operationCodes.DELETE_USER; - let codeOk = operationCodes.OK; - - // Fetch both users and departments, then display the users with their departments - async function fetchData() { - try { - // Fetch departments - const departmentsResponse = await fetchDepartments(); - if (!departmentsResponse || departmentsResponse.operationCode !== codeOk) { - alert('Failed to fetch departments. Redirecting to main menu...'); - await redirectToMainMenu(); - return; - } - - const departments = departmentsResponse.metaInfo.departments; - - // Fetch users - const usersResponse = await fetchUsers(); - if (!usersResponse || usersResponse.operationCode !== codeOk) { - alert('Failed to fetch users. Redirecting to main menu...'); - await redirectToMainMenu(); - return; - } - - const users = usersResponse.metaInfo.users; - - const usersContainer = document.getElementById('users-container'); - usersContainer.innerHTML = ''; // Clear the container - - // Filter out users in the CEO department - const ceoDepartment = departments.find(dept => dept.name.toLowerCase() === 'ceo'); - const filteredUsers = users.filter(user => user.departmentId !== ceoDepartment.id); - - // Check if there are no users after filtering - if (!filteredUsers.length) { - const noUsersMessage = document.createElement('p'); - noUsersMessage.textContent = 'No users exist.'; - noUsersMessage.classList.add('no-users-message'); // Add a class for styling - usersContainer.appendChild(noUsersMessage); - fadeIn(); // Fade in the container when the message is loaded - return; - } - - // Render users if there are any - filteredUsers.forEach(user => { - const userDiv = document.createElement('div'); - userDiv.classList.add('user-card'); - - // Create user name div - const nameDiv = document.createElement('div'); - nameDiv.classList.add('user-name'); - nameDiv.textContent = user.name; - - // Find the user's department name using departmentId - const department = departments.find(dept => dept.id === user.departmentId); - const departmentName = department ? department.name : 'Unknown'; - - // Create department div - const departmentDiv = document.createElement('div'); - departmentDiv.classList.add('user-department'); - departmentDiv.textContent = `Department: ${departmentName}`; - - // Create delete button - const deleteButton = document.createElement('button'); - deleteButton.textContent = 'Delete'; - deleteButton.classList.add('delete-button'); - deleteButton.onclick = () => deleteUser(user.id); - - // Append user info and delete button to the user div - userDiv.appendChild(nameDiv); - userDiv.appendChild(departmentDiv); - userDiv.appendChild(deleteButton); - - // Append user div to the container - usersContainer.appendChild(userDiv); - }); - - fadeIn(); // Fade in the container when the users are loaded - } catch (error) { - console.error('Error fetching data:', error); - alert('An unexpected error occurred. Redirecting to main menu...'); - await redirectToMainMenu(); - } - } - - async function fetchDepartments() { - // Send the request to get departments - if (!await window.electronAPI.sendUcMessage(codeGetDepartments)) { - return null; - } - return await waitForResponse(); - } - - async function fetchUsers() { - // Send the request to get users - if (!await window.electronAPI.sendUcMessage(codeGetUsers)) { - return null; - } - return await waitForResponse(); - } - - async function deleteUser(userId) { - // Find the index of the user in the dummy data - const userIndex = dummyUsers.findIndex(user => user.id === userId); - - // If user found, remove it from the array - if (userIndex !== -1) { - dummyUsers.splice(userIndex, 1); - alert(`User with ID ${userId} deleted.`); - await fetchData(); // Refresh the users after deleting - } - } - - async function redirectToMainMenu() { - await window.electronAPI.closeUcSocket(); - fadeOut('main_menu'); - } - - // Fetch data on page load - await fetchData(); -}); diff --git a/CEO/src/helpers/announcement_sender.ts b/CEO/src/helpers/announcement_sender.ts new file mode 100644 index 0000000..c1f1fd5 --- /dev/null +++ b/CEO/src/helpers/announcement_sender.ts @@ -0,0 +1,84 @@ +import { JsonManager } from './json_manager'; // Assuming this manages JSON configurations +import { TcpCommunicator } from "./tcp_communicator"; +import { operationCodes } from '../network/operation_codes'; // Assuming this holds operation codes +import { parentPort } from 'worker_threads'; +import {ParsedMessage} from "../network/message_handler"; + +export class AnnouncementSender { + private applicationInfo: JsonManager; + private readonly clientPort: number; + private message: string = ''; + private tcpCommunicator: TcpCommunicator | null = null; + + constructor(applicationInfoPath: string, clientPort: number) { + this.applicationInfo = new JsonManager(applicationInfoPath); + this.clientPort = clientPort; + } + + async start(message: string): Promise { + console.log('AnnouncementWorker started.'); + this.message = message; + try { + const activeUsersIp = await this.applicationInfo.readValue('users_ip'); + if (!activeUsersIp || !activeUsersIp.length) { + throw new Error('No active users found.'); + } + + for (const ip of activeUsersIp) { + const success = await this.sendAnnouncementToIp(ip); + if (!success) { + throw new Error(`Failed to send announcement to all users.`); + } + console.log(`Announcement sent and confirmed successfully from ${ip}`); + } + + parentPort?.postMessage({ success: true, message: 'Announcement sent to all active users successfully.' }); + } catch (error: any) { + console.error('Error in AnnouncementWorker:', error); + parentPort?.postMessage({ success: false, message: `A problem occurred: ${error.message}` }); + } + + console.log('AnnouncementWorker finished.'); + } + + private async sendAnnouncementToIp(ip: string): Promise { + this.tcpCommunicator = new TcpCommunicator(ip, this.clientPort); + if (!await this.tcpCommunicator.connect()) { + console.log(`Skipping user at IP ${ip} - unable to connect.`); + return true; + } + + // Prepare the message metadata + const metaInfo = { message: this.message }; + + // Send the announcement message + const messageSent = await this.tcpCommunicator.sendMessage(operationCodes.SEND_ANNOUNCEMENT, metaInfo); + if (!messageSent) { + await this.tcpCommunicator.disconnect(); + return false; + } + + // Await confirmation from the user + const response = await this.waitForResponse(); + if (response?.operationCode === operationCodes.OK) { + await this.tcpCommunicator.disconnect(); + return true; + } + + // If confirmation is not OK, disconnect and halt + await this.tcpCommunicator.disconnect(); + return false; + } + + private async waitForResponse(): Promise { + return new Promise((resolve) => { + const idResponseCheck = setInterval(async () => { + if (!this.tcpCommunicator) return null; + if (this.tcpCommunicator.hasResponseArrived()) { + clearInterval(idResponseCheck); + resolve(this.tcpCommunicator.getLastResult()); + } + }, 100); + }); + } +} diff --git a/CEO/src/helpers/backup_manager.ts b/CEO/src/helpers/backup_manager.ts index 38154dd..928f460 100644 --- a/CEO/src/helpers/backup_manager.ts +++ b/CEO/src/helpers/backup_manager.ts @@ -1,203 +1,181 @@ -import fs from 'fs'; -import path from 'path'; -import { FileEncryptor } from './file_encryptor'; // Assume the class is in this file -import { MemoryManager } from './memory_manager'; // Assume this handles memory-based storage -import { JsonManager } from './json_manager'; // Manages JSON-based configurations -import { TcpClient } from '../network/tcp/tcp_client' // Import your TcpClient class -import { operationCodes } from '../network/operation_codes'; +import { JsonManager } from './json_manager'; // Assuming this manages JSON configurations +import { TcpCommunicator } from "./tcp_communicator"; +import { operationCodes } from '../network/operation_codes'; // Assuming this holds operation codes import { parentPort } from 'worker_threads'; +import path from 'path'; +import fs from 'fs'; +import crypto from 'crypto'; +import { ParsedMessage } from "../network/message_handler"; -export class BackupManager { - private fileEncryptor: FileEncryptor | null = null; - private memoryManager: MemoryManager; - private applicationInfo: JsonManager; +export class BackupRetrievalWorker { private userConfig: JsonManager; + private applicationInfo: JsonManager; private readonly clientPort: number; + private readonly destinationPath: string; + private encryptionKey: Buffer | null = null; + private iv: Buffer | null = null; + private tcpCommunicator: TcpCommunicator | null = null; - constructor(userConfigPath: string, applicationInfoPath: string, memoryManagerPath: string, clientPort: number) { - this.applicationInfo = new JsonManager(applicationInfoPath); + constructor(userConfigPath: string, applicationInfoPath: string, clientPort: number, destinationPath: string) { this.userConfig = new JsonManager(userConfigPath); - this.memoryManager = new MemoryManager(memoryManagerPath); + this.applicationInfo = new JsonManager(applicationInfoPath); this.clientPort = clientPort; + this.destinationPath = destinationPath; } async start(): Promise { - setInterval(async () => { - await this.initialize(); // Re-run every minute - }, 60000); // 1 minute interval - } + try { + const userInfo = await this.userConfig.readValue('user_info'); + if (!userInfo || !userInfo.name) { + throw new Error('User information or name is missing.'); + } + const userName = userInfo.name; - // Initialize the backup process: fetch data from the app info and memory - private async initialize(): Promise { - // Initialize the encryption settings from UserConfig - const encryptionKeyData = await this.userConfig.readValue('encryption_key'); - if (!encryptionKeyData || !encryptionKeyData.key || !encryptionKeyData.iv) { - console.error('Encryption key data is missing in user configuration.'); - return; - } - - // Create a new FileEncryptor with the retrieved key and IV - this.fileEncryptor = new FileEncryptor(encryptionKeyData.key, encryptionKeyData.iv); - - // Get the name of the user - const userInfo = await this.userConfig.readValue('user_info'); - if (!userInfo || !userInfo.name) { - console.error('User information is missing in user configuration.'); - return; - } - - const userName = userInfo.name; - - // Get the backup directory information from ApplicationInfo - const backupDirectoryData = await this.applicationInfo.readValue('backupDirectory'); - if (!backupDirectoryData || !backupDirectoryData.id || !backupDirectoryData.path) { - console.error('Backup directory information is missing in application info.'); - return; - } - - const activeUsersIp = await this.applicationInfo.readValue('users_ip'); - if (!activeUsersIp || !activeUsersIp.length) { - console.error('No active users found.'); - return; - } - - const backupDirectoryId = backupDirectoryData.id; - const backupDirectoryPath = backupDirectoryData.path; - - // Get the file structure from MemoryManager - const directoryData = await this.memoryManager.retrieveMetaInformation(backupDirectoryId); - if (!directoryData || !directoryData.structure) { - console.error('Backup directory structure is missing in memory.'); - return; - } - - // Send files to the list of IPs - await this.sendFilesToUsers(directoryData.structure, userName, activeUsersIp, backupDirectoryPath); - } - - // Method to encrypt a file and return the base64 string - private encryptFile(filePath: string): string { - if (!this.fileEncryptor) { - return filePath; - } - - if (!fs.existsSync(filePath)) { - console.error(`File not found: ${filePath}`); - return ''; - } - - // Use FileEncryptor to encrypt the file and return the base64 string - return this.fileEncryptor.encryptFileToBase64(filePath); - } - - // Send files to the list of users and remove successfully sent files from the list - private async sendFilesToUsers(fileStructure: { [key: string]: string }, userName: string, usersIp: string[], backupDirectoryPath: string): Promise { - let unsentFiles = Object.keys(fileStructure); // Keep track of unsent files - - for (const fileName of unsentFiles) { - const filePath = fileStructure[fileName]; - const encryptedFileContent = this.encryptFile(filePath); - - if (!encryptedFileContent) { - console.error(`Failed to encrypt file: ${fileName}`); - continue; // Skip to the next file + const encryptionData = await this.userConfig.readValue('encryption_key'); + if (!encryptionData || !encryptionData.key || !encryptionData.iv) { + throw new Error('Encryption key or IV is missing.'); } - // Calculate relative file path - const relativeFilePath = path.relative(backupDirectoryPath, filePath); // Get the relative file path + this.encryptionKey = Buffer.from(encryptionData.key, 'base64'); + this.iv = Buffer.from(encryptionData.iv, 'base64'); - // Meta information to send - const metaInfo = { - userName, // Name of the user - relativeFilePath // Relative path to preserve the directory structure - }; + const activeUsersIp = await this.applicationInfo.readValue('users_ip'); + if (!activeUsersIp || !activeUsersIp.length) { + parentPort?.postMessage({ success: false, message: 'No active users found.' }); + return; + } - for (const ip of usersIp) { - const tcpClient = new TcpClient(this.clientPort); - tcpClient.openSocket(ip); - - // Wait for AES key and send the file - try { - const sendSuccess = await this.waitForAesKeyAndSendFile(tcpClient, operationCodes.BACKUP_FILE, metaInfo, Buffer.from(encryptedFileContent, 'base64')); - if (sendSuccess) { - console.log(`Successfully sent file: ${fileName} to ${ip}`); - unsentFiles = unsentFiles.filter(f => f !== fileName); // Remove the file from the unsent list - tcpClient.closeSocket(); - break; // Move to the next file after successful send - } - } catch (error) { - console.error(`Failed to send file: ${fileName} to ${ip}. Error: ${error}`); - tcpClient.closeSocket(); + let backupSuccessful = true; + for (const ip of activeUsersIp) { + const success = await this.processBackupForIp(ip, userName); + if (!success) { + backupSuccessful = false; + parentPort?.postMessage({ success: false, message: 'Backup could not be completed due to an internal error.' }); + break; } } + + if (backupSuccessful) { + parentPort?.postMessage({ success: true, message: 'Backup successful.' }); + } + } catch (error: any) { + console.error('Error in BackupRetrievalWorker:', error); + parentPort?.postMessage({ success: false, message: `Backup could not be completed due to an internal error: ${error.message}` }); + } + } + + private async processBackupForIp(ip: string, userName: string): Promise { + this.tcpCommunicator = new TcpCommunicator(ip, this.clientPort); + if (!await this.tcpCommunicator.connect()) { + console.error(`Failed to connect to ${ip}`); + return false; + } + + const backupExists = await this.checkIfBackupExists(userName); + if (!backupExists) { + console.log(`No backup found for user ${userName} on IP ${ip}`); + await this.tcpCommunicator.disconnect(); + return true; // Skip user if no backup found, do not mark as error + } + + const backupStructure = await this.requestBackupStructure(userName); + if (!backupStructure || Object.keys(backupStructure).length === 0) { + console.log(`No files found in backup structure for user ${userName} on IP ${ip}`); + await this.tcpCommunicator.disconnect(); + return true; // Skip user if no files found, do not mark as error + } + + for (const relativeFilePath of Object.keys(backupStructure)) { + const fileRequestSuccess = await this.requestBackupFile(userName, relativeFilePath); + if (!fileRequestSuccess) { + console.error(`Failed to retrieve file ${relativeFilePath} from backup for user ${userName} on IP ${ip}`); + await this.tcpCommunicator.disconnect(); + return false; // Stop if any file fails to be retrieved + } } - // If there are any unsent files, notify the parent process - if (unsentFiles.length > 0) { - parentPort?.postMessage({ success: false, message: 'Backup could not be completed for all files', unsentFiles }); - } else { - parentPort?.postMessage({ success: true, message: 'Backup completed successfully' }); + await this.tcpCommunicator.disconnect(); + return true; + } + + private async checkIfBackupExists(userName: string): Promise { + if (!this.tcpCommunicator) return false; + + const metaInfo = { name: userName }; + if (!await this.tcpCommunicator.sendMessage(operationCodes.IS_BACKUP_CREATED, metaInfo)) return false; + + const response = await this.waitForResponse(); + return response?.metaInfo?.backupExists === true; + } + + private async requestBackupStructure(userName: string): Promise { + if (!this.tcpCommunicator) return false; + + const metaInfo = { name: userName }; + if (!await this.tcpCommunicator.sendMessage(operationCodes.GET_BACKUP_STRUCTURE, metaInfo)) return null; + + const response = await this.waitForResponse(); + return response?.metaInfo?.structure || null; + } + + private async requestBackupFile(userName: string, relativeFilePath: string): Promise { + if (!this.tcpCommunicator) return false; + + const metaInfo = { name: userName, relativeFilePath }; + if (!await this.tcpCommunicator.sendMessage(operationCodes.REQ_FILE_FROM_BACKUP, metaInfo)) return false; + + const response = await this.waitForResponse(); + if (response?.operationCode === operationCodes.OK && response.metaInfo && response.fileContent) { + return this.saveFile(response.metaInfo.relativeFilePath, response.fileContent.toString('base64')); + } + return false; + } + + private saveFile(relativeFilePath: string, fileContent: string): boolean { + if (!this.encryptionKey || !this.iv) { + console.error('Encryption key or IV is not set.'); + return false; + } + + let encryptedBuffer: Buffer; + try { + encryptedBuffer = Buffer.from(fileContent, 'base64'); + } catch (error) { + console.error('Error decoding base64 file content:', error); + return false; + } + + let decryptedContent: Buffer; + try { + const decipher = crypto.createDecipheriv('aes-256-cbc', this.encryptionKey, this.iv); + decryptedContent = Buffer.concat([decipher.update(encryptedBuffer), decipher.final()]); + } catch (error) { + console.error('Error decrypting file:', error); + return false; + } + + const fullFilePath = path.join(this.destinationPath, relativeFilePath); + try { + const dirPath = path.dirname(fullFilePath); + if (!fs.existsSync(dirPath)) { + fs.mkdirSync(dirPath, { recursive: true }); + } + fs.writeFileSync(fullFilePath, decryptedContent); + console.log(`File saved successfully: ${fullFilePath}`); + return true; + } catch (error: any) { + console.error(`Error saving file ${relativeFilePath}: ${error.message}`); + return false; } } - // Wait for AES key to be set, send the file, and wait for the response - private async waitForAesKeyAndSendFile(tcpClient: TcpClient, operationCode: string, metaInfo: { [key: string]: any }, fileContent: Buffer, checkInterval: number = 500, timeout: number = 10000): Promise { - const startTime = Date.now(); - - return new Promise((resolve, reject) => { - const intervalId = setInterval(async () => { - const elapsedTime = Date.now() - startTime; - - // Check if AES key is set, if timeout occurs, reject - if (!tcpClient.isAesKeySet()) { - if (elapsedTime > timeout) { - clearInterval(intervalId); - console.error('Timeout waiting for AES key.'); - reject(new Error('Timeout waiting for AES key.')); - } - return; // Continue waiting for AES key - } - - // AES key is set, send the message - clearInterval(intervalId); - - try { - const success = await tcpClient.sendMessage(operationCode, metaInfo, fileContent); - if (!success) { - reject(new Error('Failed to send the file content.')); - return; - } - - // Wait for a response after sending the message - const responseReceived = await this.waitForMessageResponse(tcpClient, timeout); - if (!responseReceived) { - reject(new Error('Timeout waiting for the message response.')); - return; - } - - // Everything went fine - resolve(true); - } catch (error) { - reject(error); - } - }, checkInterval); // Check for AES key every `checkInterval` - }); - } - - // Method to wait for the response from the TCP client - private waitForMessageResponse(tcpClient: TcpClient, timeout: number = 10000): Promise { + private async waitForResponse(): Promise { return new Promise((resolve) => { - const startTime = Date.now(); - const intervalId = setInterval(() => { - const response = tcpClient.getLastResult(); - const elapsedTime = Date.now() - startTime; - - if (response) { - clearInterval(intervalId); - resolve(true); - } else if (elapsedTime > timeout) { - clearInterval(intervalId); - resolve(false); // No response after timeout + const idResponseCheck = setInterval(async () => { + if (!this.tcpCommunicator) return null; + if (this.tcpCommunicator.hasResponseArrived()) { + clearInterval(idResponseCheck); + resolve(this.tcpCommunicator.getLastResult()); } }, 100); }); diff --git a/CEO/src/helpers/backup_retrieval.ts b/CEO/src/helpers/backup_retrieval.ts index a21a122..c661e26 100644 --- a/CEO/src/helpers/backup_retrieval.ts +++ b/CEO/src/helpers/backup_retrieval.ts @@ -1,10 +1,11 @@ -import { JsonManager } from './json_manager'; // Assuming this manages JSON configurations -import { TcpClient } from '../network/tcp/tcp_client'; // Assuming this handles TCP client connections -import { operationCodes } from '../network/operation_codes'; // Assuming this holds operation codes +import { JsonManager } from './json_manager'; // Assuming this manages JSON configurations +import { TcpCommunicator } from "./tcp_communicator"; +import { operationCodes } from '../network/operation_codes'; // Assuming this holds operation codes import { parentPort } from 'worker_threads'; import path from 'path'; import fs from 'fs'; -import crypto from 'crypto'; // Import the crypto module for encryption and decryption +import crypto from 'crypto'; +import { ParsedMessage } from "../network/message_handler"; // Import the crypto module for encryption and decryption export class BackupRetrievalWorker { private userConfig: JsonManager; @@ -13,6 +14,7 @@ export class BackupRetrievalWorker { private readonly destinationPath: string; private encryptionKey: Buffer | null = null; private iv: Buffer | null = null; + private tcpCommunicator: TcpCommunicator | null = null; constructor(userConfigPath: string, applicationInfoPath: string, clientPort: number, destinationPath: string) { this.userConfig = new JsonManager(userConfigPath); @@ -22,203 +24,149 @@ export class BackupRetrievalWorker { } async start(): Promise { - // Retrieve the necessary data from userConfig and applicationInfo - const userInfo = await this.userConfig.readValue('user_info'); - if (!userInfo || !userInfo.name) { - console.error('User information or name is missing.'); - return; - } - const userName = userInfo.name; - - // Load encryption key and IV from userConfig - const encryptionData = await this.userConfig.readValue('encryption_key'); - if (!encryptionData || !encryptionData.key || !encryptionData.iv) { - console.error('Encryption key or IV is missing.'); - return; - } - - // Convert encryption key and IV from base64 to buffer - this.encryptionKey = Buffer.from(encryptionData.key, 'base64'); - this.iv = Buffer.from(encryptionData.iv, 'base64'); - - const activeUsersIp = await this.applicationInfo.readValue('users_ip'); - if (!activeUsersIp || !activeUsersIp.length) { - console.error('No active users found.'); - return; - } - - // Process each IP and request backup data - for (const ip of activeUsersIp) { - try { - const success = await this.processBackupForIp(ip, userName); - if (success) { - console.log(`Backup retrieved successfully from ${ip}`); - } else { - console.error(`Failed to retrieve backup from ${ip}`); - } - } catch (error) { - console.error(`Error processing backup from ${ip}: ${error}`); + try { + const userInfo = await this.userConfig.readValue('user_info'); + if (!userInfo || !userInfo.name) { + throw new Error('User information or name is missing.'); } - } + const userName = userInfo.name; - // Notify the parent that the worker is done - parentPort?.postMessage({ success: true, message: 'Backup retrieval completed.' }); + const encryptionData = await this.userConfig.readValue('encryption_key'); + if (!encryptionData || !encryptionData.key || !encryptionData.iv) { + throw new Error('Encryption key or IV is missing.'); + } + + this.encryptionKey = Buffer.from(encryptionData.key, 'base64'); + this.iv = Buffer.from(encryptionData.iv, 'base64'); + + const activeUsersIp = await this.applicationInfo.readValue('users_ip'); + if (!activeUsersIp || !activeUsersIp.length) { + throw new Error('No active users found.'); + } + + for (const ip of activeUsersIp) { + const success = await this.processBackupForIp(ip, userName); + if (!success) { + throw new Error(`Failed to retrieve backup from ${ip}`); + } + console.log(`Backup retrieved successfully from ${ip}`); + } + + parentPort?.postMessage({ success: true, message: 'Backup retrieval completed successfully.' }); + } catch (error: any) { + console.error('Error in BackupRetrievalWorker:', error); + parentPort?.postMessage({ success: false, message: `A problem occurred: ${error.message}` }); + } } private async processBackupForIp(ip: string, userName: string): Promise { - const tcpClient = new TcpClient(this.clientPort); - tcpClient.openSocket(ip); - - try { - // Wait for the AES key to be set before continuing - const aesSet = await this.waitForAesKey(tcpClient); - if (!aesSet) { - console.error(`Timeout waiting for AES key on IP ${ip}`); - return false; - } - - // Step 1: Check if a backup exists for the user on this IP - const backupExists = await this.checkIfBackupExists(tcpClient, userName); - if (!backupExists) { - console.log(`No backup found for user ${userName} on IP ${ip}`); - return false; - } - - // Step 2: Request the structure of the backup directory - const backupStructure = await this.requestBackupStructure(tcpClient, userName); - if (!backupStructure || Object.keys(backupStructure).length === 0) { - console.log(`No files found in backup structure for user ${userName} on IP ${ip}`); - return false; - } - - // Step 3: Request and retrieve each file from the backup - for (const relativeFilePath of Object.keys(backupStructure)) { - const fileRequestSuccess = await this.requestBackupFile(tcpClient, userName, relativeFilePath); - if (!fileRequestSuccess) { - console.error(`Failed to retrieve file ${relativeFilePath} from backup for user ${userName} on IP ${ip}`); - return false; // Stop if any file fails to be retrieved - } - } - - return true; // All files retrieved successfully - } catch (error) { - console.error(`Error during backup processing for IP ${ip}: ${error}`); - return false; - } finally { - tcpClient.closeSocket(); // Ensure socket is closed + this.tcpCommunicator = new TcpCommunicator(ip, this.clientPort); + if (!await this.tcpCommunicator.connect()) { + return true; } + + const backupExists = await this.checkIfBackupExists(userName); + if (!backupExists) { + console.log(`No backup found for user ${userName} on IP ${ip}`); + await this.tcpCommunicator.disconnect(); + return true; + } + + const backupStructure = await this.requestBackupStructure(userName); + if (!backupStructure || Object.keys(backupStructure).length === 0) { + console.log(`No files found in backup structure for user ${userName} on IP ${ip}`); + await this.tcpCommunicator.disconnect(); + return true; + } + + for (const relativeFilePath of Object.keys(backupStructure)) { + const fileRequestSuccess = await this.requestBackupFile(userName, relativeFilePath); + if (!fileRequestSuccess) { + await this.tcpCommunicator.disconnect(); + throw new Error(`Failed to retrieve file ${relativeFilePath} from backup for user ${userName} on IP ${ip}`); + } + } + + await this.tcpCommunicator.disconnect(); + return true; } - // Wait for AES key to be set - private async waitForAesKey(tcpClient: TcpClient, timeout: number = 10000): Promise { - const startTime = Date.now(); + private async checkIfBackupExists(userName: string): Promise { + if (!this.tcpCommunicator) return false; - return new Promise((resolve, reject) => { - const intervalId = setInterval(() => { - const elapsedTime = Date.now() - startTime; - - if (tcpClient.isAesKeySet()) { - clearInterval(intervalId); - resolve(true); // AES key is set, we can proceed - } else if (elapsedTime > timeout) { - clearInterval(intervalId); - resolve(false); // Timeout reached, AES key not set - } - }, 500); // Check every 500ms - }); - } - - // Wait for a message response with timeout - private async waitForMessageResponse(tcpClient: TcpClient, timeout: number = 10000): Promise { - const startTime = Date.now(); - - return new Promise((resolve) => { - const intervalId = setInterval(() => { - const elapsedTime = Date.now() - startTime; - const response = tcpClient.getLastResult(); - - if (response) { - clearInterval(intervalId); - resolve(response); // Return the response - } else if (elapsedTime > timeout) { - clearInterval(intervalId); - resolve(null); // Timeout, no response - } - }, 500); // Check every 500ms - }); - } - - // Check if the backup exists for the user on the remote IP - private async checkIfBackupExists(tcpClient: TcpClient, userName: string): Promise { const metaInfo = { name: userName }; - await tcpClient.sendMessage(operationCodes.IS_BACKUP_CREATED, metaInfo); + if (!await this.tcpCommunicator.sendMessage(operationCodes.IS_BACKUP_CREATED, metaInfo)) return false; - const response = await this.waitForMessageResponse(tcpClient); + const response = await this.waitForResponse(); return response?.metaInfo?.backupExists === true; } - // Request the backup structure from the remote IP - private async requestBackupStructure(tcpClient: TcpClient, userName: string): Promise { - const metaInfo = { name: userName }; - await tcpClient.sendMessage(operationCodes.GET_BACKUP_STRUCTURE, metaInfo); + private async requestBackupStructure(userName: string): Promise { + if (!this.tcpCommunicator) return false; - const response = await this.waitForMessageResponse(tcpClient); - return response?.metaInfo?.structure ? response.metaInfo.structure : null; + const metaInfo = { name: userName }; + if (!await this.tcpCommunicator.sendMessage(operationCodes.GET_BACKUP_STRUCTURE, metaInfo)) return null; + + const response = await this.waitForResponse(); + return response?.metaInfo?.structure || null; } - // Request a file from the backup and wait for it to be decrypted and stored - private async requestBackupFile(tcpClient: TcpClient, userName: string, relativeFilePath: string): Promise { - const metaInfo = { name: userName, relativeFilePath }; - await tcpClient.sendMessage(operationCodes.REQ_FILE_FROM_BACKUP, metaInfo); + private async requestBackupFile(userName: string, relativeFilePath: string): Promise { + if (!this.tcpCommunicator) return false; - const response = await this.waitForMessageResponse(tcpClient); + const metaInfo = { name: userName, relativeFilePath }; + if (!await this.tcpCommunicator.sendMessage(operationCodes.REQ_FILE_FROM_BACKUP, metaInfo)) return false; + + const response = await this.waitForResponse(); if (response?.operationCode === operationCodes.OK && response.metaInfo && response.fileContent) { - return this.saveFile(response.metaInfo.relativeFilePath, response.fileContent); + return this.saveFile(response.metaInfo.relativeFilePath, response.fileContent.toString('base64')); } return false; } - // Decrypt the file content using AES-256-CBC and save the decrypted file private saveFile(relativeFilePath: string, fileContent: string): boolean { if (!this.encryptionKey || !this.iv) { - console.error('Encryption key or IV is not set.'); - return false; + throw new Error('Encryption key or IV is not set.'); } - // Decode the base64-encoded file content into a buffer let encryptedBuffer: Buffer; try { encryptedBuffer = Buffer.from(fileContent, 'base64'); - } catch (error) { - console.error('Error decoding base64 file content:', error); - return false; + } catch (error: any) { + throw new Error(`Error decoding base64 file content: ${error.message}`); } - // Decrypt the file content let decryptedContent: Buffer; try { const decipher = crypto.createDecipheriv('aes-256-cbc', this.encryptionKey, this.iv); decryptedContent = Buffer.concat([decipher.update(encryptedBuffer), decipher.final()]); - } catch (error) { - console.error('Error decrypting file:', error); - return false; + } catch (error: any) { + throw new Error(`Error decrypting file: ${error.message}`); } - // Save the decrypted file content const fullFilePath = path.join(this.destinationPath, relativeFilePath); - try { const dirPath = path.dirname(fullFilePath); if (!fs.existsSync(dirPath)) { - fs.mkdirSync(dirPath, { recursive: true }); // Ensure directory exists + fs.mkdirSync(dirPath, { recursive: true }); } - fs.writeFileSync(fullFilePath, decryptedContent); console.log(`File saved successfully: ${fullFilePath}`); return true; } catch (error: any) { - console.error(`Error saving file ${relativeFilePath}: ${error.message}`); - return false; + throw new Error(`Error saving file ${relativeFilePath}: ${error.message}`); } } + + private async waitForResponse(): Promise { + return new Promise((resolve) => { + const idResponseCheck = setInterval(async () => { + if (!this.tcpCommunicator) return null; + if (this.tcpCommunicator.hasResponseArrived()) { + clearInterval(idResponseCheck); + resolve(this.tcpCommunicator.getLastResult()); + } + }, 100); + }); + } } diff --git a/CEO/src/helpers/department_sharer.ts b/CEO/src/helpers/department_sharer.ts index 766095f..7c11662 100644 --- a/CEO/src/helpers/department_sharer.ts +++ b/CEO/src/helpers/department_sharer.ts @@ -1,9 +1,10 @@ import fs from 'fs'; import path from 'path'; -import { TcpClient } from '../network/tcp/tcp_client'; // Assuming this class exists +import { TcpCommunicator } from './tcp_communicator'; // Using TcpCommunicator instead of TcpClient import { operationCodes } from '../network/operation_codes'; import { JsonManager } from './json_manager'; // Manages JSON configurations import { MemoryManager } from './memory_manager'; // Manages in-memory data structures +import { ParsedMessage } from "../network/message_handler"; export class DepartmentSharer { private userConfig: JsonManager; @@ -11,6 +12,8 @@ export class DepartmentSharer { private memoryManager: MemoryManager; // To read the department files private departmentDirectory: string | null; private readonly clientPort: number; + private isBusy: boolean = false; // Busy flag to prevent simultaneous sharing + private tcpCommunicator: TcpCommunicator | null = null; // For each user connection constructor( userConfigPath: string, @@ -20,7 +23,7 @@ export class DepartmentSharer { ) { this.userConfig = new JsonManager(userConfigPath); this.applicationInfo = new JsonManager(applicationInfoPath); - this.memoryManager = new MemoryManager(memoryManagerPath); // To retrieve files + this.memoryManager = new MemoryManager(memoryManagerPath); this.clientPort = clientPort; this.departmentDirectory = null; } @@ -28,7 +31,11 @@ export class DepartmentSharer { // Start sharing files with the department every minute async start(): Promise { setInterval(async () => { - await this.shareFilesWithDepartment(); // Retry every minute + if (!this.isBusy) { + this.isBusy = true; + await this.shareFilesWithDepartment(); + this.isBusy = false; + } }, 10000); // 10-second interval for testing } @@ -61,7 +68,6 @@ export class DepartmentSharer { // Filter users who belong to the same department const departmentUsers = activeUsers.filter((user: any) => user.user_info.departmentId === departmentId); - if (departmentUsers.length === 0) { console.log('No users found in the same department.'); return; @@ -83,15 +89,41 @@ export class DepartmentSharer { return; } - // Send each file to every department user - await this.shareFilesWithUsers(departmentUsers, departmentFiles.structure, userName); + // Iterate over all department users and perform the operations + for (const user of departmentUsers) { + const userIp = user.ip; + this.tcpCommunicator = new TcpCommunicator(userIp, this.clientPort); - // After sending all files, clear the department directory - await this.clearDepartmentDirectory(departmentUsers); + if(await this.tcpCommunicator.connect()) continue; + + // First clear the department directory + const clearSuccess = await this.clearDepartmentDirectory(); + if (clearSuccess) { + await this.sendFilesToUser(departmentFiles.structure, userName); + } + + await this.tcpCommunicator.disconnect(); + } } - // Send the files to the users in the department - private async shareFilesWithUsers(users: any[], files: { [key: string]: string }, userName: string): Promise { + // Clear the department directory for a user + private async clearDepartmentDirectory(): Promise { + if(!this.tcpCommunicator) return false; + + if (!await this.tcpCommunicator.sendMessage(operationCodes.CLEAR_DEPARTMENT)) return false; + const response = await this.waitForResponse(); + + if (!response || response.operationCode !== operationCodes.OK){ + console.error('Failed to clear the department directory.'); + return false; + } + + return true; + } + + // Send the files to a user in the department + private async sendFilesToUser(files: { [key: string]: string }, userName: string): Promise { + if(!this.tcpCommunicator) return; const unsentFiles = Object.keys(files); // Keep track of unsent files for (const fileName of unsentFiles) { @@ -116,163 +148,29 @@ export class DepartmentSharer { relativeFilePath // Use the relative path to preserve directory structure }; - // Send the file to each user in the same department - for (const user of users) { - const userIp = user.ip; - const tcpClient = new TcpClient(this.clientPort); + // Send the file + if (!await this.tcpCommunicator.sendMessage(operationCodes.DEPARTMENT_FILE, metaInfo, Buffer.from(fileContent))) return; - // Open a connection to the user's IP - tcpClient.openSocket(userIp); - - try { - // Wait for the AES key and send the file - const success = await this.waitForAesKeyAndSendFile(tcpClient, operationCodes.DEPARTMENT_FILE, metaInfo, fileContent); - if (success) { - console.log(`File successfully sent: ${fileName} to user ${userIp}`); - unsentFiles.splice(unsentFiles.indexOf(fileName), 1); // Remove successfully sent file - tcpClient.closeSocket(); // Close the connection after sending - break; // Move to the next file after a successful send - } - } catch (error) { - console.error(`Failed to send file: ${fileName} to IP: ${userIp}. Error: ${error}`); - tcpClient.closeSocket(); // Ensure socket is closed on error - } + const response = await this.waitForResponse(); + if (!response || response.operationCode !== operationCodes.OK) { + console.error(`Failed to send file: ${fileName}`); + return; } - } - if (unsentFiles.length > 0) { - console.log('Some files could not be sent, retrying later.'); - } else { - console.log('All files shared successfully.'); + unsentFiles.splice(unsentFiles.indexOf(fileName), 1); + await this.tcpCommunicator.disconnect(); } } - // Clear the department directory for all users after sharing - private async clearDepartmentDirectory(users: any[]): Promise { - for (const user of users) { - const userIp = user.ip; - const tcpClient = new TcpClient(this.clientPort); - - // Open a connection to the user's IP - tcpClient.openSocket(userIp); - - try { - const success = await this.waitForAesKeyAndSendClearDepartment(tcpClient, operationCodes.CLEAR_DEPARTMENT); - if (success) { - console.log(`Department directory cleared successfully for user ${userIp}`); - } else { - console.error(`Failed to clear department directory for user ${userIp}`); - } - } catch (error) { - console.error(`Error clearing department directory for user ${userIp}:`, error); - } finally { - tcpClient.closeSocket(); // Ensure the socket is closed - } - } - } - - // Wait for AES key to be set, send the file, and wait for the response - private async waitForAesKeyAndSendFile(tcpClient: TcpClient, operationCode: string, metaInfo: { [key: string]: any }, fileContent: Buffer, checkInterval: number = 500, timeout: number = 10000): Promise { - const startTime = Date.now(); - - return new Promise((resolve, reject) => { - const intervalId = setInterval(async () => { - const elapsedTime = Date.now() - startTime; - - // Check if AES key is set, if timeout occurs, reject - if (!tcpClient.isAesKeySet()) { - if (elapsedTime > timeout) { - clearInterval(intervalId); - console.error('Timeout waiting for AES key.'); - reject(new Error('Timeout waiting for AES key.')); - } - return; // Continue waiting for AES key - } - - // AES key is set, send the file - clearInterval(intervalId); - - try { - const success = await tcpClient.sendMessage(operationCode, metaInfo, fileContent); - if (!success) { - reject(new Error('Failed to send the file content.')); - return; - } - - // Wait for a response after sending the message - const responseReceived = await this.waitForMessageResponse(tcpClient, timeout); - if (!responseReceived) { - reject(new Error('Timeout waiting for the message response.')); - return; - } - - resolve(true); // Everything went fine - } catch (error) { - reject(error); - } - }, checkInterval); // Check for AES key every `checkInterval` - }); - } - - // Wait for AES key to be set, send the clear department message, and wait for the response - private async waitForAesKeyAndSendClearDepartment(tcpClient: TcpClient, operationCode: string, checkInterval: number = 500, timeout: number = 10000): Promise { - const startTime = Date.now(); - - return new Promise((resolve, reject) => { - const intervalId = setInterval(async () => { - const elapsedTime = Date.now() - startTime; - - // Check if AES key is set, if timeout occurs, reject - if (!tcpClient.isAesKeySet()) { - if (elapsedTime > timeout) { - clearInterval(intervalId); - console.error('Timeout waiting for AES key.'); - reject(new Error('Timeout waiting for AES key.')); - } - return; // Continue waiting for AES key - } - - // AES key is set, send the clear department message - clearInterval(intervalId); - - try { - const success = await tcpClient.sendMessage(operationCode, {}); - if (!success) { - reject(new Error('Failed to send the clear department operation.')); - return; - } - - // Wait for a response after sending the message - const responseReceived = await this.waitForMessageResponse(tcpClient, timeout); - if (!responseReceived) { - reject(new Error('Timeout waiting for the message response.')); - return; - } - - resolve(true); // Everything went fine - } catch (error) { - reject(error); - } - }, checkInterval); // Check for AES key every `checkInterval` - }); - } - - // Wait for the response from the TCP client - private waitForMessageResponse(tcpClient: TcpClient, timeout: number = 10000): Promise { + private async waitForResponse(): Promise { return new Promise((resolve) => { - const startTime = Date.now(); - const intervalId = setInterval(() => { - const response = tcpClient.getLastResult(); - const elapsedTime = Date.now() - startTime; - - if (response?.operationCode === operationCodes.OK) { - clearInterval(intervalId); - resolve(true); // Message successfully received - } else if (elapsedTime > timeout) { - clearInterval(intervalId); - resolve(false); // No response after timeout + const idResponseCheck = setInterval(async () => { + if (!this.tcpCommunicator) return null; + if (this.tcpCommunicator.hasResponseArrived()) { + clearInterval(idResponseCheck); + resolve(this.tcpCommunicator.getLastResult()); // Resolve the response or null if not available } - }, 100); // Check every 100ms + }, 100); // Check every 100 milliseconds if the response has arrived }); } } diff --git a/CEO/src/helpers/file_sharer.ts b/CEO/src/helpers/file_sharer.ts index b6a6d7e..435e021 100644 --- a/CEO/src/helpers/file_sharer.ts +++ b/CEO/src/helpers/file_sharer.ts @@ -1,9 +1,10 @@ -import { QueueManager } from './queue_manager'; // Assume the QueueManager is in this path -import { TcpClient } from '../network/tcp/tcp_client'; // Import your TcpClient class -import { operationCodes } from '../network/operation_codes'; +import {QueueManager} from './queue_manager'; +import {TcpCommunicator} from "./tcp_communicator"; // Updated to use TcpCommunicator +import {operationCodes} from '../network/operation_codes'; import fs from "fs"; import path from "path"; import {compareFnFileItemTask, FileItemTask} from "../interfaces/file_item_task"; +import {ParsedMessage} from "../network/message_handler"; interface FileSendTask { ip: string; @@ -14,45 +15,56 @@ interface FileSendTask { export class FileSharer { private queueManager: QueueManager; private readonly clientPort: number; + private isBusy: boolean; + private tcpCommunicator: TcpCommunicator | null = null; constructor(queueFilePath: string, clientPort: number) { - - this.queueManager = new QueueManager(queueFilePath, compareFnFileItemTask); this.clientPort = clientPort; + this.isBusy = false; // Initialize the busy flag } // Start processing the file queue async start(): Promise { setInterval(async () => { - await this.processQueue(); // Process the queue at regular intervals + if (!this.isBusy) { // Check if the queue is already being processed + await this.processQueue(); // Process the queue at regular intervals + } }, 10000); // 10 seconds interval } // Method to process the queue private async processQueue(): Promise { + if (this.isBusy) { + console.log("Queue is already being processed. Skipping this interval."); + return; + } + + this.isBusy = true; // Set busy flag to true before starting + while (!this.queueManager.isEmpty()) { const task = this.queueManager.peek(); if (task) { + console.log(task); const success = await this.sendFile(task); if (!success) { console.error(`Failed to send file: ${task.path} to IP: ${task.ip}. Re-adding to queue.`); this.queueManager.dequeue(); this.queueManager.enqueue(task); // Re-add to queue if failed - } - else{ + } else { console.log(`File sent successfully: ${task.path} to IP: ${task.ip}.`); this.queueManager.dequeue(); } } } + this.isBusy = false; // Reset busy flag after the queue is processed } - // Method to send the file to a specific IP using the TcpClient + // Method to send the file to a specific IP using TcpCommunicator private async sendFile(task: FileSendTask): Promise { - const { ip, path: filePath, userName } = task; + const {ip, path: filePath, userName} = task; // Ensure the file exists before attempting to send if (!fs.existsSync(filePath)) { @@ -63,7 +75,7 @@ export class FileSharer { // Read the file contents const fileContent = fs.readFileSync(filePath); - // Extract the file name from the file path using path.basename (handles both Windows and Unix) + // Extract the file name from the file path using path.basename const fileName = path.basename(filePath); const metaInfo = { @@ -71,82 +83,36 @@ export class FileSharer { relativeFilePath: fileName, // Use the file name instead of the full path }; - const tcpClient = new TcpClient(this.clientPort); - tcpClient.openSocket(ip); + this.tcpCommunicator = new TcpCommunicator(ip, this.clientPort); - // Wait for the AES key and then send the file - try { - const sendSuccess = await this.waitForAesKeyAndSendFile(tcpClient, operationCodes.SHARE_FILE, metaInfo, fileContent, task); - tcpClient.closeSocket(); - - return sendSuccess; - } catch (error) { - console.error(`Error sending file: ${filePath} to IP: ${ip}. Error: ${error}`); - tcpClient.closeSocket(); + if (!await this.tcpCommunicator.connect()) { + console.error(`Failed to connect to IP: ${ip}`); return false; } + + console.log(`Sending file: ${filePath} to IP: ${ip}`); + + if (!await this.tcpCommunicator.sendMessage(operationCodes.SHARE_FILE, metaInfo, fileContent)) return false; + + const response = await this.waitForResponse(); + if (!response || response.operationCode !== operationCodes.OK) { + console.error(`Failed to send file: ${filePath} to IP: ${ip}`); + return false; + } + + await this.tcpCommunicator.disconnect(); + return true; } - // Wait for AES key to be set and send the file, handling the response - private async waitForAesKeyAndSendFile(tcpClient: TcpClient, operationCode: string, metaInfo: { [key: string]: any }, fileContent: Buffer, task: FileSendTask, checkInterval: number = 500, timeout: number = 10000): Promise { - const startTime = Date.now(); - - return new Promise((resolve, reject) => { - const intervalId = setInterval(async () => { - const elapsedTime = Date.now() - startTime; - - // Check if AES key is set, if timeout occurs, reject - if (!tcpClient.isAesKeySet()) { - if (elapsedTime > timeout) { - clearInterval(intervalId); - console.error('Timeout waiting for AES key.'); - - reject(new Error('Timeout waiting for AES key.')); - } - return; // Continue waiting for AES key - } - - // AES key is set, send the message - clearInterval(intervalId); - - try { - const success = await tcpClient.sendMessage(operationCode, metaInfo, fileContent); - if (!success) { - reject(new Error('Failed to send the file content.')); - return; - } - - // Wait for a response after sending the message - const responseReceived = await this.waitForMessageResponse(tcpClient, timeout); - if (!responseReceived) { - reject(new Error('Timeout waiting for the message response.')); - return; - } - - resolve(true); // Everything went fine - } catch (error) { - reject(error); - } - }, checkInterval); // Check for AES key every `checkInterval` - }); - } - - // Method to wait for the response from the TCP client - private waitForMessageResponse(tcpClient: TcpClient, timeout: number = 10000): Promise { + private async waitForResponse(): Promise { return new Promise((resolve) => { - const startTime = Date.now(); - const intervalId = setInterval(() => { - const response = tcpClient.getLastResult(); - const elapsedTime = Date.now() - startTime; - - if (response?.operationCode === operationCodes.OK) { - clearInterval(intervalId); - resolve(true); // Message successfully received - } else if (elapsedTime > timeout) { - clearInterval(intervalId); - resolve(false); // No response after timeout + const idResponseCheck = setInterval(async () => { + if (!this.tcpCommunicator) return null; + if (this.tcpCommunicator.hasResponseArrived()) { + clearInterval(idResponseCheck); + resolve(this.tcpCommunicator.getLastResult()); // Resolve the response or null if not available } - }, 100); // Check every 100ms + }, 100); // Check every 100 milliseconds if the response has arrived }); } } diff --git a/CEO/src/helpers/task_scheduler.ts b/CEO/src/helpers/task_scheduler.ts deleted file mode 100644 index e250c1d..0000000 --- a/CEO/src/helpers/task_scheduler.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { JsonManager } from './json_manager'; // Assuming you have this class for managing user/memory -import { WindowManager } from './window_manager'; // For managing app navigation -import { UdpClient } from '../network/udp/udp_client'; - -export class TaskScheduler { - private applicationInfo: JsonManager; - private windowManager: WindowManager; - private appStarted: boolean = false; - private intervalIds: NodeJS.Timeout[] = []; // Array to store interval IDs - - constructor(applicationInfo: JsonManager, windowManager: WindowManager) { - this.applicationInfo = applicationInfo; - this.windowManager = windowManager; - } - - // Function to schedule the UC check task with dynamic UDP client creation - public startUCCheck(udpPort: number, okPage: string, errorPage: string, interval: number = 30000) { - const intervalId = setInterval(async () => { - try { - const udpClient = new UdpClient(udpPort); // Create UdpClient with the provided port - const aliveClients = await udpClient.getAliveClients(); - const storedIp = await this.applicationInfo.readValue('serverIp'); - const foundClient = aliveClients.length > 0; - - if (foundClient) { - const ipAddress = aliveClients[0]; // Just using the first alive client - - if (!storedIp || storedIp !== ipAddress) { - await this.applicationInfo.writeValue('serverIp', ipAddress); - if (!this.appStarted) { - await this.windowManager.changeContent(okPage); - } - this.appStarted = true; - } else if (!this.appStarted) { - await this.windowManager.changeContent(okPage); - this.appStarted = true; - } - } else { - await this.windowManager.changeContent(errorPage); - } - } catch (err) { - console.error('Error checking UC:', err); - await this.windowManager.changeContent(errorPage); - } - }, interval); - - this.intervalIds.push(intervalId); - } - - // Function to schedule the IP lookup task, storing the active addresses in memory - public async startUserIPLookup(udpPort: number, interval: number = 30000) { - const serverIp = await this.applicationInfo.readValue('serverIp'); // Ensure it's awaited if it's an async function - const intervalId = setInterval(async () => { - try { - const udpClient = new UdpClient(udpPort); // Create a UDP client with the provided port - const activeIPs = await udpClient.getAliveClients(); // Get the list of active IPs - - // Filter out the serverIp from the list of active clients - const filteredIPs = activeIPs.filter(ip => ip !== serverIp); - - // Save the filtered IPs to 'users_ip' - await this.applicationInfo.writeValue('users_ip', filteredIPs); - } catch (err) { - console.error('Error during user IP lookup:', err); - } - }, interval); - - this.intervalIds.push(intervalId); // Store the interval ID - } - - // Function to stop all tasks (UC check, user worker, etc.) - public stopAllTasks() { - this.intervalIds.forEach(clearInterval); // Clear all intervals - this.intervalIds = []; // Reset the array - } -} diff --git a/CEO/src/helpers/users_info_fetcher.ts b/CEO/src/helpers/users_info_fetcher.ts index a4827f3..d584152 100644 --- a/CEO/src/helpers/users_info_fetcher.ts +++ b/CEO/src/helpers/users_info_fetcher.ts @@ -2,6 +2,7 @@ import { JsonManager } from "./json_manager"; import { MemoryManager } from "./memory_manager"; import { operationCodes } from "../network/operation_codes"; import { TcpCommunicator } from "./tcp_communicator"; +import {ParsedMessage} from "../network/message_handler"; export class UsersInfoFetcher { private applicationInfo: JsonManager; @@ -24,7 +25,7 @@ export class UsersInfoFetcher { async start(): Promise { setInterval(async () => { await this.initialize(); // Re-run every minute - }, 60000); // 1 minute interval + }, 5000); // 1 minute interval } // Initialize and fetch user IPs and process users info @@ -57,16 +58,19 @@ export class UsersInfoFetcher { continue; } + if(!await this.tcpCommunicator?.sendMessage(operationCodes.GET_USER_INFORMATION)){ + await this.tcpCommunicator.disconnect(); + continue + } + // Wait for the response for 10 seconds const response = await this.waitForResponse(); - console.log(response); // If a response is received and is successful, append it to usersInfo if (response && response.metaInfo) { - console.log(`Response received from ${ip}:`, response); usersInfo.push({ ip: ip, - user_info: response.metaInfo // Push the IP and user_info object into the array + user_info: response.metaInfo }); } @@ -76,31 +80,15 @@ export class UsersInfoFetcher { await this.updateActiveUsers(usersInfo); // Update active users information in the memory } - // Send the message once and wait for the response for a specific timeout - private async waitForResponse(timeout: number = 10000): Promise { - // Send the message once - const status = await this.tcpCommunicator?.sendMessage(operationCodes.GET_USER_INFORMATION); - if (!status) { - return null; - } - - // Wait for the response until the timeout + private async waitForResponse(): Promise { return new Promise((resolve) => { - const startTime = Date.now(); - - const checkResponseInterval = setInterval(async () => { - // Check if the message has been received - if (this.tcpCommunicator?.hasResponseArrived()) { - clearInterval(checkResponseInterval); - resolve(this.tcpCommunicator?.getLastResult()); // Return the response once it arrives + const idResponseCheck = setInterval(async () => { + if (!this.tcpCommunicator) return null; + if (this.tcpCommunicator.hasResponseArrived()) { + clearInterval(idResponseCheck); + resolve(this.tcpCommunicator.getLastResult()); // Resolve the response or null if not available } - - // If the timeout is reached, stop checking and resolve with null - if (Date.now() - startTime > timeout) { - clearInterval(checkResponseInterval); - resolve(null); - } - }, 100); // Check every 100ms if the response has arrived + }, 100); // Check every 100 milliseconds if the response has arrived }); } diff --git a/CEO/src/helpers/worker_manager.ts b/CEO/src/helpers/worker_manager.ts index 40950b2..976136c 100644 --- a/CEO/src/helpers/worker_manager.ts +++ b/CEO/src/helpers/worker_manager.ts @@ -13,10 +13,40 @@ export class WorkerManager { this.workers = []; // Initialize the array to store workers } - // Start the Connection Pool Worker - async startWatchersWorker(memoryManagerPath: string, applicationInfoPath: string): Promise { + async startNetworkScannerWorker(udpPort: number, okPage: string, errorPage: string, applicationInfoPath: string): Promise { return new Promise((resolve, reject) => { - const worker = new Worker(path.join(this.pathToWorkerDir, 'watcher_worker.js'), { + const worker = new Worker(path.join(this.pathToWorkerDir, 'network_scanner_worker.js'), { + workerData: { udpPort, okPage, errorPage, applicationInfoPath }, // Pass necessary data to the worker + }); + + this.workers.push(worker); // Store the worker reference + + worker.on('message', (data) => { + console.log(data); + if (data.type === 'changeContent') { + this.windowManager.changeContent(data.page); + } + }); + + worker.on('error', (err) => { + console.error('Network Scanner Worker error:', err); + worker.terminate(); + this.removeWorker(worker); + reject(err); // Reject the promise if there's an error + }); + + worker.on('exit', (code) => { + console.log(`Network Scanner Worker exited with code ${code}`); + this.removeWorker(worker); // Remove worker reference when it exits + resolve(); // Resolve when the worker exits cleanly + }); + }); + } + + // Start the Connection Pool Worker + async startDirectoriesWatchersWorker(memoryManagerPath: string, applicationInfoPath: string): Promise { + return new Promise((resolve, reject) => { + const worker = new Worker(path.join(this.pathToWorkerDir, 'directories_watcher_worker.js'), { workerData: { memoryManagerPath, applicationInfoPath }, // Pass the port to the worker }); @@ -110,17 +140,18 @@ export class WorkerManager { clientPort: number, destinationPath: string ): Promise { - return new Promise((resolve, reject) => { + return new Promise(async (resolve, reject) => { const worker = new Worker(path.join(this.pathToWorkerDir, 'backup_retrieval_worker.js'), { workerData: { userConfigPath, applicationInfoPath, clientPort, destinationPath }, // Pass parameters to the worker }); this.workers.push(worker); // Store the worker reference - worker.on('message', (data) => { + worker.on('message', async (data) => { console.log('Backup Retrieval Worker message:', data); - this.windowManager.changeContent('main_menu'); - this.windowManager.showAlert(data.message); + await new Promise((resolve) => setTimeout(resolve, 3000)); // Wait for 1 second + await this.windowManager.changeContent('main_menu'); + await this.windowManager.showAlert(data.message); }); worker.on('error', (err) => { @@ -138,6 +169,36 @@ export class WorkerManager { }); } + // Method to start the Announcement Worker + async startAnnouncementWorker(applicationInfoPath: string, clientPort: number, message: string): Promise { + return new Promise((resolve, reject) => { + const worker = new Worker(path.join(this.pathToWorkerDir, 'send_announcement_worker.js'), { + workerData: { applicationInfoPath, clientPort, message }, // Pass necessary data to the worker + }); + + this.workers.push(worker); // Store the worker reference + + worker.on('message', async (data) => { + await new Promise((resolve) => setTimeout(resolve, 3000)); // Wait for 1 second + this.windowManager.changeContent('main_menu'); + this.windowManager.showAlert(`${data.message}`) + }); + + worker.on('error', (err) => { + console.error('Announcement Worker error:', err); + worker.terminate(); + this.removeWorker(worker); + reject(err); // Reject the promise if there's an error + }); + + worker.on('exit', (code) => { + console.log(`Announcement Worker exited with code ${code}`); + this.removeWorker(worker); // Remove worker reference when it exits + resolve(); // Resolve when the worker exits cleanly + }); + }); + } + // Close all running workers closeAllWorkers(): void { console.log('Terminating all running workers...'); diff --git a/CEO/src/main/main.ts b/CEO/src/main/main.ts index 4184506..01b4f2a 100644 --- a/CEO/src/main/main.ts +++ b/CEO/src/main/main.ts @@ -7,20 +7,20 @@ import {WorkerManager} from "../helpers/worker_manager"; import {DirectoryWatcher} from "../helpers/directory_watcher"; import {QueueManager} from "../helpers/queue_manager"; import {compareFnFileItemTask, FileItemTask} from "../interfaces/file_item_task"; -import {TaskScheduler} from "../helpers/task_scheduler"; import {WindowManager} from "../helpers/window_manager"; import {JsonManager} from "../helpers/json_manager"; import {MemoryManager} from "../helpers/memory_manager"; import {TcpCommunicator} from "../helpers/tcp_communicator"; import {operationCodes} from "../network/operation_codes"; +import os from "os"; // Load environment variables dotenv.config({ path: path.join(__dirname, '..', '..', '.env') }); const UDP_PORT = process.env.UDP_PORT ? parseInt(process.env.UDP_PORT) : 41233; const TCP_PORT = process.env.TCP_PORT ? parseInt(process.env.TCP_PORT) : 41234; -const HOST = process.env.HOST || '0.0.0.0'; +const HOST = getLocalIp(); let mainWindow: BrowserWindow | null = null; let windowManager: WindowManager | null = null; @@ -29,7 +29,6 @@ let userConfig: JsonManager | null = null; let applicationInfo: JsonManager | null = null; let memoryManager: MemoryManager | null = null; let workerManager: WorkerManager | null = null; -let taskScheduler: TaskScheduler | null = null; let backupDirectoryManager: DirectoryWatcher | null = null; let departmentShareManager: DirectoryWatcher | null = null; let sendFileQueue: QueueManager | null = null; @@ -62,11 +61,6 @@ async function cleanupAndExit() { departmentShareManager.closeWatcher(); // Add this method to DirectoryWatcher to close the watcher } - if(taskScheduler){ - console.log('Stopping all tasks...'); - taskScheduler.stopAllTasks() - } - if(workerManager){ console.log('Terminating all workers...'); workerManager.closeAllWorkers() @@ -86,6 +80,21 @@ async function ensureDirectoryExists(dirPath: string): Promise { } } +function getLocalIp() { + const interfaces = os.networkInterfaces(); + for (let interfaceName in interfaces) { + const addresses = interfaces[interfaceName]; + if(!addresses) continue; + for (let address of addresses) { + // Filter for IPv4 and ignore internal (127.0.0.1) addresses + if (address.family === 'IPv4' && !address.internal) { + return address.address; + } + } + } + return ''; // Fallback if no IP is found +} + app.whenReady().then(async () => { const title = 'Application'; const mainScreen = require('electron').screen.getPrimaryDisplay(); @@ -103,6 +112,8 @@ app.whenReady().then(async () => { }, }); + mainWindow.removeMenu(); + await ensureDirectoryExists(pathToJsons); await ensureDirectoryExists(pathToClientsBackups); @@ -112,14 +123,16 @@ app.whenReady().then(async () => { memoryManager = new MemoryManager(path.join(pathToJsons, 'memory.json')); sendFileQueue = new QueueManager(path.join(pathToJsons, 'sendFileTasks.json'), compareFnFileItemTask); - taskScheduler = new TaskScheduler(applicationInfo, windowManager); workerManager = new WorkerManager(pathToWorkerDir, windowManager); await userConfig.writeValue('app_type', 'ceo'); await applicationInfo.writeValue('users_ip', []); + await applicationInfo.writeValue('serverIp', ''); + await applicationInfo.writeValue('announcement', ''); await memoryManager.resetFile(); - workerManager.startWatchersWorker(path.join(pathToJsons, 'memory.json'), path.join(pathToJsons, 'application.json')); + workerManager.startNetworkScannerWorker(UDP_PORT, 'login', 'uc_not_found', path.join(pathToJsons, 'application.json')); + workerManager.startDirectoriesWatchersWorker(path.join(pathToJsons, 'memory.json'), path.join(pathToJsons, 'application.json')); workerManager.startServersWorker(HOST, UDP_PORT, TCP_PORT); workerManager.startResourceCoordinatorWorker( path.join(pathToJsons, 'userConfig.json'), @@ -129,10 +142,6 @@ app.whenReady().then(async () => { TCP_PORT ); - - taskScheduler.startUCCheck(UDP_PORT, 'login', 'uc_not_found'); - taskScheduler.startUserIPLookup(UDP_PORT); - registerIPCHandlers(); await windowManager.changeContent('welcome'); @@ -156,6 +165,43 @@ app.on('before-quit', async () => { // Register IPC handlers function registerIPCHandlers() { + // ResetApplicationPreferences IPC Handlers + ipcMain.handle('reset-application-preferences', async () => { + if(applicationInfo) { + const serverIp = await applicationInfo.readValue('serverIp'); + await applicationInfo.resetFile(); + await applicationInfo.writeValue('serverIp', serverIp); + } + + if(userConfig) { + await userConfig.resetFile(); + await userConfig.writeValue('app_type', 'ceo'); + } + + if(memoryManager) { + await memoryManager.resetFile(); + } + + if(sendFileQueue) { + sendFileQueue.clearQueue(); + } + + if(workerManager) { + workerManager.closeAllWorkers(); + await new Promise(resolve => setTimeout(resolve, 3000)); + workerManager.startNetworkScannerWorker(UDP_PORT, 'login', 'uc_not_found', path.join(pathToJsons, 'application.json')); + workerManager.startDirectoriesWatchersWorker(path.join(pathToJsons, 'memory.json'), path.join(pathToJsons, 'application.json')); + workerManager.startServersWorker(HOST, UDP_PORT, TCP_PORT); + workerManager.startResourceCoordinatorWorker( + path.join(pathToJsons, 'userConfig.json'), + path.join(pathToJsons, 'application.json'), + path.join(pathToJsons, 'memory.json'), + path.join(pathToJsons, 'sendFileTasks.json'), + TCP_PORT + ); + } + }); + // Window Manager IPC Handlers ipcMain.handle('show-alert', async (event: IpcMainInvokeEvent, message: string) => { if (!windowManager) throw new Error('WindowManager is not initialized.'); @@ -251,7 +297,11 @@ function registerIPCHandlers() { ipcMain.handle('reset-application-json-files', async () => { if (!applicationInfo) throw new Error('ApplicationInfo is not initialized.'); - return applicationInfo.resetFile(); + const serverIp = await applicationInfo.readValue('serverIp'); + await applicationInfo.resetFile(); + if(serverIp) { + await applicationInfo.writeValue('serverIp', serverIp); + } }); ipcMain.handle('remove-application-json-files-key', async (_event: IpcMainInvokeEvent, key: string) => { @@ -280,13 +330,18 @@ function registerIPCHandlers() { return memoryManager.removeMetaInformation(id); }); + ipcMain.handle('memory-reset', async () => { + if (!memoryManager) throw new Error('MemoryManager is not initialized.'); + return memoryManager.resetFile(); + }); + // Queue IPC Handlers ipcMain.handle('add-task-to-send-file-queue', async (event: IpcMainInvokeEvent, task: FileItemTask) => { if (!sendFileQueue) throw new Error('SendFileQueue is not initialized.'); sendFileQueue.enqueue(task); }); - // BackupRetrievalWorker IPC Handler + // Workers IPC Handlers ipcMain.handle('start-backup-retrieval', async (_event: IpcMainInvokeEvent, destinationPath: string) => { if (!workerManager) throw new Error('WorkerManager is not initialized.'); return workerManager.startBackupRetrievalWorker( @@ -296,4 +351,13 @@ function registerIPCHandlers() { destinationPath ); }); + + ipcMain.handle('start-announcement-worker', async (_event: IpcMainInvokeEvent, message: string) => { + if (!workerManager) throw new Error('WorkerManager is not initialized.'); + return workerManager.startAnnouncementWorker( + path.join(pathToJsons, 'application.json'), + TCP_PORT, + message + ); + }); } \ No newline at end of file diff --git a/CEO/src/main/preload.ts b/CEO/src/main/preload.ts index 0aa21cc..2643ba9 100644 --- a/CEO/src/main/preload.ts +++ b/CEO/src/main/preload.ts @@ -27,6 +27,7 @@ contextBridge.exposeInMainWorld('electronAPI', { readMemoryEntry: (id: string): Promise => ipcRenderer.invoke('memory-read-entry', id), updateMemoryEntry: (id: string, data: any): Promise => ipcRenderer.invoke('memory-update-entry', id, data), removeMemoryEntry: (id: string): Promise => ipcRenderer.invoke('memory-remove-entry', id), + resetMemory: (): Promise => ipcRenderer.invoke('memory-reset'), // UI methods showAlert: (message: string): Promise => ipcRenderer.invoke('show-alert', message), @@ -38,6 +39,7 @@ contextBridge.exposeInMainWorld('electronAPI', { // Queue methods addTaskToSendFileQueue: (task: FileItemTask): Promise => ipcRenderer.invoke('add-task-to-send-file-queue', task), - // BackupRetrievalWorker - startBackupRetrieval: (destinationPath: string): Promise => ipcRenderer.invoke('start-backup-retrieval', destinationPath) + // Workers + startBackupRetrieval: (destinationPath: string): Promise => ipcRenderer.invoke('start-backup-retrieval', destinationPath), + startAnnouncementWorker: (message: string): Promise => ipcRenderer.invoke('start-announcement-worker', message), }); diff --git a/CEO/src/network/operation_codes.ts b/CEO/src/network/operation_codes.ts index 7e6835e..1bd466f 100644 --- a/CEO/src/network/operation_codes.ts +++ b/CEO/src/network/operation_codes.ts @@ -1,4 +1,5 @@ export let operationCodes = { + // General Operations HEARTBEAT: 'HEARTBEAT', ALIVE: 'ALIVE', SET_PUBLIC_KEY: 'SET_PUBLIC_KEY', @@ -9,20 +10,23 @@ export let operationCodes = { END: 'END', UNKNOWN_COMMAND: 'UNKNOWN_COMMAND', + // Auth Operations LOGIN: 'LOGIN', SIGN_UP: 'SIGN_UP', RESET_PASSWORD: 'RESET_PASSWORD', + FIND_BY_EMAIL: 'FIND_BY_EMAIL', + MODIFY_USER: 'MODIFY_USER', + GET_DEPARTMENTS: 'GET_DEPARTMENTS', CREATE_DEPARTMENT: 'CREATE_DEPARTMENT', MODIFY_DEPARTMENT: 'MODIFY_DEPARTMENT', DELETE_DEPARTMENT: 'DELETE_DEPARTMENT', GET_USERS: 'GET_USERS', - DELETE_USER: 'DELETE_USER', FIND_KEY_BY_USER_ID: 'FIND_KEY_BY_USER_ID', - FIND_BY_EMAIL: 'FIND_BY_EMAIL', - MODIFY_USER: 'MODIFY_USER', + DELETE_USER: 'DELETE_USER', + SEND_ANNOUNCEMENT: 'SEND_ANNOUNCEMENT', GET_USER_INFORMATION: 'GET_USER_INFORMATION', CLEAR_BACKUP: 'CLEAR_BACKUP', diff --git a/CEO/src/network/operations_base/operation_base.ts b/CEO/src/network/operations_base/operation_base.ts index d0d62da..70fc47b 100644 --- a/CEO/src/network/operations_base/operation_base.ts +++ b/CEO/src/network/operations_base/operation_base.ts @@ -12,19 +12,16 @@ export abstract class OperationBase implements OperationPlugin { // Default handler for OK operation public static handleOk(parsedMessage: ParsedMessage): ParsedMessage { - console.log('OK operation received'); return parsedMessage; // Typically, you would just acknowledge with OK, returning as-is } // Default handler for ERR operation public static handleErr(parsedMessage: ParsedMessage): ParsedMessage { - console.log('ERR operation received: ', parsedMessage.metaInfo?.message || 'No error details provided'); return parsedMessage; // Typically, you would log the error and return } // Default handler for END operation public static handleEnd(parsedMessage: ParsedMessage): ParsedMessage { - console.log('END operation received'); return { operationCode: OperationBase.operationCodes.END, metaInfo: { message: 'Connection ended.' }, diff --git a/CEO/src/network/socket_communicator/tcp_client_communicator.ts b/CEO/src/network/socket_communicator/tcp_client_communicator.ts index 7f262e6..6d78dd2 100644 --- a/CEO/src/network/socket_communicator/tcp_client_communicator.ts +++ b/CEO/src/network/socket_communicator/tcp_client_communicator.ts @@ -137,8 +137,6 @@ export class TcpClientCommunicator extends SocketCommunicatorBase { messageToProcess = this.decryptWithRsa(incomingMessage); } - console.log(`\n\nComplete Message:\n${messageToProcess}\n\n`); - const result = this.operationHandler.handleOperation(messageToProcess); if(result.operationCode === operationCodes.SET_AES_KEY){ diff --git a/CEO/src/network/tcp/tcp_client.ts b/CEO/src/network/tcp/tcp_client.ts index 557939a..e6d5d62 100644 --- a/CEO/src/network/tcp/tcp_client.ts +++ b/CEO/src/network/tcp/tcp_client.ts @@ -80,9 +80,6 @@ export class TcpClient { // Check if the message is received (based on if lastResult is available) isMessageReceived(): boolean { - console.log('Is message received?'); - console.log(this.lastResult); - console.log(this.lastResult !== null); return this.lastResult !== null; } diff --git a/CEO/src/workers/backup_retrieval_worker.ts b/CEO/src/workers/backup_retrieval_worker.ts index 6e55b4c..337a4a6 100644 --- a/CEO/src/workers/backup_retrieval_worker.ts +++ b/CEO/src/workers/backup_retrieval_worker.ts @@ -23,16 +23,4 @@ const backupRetrievalWorker = new BackupRetrievalWorker( ); // Start the backup retrieval process -backupRetrievalWorker.start() - .then(() => { - parentPort?.postMessage({ - success: true, - message: 'Backup retrieval completed successfully.' - }); - }) - .catch((error: any) => { - parentPort?.postMessage({ - success: false, - message: `Backup retrieval failed: ${error.message}` - }); - }); +backupRetrievalWorker.start(); diff --git a/User/src/workers/watcher_worker.ts b/CEO/src/workers/directories_watcher_worker.ts similarity index 93% rename from User/src/workers/watcher_worker.ts rename to CEO/src/workers/directories_watcher_worker.ts index 36a7262..9e0138f 100644 --- a/User/src/workers/watcher_worker.ts +++ b/CEO/src/workers/directories_watcher_worker.ts @@ -18,7 +18,7 @@ const backupIntervalId = setInterval(async () => { } else { console.log('Retrying BackupDirectoryManager initialization...'); } -}, 60000); // Check every 60 seconds +}, 10000); // Check every 60 seconds // Department share manager check loop @@ -29,7 +29,7 @@ const departmentIntervalId = setInterval(async () => { } else { console.log('Retrying DepartmentShareManager initialization...'); } -}, 60000); // Check every 60 seconds +}, 10000); // Check every 60 seconds // Department share manager check loop const shareIntervalId = setInterval(async () => { @@ -39,5 +39,5 @@ const shareIntervalId = setInterval(async () => { } else { console.log('Retrying DepartmentShareManager initialization...'); } -}, 60000); // Check every 60 seconds +}, 10000); // Check every 60 seconds diff --git a/CEO/src/workers/network_scanner_worker.ts b/CEO/src/workers/network_scanner_worker.ts new file mode 100644 index 0000000..ede8aa5 --- /dev/null +++ b/CEO/src/workers/network_scanner_worker.ts @@ -0,0 +1,94 @@ +import { parentPort, workerData } from 'worker_threads'; +import { JsonManager } from '../helpers/json_manager'; +import { UdpClient } from '../network/udp/udp_client'; + +// Define the structure of workerData +interface WorkerData { + udpPort: number; + okPage: string; + errorPage: string; + applicationInfoPath: string; +} + +// Extract the data passed to the worker +const { udpPort, okPage, errorPage, applicationInfoPath }: WorkerData = workerData; + +// Create a JsonManager instance for application info +const applicationInfo = new JsonManager(applicationInfoPath); +let appStarted = false; +let intervalIds: NodeJS.Timeout[] = []; // Store interval IDs for future clearing + +// Flags to prevent overlapping executions +let ucCheckBusy = false; +let ipLookupBusy = false; + +// Function to schedule the UC check task with dynamic UDP client creation +function startUCCheck(udpPort: number, okPage: string, errorPage: string, interval: number = 5000): void { + const intervalId = setInterval(async () => { + if (ucCheckBusy) return; // If already running, skip this iteration + ucCheckBusy = true; // Mark as busy + + try { + console.log('UC Check running...'); + const udpClient = new UdpClient(udpPort); // Create UdpClient with the provided port + const aliveClients = await udpClient.getAliveClients(); + const storedIp = await applicationInfo.readValue('serverIp'); + const foundClient = aliveClients.length > 0; + + if (foundClient) { + const ipAddress = aliveClients[0]; // Just using the first alive client + + if (!storedIp || storedIp !== ipAddress) { + await applicationInfo.writeValue('serverIp', ipAddress); + if (!appStarted) { + parentPort?.postMessage({ type: 'changeContent', page: okPage }); + } + appStarted = true; + } else if (!appStarted) { + parentPort?.postMessage({ type: 'changeContent', page: okPage }); + appStarted = true; + } + } else { + parentPort?.postMessage({ type: 'changeContent', page: errorPage }); + } + } catch (err) { + console.error('Error checking UC:', err); + parentPort?.postMessage({ type: 'changeContent', page: errorPage }); + } finally { + ucCheckBusy = false; // Mark as not busy + } + }, interval); + + intervalIds.push(intervalId); +} + +// Function to schedule the IP lookup task, storing the active addresses in memory +function startUserIPLookup(udpPort: number, interval: number = 10000): void { + const intervalId = setInterval(async () => { + if (ipLookupBusy) return; // If already running, skip this iteration + ipLookupBusy = true; // Mark as busy + + try { + console.log('IP Lookup running...'); + const serverIp = await applicationInfo.readValue('serverIp'); + const udpClient = new UdpClient(udpPort); // Create a UDP client with the provided port + const activeIPs = await udpClient.getAliveClients(); // Get the list of active IPs + + // Filter out the serverIp from the list of active clients + const filteredIPs = activeIPs.filter(ip => ip !== serverIp); + + // Save the filtered IPs to 'users_ip' + await applicationInfo.writeValue('users_ip', filteredIPs); + } catch (err) { + console.error('Error during user IP lookup:', err); + } finally { + ipLookupBusy = false; // Mark as not busy + } + }, interval); + + intervalIds.push(intervalId); +} + +// Start the UC Check and User IP Lookup tasks +startUCCheck(udpPort, okPage, errorPage); +startUserIPLookup(udpPort); diff --git a/CEO/src/workers/resource_coordinator_worker.ts b/CEO/src/workers/resource_coordinator_worker.ts index 93d5856..c92c215 100644 --- a/CEO/src/workers/resource_coordinator_worker.ts +++ b/CEO/src/workers/resource_coordinator_worker.ts @@ -1,6 +1,6 @@ import { workerData } from 'worker_threads'; import { UsersInfoFetcher } from '../helpers/users_info_fetcher'; -import {BackupManager} from "../helpers/backup_manager"; +import {BackupRetrievalWorker} from "../helpers/backup_manager"; import {FileSharer} from "../helpers/file_sharer"; import {DepartmentSharer} from "../helpers/department_sharer"; @@ -16,7 +16,7 @@ usersInfoFetcher.start() console.error('Error starting Users Info Fetcher:', error); }); -const backupManager = new BackupManager( +const backupManager = new BackupRetrievalWorker( usersConfigPath, applicationInfoPath, memoryManagerPath, diff --git a/CEO/src/workers/send_announcement_worker.ts b/CEO/src/workers/send_announcement_worker.ts new file mode 100644 index 0000000..816b6e7 --- /dev/null +++ b/CEO/src/workers/send_announcement_worker.ts @@ -0,0 +1,19 @@ +import { workerData } from 'worker_threads'; +import { AnnouncementSender} from "../helpers/announcement_sender"; + +// Destructure data passed from the main thread +const { + applicationInfoPath, + clientPort, + message +}: { + applicationInfoPath: string, + clientPort: number, + message: string +} = workerData; + +// Initialize the AnnouncementWorker +const announcementWorker = new AnnouncementSender(applicationInfoPath, clientPort); + +// Start the announcement process and handle results +announcementWorker.start(message); diff --git a/UC/src/db_managers/user_database.ts b/UC/src/db_managers/user_database.ts index 7c8ac70..7e9299a 100644 --- a/UC/src/db_managers/user_database.ts +++ b/UC/src/db_managers/user_database.ts @@ -30,14 +30,15 @@ export class UserDatabase { // Create the table if it doesn't exist private createTableIfNotExists() { const createTableQuery = ` - CREATE TABLE IF NOT EXISTS users ( + CREATE TABLE IF NOT EXISTS users ( id TEXT PRIMARY KEY, name TEXT NOT NULL, email TEXT NOT NULL UNIQUE, salt TEXT NOT NULL, hashedPassword TEXT NOT NULL, departmentId TEXT NOT NULL, - app_type TEXT NOT NULL + app_type TEXT NOT NULL, + FOREIGN KEY (departmentId) REFERENCES departments(id) ON DELETE CASCADE ); `; this.db.exec(createTableQuery); diff --git a/User/.env b/User/.env index c411426..abdda81 100644 --- a/User/.env +++ b/User/.env @@ -1,4 +1,2 @@ UDP_PORT=41234 -TCP_PORT=41233 - -HOST=0.0.0.0 \ No newline at end of file +TCP_PORT=41233 \ No newline at end of file diff --git a/User/package-lock.json b/User/package-lock.json index 4c0237b..6a9924e 100644 --- a/User/package-lock.json +++ b/User/package-lock.json @@ -10,17 +10,20 @@ "license": "ISC", "dependencies": { "dotenv": "^16.4.5", - "electron": "^32.0.1", "ping": "^0.4.4", "uuid": "^10.0.0" }, "devDependencies": { - "@types/electron": "^1.6.10", - "@types/node": "^22.6.1", + "@electron-forge/cli": "^6.0.0", + "@electron-forge/maker-deb": "^6.0.0", + "@electron-forge/maker-rpm": "^6.0.0", + "@electron-forge/maker-squirrel": "^6.0.0", + "@electron-forge/maker-zip": "^6.0.0", "@types/ping": "^0.4.4", "@types/uuid": "^10.0.0", "copyfiles": "^2.4.1", "del-cli": "^5.0.0", + "electron": "^33.0.2", "typescript": "^5.6.2" } }, @@ -111,10 +114,393 @@ "node": ">=0.8.0" } }, + "node_modules/@electron-forge/cli": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-6.4.2.tgz", + "integrity": "sha512-bM6YVTV0uUEpIL1jkpARlSm4Li26XZn+avC/lyTdpPqnd65T/oXZNkrAD+2Jb0RlgplOaM21qWm7ybtvKDGDyA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.electron-forge-cli?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "MIT", + "dependencies": { + "@electron-forge/core": "6.4.2", + "@electron-forge/shared-types": "6.4.2", + "@electron/get": "^2.0.0", + "chalk": "^4.0.0", + "commander": "^4.1.1", + "debug": "^4.3.1", + "fs-extra": "^10.0.0", + "listr2": "^5.0.3", + "semver": "^7.2.1" + }, + "bin": { + "electron-forge": "dist/electron-forge.js", + "electron-forge-vscode-nix": "script/vscode.sh", + "electron-forge-vscode-win": "script/vscode.cmd" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/cli/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@electron-forge/cli/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron-forge/core": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-6.4.2.tgz", + "integrity": "sha512-VtrFZ1Q7NG1ov0jJO/tUvUiYdWZ0Y31xw762is/jfpRPD6V/soOpwJJAoWoPK9TZVkTm2pkS8S5LikCMbNCLxw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.electron-forge-core?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "MIT", + "dependencies": { + "@electron-forge/core-utils": "6.4.2", + "@electron-forge/maker-base": "6.4.2", + "@electron-forge/plugin-base": "6.4.2", + "@electron-forge/publisher-base": "6.4.2", + "@electron-forge/shared-types": "6.4.2", + "@electron-forge/template-base": "6.4.2", + "@electron-forge/template-vite": "6.4.2", + "@electron-forge/template-vite-typescript": "6.4.2", + "@electron-forge/template-webpack": "6.4.2", + "@electron-forge/template-webpack-typescript": "6.4.2", + "@electron/get": "^2.0.0", + "@electron/rebuild": "^3.2.10", + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.3.1", + "electron-packager": "^17.1.2", + "fast-glob": "^3.2.7", + "filenamify": "^4.1.0", + "find-up": "^5.0.0", + "fs-extra": "^10.0.0", + "got": "^11.8.5", + "interpret": "^3.1.1", + "listr2": "^5.0.3", + "lodash": "^4.17.20", + "log-symbols": "^4.0.0", + "node-fetch": "^2.6.7", + "progress": "^2.0.3", + "rechoir": "^0.8.0", + "resolve-package": "^1.0.1", + "semver": "^7.2.1", + "source-map-support": "^0.5.13", + "sudo-prompt": "^9.1.1", + "username": "^5.1.0", + "yarn-or-npm": "^3.0.1" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/core-utils": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/core-utils/-/core-utils-6.4.2.tgz", + "integrity": "sha512-CjB3aakmRsXAMMDYc8PxNTMf4FdI29y4PErfv7eCXlL5oo3JW0VSKZIV7R8/Po0S0got85q2kmhZgCKuxL1BNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "6.4.2", + "@electron/rebuild": "^3.2.10", + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.3.1", + "find-up": "^5.0.0", + "fs-extra": "^10.0.0", + "log-symbols": "^4.0.0", + "semver": "^7.2.1", + "yarn-or-npm": "^3.0.1" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/core-utils/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron-forge/core/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron-forge/maker-base": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-6.4.2.tgz", + "integrity": "sha512-zW3GH+LqDK9nxQmQEFkJPR8RqiX0lVk6a4mXll3ngujN1fPevO4ivUAWmaEVeC1dH/hXbN7s9m0S6a37MigftQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "6.4.2", + "fs-extra": "^10.0.0", + "which": "^2.0.2" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/maker-deb": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-6.4.2.tgz", + "integrity": "sha512-tlV8ffivgBP94vtYXgAeXgzeKCaRyLuWH9LT8PQW1QrYbAFpCMmuwk/zFaJkyMklImCWmDFTPYMEqdEJGd7Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/maker-base": "6.4.2", + "@electron-forge/shared-types": "6.4.2" + }, + "engines": { + "node": ">= 14.17.5" + }, + "optionalDependencies": { + "electron-installer-debian": "^3.2.0" + } + }, + "node_modules/@electron-forge/maker-rpm": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-rpm/-/maker-rpm-6.4.2.tgz", + "integrity": "sha512-+hfbY5pYbAer0y07OtOzVgVBHoTRmemqqZ//T0mKJpyK2ThHKGTvyW8FFlr5jlQs5LoDCM2WHKE8oGtRhivsMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/maker-base": "6.4.2", + "@electron-forge/shared-types": "6.4.2" + }, + "engines": { + "node": ">= 14.17.5" + }, + "optionalDependencies": { + "electron-installer-redhat": "^3.2.0" + } + }, + "node_modules/@electron-forge/maker-squirrel": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-6.4.2.tgz", + "integrity": "sha512-ukK3RcFaBrQXUzR52PsHxfwDq5XKSnj6A1kkXiyHWqgj+HIU97prBScBb5JRtasPvYN+nDdQO2vlInsLaqcx9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/maker-base": "6.4.2", + "@electron-forge/shared-types": "6.4.2", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 14.17.5" + }, + "optionalDependencies": { + "electron-winstaller": "^5.0.0" + } + }, + "node_modules/@electron-forge/maker-zip": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-6.4.2.tgz", + "integrity": "sha512-k2nfhhnxcYbUS7rCKCisuqEalxtH9l73+lrtfL0aQZiE/BLbDXyNckDIDOPvX0tBEg62nVzUdJonZwOhZVvAMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/maker-base": "6.4.2", + "@electron-forge/shared-types": "6.4.2", + "cross-zip": "^4.0.0", + "fs-extra": "^10.0.0", + "got": "^11.8.5" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/plugin-base": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-6.4.2.tgz", + "integrity": "sha512-g6AAtQ7fZ94djBmwcnWasQ8xgaNVNjgaQ00GLK0NkmQ7n0PNbsnlMDuw9vdfTiL6WaLg5nxNSYc9bFJP/rtyeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "6.4.2" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/publisher-base": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-6.4.2.tgz", + "integrity": "sha512-Tnf9O8MFzdT1gsb5EDDaQUoslt7gUuUywtsr+lT/fpBlBQbei2fvioTwvZ1Q1cmsKnld7XhRh6unfgdWLTZzgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "6.4.2" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/shared-types": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.4.2.tgz", + "integrity": "sha512-DKOUMsdTXZIq8XiqY0Hi3C+dam/JKUnvfBjwcUeyZqPdgEE1qry8xZmmjorXuLrRf1Jq8rhxYGQInSK4af0QYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/rebuild": "^3.2.10", + "electron-packager": "^17.1.2", + "listr2": "^5.0.3" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/template-base": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-6.4.2.tgz", + "integrity": "sha512-vsQh+64Fr2Vxg6k8DAahWq4MAdB2F2qTig+LgIJENv8ksbzC1YIq05SBAS/g2674cdr7WdwyukMy2rgxe3rhnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "6.4.2", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "fs-extra": "^10.0.0", + "username": "^5.1.0" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/template-vite": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-vite/-/template-vite-6.4.2.tgz", + "integrity": "sha512-NX7jHRblBmIqufMbqWgpI/VnpgF/qMSTq9ZPmDSXamBhid336MC6+DoWzDpXceQZEp0m/jpMLR04ynr8O4jGlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "6.4.2", + "@electron-forge/template-base": "6.4.2", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + } + }, + "node_modules/@electron-forge/template-vite-typescript": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-vite-typescript/-/template-vite-typescript-6.4.2.tgz", + "integrity": "sha512-h3pn6onvC/nLglmJuelYU82Qzrh0l6MqvbBGoT39bbDoRLIqmlhWTWppHgDJVXAGrSoH+9BEpptipeBQWirFwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "6.4.2", + "@electron-forge/template-base": "6.4.2", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + } + }, + "node_modules/@electron-forge/template-webpack": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-6.4.2.tgz", + "integrity": "sha512-9QYr/td4cmnGOj8UF25W6An/eI+JXj9T/b+KFybL3cQ87H1yrQOn2T84Bm5/JaB4SPdIu4FdKRjqwR7C7R0g2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "6.4.2", + "@electron-forge/template-base": "6.4.2", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron-forge/template-webpack-typescript": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-6.4.2.tgz", + "integrity": "sha512-MPAZQ4v6piCED7NT1LTVQf61o6Eg/laNoKbhbrFBSH1i20OUwbtV2MLj6Op292ynI9+1qdHKmFgctr6qPTCAQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-forge/shared-types": "6.4.2", + "@electron-forge/template-base": "6.4.2", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": ">= 14.17.5" + } + }, + "node_modules/@electron/asar": { + "version": "3.2.14", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.14.tgz", + "integrity": "sha512-hc52QkesULqbxTRC1vOmSBN1YndUkieoNMfvpe988h0MEoGGqbijkOqv4/2M9PufBJxiTVoDdBmBFfXPowZDQg==", + "dev": true, + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, "node_modules/@electron/get": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "dev": true, "dependencies": { "debug": "^4.1.1", "env-paths": "^2.2.0", @@ -135,6 +521,7 @@ "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, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -148,6 +535,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -156,10 +544,190 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, "engines": { "node": ">= 4.0.0" } }, + "node_modules/@electron/osx-sign": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.1.tgz", + "integrity": "sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==", + "dev": true, + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/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, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/rebuild": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.6.1.tgz", + "integrity": "sha512-f6596ZHpEq/YskUd8emYvOUne89ij8mQgjYFA5ru25QwbrRO+t1SImofdDv7kKOuWCmVOuU5tvfkbgGxIl3E/w==", + "dev": true, + "dependencies": { + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.1.1", + "detect-libc": "^2.0.1", + "fs-extra": "^10.0.0", + "got": "^11.7.0", + "node-abi": "^3.45.0", + "node-api-version": "^0.2.0", + "node-gyp": "^9.0.0", + "ora": "^5.1.0", + "read-binary-file-arch": "^1.0.6", + "semver": "^7.3.5", + "tar": "^6.0.5", + "yargs": "^17.0.1" + }, + "bin": { + "electron-rebuild": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@electron/rebuild/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, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/rebuild/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/rebuild/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, + "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/@electron/rebuild/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, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/windows-sign": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.1.3.tgz", + "integrity": "sha512-OqVSdAe+/88fIjvTDWiy+5Ho1nXsiBhE5RTsIQ6M/zcxcDAEP2TlQCkOyusItnmzXRN+XTFaK9gKhiZ6KGyXQw==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "dependencies": { + "cross-dirname": "^0.1.0", + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8", + "postject": "^1.0.0-alpha.6" + }, + "bin": { + "electron-windows-sign": "bin/electron-windows-sign.js" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/windows-sign/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", + "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" + } + ], + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 12.13.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -195,10 +763,50 @@ "node": ">= 8" } }, + "node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.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==", + "dev": true, "engines": { "node": ">=10" }, @@ -210,6 +818,7 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, "dependencies": { "defer-to-connect": "^2.0.0" }, @@ -217,10 +826,20 @@ "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, + "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", "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", @@ -228,29 +847,51 @@ "@types/responselike": "^1.0.0" } }, - "node_modules/@types/electron": { - "version": "1.6.10", - "resolved": "https://registry.npmjs.org/@types/electron/-/electron-1.6.10.tgz", - "integrity": "sha512-MOCVyzIwkBEloreoCVrTV108vSf8fFIJPsGruLCoAoBZdxtnJUqKA4lNonf/2u1twSjAspPEfmEheC+TLm/cMw==", - "deprecated": "This is a stub types definition for electron (https://github.com/electron/electron). electron provides its own type definitions, so you don't need @types/electron installed!", + "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, + "optional": true, "dependencies": { - "electron": "*" + "@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", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true }, "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==", + "dev": true, "dependencies": { "@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/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", @@ -261,6 +902,7 @@ "version": "22.6.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.6.1.tgz", "integrity": "sha512-V48tCfcKb/e6cVUigLAaJDAILdMP0fUW6BidkPK4GpGjXcfbnoHasCZDwz3N3yVt5we2RHm4XTQCpv0KJz9zqw==", + "dev": true, "dependencies": { "undici-types": "~6.19.2" } @@ -281,6 +923,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -295,11 +938,39 @@ "version": "2.10.3", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, "optional": true, "dependencies": { "@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, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dev": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/aggregate-error": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", @@ -316,6 +987,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -340,6 +1040,69 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/are-we-there-yet/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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" + } + ] + }, + "node_modules/are-we-there-yet/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -349,16 +1112,149 @@ "node": ">=0.10.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", + "optional": true, + "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/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, + "engines": { + "node": ">=8" + } + }, + "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, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/author-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz", + "integrity": "sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, "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 }, + "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" + } + ] + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bl/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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" + } + ] + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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 + }, "node_modules/boolean": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "dev": true, "optional": true }, "node_modules/brace-expansion": { @@ -383,18 +1279,188 @@ "node": ">=8" } }, + "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" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "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==", + "dev": true, "engines": { "node": "*" } }, + "node_modules/buffer-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", + "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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 + }, + "node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/cacache/node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/cacache/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, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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==", + "dev": true, "engines": { "node": ">=10.6.0" } @@ -403,6 +1469,7 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -458,6 +1525,59 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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, + "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/chalk/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "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, + "optional": true + }, "node_modules/clean-stack": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", @@ -485,6 +1605,46 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "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": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -496,10 +1656,20 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "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==", + "dev": true, "dependencies": { "mimic-response": "^1.0.0" }, @@ -525,12 +1695,52 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "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, + "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, + "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 }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, "node_modules/copyfiles": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", @@ -556,10 +1766,105 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, + "node_modules/cross-dirname": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", + "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn-windows-exe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cross-spawn-windows-exe/-/cross-spawn-windows-exe-1.2.0.tgz", + "integrity": "sha512-mkLtJJcYbDCxEG7Js6eUnUNndWjyUZwJ3H7bErmmtOYU/Zb99DyUkpamuIZE0b3bhmJyZ7D90uS6f+CGxRRjOw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-cross-spawn-windows-exe?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "@malept/cross-spawn-promise": "^1.1.0", + "is-wsl": "^2.2.0", + "which": "^2.0.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cross-spawn-windows-exe/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/cross-zip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cross-zip/-/cross-zip-4.0.1.tgz", + "integrity": "sha512-n63i0lZ0rvQ6FXiGQ+/JFCKAUyPFhLQYJIqKaa+tSJtfKeULF/IDNDAbdnSIxgS4NTuw2b0+lj8LzfITuq+ZxQ==", + "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", + "engines": { + "node": ">=12.10" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -622,6 +1927,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, "dependencies": { "mimic-response": "^3.1.0" }, @@ -636,6 +1942,7 @@ "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==", + "dev": true, "engines": { "node": ">=10" }, @@ -643,10 +1950,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "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==", + "dev": true, "engines": { "node": ">=10" } @@ -655,6 +1975,7 @@ "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==", + "dev": true, "optional": true, "dependencies": { "es-define-property": "^1.0.0", @@ -672,6 +1993,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, "optional": true, "dependencies": { "define-data-property": "^1.0.1", @@ -727,10 +2049,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, "optional": true }, "node_modules/dir-glob": { @@ -757,10 +2095,12 @@ } }, "node_modules/electron": { - "version": "32.0.1", - "resolved": "https://registry.npmjs.org/electron/-/electron-32.0.1.tgz", - "integrity": "sha512-5Hd5Jaf9niYVR2hZxoRd3gOrcxPOxQV1XPV5WaoSfT9jLJHFadhlKtuSDIk3U6rQZke+aC7GqPPAv55nWFCMsA==", + "version": "33.0.2", + "resolved": "https://registry.npmjs.org/electron/-/electron-33.0.2.tgz", + "integrity": "sha512-C2WksfP0COsMHbYXSJG68j6S3TjuGDrw/YT42B526yXalIlNQZ2GeAYKryg6AEMkIp3p8TUfDRD0+HyiyCt/nw==", + "dev": true, "hasInstallScript": true, + "license": "MIT", "dependencies": { "@electron/get": "^2.0.0", "@types/node": "^20.9.0", @@ -773,10 +2113,466 @@ "node": ">= 12.20.55" } }, + "node_modules/electron-installer-common": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/electron-installer-common/-/electron-installer-common-0.10.3.tgz", + "integrity": "sha512-mYbP+6i+nHMIm0WZHXgGdmmXMe+KXncl6jZYQNcCF9C1WsNA9C5SZ2VP4TLQMSIoFO+X4ugkMEA5uld1bmyEvA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@malept/cross-spawn-promise": "^1.0.0", + "asar": "^3.0.0", + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "glob": "^7.1.4", + "lodash": "^4.17.15", + "parse-author": "^2.0.0", + "semver": "^7.1.1", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "url": "https://github.com/electron-userland/electron-installer-common?sponsor=1" + }, + "optionalDependencies": { + "@types/fs-extra": "^9.0.1" + } + }, + "node_modules/electron-installer-common/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", + "optional": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/electron-installer-common/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", + "optional": true, + "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-installer-common/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-installer-debian": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/electron-installer-debian/-/electron-installer-debian-3.2.0.tgz", + "integrity": "sha512-58ZrlJ1HQY80VucsEIG9tQ//HrTlG6sfofA3nRGr6TmkX661uJyu4cMPPh6kXW+aHdq/7+q25KyQhDrXvRL7jw==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin", + "linux" + ], + "dependencies": { + "@malept/cross-spawn-promise": "^1.0.0", + "debug": "^4.1.1", + "electron-installer-common": "^0.10.2", + "fs-extra": "^9.0.0", + "get-folder-size": "^2.0.1", + "lodash": "^4.17.4", + "word-wrap": "^1.2.3", + "yargs": "^16.0.2" + }, + "bin": { + "electron-installer-debian": "src/cli.js" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-installer-debian/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", + "optional": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/electron-installer-debian/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", + "optional": true, + "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-installer-redhat": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/electron-installer-redhat/-/electron-installer-redhat-3.4.0.tgz", + "integrity": "sha512-gEISr3U32Sgtj+fjxUAlSDo3wyGGq6OBx7rF5UdpIgbnpUvMN4W5uYb0ThpnAZ42VEJh/3aODQXHbFS4f5J3Iw==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin", + "linux" + ], + "dependencies": { + "@malept/cross-spawn-promise": "^1.0.0", + "debug": "^4.1.1", + "electron-installer-common": "^0.10.2", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "word-wrap": "^1.2.3", + "yargs": "^16.0.2" + }, + "bin": { + "electron-installer-redhat": "src/cli.js" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-installer-redhat/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", + "optional": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/electron-installer-redhat/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", + "optional": true, + "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-packager": { + "version": "17.1.2", + "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-17.1.2.tgz", + "integrity": "sha512-XofXdikjYI7MVBcnXeoOvRR+yFFFHOLs3J7PF5KYQweigtgLshcH4W660PsvHr4lYZ03JBpLyEcUB8DzHZ+BNw==", + "deprecated": "Please use @electron/packager moving forward. There is no API change, just a package name change", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@electron/asar": "^3.2.1", + "@electron/get": "^2.0.0", + "@electron/notarize": "^1.2.3", + "@electron/osx-sign": "^1.0.5", + "@electron/universal": "^1.3.2", + "cross-spawn-windows-exe": "^1.2.0", + "debug": "^4.0.1", + "extract-zip": "^2.0.0", + "filenamify": "^4.1.0", + "fs-extra": "^11.1.0", + "galactus": "^1.0.0", + "get-package-info": "^1.0.0", + "junk": "^3.1.0", + "parse-author": "^2.0.0", + "plist": "^3.0.0", + "rcedit": "^3.0.1", + "resolve": "^1.1.6", + "semver": "^7.1.3", + "yargs-parser": "^21.1.1" + }, + "bin": { + "electron-packager": "bin/electron-packager.js" + }, + "engines": { + "node": ">= 14.17.5" + }, + "funding": { + "url": "https://github.com/electron/electron-packager?sponsor=1" + } + }, + "node_modules/electron-packager/node_modules/@electron/notarize": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.4.tgz", + "integrity": "sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/electron-packager/node_modules/@electron/notarize/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-packager/node_modules/@electron/universal": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz", + "integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "^3.2.1", + "@malept/cross-spawn-promise": "^1.1.0", + "debug": "^4.3.1", + "dir-compare": "^3.0.0", + "fs-extra": "^9.0.1", + "minimatch": "^3.0.4", + "plist": "^3.0.4" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/electron-packager/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-packager/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/electron-packager/node_modules/dir-compare": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", + "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-equal": "^1.0.0", + "minimatch": "^3.0.4" + } + }, + "node_modules/electron-packager/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/electron-packager/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/electron-packager/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/electron-winstaller": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", + "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.21", + "temp": "^0.9.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "@electron/windows-sign": "^1.1.2" + } + }, + "node_modules/electron-winstaller/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/electron-winstaller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optional": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-winstaller/node_modules/universalify": { + "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", + "optional": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/electron/node_modules/@types/node": { "version": "20.16.6", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.6.tgz", "integrity": "sha512-T7PpxM/6yeDE+AdlVysT62BX6/bECZOmQAgiFg5NoBd5MQheZ3tzal7f1wvzfiEcmrcJNRi2zRr2nY2zF+0uqw==", + "dev": true, "dependencies": { "undici-types": "~6.19.2" } @@ -787,10 +2583,21 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, "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==", + "dev": true, "dependencies": { "once": "^1.4.0" } @@ -799,10 +2606,17 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, "engines": { "node": ">=6" } }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -816,6 +2630,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, "optional": true, "dependencies": { "get-intrinsic": "^1.2.4" @@ -828,6 +2643,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, "optional": true, "engines": { "node": ">= 0.4" @@ -837,6 +2653,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, "optional": true }, "node_modules/escalade": { @@ -852,6 +2669,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, "optional": true, "engines": { "node": ">=10" @@ -860,10 +2678,135 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, "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==", + "dev": true, "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -908,10 +2851,39 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, "dependencies": { "pend": "~1.2.0" } }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz", + "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -940,6 +2912,46 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/flora-colossus": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flora-colossus/-/flora-colossus-2.0.0.tgz", + "integrity": "sha512-dz4HxH6pOvbUzZpZ/yXhafjbR2I8cenK5xL0KtBFb7U2ADsR+OwXifnxZjij/pZWF775uSCMzWVd+jDik2H2IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "fs-extra": "^10.1.0" + }, + "engines": { + "node": ">= 12" + } + }, + "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, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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, + "dependencies": { + "minipass": "^3.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", @@ -950,11 +2962,55 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "devOptional": true, + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/galactus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/galactus/-/galactus-1.0.0.tgz", + "integrity": "sha512-R1fam6D4CyKQGNlvJne4dkNF+PvUUl7TAJInvTGa9fti9qAv95quQz29GXapA4d8Ec266mJJxFVh82M4GIIGDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "flora-colossus": "^2.0.0", + "fs-extra": "^10.1.0" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/gar": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/gar/-/gar-1.0.4.tgz", + "integrity": "sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -964,10 +3020,36 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-folder-size": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz", + "integrity": "sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "gar": "^1.0.4", + "tiny-each-async": "2.0.3" + }, + "bin": { + "get-folder-size": "bin/get-folder-size" + } + }, + "node_modules/get-installed-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/get-installed-path/-/get-installed-path-2.1.1.tgz", + "integrity": "sha512-Qkn9eq6tW5/q9BDVdMpB8tOHljX9OSP0jRC5TRNVA4qRc839t4g8KQaR8t0Uv0EFVL0MlyG7m/ofjEgAROtYsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-modules": "1.0.0" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, "optional": true, "dependencies": { "es-errors": "^1.3.0", @@ -983,10 +3065,179 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-package-info": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz", + "integrity": "sha512-SCbprXGAPdIhKAXiG+Mk6yeoFH61JlYunqdFQFHDtLjJlDjFf6x07dsS8acO+xWt52jpdVo49AlVDnUVK1sDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "^3.1.1", + "debug": "^2.2.0", + "lodash.get": "^4.0.0", + "read-pkg-up": "^2.0.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/get-package-info/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/get-package-info/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-package-info/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/get-package-info/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-package-info/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/get-package-info/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/get-package-info/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-package-info/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-package-info/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/get-package-info/node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-package-info/node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-package-info/node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-package-info/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, "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==", + "dev": true, "dependencies": { "pump": "^3.0.0" }, @@ -1034,6 +3285,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, "optional": true, "dependencies": { "boolean": "^3.0.1", @@ -1051,6 +3303,7 @@ "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, "optional": true, "dependencies": { "lru-cache": "^6.0.0" @@ -1062,10 +3315,56 @@ "node": ">=10" } }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/globalthis": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, "optional": true, "dependencies": { "define-properties": "^1.1.3" @@ -1100,6 +3399,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, "optional": true, "dependencies": { "get-intrinsic": "^1.1.3" @@ -1112,6 +3412,7 @@ "version": "11.8.6", "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -1135,7 +3436,8 @@ "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==" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true }, "node_modules/hard-rejection": { "version": "2.1.0", @@ -1159,6 +3461,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "optional": true, "dependencies": { "es-define-property": "^1.0.0" @@ -1171,6 +3474,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, "optional": true, "engines": { "node": ">= 0.4" @@ -1183,6 +3487,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, "optional": true, "engines": { "node": ">= 0.4" @@ -1191,11 +3496,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "devOptional": true, + "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -1203,6 +3514,19 @@ "node": ">= 0.4" } }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", @@ -1218,12 +3542,14 @@ "node_modules/http-cache-semantics": { "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==" + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true }, "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==", + "dev": true, "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" @@ -1232,6 +3558,48 @@ "node": ">=10.19.0" } }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "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, + "optional": true, + "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" + } + ] + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -1241,6 +3609,15 @@ "node": ">= 4" } }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, "node_modules/indent-string": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", @@ -1253,6 +3630,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -1270,6 +3653,36 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -1291,6 +3704,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1321,6 +3750,21 @@ "node": ">=0.10.0" } }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -1363,22 +3807,80 @@ "node": ">=0.10.0" } }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, "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==" + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -1390,12 +3892,36 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, "optional": true }, + "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, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "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==", + "dev": true, "dependencies": { "json-buffer": "3.0.1" } @@ -1415,6 +3941,113 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "node_modules/listr2": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", + "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.19", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.8.0", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/listr2/node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2/node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/listr2/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -1430,10 +4063,92 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, "engines": { "node": ">=8" } @@ -1442,7 +4157,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "devOptional": true, + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -1450,6 +4165,94 @@ "node": ">=10" } }, + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/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, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/make-fetch-happen/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, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/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, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", @@ -1466,6 +4269,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, "optional": true, "dependencies": { "escape-string-regexp": "^4.0.0" @@ -1474,6 +4278,21 @@ "node": ">=10" } }, + "node_modules/mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/meow": { "version": "10.1.5", "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", @@ -1534,10 +4353,20 @@ "node": ">=8.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "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==", + "dev": true, "engines": { "node": ">=4" } @@ -1563,6 +4392,15 @@ "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, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/minimist-options": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", @@ -1577,6 +4415,96 @@ "node": ">= 6" } }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "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, + "dependencies": { + "minipass": "^3.0.0", + "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", @@ -1592,7 +4520,127 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-abi": { + "version": "3.71.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", + "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-api-version": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.0.tgz", + "integrity": "sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + } + }, + "node_modules/node-api-version/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/node-gyp/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, "node_modules/noms": { "version": "0.0.0", @@ -1604,6 +4652,21 @@ "readable-stream": "~1.0.31" } }, + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/normalize-package-data": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", @@ -1635,6 +4698,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, "engines": { "node": ">=10" }, @@ -1642,10 +4706,50 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "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==", + "dev": true, "optional": true, "engines": { "node": ">= 0.4" @@ -1655,18 +4759,88 @@ "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, "dependencies": { "wrappy": "1" } }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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==", + "dev": true, "engines": { "node": ">=8" } }, + "node_modules/p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -1712,6 +4886,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-author": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", + "integrity": "sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "author-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -1730,6 +4927,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -1748,6 +4955,22 @@ "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -1760,7 +4983,8 @@ "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==" + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true }, "node_modules/picocolors": { "version": "1.1.1", @@ -1780,6 +5004,16 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ping": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/ping/-/ping-0.4.4.tgz", @@ -1788,6 +5022,127 @@ "node": ">=4.0.0" } }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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, + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/postject": { + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", + "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "commander": "^9.4.0" + }, + "bin": { + "postject": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/postject/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -1798,14 +5153,35 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, "engines": { "node": ">=0.4.0" } }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -1835,6 +5211,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, "engines": { "node": ">=10" }, @@ -1842,6 +5219,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/rcedit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-3.1.0.tgz", + "integrity": "sha512-WRlRdY1qZbu1L11DklT07KuHfRk42l0NFFJdaExELEu4fEQ982bP5Z6OWGPj/wLLIuKRQDCxZJGAwoFsxhZhNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn-windows-exe": "^1.1.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, "node_modules/read-pkg": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", @@ -1913,6 +5315,19 @@ "string_decoder": "~0.10.x" } }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, "node_modules/redent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", @@ -1938,15 +5353,63 @@ "node": ">=0.10.0" } }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "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==" + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-package": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-package/-/resolve-package-1.0.1.tgz", + "integrity": "sha512-rzB7NnQpOkPHBWFPP3prUMqOP6yg3HkRGgcvR+lDyvyHoY3fZLFLYDkPXh78SPVBAE6VTCk/V+j8we4djg6o4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-installed-path": "^2.0.3" + }, + "engines": { + "node": ">=4", + "npm": ">=2" + } }, "node_modules/responselike": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, "dependencies": { "lowercase-keys": "^2.0.0" }, @@ -1954,6 +5417,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -1964,6 +5449,13 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -1984,6 +5476,7 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, "optional": true, "dependencies": { "boolean": "^3.0.1", @@ -2020,16 +5513,34 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, + "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, + "optional": true + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -2038,12 +5549,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, "optional": true }, "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==", + "dev": true, "optional": true, "dependencies": { "type-fest": "^0.13.1" @@ -2055,6 +5568,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "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, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -2067,6 +5613,89 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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, + "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, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dev": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/socks-proxy-agent/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, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.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, + "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, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -2103,7 +5732,19 @@ "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==", - "optional": true + "dev": true + }, + "node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } }, "node_modules/string_decoder": { "version": "0.10.31", @@ -2137,6 +5778,26 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-indent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", @@ -2152,10 +5813,41 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-outer/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/sudo-prompt": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", + "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/sumchecker": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, "dependencies": { "debug": "^4.1.0" }, @@ -2175,6 +5867,96 @@ "node": ">=4" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "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/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, "node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -2215,6 +5997,34 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/tiny-each-async": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz", + "integrity": "sha512-5ROII7nElnAirvFn8g7H7MtpfV1daMcyfTGQwsn/x2VtyV+VPiO5CjReCJtWLvoKTDEDmZocf3cNPraiMnBXLA==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "optional": true, + "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, + "optional": true, + "dependencies": { + "tmp": "^0.2.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -2227,6 +6037,13 @@ "node": ">=8.0" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, "node_modules/trim-newlines": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", @@ -2239,10 +6056,41 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-repeated/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/tslib": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "dev": true, + "license": "0BSD" + }, "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==", + "dev": true, "optional": true, "engines": { "node": ">=10" @@ -2267,7 +6115,41 @@ "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, + "node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "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, + "engines": { + "node": ">= 10.0.0" + } }, "node_modules/untildify": { "version": "4.0.0", @@ -2278,6 +6160,20 @@ "node": ">=8" } }, + "node_modules/username": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/username/-/username-5.1.0.tgz", + "integrity": "sha512-PCKbdWw85JsYMvmCv5GH3kXmM66rCd9m1hBEDutPNv94b/pqCMT4NtcKyeWYvLFiE8b+ha1Jdl8XAaUdPn5QTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^1.0.0", + "mem": "^4.3.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -2306,6 +6202,68 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.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, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -2326,7 +6284,17 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "engines": { + "node": ">=8.0" + } }, "node_modules/xtend": { "version": "4.0.2", @@ -2350,7 +6318,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true + "dev": true }, "node_modules/yargs": { "version": "16.2.0", @@ -2379,10 +6347,102 @@ "node": ">=10" } }, + "node_modules/yarn-or-npm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/yarn-or-npm/-/yarn-or-npm-3.0.1.tgz", + "integrity": "sha512-fTiQP6WbDAh5QZAVdbMQkecZoahnbOjClTQhzv74WX5h2Uaidj1isf9FDes11TKtsZ0/ZVfZsqZ+O3x6aLERHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.5", + "pkg-dir": "^4.2.0" + }, + "bin": { + "yarn-or-npm": "bin/index.js", + "yon": "bin/index.js" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/yarn-or-npm/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/yarn-or-npm/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/yarn-or-npm/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/yarn-or-npm/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yarn-or-npm/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yarn-or-npm/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "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==", + "dev": true, "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" diff --git a/User/package.json b/User/package.json index 3416073..5753ce8 100644 --- a/User/package.json +++ b/User/package.json @@ -4,25 +4,68 @@ "version": "1.0.0", "description": "Aplicatie P2P pentru stocarea resurselor digitale", "scripts": { - "clean": "del-cli dist", - "start": "tsc && copyfiles -u 1 'src/**/*' dist && electron dist/main/main.js" + "clean": "del-cli dist && del-cli out", + "build-dist": "tsc && copyfiles -u 1 'src/**/*' dist", + "start-dev": "tsc && copyfiles -u 1 'src/**/*' dist && electron dist/main/main.js", + "start": "npm run clean && npm run build-dist && electron-forge start", + "package": "npm run clean && npm run build-dist && electron-forge package", + "make": "npm run clean && npm run build-dist && electron-forge make" }, "main": "dist/main/main.js", "author": "Cerbu Andrei - Mihnea", "license": "ISC", "dependencies": { "dotenv": "^16.4.5", - "electron": "^32.0.1", "ping": "^0.4.4", "uuid": "^10.0.0" }, "devDependencies": { - "@types/electron": "^1.6.10", - "@types/node": "^22.6.1", + "@electron-forge/cli": "^6.0.0", + "@electron-forge/maker-deb": "^6.0.0", + "@electron-forge/maker-rpm": "^6.0.0", + "@electron-forge/maker-squirrel": "^6.0.0", + "@electron-forge/maker-zip": "^6.0.0", "@types/ping": "^0.4.4", "@types/uuid": "^10.0.0", "copyfiles": "^2.4.1", "del-cli": "^5.0.0", + "electron": "^33.0.2", "typescript": "^5.6.2" + }, + "config": { + "forge": { + "packagerConfig": { + "name": "ClientApp", + "icon": "../app_icons/icon.ico", + "ignore": [ + "src", + ".idea", + "tsconfig.json" + ] + }, + "makers": [ + { + "name": "@electron-forge/maker-squirrel", + "config": { + "name": "ClientApp", + "setupIcon": "../app_icons/icon.ico" + } + }, + { + "name": "@electron-forge/maker-zip", + "platforms": ["darwin"], + "config": { + "icon": "../app_icons/icon.icns" + } + }, + { + "name": "@electron-forge/maker-deb", + "platforms": ["linux"], + "config": { + "icon": "../app_icons/icon.png" + } + } + ] + } } } diff --git a/User/render/assets/2581896.png b/User/render/assets/2581896.png new file mode 100644 index 0000000..6a3d2a0 Binary files /dev/null and b/User/render/assets/2581896.png differ diff --git a/User/render/assets/background.png b/User/render/assets/background.png deleted file mode 100644 index fc8f921..0000000 Binary files a/User/render/assets/background.png and /dev/null differ diff --git a/User/render/assets/cloud-computing.webp b/User/render/assets/cloud-computing.webp new file mode 100644 index 0000000..1272400 Binary files /dev/null and b/User/render/assets/cloud-computing.webp differ diff --git a/User/render/assets/icon.icns b/User/render/assets/icon.icns new file mode 100644 index 0000000..b5c7217 Binary files /dev/null and b/User/render/assets/icon.icns differ diff --git a/User/render/assets/icon.ico b/User/render/assets/icon.ico new file mode 100644 index 0000000..debc9a2 Binary files /dev/null and b/User/render/assets/icon.ico differ diff --git a/CEO/render/assets/hard-disk.png b/User/render/assets/icon.png similarity index 100% rename from CEO/render/assets/hard-disk.png rename to User/render/assets/icon.png diff --git a/User/render/assets/loading.gif b/User/render/assets/loading.gif deleted file mode 100644 index aaac076..0000000 Binary files a/User/render/assets/loading.gif and /dev/null differ diff --git a/User/render/assets/refresh-data.webp b/User/render/assets/refresh-data.webp new file mode 100644 index 0000000..cb54150 Binary files /dev/null and b/User/render/assets/refresh-data.webp differ diff --git a/User/render/css/announcement.css b/User/render/css/announcement.css new file mode 100644 index 0000000..13830c0 --- /dev/null +++ b/User/render/css/announcement.css @@ -0,0 +1,79 @@ +body, html { + height: 100vh; + width: 100vw; + margin: 0; + padding: 0; + font-family: "Pridi", sans-serif; + background-color: #4A628A; +} + +.container { + height: 100vh; + width: 100vw; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.header { + text-align: center; + margin-top: 10px; + margin-bottom: 20px; +} + +.title { + font-size: 48px; + font-weight: 500; + color: white; +} + +.announcement-body { + max-height: 300px; /* Limit the height to make it scrollable if content overflows */ + width: 80%; + overflow-y: auto; /* Enable vertical scrolling */ + padding: 20px; + color: white; + background-color: rgba(0, 0, 0, 0.2); /* Slight background to make text stand out */ + border-radius: 8px; + text-align: center; +} + +/* Customize scrollbar appearance */ +.announcement-body::-webkit-scrollbar { + width: 8px; +} + +.announcement-body::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0.1); + border-radius: 8px; +} + +.announcement-body::-webkit-scrollbar-thumb { + background-color: rgba(255, 255, 255, 0.8); + border-radius: 8px; +} + +.announcement-body::-webkit-scrollbar-thumb:hover { + background-color: rgb(158, 158, 158); +} + +.announcement-footer { + margin-top: 20px; +} + +#closeButton { + padding: 10px 20px; + margin-bottom: 15px; + font-size: 16px; + color: #4A628A; + background-color: white; + border: none; + border-radius: 5px; + cursor: pointer; + transition: background-color 0.3s ease; +} + +#closeButton:hover { + background-color: #f0f0f0; +} diff --git a/User/render/css/loading.css b/User/render/css/loading.css new file mode 100644 index 0000000..a365a5a --- /dev/null +++ b/User/render/css/loading.css @@ -0,0 +1,59 @@ +body, html { + height: 100vh; + width: 100vw; + margin: 0; + padding: 0; + + font-family: "Pridi", sans-serif; /* Use sans-serif fallback */ + background-color: #4A628A; +} + +h4, h2, h1{ + margin: 0; +} + +.container{ + height: 100vh; + width: 100vw; + display: flex; + flex-direction: column; + justify-content: space-evenly; + align-items: center; +} + +.title{ + font-size: 48px; + font-weight: 500; + letter-spacing: -1px; + color: white; +} + +img{ + width: 200px; + height: 200px; +} + +p{ + color: white; +} + +.loading-section{ + display: flex; + flex-direction: column; + align-items: center; +} + +.spinner { + margin-bottom: 8px; + width: 15px; + height: 15px; + border: 3px solid #f3f3f3; + border-top: 3px solid #2196F3; + border-radius: 50%; + animation: spin 1s linear infinite; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} \ No newline at end of file diff --git a/User/render/css/login.css b/User/render/css/login.css index 2e9d6d5..d9062ef 100644 --- a/User/render/css/login.css +++ b/User/render/css/login.css @@ -1,110 +1,143 @@ body, html { - height: 100%; - width: 100%; + height: 100vh; + width: 100vw; margin: 0; padding: 0; - font-family: "Roboto", sans-serif; - font-weight: 500; - font-style: normal; + font-family: "Pridi", sans-serif; /* Use sans-serif fallback */ + background-color: #4A628A; +} - background-image: url('../assets/background.png'); - background-size: cover; - background-repeat: no-repeat; +h4, h2, h1{ + margin: 0; +} +.page{ + height: 100vh; + width: 100vw; + display: flex; + justify-content: center; + align-items: center; } .container { - opacity: 0; - - display: flex; - flex-direction: row; - justify-content: space-evenly; - align-items: center; - min-height: 100vh; -} - -.header { - color: #1B1A55; - font-size: 4vh; - text-transform: uppercase; - line-height: 2.5rem; - margin-bottom: 10rem; -} - -.login-form { - background-color: #535C91; - opacity: 71; - padding: 9vh 3vh 5vh; - border-radius: 1rem; - box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.9); - width: 25%; -} - -.login-form-title { - margin: 0 0 5vh 0; - text-align: center; -} - -.login-form-title h2 { - color: #FFFFFF; - font-size: 5vh; - margin: 0; - padding: 0; -} - -.login-form hr { - width: 40%; -} - -.login-form-content { - display: flex; - flex-wrap: wrap; - justify-content: center; -} - -input { - text-align: center; - color: white; - font-weight: bold; - font-size: 1.2rem; - width: 70%; - padding: 1rem; - margin: 0.7rem; - background-color: #1B1A55; border-radius: 10px; -} - -button { - font-weight: bold; + background: linear-gradient(to bottom, rgba(74, 98, 138, 0.0) 30%, rgba(186, 237, 255, 0.7)); + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-evenly; + height: 90%; width: 35%; - font-size: 1rem; - padding: 10px; - border: none; - border-radius: 5px; - margin-top: 1rem; - cursor: pointer; } -button:hover { - filter: brightness(85%); +.header{ + text-align: center; + padding-bottom: 16px; + padding-top: 16px; +} + +.title{ + font-size: 48px; + font-weight: 500; + letter-spacing: -1px; + color: white; +} + +.subheading{ + padding-top: 8px; + font-size: 16px; + letter-spacing: -0.5px; + color: rgba(255,255,255, 0.8); +} + +.login-form{ + display: flex; + flex-direction: column; + align-items: center; + width: 80%; +} + +.login-title { + font-size: 24px; + font-weight: 500; + color: white; + margin-bottom: 16px; +} + +.login-form-content input { + width: 100%; + padding: 15px; + margin: 10px 0; + border: 1px solid #ccc; /* Light gray border */ + border-radius: 8px; /* Rounded corners */ + font-size: 1em; + font-family: inherit; + box-sizing: border-box; + background-color: #f9f9f9; /* Light background */ + color: #333; /* Dark text color */ + transition: border-color 0.3s ease, box-shadow 0.3s ease; /* Smooth transition for interaction */ +} + +/* Placeholder Text Styling */ +.login-form-content input::placeholder { + color: #aaa; /* Lighter color for placeholders */ +} + +/* Focus State Styling */ +.login-form-content input:focus { + outline: none; /* Remove default focus outline */ + border-color: #4A628A; /* Blue border on focus */ + box-shadow: 0 0 5px rgba(74, 98, 138, 0.5); /* Subtle shadow for focus */ + background-color: #fff; /* Slightly brighter background on focus */ +} + +/* Input Field Hover Effect */ +.login-form-content input:hover { + border-color: #888; /* Darker gray border on hover */ +} + +/* Disabled Input Styling */ +.login-form-content input:disabled { + background-color: #e0e0e0; /* Light gray background for disabled input */ + cursor: not-allowed; /* Show "not allowed" cursor */ + opacity: 0.7; /* Slight transparency */ } .login-form-footer { - margin-top: 3vh; display: flex; - flex-wrap: wrap; - align-content: center; + width: 100%; + flex-direction: column; + justify-content: space-between; /* Align buttons next to each other */ align-items: center; - justify-content: space-evenly; + gap: 10px; /* Space between buttons */ + margin-top: 20px; +} + +/* Styling for buttons */ +.login-form-footer button { + flex: 1; /* Ensure buttons are equal width */ + padding: 16px; + font-weight: 300; + border: none; + border-radius: 8px; + cursor: pointer; + transition: background-color 0.3s ease, transform 0.2s ease; +} + +button[name="underline"] { + background-color: transparent; /* No background */ + border: none; /* Remove default button border */ + color: #4A628A; /* Set text color */ + font-size: 1em; /* Set font size */ + cursor: pointer; /* Add pointer cursor for interactivity */ + text-decoration: underline; /* Underline text */ + padding: 0; /* Remove default padding */ } button[name="submit"] { - background-color: #F44336; - color: white; + width: 100%; + background-color: #4A628A; /* Blue background */ + color: white; /* White text color */ } - -button[name="signup"] { - background-color: #2196F3; - color: white; -} \ No newline at end of file diff --git a/User/render/css/main_menu.css b/User/render/css/main_menu.css index 60df4ae..82e3792 100644 --- a/User/render/css/main_menu.css +++ b/User/render/css/main_menu.css @@ -1,232 +1,204 @@ body, html { - height: 100%; - width: 100%; + height: 100vh; + width: 100vw; margin: 0; padding: 0; - font-family: "Roboto", sans-serif; + font-family: "Pridi", sans-serif; /* Use sans-serif fallback */ + background-color: #4A628A; +} + +h4, h2, h1{ + margin: 0; +} + +.title{ + font-size: 32px; font-weight: 500; - font-style: normal; - - background-image: url('../assets/background.png'); - background-size: cover; - background-repeat: no-repeat; - -} - -.overlay { - display: none; - position: fixed; - width: 100%; - height: 100%; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.85); - z-index: 2; - cursor: pointer; -} - -.ceo-validation-form { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 300px; - padding: 20px; - background: #1B1A55; - border-radius: 10px; - cursor: default; -} - -.ceo-validation-form h2 { - text-align: center; + letter-spacing: -1px; color: white; } -.form-actions { - text-align: center; - padding-top: 20px; -} - -.form-actions button { - padding: 10px 20px; - margin: 0 10px; - border: none; - border-radius: 5px; - cursor: pointer; -} - -input { - text-align: center; - color: white; - font-weight: bold; - font-size: 1.2rem; - width: 80%; - padding: 1rem; - margin: 0.7rem; - background-color: #1B1A55; - border-radius: 10px; -} - -#back_button { - background-color: #f44336; - width: 35%; - height: auto; +.user{ + display: inline; color: white; } - -#submit_button { - background-color: #4CAF50; - width: 35%; - height: auto; - color: white; -} - -.container { - opacity: 0; - - display: flex; - flex-direction: row; - justify-content: space-evenly; - align-items: center; - min-height: 100vh; - text-align: center; -} - -.left_block { - display: flex; - flex-direction: column; - background-color: #535C91; - opacity: 71; - padding: 2rem; - border-radius: 1rem; - box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.9); - color: white; -} - -.left_block_top { - display: flex; +.navbar{ + padding-top: 8px; + padding-right: 32px; + padding-left: 32px; + height: 10%; + display:flex; flex-direction: row; justify-content: space-between; - text-align: left; + align-items: center; } - -.left_block_top h1 { - padding: 0; - margin: 0; -} - -.left_block_top img { - margin: 0 3vw 0 5vw; - width: 8vw; - height: 8vw; -} - -.left_block_content { - margin: 2rem 0 2rem 0; -} - -.left_block_buttons { +.welcome{ display: flex; flex-direction: row; - align-content: center; align-items: center; +} + +img{ + padding-right: 8px; + width:25px; + height: auto; +} + +.page{ + height: 100vh; + width: 100vw; + display: flex; + justify-content: center; + align-items: center; +} + +.container{ + width:100%; + height:100%; + display: flex; + flex-direction: row; justify-content: center; } -button { - margin: 0 1rem 0 1rem; - width: 15vw; - height: 10vh; +.left_block{ + background: linear-gradient(to bottom, #131A24, #4A628A); + width: 25%; + display: flex; + flex-direction: column; +} - border: none; - border-radius: 10px; +.notification-title{ + padding-top: 16px; + padding-bottom: 16px; + text-align: center; + height: 10%; + display: flex; + justify-content: center; + align-items: center; +} - color: white; - font-size: 1rem; - font-weight: bold; +.notifications{ + overflow-y: auto; + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + flex-grow: 1; /* Allow it to take available space */ + max-height: calc(90% - 80px); +} - text-transform: uppercase; +.right_block_content button:last-child { + background-color: #FF6347; +} + +.right_block_content button:last-child:hover { + background-color: #fd4c29; +} + +.alert, .logout-button{ cursor: pointer; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); - outline: none; - transition: background-color 0.3s ease; + border-radius: 15px; + width: 80%; + min-height: 64px; + height: auto; + padding:12px; + background: #FF6347; + font-weight: bold; + font-size: 12px; +} +.notification{ + cursor: pointer; + border-radius: 15px; + width: 80%; + min-height: 64px; + height: auto; + padding:12px; + background: rgba(186, 229, 255); + font-weight: bold; + font-size: 12px; } -button:hover { - filter: brightness(85%); +.notification:hover{ + background: #d9efff; } -.left_block_footer { +.alert:hover, .logout-button:hover{ + background: rgb(244, 44, 44); +} + +.notif-title{ + font-size: 24px; + font-weight: 300; + letter-spacing: -1px; + color: white; +} + +.left-content{ + height: 90%; + width: 100%; + display: flex; + flex-direction: column; + justify-content: space-around; + align-items: center; +} + +.left_block_footer{ display: flex; align-items: center; - justify-content: end; + justify-content: center; + width: 100%; + padding-bottom: 16px; } -.right_block { - display: flex; +.right_block_content{ + height: 90%; +} + +.right_block{ + width: 75%; + display:flex; flex-direction: column; - background-color: #535C91; - opacity: 71; - padding: 2rem; - border-radius: 1rem; - box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.9); - color: white; + justify-content: center; } -.notifications { - display: flex; - margin: 1rem 2rem 2rem 3rem; - flex-direction: column; - align-items: start; - - height: 40vh; /* Fixed height */ - width: 80%; /* Full width */ - overflow: auto; /* Enable scrolling */ - - font-size: 1.2rem; - color: white; - font-weight: bold; -} - -.notifications::-webkit-scrollbar { - width: 10px; /* Reduced width of the scrollbar by 2px */ -} - -.notifications::-webkit-scrollbar-track { - background: #1B1A55; /* Updated track color */ -} - -.notifications::-webkit-scrollbar-thumb { - background: #535C91; /* Updated handle color */ - border: 2px solid #1B1A55; /* Adding a border to effectively reduce the thumb size */ -} - -.notifications::-webkit-scrollbar-thumb:hover { - background: #555; /* Updated handle color on hover */ -} - -button[name="logout"] { - margin: 0; - padding: 0; - width: 10vw; - height: 5vh; - background-color: #F44336; -} - -button[name="alert"] { - margin: 0.7rem; - background-color: #F44336; -} - -button[name="notification"] { - margin: 0.7rem; - background-color: #23BDEE; +.right_block_content { + display: grid; + grid-template-columns: repeat(3, 1fr); /* 3 equal-width columns */ + gap: 8px; /* Spacing between buttons */ + padding: 32px; /* Optional padding */ } button[name="menu_button"] { - margin: 0.7rem; - background-color: #1B1A55; + padding: 10px 20px; + font-size: 16px; + background-color: rgba(186,229,244,0.4); /* Button background */ + color: white; + border: none; + border-radius: 8px; + cursor: pointer; + transition: background-color 0.3s ease, transform 0.2s ease; +} + +button[name="menu_button"]:hover { + background-color: #3B5173; /* Darker background on hover */ +} + +.notifications::-webkit-scrollbar { + width: 4px; /* Width of the scrollbar */ +} + +.notifications::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0.1); /* Track background color */ + border-radius: 10px; /* Rounded corners for the track */ +} + +.notifications::-webkit-scrollbar-thumb { + background-color: rgba(74, 98, 138, 0.8); /* Scrollbar handle color */ + border-radius: 10px; /* Rounded corners for the scrollbar handle */ +} + +.notifications::-webkit-scrollbar-thumb:hover { + background-color: rgba(74, 98, 138, 1); /* Darker color on hover */ } \ No newline at end of file diff --git a/User/render/css/normalizer.css b/User/render/css/normalizer.css new file mode 100644 index 0000000..98fe5ba --- /dev/null +++ b/User/render/css/normalizer.css @@ -0,0 +1,41 @@ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, hr +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} \ No newline at end of file diff --git a/User/render/css/profile.css b/User/render/css/profile.css index 5bbe960..67879da 100644 --- a/User/render/css/profile.css +++ b/User/render/css/profile.css @@ -1,110 +1,136 @@ body, html { - height: 100%; - width: 100%; + height: 100vh; + width: 100vw; margin: 0; padding: 0; - font-family: "Roboto", sans-serif; - font-weight: 500; - font-style: normal; + font-family: "Pridi", sans-serif; /* Use sans-serif fallback */ + background-color: #4A628A; +} - background-image: url('../assets/background.png'); - background-size: cover; - background-repeat: no-repeat; +h4, h2, h1{ + margin: 0; +} +.page{ + height: 100vh; + width: 100vw; + display: flex; + justify-content: center; + align-items: center; } .container { - opacity: 0; - + border-radius: 10px; + background: linear-gradient(to bottom, rgba(74, 98, 138, 0.0) 30%, rgba(186, 237, 255, 0.7)); + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); display: flex; - flex-direction: row; - justify-content: space-evenly; + flex-direction: column; align-items: center; - min-height: 100vh; - text-align: center; /* Center the text for all child elements */ + justify-content: space-evenly; + height: 90%; + width: 35%; } -.header { - color: #1B1A55; - font-size: 4vh; - text-transform: uppercase; - line-height: 2.5rem; - margin-bottom: 10rem; -} - -.profile-form { - background-color: #535C91; - opacity: 71; - padding: 13vh 3vh 5vh; - border-radius: 1rem; - box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.9); - width: 25%; -} - -.profile-form-title { - margin-bottom: 5vh; -} - -.profile-form hr { - width: 40%; -} - -.profile-form-title h2 { - color: #FFFFFF; - margin: 0; - padding: 0; +.header{ text-align: center; - font-size: 5vh; + padding-bottom: 16px; + padding-top: 16px; } -.profile-form-content { +.title{ + font-size: 48px; + font-weight: 500; + letter-spacing: -1px; + color: white; +} + +.subheading{ + padding-top: 8px; + font-size: 16px; + letter-spacing: -0.5px; + color: rgba(255,255,255, 0.8); +} + +.profile-form{ display: flex; - flex-wrap: wrap; - justify-content: center; + flex-direction: column; + align-items: center; + width: 80%; +} + +.profile-form-content input { + width: 100%; + padding: 15px; + margin: 10px 0; + border: 1px solid #ccc; /* Light gray border */ + border-radius: 8px; /* Rounded corners */ + font-size: 1em; + font-family: inherit; + box-sizing: border-box; + background-color: #f9f9f9; /* Light background */ + color: #333; /* Dark text color */ + transition: border-color 0.3s ease, box-shadow 0.3s ease; /* Smooth transition for interaction */ +} + +/* Placeholder Text Styling */ +.profile-form-content input::placeholder { + color: #aaa; /* Lighter color for placeholders */ +} + +/* Focus State Styling */ +.profile-form-content input:focus { + outline: none; /* Remove default focus outline */ + border-color: #4A628A; /* Blue border on focus */ + box-shadow: 0 0 5px rgba(74, 98, 138, 0.5); /* Subtle shadow for focus */ + background-color: #fff; /* Slightly brighter background on focus */ +} + +/* Input Field Hover Effect */ +.profile-form-content input:hover { + border-color: #888; /* Darker gray border on hover */ +} + +/* Disabled Input Styling */ +.profile-form-content input:disabled { + background-color: #e0e0e0; /* Light gray background for disabled input */ + cursor: not-allowed; /* Show "not allowed" cursor */ + opacity: 0.7; /* Slight transparency */ } .profile-form-footer { - margin-top: 7vh; display: flex; - flex-direction: row; - justify-content: center; + width: 100%; + flex-direction: column; + justify-content: space-between; /* Align buttons next to each other */ + align-items: center; + gap: 10px; /* Space between buttons */ + margin-top: 20px; } -input { - text-align: center; - color: white; - font-weight: bold; - font-size: 1.2rem; - width: 70%; - padding: 1rem; - margin: 0.7rem; - background-color: #1B1A55; - border-radius: 10px; -} - -button { - font-weight: bold; - width: 35%; - font-size: 1rem; - padding: 10px; +/* Styling for buttons */ +.profile-form button { + flex: 1; /* Ensure buttons are equal width */ + padding: 16px; + font-weight: 300; border: none; - border-radius: 5px; - margin-top: 1rem; + border-radius: 8px; cursor: pointer; + transition: background-color 0.3s ease, transform 0.2s ease; } -button:hover { - filter: brightness(85%); +button[name="underline"] { + background-color: transparent; /* No background */ + border: none; /* Remove default button border */ + color: #4A628A; /* Set text color */ + font-size: 1em; /* Set font size */ + cursor: pointer; /* Add pointer cursor for interactivity */ + text-decoration: underline; /* Underline text */ + padding: 0; /* Remove default padding */ } button[name="submit"] { - background-color: #F44336; - color: white; + width: 100%; + background-color: #4A628A; /* Blue background */ + color: white; /* White text color */ } - -button[name="login"] { - background-color: #2196F3; - color: white; - margin-right: 5rem; -} \ No newline at end of file diff --git a/User/render/css/reset_password.css b/User/render/css/reset_password.css index 2e9d6d5..c1cd8a6 100644 --- a/User/render/css/reset_password.css +++ b/User/render/css/reset_password.css @@ -1,110 +1,151 @@ body, html { - height: 100%; - width: 100%; + height: 100vh; + width: 100vw; margin: 0; padding: 0; - font-family: "Roboto", sans-serif; - font-weight: 500; - font-style: normal; + font-family: "Pridi", sans-serif; /* Use sans-serif fallback */ + background-color: #4A628A; +} - background-image: url('../assets/background.png'); - background-size: cover; - background-repeat: no-repeat; +h4, h2, h1{ + margin: 0; +} +.page{ + height: 100vh; + width: 100vw; + display: flex; + justify-content: center; + align-items: center; } .container { - opacity: 0; - - display: flex; - flex-direction: row; - justify-content: space-evenly; - align-items: center; - min-height: 100vh; -} - -.header { - color: #1B1A55; - font-size: 4vh; - text-transform: uppercase; - line-height: 2.5rem; - margin-bottom: 10rem; -} - -.login-form { - background-color: #535C91; - opacity: 71; - padding: 9vh 3vh 5vh; - border-radius: 1rem; - box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.9); - width: 25%; -} - -.login-form-title { - margin: 0 0 5vh 0; - text-align: center; -} - -.login-form-title h2 { - color: #FFFFFF; - font-size: 5vh; - margin: 0; - padding: 0; -} - -.login-form hr { - width: 40%; -} - -.login-form-content { - display: flex; - flex-wrap: wrap; - justify-content: center; -} - -input { - text-align: center; - color: white; - font-weight: bold; - font-size: 1.2rem; - width: 70%; - padding: 1rem; - margin: 0.7rem; - background-color: #1B1A55; border-radius: 10px; -} - -button { - font-weight: bold; + background: linear-gradient(to bottom, rgba(74, 98, 138, 0.0) 30%, rgba(186, 237, 255, 0.7)); + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; + height: 90%; width: 35%; - font-size: 1rem; - padding: 10px; - border: none; - border-radius: 5px; - margin-top: 1rem; - cursor: pointer; } -button:hover { - filter: brightness(85%); +.header{ + display: flex; + width: 80%; + flex-direction: column; + align-items: center; + justify-content: center; + height: 20%; + text-align: center; + padding-bottom: 16px; + padding-top: 16px; +} + +.title{ + font-size: 48px; + font-weight: 500; + letter-spacing: -1px; + color: white; +} + +.subheading{ + font-size: 16px; + letter-spacing: -0.5px; + padding-top: 8px; + color: rgba(255,255,255, 0.8); +} + +.login-form{ + height: 80%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-around; + width: 80%; +} + +.login-title { + font-size: 24px; + font-weight: 500; + color: white; + margin-bottom: 16px; +} + +.login-form-content input { + width: 100%; + padding: 15px; + margin: 10px 0; + border: 1px solid #ccc; /* Light gray border */ + border-radius: 8px; /* Rounded corners */ + font-size: 1em; + font-family: inherit; + box-sizing: border-box; + background-color: #f9f9f9; /* Light background */ + color: #333; /* Dark text color */ + transition: border-color 0.3s ease, box-shadow 0.3s ease; /* Smooth transition for interaction */ +} + +/* Placeholder Text Styling */ +.login-form-content input::placeholder { + color: #aaa; /* Lighter color for placeholders */ +} + +/* Focus State Styling */ +.login-form-content input:focus { + outline: none; /* Remove default focus outline */ + border-color: #4A628A; /* Blue border on focus */ + box-shadow: 0 0 5px rgba(74, 98, 138, 0.5); /* Subtle shadow for focus */ + background-color: #fff; /* Slightly brighter background on focus */ +} + +/* Input Field Hover Effect */ +.login-form-content input:hover { + border-color: #888; /* Darker gray border on hover */ +} + +/* Disabled Input Styling */ +.login-form-content input:disabled { + background-color: #e0e0e0; /* Light gray background for disabled input */ + cursor: not-allowed; /* Show "not allowed" cursor */ + opacity: 0.7; /* Slight transparency */ } .login-form-footer { - margin-top: 3vh; display: flex; - flex-wrap: wrap; - align-content: center; + width: 100%; + flex-direction: column; + justify-content: space-between; /* Align buttons next to each other */ align-items: center; - justify-content: space-evenly; + gap: 10px; /* Space between buttons */ + margin-top: 20px; +} + +/* Styling for buttons */ +.login-form-footer button { + flex: 1; /* Ensure buttons are equal width */ + padding: 16px; + font-weight: 300; + border: none; + border-radius: 8px; + cursor: pointer; + transition: background-color 0.3s ease, transform 0.2s ease; +} + +button[name="underline"] { + background-color: transparent; /* No background */ + border: none; /* Remove default button border */ + color: #4A628A; /* Set text color */ + font-size: 1em; /* Set font size */ + cursor: pointer; /* Add pointer cursor for interactivity */ + text-decoration: underline; /* Underline text */ + padding: 0; /* Remove default padding */ } button[name="submit"] { - background-color: #F44336; - color: white; + width: 100%; + background-color: #4A628A; /* Blue background */ + color: white; /* White text color */ } - -button[name="signup"] { - background-color: #2196F3; - color: white; -} \ No newline at end of file diff --git a/User/render/css/share_file.css b/User/render/css/share_file.css index 671485b..1a11178 100644 --- a/User/render/css/share_file.css +++ b/User/render/css/share_file.css @@ -1,191 +1,162 @@ body, html { - height: 100%; - width: 100%; + height: 100vh; + width: 100vw; margin: 0; padding: 0; - font-family: "Roboto", sans-serif; - font-weight: 500; - font-style: normal; + font-family: "Pridi", sans-serif; /* Use sans-serif fallback */ + background-color: #4A628A; +} - background-image: url('../assets/background.png'); - background-size: cover; - background-repeat: no-repeat; +h4, h2, h1{ + margin: 0; +} +.page{ + height: 100vh; + width: 100vw; + display: flex; + justify-content: center; + align-items: center; } .container { - opacity: 0; - - display: flex; - flex-direction: row; - justify-content: space-evenly; - align-items: center; - min-height: 100vh; - text-align: center; -} - -h1, h2 { - padding: 0; - margin: 0; -} - -h2 { - font-size: 1rem; -} - -.left_block { - display: flex; - flex-direction: column; - background-color: #535C91; - opacity: 71; - padding: 2rem; - border-radius: 1rem; - box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.9); - color: white; -} - -.left_block_top { - display: flex; - flex-direction: row; - justify-content: space-between; -} - -.left_block_top_left { - display: flex; - flex-direction: column; - justify-content: start; - text-align: left; -} - -.left_block_top_left hr { - margin: 0 0 1rem 0; - width: 45%; -} - -.left_block_top_right { - width: 10vw; - - display: flex; - flex-wrap: wrap; - align-content: center; - justify-content: center; - - padding: 0 2vh 0 2vh; - background-color: #1B1A55; - margin: 0 0 0 5vw; - border-radius: 1rem; -} - -.left_block_content { - display: flex; - justify-content: start; - align-items: center; - margin: 2rem 0 2rem 0; -} - -.left_block_buttons { - display: flex; - flex-direction: row; - align-content: center; - align-items: center; - justify-content: center; -} - -button { - margin: 0 1rem 0 1rem; - width: 10vw; - height: 5vh; - - border: none; border-radius: 10px; - - color: white; - font-size: 1rem; - font-weight: bold; - - text-transform: uppercase; - cursor: pointer; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); - outline: none; - transition: background-color 0.3s ease; -} - -button:hover { - filter: brightness(85%); -} - -.left_block_footer { + background: linear-gradient(to bottom, rgba(74, 98, 138, 0.0) 30%, rgba(186, 237, 255, 0.7)); + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); display: flex; + flex-direction: column; align-items: center; - justify-content: end; + height: 90%; + width: 35%; } -.right_block { - display: flex; - flex-direction: column; - background-color: #535C91; - opacity: 71; - padding: 2rem 4rem 2rem 2rem; - border-radius: 1rem; - box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.9); +.header{ + text-align: center; + padding-bottom: 16px; + padding-top: 32px; +} + +.title{ + font-size: 48px; + font-weight: 500; + letter-spacing: -1px; color: white; } -.choose_user_form_title { - display: flex; - flex-wrap: wrap; - flex-direction: column; - justify-content: left; - align-content: start; +.subheading{ + padding-top: 8px; + font-size: 16px; + letter-spacing: -0.5px; + color: rgba(255,255,255, 0.8); } -.choose_user_form_title hr { +.form{ + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; width: 80%; + height: 100%; + overflow: hidden; +} + +.footer { + padding-bottom: 16px; + display: flex; + width: 100%; + flex-direction: row; + justify-content: space-between; /* Align buttons next to each other */ + align-items: center; + gap: 10px; /* Space between buttons */ +} + +.filename-title{ + font-size: 16px; + font-weight: 300; + color: white; + padding: 48px 24px 48px 24px; + background-color: rgba(0,0,0,0.25); + border-radius: 10px; + margin-top: 16px; + box-shadow: 2px 2px 2px 1px rgb(0 0 0 / 20%); +} + +.users_block{ + padding-top: 16px; +} + +label{ + margin-top: 8px; + color: white; } .choose_user_form_content { + overflow-y: hidden; + width: 100%; + height: auto; + max-height: 180px; display: flex; - margin: 1rem 7rem 2rem 0.5rem; flex-direction: column; - align-items: start; + align-items: flex-start; +} - height: 20vh; /* Fixed height */ - width: 100%; /* Full width */ - overflow: auto; /* Enable scrolling */ - - font-size: 1.2rem; +h5{ + font-size: 20px; + font-weight: 300; + text-align: center; color: white; - font-weight: bold; } -.choose_user_form_content::-webkit-scrollbar { - width: 10px; /* Reduced width of the scrollbar by 2px */ +/* Styling for buttons */ +.form button { + flex: 1; /* Ensure buttons are equal width */ + padding: 16px; + font-weight: 300; + border: none; + border-radius: 8px; + cursor: pointer; + transition: background-color 0.3s ease, transform 0.2s ease; } -.choose_user_form_content::-webkit-scrollbar-track { - background: #1B1A55; /* Updated track color */ -} - -.choose_user_form_content::-webkit-scrollbar-thumb { - background: #535C91; /* Updated handle color */ - border: 2px solid #1B1A55; /* Adding a border to effectively reduce the thumb size */ -} - -.choose_user_form_content::-webkit-scrollbar-thumb:hover { - background: #555; /* Updated handle color on hover */ -} - -button[name="back"] { - background-color: #23BDEE; +button[name="underline"] { + background-color: transparent; /* No background */ + border: none; /* Remove default button border */ + color: #4A628A; /* Set text color */ + font-size: 1em; /* Set font size */ + cursor: pointer; /* Add pointer cursor for interactivity */ + text-decoration: underline; /* Underline text */ + padding: 0; /* Remove default padding */ } button[name="submit"] { - background-color: #F44336; + width: 100%; + background-color: #4A628A; /* Blue background */ + color: white; /* White text color */ } -button[name="select_file"] { - margin: 0; - width: 8vw; - background-color: #1B1A55; +button[name="submit"]:hover { + background-color: #3B5173; /* Darker background on hover */ +} + +.choose_user_form_content::-webkit-scrollbar { + width: 4px; /* Width of the scrollbar */ +} + +.choose_user_form_content::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0.1); /* Track background color */ + border-radius: 10px; /* Rounded corners for the track */ +} + +.choose_user_form_content::-webkit-scrollbar-thumb { + background-color: rgba(74, 98, 138, 0.8); /* Scrollbar handle color */ + border-radius: 10px; /* Rounded corners for the scrollbar handle */ +} + +.choose_user_form_content::-webkit-scrollbar-thumb:hover { + background-color: rgba(74, 98, 138, 1); /* Darker color on hover */ +} + +.choose_user_form_content:empty { + overflow-y: hidden; } \ No newline at end of file diff --git a/User/render/css/sign_up.css b/User/render/css/sign_up.css index 09b4634..3571ebc 100644 --- a/User/render/css/sign_up.css +++ b/User/render/css/sign_up.css @@ -1,117 +1,183 @@ +/* General Styles */ body, html { - height: 100%; - width: 100%; + height: 100vh; + width: 100vw; margin: 0; padding: 0; - font-family: "Roboto", sans-serif; - font-weight: 500; - font-style: normal; - background-image: url('../assets/background.png'); - background-size: cover; - background-repeat: no-repeat; + + font-family: "Pridi", sans-serif; /* Use sans-serif fallback */ + background-color: #4A628A; /* Background color */ } -.container { - min-height: 100vh; +h4, h2, h1 { + margin: 0; /* Remove default margin */ } -.step { +/* Page Layout */ +.page { + height: 100vh; + width: 100vw; display: flex; - flex-direction: row; - justify-content: space-evenly; + justify-content: center; align-items: center; - min-height: 100vh; - opacity: 0; /* Make steps invisible by default */ - visibility: hidden; /* Hide steps by default */ - transition: opacity 0.5s ease, visibility 0.5s ease; /* Smooth transition */ +} +.container{ + height: 100%; + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-evenly; } -.step.active { - opacity: 1; /* Show the active step */ - visibility: visible; /* Make it visible */ +/* Active Step Styles */ +.step { + border-radius: 10px; + background: linear-gradient(to bottom, rgba(74, 98, 138, 0.0) 30%, rgba(186, 237, 255, 0.7)); + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); + display: flex; + flex-direction: column; + align-items: center; + justify-content: stretch; + height: 90%; + width: 35%; } +/* Header Styling */ .header { - color: #1B1A55; - font-size: 4vh; - text-transform: uppercase; - line-height: 2.5rem; - margin-bottom: 10rem; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 20%; + text-align: center; + padding-bottom: 16px; + padding-top: 16px; } +.title{ + font-size: 48px; + font-weight: 500; + letter-spacing: -1px; + color: white; +} + +.subheading{ + font-size: 16px; + letter-spacing: -0.5px; + padding-top: 8px; + color: rgba(255,255,255, 0.8); +} + +/* Signup Form Styles */ .signup-form { - background-color: #535C91; - opacity: 71; - padding: 9vh 3vh 5vh; - border-radius: 1rem; - box-shadow: 10px 10px 10px rgba(0, 0, 0, 0.9); - width: 25%; + display: flex; + height: 80%; + flex-direction: column; + align-items: center; + justify-content: space-between; + width: 80%; /* Width of the form */ + margin-bottom: 16px; } .signup-form-title { - margin: 0 0 5vh 0; - text-align: center; -} - -.signup-form-title h2 { - color: #FFFFFF; - font-size: 5vh; - margin: 0; - padding: 0; -} - -.signup-form hr { - width: 40%; -} - -.signup-form-content { - display: flex; - flex-wrap: wrap; - justify-content: center; -} - -input { - text-align: center; + font-size: 24px; + font-weight: 500; color: white; - font-weight: bold; - font-size: 1.2rem; - width: 70%; - padding: 1rem; - margin: 0.7rem; - background-color: #1B1A55; - border-radius: 10px; + margin-bottom: 16px; /* Space below title */ } -button { - font-weight: bold; - width: 35%; - font-size: 1rem; - padding: 10px; - border: none; - border-radius: 5px; - margin-top: 1rem; - cursor: pointer; +/* Input Styles */ +.signup-form-content input { + width: 100%; + padding: 15px; + margin: 10px 0; + border: 1px solid #ccc; /* Light gray border */ + border-radius: 8px; /* Rounded corners */ + font-size: 1em; + font-family: inherit; + box-sizing: border-box; + background-color: #f9f9f9; /* Light background */ + color: #333; /* Dark text color */ + transition: border-color 0.3s ease, box-shadow 0.3s ease; /* Smooth transition for interaction */ } -button:hover { - filter: brightness(85%); +/* Placeholder Text Styling */ +.signup-form-content input::placeholder { + color: #aaa; /* Lighter color for placeholders */ } +.signup-form-content-radio{ + width: 100%; + display: flex; /* Use flexbox to arrange items in a row */ + align-items: flex-start; + flex-direction: column; + justify-content: flex-start; + gap: 20px; +} + +.signup-form-content-radio label { + width: 100%; + display: flex; /* Make label a flex container */ + align-items: flex-start; + justify-content: flex-start; + cursor: pointer; /* Change cursor to pointer when hovering */ +} + +/* Optional: Styling the radio button */ +.signup-form-content-radio input[type="radio"] { + margin-right: 8px; /* Space between radio button and label text */ +} +/* Focus State Styling */ +.signup-form-content input:focus { + outline: none; /* Remove default focus outline */ + border-color: #4A628A; /* Change border color on focus */ + box-shadow: 0 0 5px rgba(74, 98, 138, 0.5); /* Subtle shadow for focus */ + background-color: #fff; /* Slightly brighter background on focus */ +} + +/* Input Field Hover Effect */ +.signup-form-content input:hover { + border-color: #888; /* Darker gray border on hover */ +} + +/* Disabled Input Styling */ +.signup-form-content input:disabled { + background-color: #e0e0e0; /* Light gray background for disabled input */ + cursor: not-allowed; /* Show "not allowed" cursor */ + opacity: 0.7; /* Slight transparency */ +} + +/* Signup Form Footer */ .signup-form-footer { - margin-top: 3vh; + display: flex; - flex-wrap: wrap; - align-content: center; + width: 100%; + justify-content: space-between; /* Align buttons next to each other */ align-items: center; - justify-content: space-evenly; + gap: 10px; /* Space between buttons */ + margin-top: 20px; +} + +/* Button Styles */ +.signup-form-footer button { + flex: 1; /* Ensure buttons are equal width */ + padding: 16px; + font-weight: 300; + border: none; + border-radius: 8px; + cursor: pointer; + transition: background-color 0.3s ease, transform 0.2s ease; } button[name="back"] { - background-color: #F44336; - color: white; + background-color: transparent; /* No background for 'back' button */ + color: #4A628A; /* Set text color */ + text-decoration: underline; /* Underline text */ } button[name="continue"] { - background-color: #2196F3; - color: white; + width: 100%; + background-color: #4A628A; /* Blue background */ + color: white; /* White text color */ } diff --git a/User/render/css/uc_not_found.css b/User/render/css/uc_not_found.css deleted file mode 100644 index df2f3d6..0000000 --- a/User/render/css/uc_not_found.css +++ /dev/null @@ -1,59 +0,0 @@ -body, html { - height: 100%; - width: 100%; - margin: 0; - padding: 0; - - font-family: "Roboto", sans-serif; - font-weight: 500; - font-style: normal; - - background-image: url('../assets/background.png'); - background-size: cover; - background-repeat: no-repeat; -} - -.container { - opacity: 0; - - display: flex; - flex-direction: column; - justify-content: space-evenly; - align-items: center; - min-height: 100vh; -} - -.header { - color: #1B1A55; - font-size: 4vh; - text-transform: uppercase; - text-align: center; -} - -.loading-section { - display: flex; - flex-direction: column; - align-items: center; - text-align: center; - color: white; -} - -.spinner { - width: 50px; - height: 50px; - border: 6px solid #f3f3f3; - border-top: 6px solid #2196F3; - border-radius: 50%; - animation: spin 1s linear infinite; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -.loading-section p { - font-size: 1.5rem; - color: white; - margin-top: 1rem; -} diff --git a/User/render/css/welcome.css b/User/render/css/welcome.css deleted file mode 100644 index df2f3d6..0000000 --- a/User/render/css/welcome.css +++ /dev/null @@ -1,59 +0,0 @@ -body, html { - height: 100%; - width: 100%; - margin: 0; - padding: 0; - - font-family: "Roboto", sans-serif; - font-weight: 500; - font-style: normal; - - background-image: url('../assets/background.png'); - background-size: cover; - background-repeat: no-repeat; -} - -.container { - opacity: 0; - - display: flex; - flex-direction: column; - justify-content: space-evenly; - align-items: center; - min-height: 100vh; -} - -.header { - color: #1B1A55; - font-size: 4vh; - text-transform: uppercase; - text-align: center; -} - -.loading-section { - display: flex; - flex-direction: column; - align-items: center; - text-align: center; - color: white; -} - -.spinner { - width: 50px; - height: 50px; - border: 6px solid #f3f3f3; - border-top: 6px solid #2196F3; - border-radius: 50%; - animation: spin 1s linear infinite; -} - -@keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - -.loading-section p { - font-size: 1.5rem; - color: white; - margin-top: 1rem; -} diff --git a/User/render/html/announcement.html b/User/render/html/announcement.html new file mode 100644 index 0000000..204daa6 --- /dev/null +++ b/User/render/html/announcement.html @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + Announcement + + +
+
+

Announcement

+
+
+

Loading announcement...

+
+ +
+ + diff --git a/User/render/html/backup_retreive.html b/User/render/html/backup_retreive.html deleted file mode 100644 index ce01128..0000000 --- a/User/render/html/backup_retreive.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - Welcome - - -
-
-

BACKUP FETCHER

-
-
-
-

Backup is not searched, please wait...

-
-
- - diff --git a/CEO/render/html/backup_retreive.html b/User/render/html/backup_retrieve.html similarity index 51% rename from CEO/render/html/backup_retreive.html rename to User/render/html/backup_retrieve.html index ce01128..e3ae2e9 100644 --- a/CEO/render/html/backup_retreive.html +++ b/User/render/html/backup_retrieve.html @@ -4,10 +4,13 @@ - + - + + + + Welcome @@ -15,11 +18,12 @@
-

BACKUP FETCHER

+

Team Vault

+ Backup Fetcher
-

Backup is not searched, please wait...

+

Backup is now searched, please wait...

diff --git a/User/render/html/login.html b/User/render/html/login.html index 9767cea..80586a6 100644 --- a/User/render/html/login.html +++ b/User/render/html/login.html @@ -4,33 +4,39 @@ - + + + + Login +
-

DO WE KNOW

-

EACH OTHER?

+

TeamVault

+

Do we know each other?

+
diff --git a/User/render/html/main_menu.html b/User/render/html/main_menu.html index dd8d0e7..40487cc 100644 --- a/User/render/html/main_menu.html +++ b/User/render/html/main_menu.html @@ -4,9 +4,12 @@ - + + + + @@ -14,41 +17,43 @@ Main Page - -
-
-
-
-

WELCOME BACK,

-

-

Hope you have a productive day!

+ +
+
+
+
+

Notifications

+
+
+
+ +
+
-
-
-
+ +
+ + +
-
-
-
-
-
- -
-
-
-

NOTIFICATIONS

-
-
-
diff --git a/User/render/html/profile.html b/User/render/html/profile.html index c5db853..e7f6ea0 100644 --- a/User/render/html/profile.html +++ b/User/render/html/profile.html @@ -4,9 +4,12 @@ - + + + + @@ -14,22 +17,24 @@ Profile -
-
-
-

Profile

-
-
-
- - - -
- -
+
+
+
+
+

Profile

+

Who are you?

+
+
+ + + +
+ +
+
diff --git a/User/render/html/reset_database.html b/User/render/html/reset_database.html new file mode 100644 index 0000000..db6d68f --- /dev/null +++ b/User/render/html/reset_database.html @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + Welcome + + +
+
+

Welcome to TeamVault

+
+ Connecting to server +
+
+

The CEO initialized a complete reset, please wait...

+
+
+ + diff --git a/User/render/html/reset_password.html b/User/render/html/reset_password.html index 8bf382e..46c1535 100644 --- a/User/render/html/reset_password.html +++ b/User/render/html/reset_password.html @@ -3,33 +3,37 @@ + + + + Reset Password +
-

RESET

-

YOUR PASSWORD

+

TeamVault

+

Forgot your password? No worries, it happens to the best of us!

- +
diff --git a/User/render/html/share_file.html b/User/render/html/share_file.html index 6163a09..c0b8a6e 100644 --- a/User/render/html/share_file.html +++ b/User/render/html/share_file.html @@ -4,46 +4,42 @@ - + + + + Share File - + +
-
-
-
-

SHARE A FILE

-
-

First select the file you want to share

-

(can be whatever resource from the system)

-
-
-

-
+
+
+

Share a File

+

First select the file you want to share.

+ +
+
Users
+

Select the users you want to share the file with.

+
+ +
+
-
- -
- -
-
-

USERS

-
-
-
- -
-
+
diff --git a/User/render/html/sign_up.html b/User/render/html/sign_up.html index 4a1bdcc..5768795 100644 --- a/User/render/html/sign_up.html +++ b/User/render/html/sign_up.html @@ -3,24 +3,27 @@ + + + + Signup Process - +
-

LET US MEET

-

EACH OTHER

+

TeamVault

+

Let us meet each other