diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index e17f7fd7..34ff43a5 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -13,8 +13,9 @@ use Pterodactyl\Console\Commands\Maintenance\PruneOrphanedBackupsCommand; use Pterodactyl\Console\Commands\Maintenance\CleanServiceBackupFilesCommand; -use Pterodactyl\BlueprintFramework\GetExtensionSchedules; +// Import Blueprint schedules, telemetry and library use Pterodactyl\Services\Telemetry\RegisterBlueprintTelemetry; +use Pterodactyl\BlueprintFramework\GetExtensionSchedules; use Pterodactyl\BlueprintFramework\Libraries\ExtensionLibrary\Console\BlueprintConsoleLibrary as BlueprintExtensionLibrary; class Kernel extends ConsoleKernel @@ -60,9 +61,10 @@ protected function schedule(Schedule $schedule): void $registerBlueprintTelemetry->register($schedule); } - // Blueprint-related utilities. + // Blueprint-related utilities $schedule->command('bp:version:cache')->dailyAt(str_pad(rand(0, 23), 2, '0', STR_PAD_LEFT) . ':' . str_pad(rand(0, 59), 2, '0', STR_PAD_LEFT)); + // Blueprint extension schedules GetExtensionSchedules::schedules($schedule); } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 9cfd97e2..6772e753 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -48,6 +48,10 @@ class Kernel extends HttpKernel ConvertEmptyStringsToNull::class, ]; + protected $middlewarePriority = [ + SubstituteClientBindings::class, + ]; + /** * The application's route middleware groups. */ diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index c2649e1c..611c3b61 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -13,6 +13,7 @@ use Pterodactyl\Extensions\Themes\Theme; use Illuminate\Database\Eloquent\Relations\Relation; +// Blueprint-related shenanigans imports use Pterodactyl\Providers\Blueprint\ExtensionfsConfigProvider; use Pterodactyl\Providers\Blueprint\RouteServiceProvider; diff --git a/blueprint.sh b/blueprint.sh index 15db1fff..931af577 100644 --- a/blueprint.sh +++ b/blueprint.sh @@ -131,8 +131,8 @@ depend() { if [[ $DEPEND_MISSING == true ]]; then PRINT FATAL "Some framework dependencies couldn't be found or have issues. This is usually NOT a bug, do not report it as such." - if [[ $nodeMajor -lt 17 ]]; then - PRINT FATAL "Unsupported dependency \"node\" <17.x. (Requires >17.x)" + if [[ $nodeMajor -lt 22 ]]; then + PRINT FATAL "Unsupported dependency \"node\" <22.x. (Requires >22.x)" fi if ! [ -x "$(command -v unzip)" ]; then PRINT FATAL "Missing dependency \"unzip\"."; fi diff --git a/package.json b/package.json index 243827c3..30c9009d 100644 --- a/package.json +++ b/package.json @@ -1,157 +1,157 @@ { - "name": "pterodactyl-panel", - "engines": { - "node": ">=17" - }, - "dependencies": { - "@floating-ui/react-dom-interactions": "^0.6.6", - "@fortawesome/fontawesome-svg-core": "^1.2.32", - "@fortawesome/free-solid-svg-icons": "^5.15.1", - "@fortawesome/react-fontawesome": "^0.1.11", - "@headlessui/react": "^1.6.4", - "@heroicons/react": "^1.0.6", - "@hot-loader/react-dom": "^16.14.0", - "@preact/signals-react": "^1.2.1", - "@tailwindcss/forms": "^0.5.2", - "@tailwindcss/line-clamp": "^0.4.0", - "axios": "^0.27.2", - "boring-avatars": "^1.7.0", - "chart.js": "^3.8.0", - "classnames": "^2.3.1", - "codemirror": "^5.57.0", - "copy-to-clipboard": "^3.3.1", - "date-fns": "^2.28.0", - "debounce": "^1.2.0", - "deepmerge-ts": "^4.2.1", - "easy-peasy": "^4.0.1", - "events": "^3.0.0", - "formik": "^2.2.6", - "framer-motion": "^6.3.10", - "i18next": "^21.8.9", - "i18next-http-backend": "^1.4.1", - "i18next-multiload-backend-adapter": "^1.0.0", - "qrcode.react": "^1.0.1", - "react": "^16.14.0", - "react-chartjs-2": "^4.2.0", - "react-dom": "npm:@hot-loader/react-dom", - "react-fast-compare": "^3.2.0", - "react-hot-loader": "^4.12.21", - "react-i18next": "^11.2.1", - "react-router-dom": "^5.1.2", - "react-transition-group": "^4.4.1", - "reaptcha": "^1.7.2", - "sockette": "^2.0.6", - "styled-components": "^5.2.1", - "styled-components-breakpoint": "^3.0.0-preview.20", - "swr": "^0.2.3", - "tailwindcss": "^3.0.24", - "use-fit-text": "^2.4.0", - "uuid": "^8.3.2", - "xterm": "^4.19.0", - "xterm-addon-fit": "^0.5.0", - "xterm-addon-search": "^0.9.0", - "xterm-addon-search-bar": "^0.2.0", - "xterm-addon-web-links": "^0.6.0", - "yup": "^0.29.1" - }, - "devDependencies": { - "@babel/core": "^7.12.1", - "@babel/plugin-proposal-class-properties": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-modules-commonjs": "^7.18.2", - "@babel/plugin-transform-react-jsx": "^7.12.1", - "@babel/plugin-transform-runtime": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-react": "^7.12.1", - "@babel/preset-typescript": "^7.12.1", - "@babel/runtime": "^7.12.1", - "@testing-library/dom": "^8.14.0", - "@testing-library/jest-dom": "^5.16.4", - "@testing-library/react": "12.1.5", - "@testing-library/user-event": "^14.2.1", - "@types/codemirror": "^0.0.98", - "@types/debounce": "^1.2.0", - "@types/events": "^3.0.0", - "@types/jest": "^28.1.3", - "@types/node": "^14.11.10", - "@types/qrcode.react": "^1.0.1", - "@types/react": "^16.14.0", - "@types/react-copy-to-clipboard": "^4.3.0", - "@types/react-dom": "^16.9.16", - "@types/react-redux": "^7.1.1", - "@types/react-router": "^5.1.3", - "@types/react-router-dom": "^5.1.3", - "@types/react-transition-group": "^4.4.0", - "@types/styled-components": "^5.1.7", - "@types/uuid": "^3.4.5", - "@types/webpack-env": "^1.15.2", - "@types/yup": "^0.29.3", - "@typescript-eslint/eslint-plugin": "^5.29.0", - "@typescript-eslint/parser": "^5.29.0", - "autoprefixer": "^10.4.7", - "babel-jest": "^28.1.1", - "babel-loader": "^8.2.5", - "babel-plugin-styled-components": "^2.0.7", - "cross-env": "^7.0.2", - "css-loader": "^5.2.7", - "eslint": "^8.18.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-jest-dom": "^4.0.2", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^4.0.0", - "eslint-plugin-react": "^7.30.1", - "eslint-plugin-react-hooks": "^4.6.0", - "fork-ts-checker-webpack-plugin": "^6.2.10", - "identity-obj-proxy": "^3.0.0", - "jest": "^28.1.1", - "postcss": "^8.4.14", - "postcss-import": "^14.1.0", - "postcss-loader": "^4.0.0", - "postcss-nesting": "^10.1.8", - "postcss-preset-env": "^7.7.1", - "prettier": "^2.7.1", - "redux-devtools-extension": "^2.13.8", - "source-map-loader": "^1.1.3", - "style-loader": "^2.0.0", - "svg-url-loader": "^7.1.1", - "terser-webpack-plugin": "^4.2.3", - "ts-essentials": "^9.1.2", - "ts-jest": "^28.0.5", - "twin.macro": "^2.8.2", - "typescript": "^4.7.3", - "webpack": "^4.43.0", - "webpack-assets-manifest": "^3.1.1", - "webpack-bundle-analyzer": "^3.8.0", - "webpack-cli": "^3.3.12", - "webpack-dev-server": "^3.11.0", - "yarn-deduplicate": "^1.1.1" - }, - "scripts": { - "clean": "cd public/assets && find . \\( -name \"*.js\" -o -name \"*.map\" \\) -type f -delete && rm -rf node_modules/.cache", - "test": "jest", - "lint": "eslint ./resources/scripts/**/*.{ts,tsx} --ext .ts,.tsx", - "watch": "cross-env NODE_ENV=development ./node_modules/.bin/webpack --watch --progress", - "build": "cross-env NODE_ENV=development ./node_modules/.bin/webpack --progress", - "build:production": "yarn run clean && cross-env NODE_ENV=production ./node_modules/.bin/webpack --mode production", - "serve": "yarn run clean && cross-env WEBPACK_PUBLIC_PATH=/webpack@hmr/ NODE_ENV=development webpack-dev-server --host 0.0.0.0 --port 8080 --public https://pterodactyl.test --hot" - }, - "browserslist": [ - "> 0.5%", - "last 2 versions", - "firefox esr", - "not dead" - ], - "babelMacros": { - "twin": { - "preset": "styled-components" + "name": "pterodactyl-panel", + "engines": { + "node": ">=22" }, - "styledComponents": { - "pure": true, - "displayName": true, - "fileName": true + "dependencies": { + "@floating-ui/react-dom-interactions": "^0.6.6", + "@fortawesome/fontawesome-svg-core": "^1.2.32", + "@fortawesome/free-solid-svg-icons": "^5.15.1", + "@fortawesome/react-fontawesome": "^0.1.11", + "@headlessui/react": "^1.6.4", + "@heroicons/react": "^1.0.6", + "@hot-loader/react-dom": "^16.14.0", + "@preact/signals-react": "^1.2.1", + "@tailwindcss/forms": "^0.5.2", + "@tailwindcss/line-clamp": "^0.4.0", + "axios": "^1.13.2", + "boring-avatars": "^1.7.0", + "chart.js": "^3.8.0", + "classnames": "^2.3.1", + "codemirror": "^5.57.0", + "copy-to-clipboard": "^3.3.1", + "date-fns": "^2.28.0", + "debounce": "^1.2.0", + "deepmerge-ts": "^4.2.1", + "easy-peasy": "^4.0.1", + "events": "^3.0.0", + "formik": "^2.2.6", + "framer-motion": "^6.3.10", + "i18next": "^21.8.9", + "i18next-http-backend": "^1.4.1", + "i18next-multiload-backend-adapter": "^1.0.0", + "pathe": "^2.0.3", + "qrcode.react": "^1.0.1", + "react": "^16.14.0", + "react-chartjs-2": "^4.2.0", + "react-dom": "npm:@hot-loader/react-dom", + "react-fast-compare": "^3.2.0", + "react-hot-loader": "^4.12.21", + "react-i18next": "^11.2.1", + "react-router-dom": "^5.1.2", + "react-transition-group": "^4.4.1", + "reaptcha": "^1.7.2", + "sockette": "^2.0.6", + "styled-components": "^5.3.0", + "styled-components-breakpoint": "^3.0.0-preview.20", + "swr": "^0.2.3", + "tailwindcss": "^3.0.24", + "use-fit-text": "^2.4.0", + "uuid": "^13.0.0", + "xterm": "^4.19.0", + "xterm-addon-fit": "^0.5.0", + "xterm-addon-search": "^0.9.0", + "xterm-addon-search-bar": "^0.2.0", + "xterm-addon-web-links": "^0.6.0", + "yup": "^0.29.1" + }, + "devDependencies": { + "@babel/core": "^7.12.1", + "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", + "@babel/plugin-proposal-object-rest-spread": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.1", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-modules-commonjs": "^7.18.2", + "@babel/plugin-transform-react-jsx": "^7.12.1", + "@babel/plugin-transform-runtime": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.1", + "@babel/preset-typescript": "^7.12.1", + "@babel/runtime": "^7.12.1", + "@fontsource-variable/ibm-plex-sans": "^5.2.8", + "@testing-library/dom": "^8.14.0", + "@testing-library/jest-dom": "^5.16.4", + "@testing-library/react": "12.1.5", + "@testing-library/user-event": "^14.2.1", + "@types/codemirror": "^0.0.98", + "@types/debounce": "^1.2.0", + "@types/events": "^3.0.0", + "@types/jest": "^28.1.3", + "@types/node": "^22.0.0", + "@types/path-browserify": "^1.0.3", + "@types/qrcode.react": "^1.0.1", + "@types/react": "^16.14.0", + "@types/react-copy-to-clipboard": "^4.3.0", + "@types/react-dom": "^16.9.16", + "@types/react-redux": "^7.1.1", + "@types/react-router": "^5.1.3", + "@types/react-router-dom": "^5.1.3", + "@types/react-transition-group": "^4.4.0", + "@types/styled-components": "5.1.7", + "@types/uuid": "^3.4.5", + "@types/webpack-env": "^1.18.8", + "@types/yup": "^0.29.3", + "@typescript-eslint/eslint-plugin": "^5", + "@typescript-eslint/parser": "^5", + "autoprefixer": "^10.4.7", + "babel-jest": "^28.1.1", + "babel-loader": "^10.0.0", + "babel-plugin-styled-components": "^2.0.7", + "cross-env": "^7.0.2", + "css-loader": "^7.1.2", + "eslint": "^8", + "eslint-config-prettier": "^8", + "eslint-plugin-jest-dom": "^4.0.2", + "eslint-plugin-prettier": "^4", + "eslint-plugin-react": "^7", + "eslint-plugin-react-hooks": "^4", + "identity-obj-proxy": "^3.0.0", + "jest": "^28.1.1", + "postcss": "^8.5.6", + "postcss-import": "^14.1.0", + "postcss-loader": "^8.2.0", + "postcss-nesting": "^13.0.2", + "postcss-preset-env": "^10.4.0", + "prettier": "^2.7.1", + "redux-devtools-extension": "^2.13.8", + "source-map-loader": "^5.0.0", + "style-loader": "^4.0.0", + "svg-url-loader": "^8.0.0", + "terser-webpack-plugin": "^5.3.14", + "ts-essentials": "^9.1.2", + "ts-jest": "^28.0.5", + "twin.macro": "^2.8.2", + "typescript": "~5.1.0", + "webpack": "^5.103.0", + "webpack-assets-manifest": "^6.4.0", + "webpack-cli": "^6.0.1", + "webpack-dev-server": "^5.2.2" + }, + "scripts": { + "clean": "cd public/assets && find . \\( -name \"*.js\" -o -name \"*.map\" \\) -type f -delete", + "test": "jest", + "tsc": "tsc --noEmit", + "lint": "eslint ./resources/scripts/**/*.{ts,tsx} --ext .ts,.tsx", + "watch": "cross-env NODE_ENV=development ./node_modules/.bin/webpack --watch --progress", + "build": "cross-env NODE_ENV=development ./node_modules/.bin/webpack --progress", + "build:production": "yarn run clean && cross-env NODE_ENV=production ./node_modules/.bin/webpack --mode production", + "serve": "yarn run clean && cross-env NODE_ENV=development USE_LOCAL_CERTS=true WEBPACK_PUBLIC_PATH=https://pterodactyl.test:5173/ webpack serve --progress --hot --server-type https" + }, + "browserslist": [ + "> 0.5%", + "last 2 versions", + "firefox esr", + "not dead" + ], + "babelMacros": { + "twin": { + "preset": "styled-components" + }, + "styledComponents": { + "pure": true, + "displayName": true, + "fileName": true + } } - } } diff --git a/resources/scripts/api/server/getServer.ts b/resources/scripts/api/server/getServer.ts index 1b9d4720..1e82f388 100644 --- a/resources/scripts/api/server/getServer.ts +++ b/resources/scripts/api/server/getServer.ts @@ -44,6 +44,7 @@ export interface Server { variables: ServerEggVariable[]; allocations: Allocation[]; + // Define egg id from Blueprint BlueprintFramework: { eggId: number; }; @@ -69,12 +70,13 @@ export const rawDataToServerObject = ({ attributes: data }: FractalResponseData) featureLimits: { ...data.feature_limits }, isTransferring: data.is_transferring, variables: ((data.relationships?.variables as FractalResponseList | undefined)?.data || []).map( - rawDataToServerEggVariable + rawDataToServerEggVariable, ), allocations: ((data.relationships?.allocations as FractalResponseList | undefined)?.data || []).map( - rawDataToServerAllocation + rawDataToServerAllocation, ), + // Get egg id from Blueprint BlueprintFramework: { eggId: data.BlueprintFramework.egg_id, }, @@ -89,8 +91,8 @@ export default (uuid: string): Promise<[Server, string[]]> => { rawDataToServerObject(data), // eslint-disable-next-line camelcase data.meta?.is_server_owner ? ['*'] : data.meta?.user_permissions || [], - ]) + ]), ) .catch(reject); }); -}; \ No newline at end of file +}; diff --git a/resources/scripts/assets/css/GlobalStylesheet.ts b/resources/scripts/assets/css/GlobalStylesheet.ts deleted file mode 100644 index 7f520be4..00000000 --- a/resources/scripts/assets/css/GlobalStylesheet.ts +++ /dev/null @@ -1,66 +0,0 @@ -import tw from 'twin.macro'; -import { createGlobalStyle } from 'styled-components/macro'; - -export default createGlobalStyle` - body { - ${tw`font-sans bg-neutral-800 text-neutral-200`}; - letter-spacing: 0.015em; - } - - h1, h2, h3, h4, h5, h6 { - ${tw`font-medium tracking-normal font-header`}; - } - - p { - ${tw`text-neutral-200 leading-snug font-sans`}; - } - - form { - ${tw`m-0`}; - } - - textarea, select, input, button, button:focus, button:focus-visible { - ${tw`outline-none`}; - } - - input[type=number]::-webkit-outer-spin-button, - input[type=number]::-webkit-inner-spin-button { - -webkit-appearance: none !important; - margin: 0; - } - - input[type=number] { - -moz-appearance: textfield !important; - } - - /* Scroll Bar Style */ - ::-webkit-scrollbar { - background: none; - width: 16px; - height: 16px; - } - - ::-webkit-scrollbar-thumb { - border: solid 0 rgb(0 0 0 / 0%); - border-right-width: 4px; - border-left-width: 4px; - -webkit-border-radius: 9px 4px; - -webkit-box-shadow: inset 0 0 0 1px hsl(211, 10%, 53%), inset 0 0 0 4px hsl(209deg 18% 30%); - } - - ::-webkit-scrollbar-track-piece { - margin: 4px 0; - } - - ::-webkit-scrollbar-thumb:horizontal { - border-right-width: 0; - border-left-width: 0; - border-top-width: 4px; - border-bottom-width: 4px; - -webkit-border-radius: 4px 9px; - } - - ::-webkit-scrollbar-corner { - background: transparent; - } -`; diff --git a/resources/scripts/components/NavigationBar.tsx b/resources/scripts/components/NavigationBar.tsx index e126957a..27a494d4 100644 --- a/resources/scripts/components/NavigationBar.tsx +++ b/resources/scripts/components/NavigationBar.tsx @@ -58,7 +58,7 @@ export default () => { {name} diff --git a/resources/scripts/components/server/console/Console.tsx b/resources/scripts/components/server/console/Console.tsx index d32ed80a..ac9df620 100644 --- a/resources/scripts/components/server/console/Console.tsx +++ b/resources/scripts/components/server/console/Console.tsx @@ -204,7 +204,7 @@ export default () => { {canSendCommands && ( -
{description}