From 4cf0b0d542d52398828fd2cffe40a2effef3bbbf Mon Sep 17 00:00:00 2001 From: neizbejnoezlo <137374284+neizbejnoezlo@users.noreply.github.com> Date: Wed, 19 Aug 2026 16:40:24 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81?= =?UTF-8?q?=20=D1=82=D0=B5=D1=85=D0=BD=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=BE=D0=B1=D1=81=D0=BB=D1=83=D0=B6=D0=B8=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=20=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=D1=81=D1=82=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + mdm-front/.gitignore | 10 + mdm-front/codegen.ts | 24 + mdm-front/package-lock.json | 3514 ++++++++++++++++- mdm-front/package.json | 6 +- .../device/api/device.documents.graphql | 471 +++ .../src/entities/device/api/device.graphql.ts | 407 +- .../src/entities/device/lib/maintenance.ts | 54 + mdm-front/src/entities/device/model/types.ts | 225 +- .../employee/api/employee.documents.graphql | 299 ++ .../entities/employee/api/employee.graphql.ts | 339 +- .../src/entities/employee/model/types.ts | 253 +- .../features/auth/api/auth.documents.graphql | 37 + .../src/features/auth/api/auth.graphql.ts | 50 +- mdm-front/src/features/auth/ui/AuthGate.tsx | 28 +- mdm-front/src/index.scss | 12 + .../src/pages/DevicePage/DevicePage.scss | 207 +- mdm-front/src/pages/DevicePage/DevicePage.tsx | 123 +- .../DeviceAppsView/DeviceAppsView.scss | 59 +- .../DeviceAppsView/DeviceAppsView.tsx | 6 +- .../DeviceHistoryModal/DeviceHistoryModal.tsx | 3 +- .../DeviceMainCard/DeviceMainCard.tsx | 110 +- .../DeviceMaintenanceHistoryModal.scss | 235 ++ .../DeviceMaintenanceHistoryModal.tsx | 193 + .../DeviceMaintenanceMetrics.scss | 42 + .../DeviceMaintenanceMetrics.tsx | 82 + .../DeviceMaintenanceModal.scss | 421 ++ .../DeviceMaintenanceModal.tsx | 525 +++ .../DeviceMapCard/DeviceMapCard.tsx | 5 +- mdm-front/src/pages/DevicePage/types.ts | 9 +- .../src/pages/DevicesPage/DevicesPage.scss | 11 +- .../src/pages/DevicesPage/DevicesPage.tsx | 105 +- .../DevicesFiltersPanel.tsx | 99 +- .../components/DevicesTabs/DevicesTabs.tsx | 56 +- .../AddOrganisationModal.scss | 6 + .../AddOrganisationModal.tsx | 2 +- mdm-front/src/pages/LoginPage/LoginPage.scss | 160 +- mdm-front/src/pages/LoginPage/LoginPage.tsx | 18 +- mdm-front/src/pages/MapPage/MapPage.tsx | 16 +- .../OrganisationPage/OrganisationPage.scss | 11 +- .../OrganisationPage/OrganisationPage.tsx | 53 +- .../shared/api/generated/fragment-masking.ts | 87 + mdm-front/src/shared/api/generated/gql.ts | 58 + mdm-front/src/shared/api/generated/graphql.ts | 411 ++ mdm-front/src/shared/api/generated/index.ts | 2 + mdm-front/src/shared/lib/isPresent.ts | 5 + mdm-front/src/shared/theme/themeTransition.ts | 112 + mdm-front/src/shared/theme/useTheme.ts | 20 +- mdm-front/src/shared/ui/Tooltip/Tooltip.scss | 54 + mdm-front/src/shared/ui/Tooltip/Tooltip.tsx | 84 + mdm-front/src/widgets/Navbar/Navbar.scss | 159 +- mdm-front/src/widgets/Navbar/Navbar.tsx | 41 +- .../widgets/Notification/Notification.scss | 8 +- .../src/widgets/Notification/Notification.tsx | 8 +- mdm-front/vite.config.ts | 8 +- 55 files changed, 7657 insertions(+), 1688 deletions(-) create mode 100644 .gitignore create mode 100644 mdm-front/codegen.ts create mode 100644 mdm-front/src/entities/device/api/device.documents.graphql create mode 100644 mdm-front/src/entities/device/lib/maintenance.ts create mode 100644 mdm-front/src/entities/employee/api/employee.documents.graphql create mode 100644 mdm-front/src/features/auth/api/auth.documents.graphql create mode 100644 mdm-front/src/pages/DevicePage/components/DeviceMaintenanceHistoryModal/DeviceMaintenanceHistoryModal.scss create mode 100644 mdm-front/src/pages/DevicePage/components/DeviceMaintenanceHistoryModal/DeviceMaintenanceHistoryModal.tsx create mode 100644 mdm-front/src/pages/DevicePage/components/DeviceMaintenanceMetrics/DeviceMaintenanceMetrics.scss create mode 100644 mdm-front/src/pages/DevicePage/components/DeviceMaintenanceMetrics/DeviceMaintenanceMetrics.tsx create mode 100644 mdm-front/src/pages/DevicePage/components/DeviceMaintenanceModal/DeviceMaintenanceModal.scss create mode 100644 mdm-front/src/pages/DevicePage/components/DeviceMaintenanceModal/DeviceMaintenanceModal.tsx create mode 100644 mdm-front/src/shared/api/generated/fragment-masking.ts create mode 100644 mdm-front/src/shared/api/generated/gql.ts create mode 100644 mdm-front/src/shared/api/generated/graphql.ts create mode 100644 mdm-front/src/shared/api/generated/index.ts create mode 100644 mdm-front/src/shared/lib/isPresent.ts create mode 100644 mdm-front/src/shared/theme/themeTransition.ts create mode 100644 mdm-front/src/shared/ui/Tooltip/Tooltip.scss create mode 100644 mdm-front/src/shared/ui/Tooltip/Tooltip.tsx diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b3826b1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Separate repository +/Arma_mdm/ diff --git a/mdm-front/.gitignore b/mdm-front/.gitignore index a547bf3..4ea1904 100644 --- a/mdm-front/.gitignore +++ b/mdm-front/.gitignore @@ -12,6 +12,16 @@ dist dist-ssr *.local +# Local environment +.env +.env.* +!.env.example + +# Local working files +.artifact-third-sheet-work/ +/*.xlsx +/public/photo_2025-03-29_20-05-51.jpg + # Editor directories and files .vscode/* !.vscode/extensions.json diff --git a/mdm-front/codegen.ts b/mdm-front/codegen.ts new file mode 100644 index 0000000..8c02c9e --- /dev/null +++ b/mdm-front/codegen.ts @@ -0,0 +1,24 @@ +import type { CodegenConfig } from '@graphql-codegen/cli' + +const config: CodegenConfig = { + schema: '../Arma_mdm/src/main/resources/graphql/**/*.graphql', + documents: ['src/**/*.graphql'], + generates: { + 'src/shared/api/generated/': { + preset: 'client', + config: { + enumsAsTypes: true, + scalars: { + ID: { + input: 'string', + output: 'number', + }, + }, + useTypeImports: true, + }, + }, + }, + ignoreNoDocuments: true, +} + +export default config diff --git a/mdm-front/package-lock.json b/mdm-front/package-lock.json index e6c447d..d9b323f 100644 --- a/mdm-front/package-lock.json +++ b/mdm-front/package-lock.json @@ -39,6 +39,8 @@ }, "devDependencies": { "@eslint/js": "^10.0.1", + "@graphql-codegen/cli": "^7.2.0", + "@graphql-codegen/client-preset": "^6.1.3", "@types/leaflet": "^1.9.21", "@types/node": "^24.12.2", "@types/react": "^19.2.14", @@ -91,14 +93,29 @@ } } }, - "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "node_modules/@ardatan/relay-compiler": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@ardatan/relay-compiler/-/relay-compiler-13.0.2.tgz", + "integrity": "sha512-VFpv9UP820SiwDUPYtq7PmD3jifzZlevkQ26bhbSzFeruSTys0eHzQCZyKg+IhgmZzwPI9AFjPe26ABNjGeIKg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/runtime": "^8.0.0", + "immutable": "^5.1.9", + "invariant": "^2.2.4" + }, + "peerDependencies": { + "graphql": "*" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -107,9 +124,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", "engines": { @@ -117,21 +134,21 @@ } }, "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -148,14 +165,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -165,14 +182,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -182,9 +199,9 @@ } }, "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", "engines": { @@ -192,29 +209,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -223,10 +240,20 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", "engines": { @@ -234,9 +261,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", "engines": { @@ -244,9 +271,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", "engines": { @@ -254,27 +281,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", - "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" + "@babel/types": "^7.29.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -283,34 +310,57 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz", + "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-8.0.0.tgz", + "integrity": "sha512-sL6cvO2IfkSu/iU+zs2S/w01B7A8V7suXSIKEN4hPFFdZoiPGxrj5pAG0lCaqLWiEIrjKzdznIWuaLcxPR53qw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", "debug": "^4.3.1" }, "engines": { @@ -318,14 +368,14 @@ } }, "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -371,6 +421,50 @@ "tslib": "^2.4.0" } }, + "node_modules/@envelop/core": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@envelop/core/-/core-5.5.1.tgz", + "integrity": "sha512-3DQg8sFskDo386TkL5j12jyRAdip/8yzK3x7YGbZBgobZ4aKXrvDU0GppU0SnmrpQnNaiTUsxBs9LKkwQ/eyvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@envelop/instrumentation": "^1.0.0", + "@envelop/types": "^5.2.1", + "@whatwg-node/promise-helpers": "^1.2.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@envelop/instrumentation": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@envelop/instrumentation/-/instrumentation-1.0.0.tgz", + "integrity": "sha512-cxgkB66RQB95H3X27jlnxCRNTmPuSTgmBAq6/4n2Dtv4hsk4yz8FadA1ggmd0uZzvKqWD6CR+WFgTjhDqg7eyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@whatwg-node/promise-helpers": "^1.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@envelop/types": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@envelop/types/-/types-5.2.1.tgz", + "integrity": "sha512-CsFmA3u3c2QoLDTfEpGr4t25fjMU31nyvse7IzWTvb0ZycuPjMjb0fjlheh+PbhBYb9YLugnT2uY6Mwcg1o+Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@whatwg-node/promise-helpers": "^1.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", @@ -499,6 +593,13 @@ "node": "^20.19.0 || ^22.13.0 || >=24" } }, + "node_modules/@fastify/busboy": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.2.1.tgz", + "integrity": "sha512-tgK4O+57iz5ycYNGXE5ZWj1ES03lD2XnnBYWSbU/3wYZRMQzCUq7Ycds/RdyBZQeL5MU4fxBt6lzbIWf/Bickw==", + "dev": true, + "license": "MIT" + }, "node_modules/@floating-ui/core": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", @@ -537,6 +638,1042 @@ "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", "license": "MIT" }, + "node_modules/@graphql-codegen/add": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-7.1.0.tgz", + "integrity": "sha512-bytJg1kel5zfgK3JSYbGwtpbNe6F9OPZSR6DiMDe9RVxblAgl6w4zEEPd/mM3rhNJ1VmGYLbNnf5e1eUfXQEbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^7.1.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/cli": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-7.2.0.tgz", + "integrity": "sha512-JPJw2vquEIpO3b8XJyxFVTrYi6WRn/OKu/SlzQA+IwAVT7GZPeG+AHmfRXAvpVMj31899nTpQYEQGUxx3ZqubQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.18.13", + "@babel/template": "^7.18.10", + "@babel/types": "^7.18.13", + "@graphql-codegen/client-preset": "^6.1.0", + "@graphql-codegen/core": "^6.2.0", + "@graphql-codegen/plugin-helpers": "^7.1.0", + "@graphql-tools/apollo-engine-loader": "^8.0.28", + "@graphql-tools/code-file-loader": "^8.1.28", + "@graphql-tools/git-loader": "^8.0.32", + "@graphql-tools/github-loader": "^9.0.6", + "@graphql-tools/graphql-file-loader": "^8.1.11", + "@graphql-tools/json-file-loader": "^8.0.26", + "@graphql-tools/load": "^8.1.8", + "@graphql-tools/merge": "^9.0.6", + "@graphql-tools/url-loader": "^9.0.6", + "@graphql-tools/utils": "^11.2.0", + "@inquirer/prompts": "^8.3.2", + "@whatwg-node/fetch": "^0.10.0", + "chalk": "^5.6.0", + "cosmiconfig": "^9.0.0", + "debounce": "^3.0.0", + "detect-indent": "^7.0.0", + "graphql-config": "^5.1.6", + "is-glob": "^4.0.1", + "jiti": "^2.3.0", + "json-to-pretty-yaml": "^1.2.2", + "listr2": "^10.2.1", + "log-symbols": "^7.0.0", + "micromatch": "^4.0.5", + "shell-quote": "^1.7.3", + "string-env-interpolation": "^1.0.1", + "ts-log": "^3.0.0", + "tslib": "^2.4.0", + "yaml": "^2.3.1", + "yargs": "^18.0.0" + }, + "bin": { + "gql-gen": "esm/bin.js", + "graphql-code-generator": "esm/bin.js", + "graphql-codegen": "esm/bin.js", + "graphql-codegen-cjs": "cjs/bin.js", + "graphql-codegen-esm": "esm/bin.js" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@parcel/watcher": "^2.1.0", + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@parcel/watcher": { + "optional": true + } + } + }, + "node_modules/@graphql-codegen/client-preset": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@graphql-codegen/client-preset/-/client-preset-6.1.3.tgz", + "integrity": "sha512-bIuJiirdwzx784bnqZsoC+wEzCyhr0T+tbVhwuZRudyZXPeLm+7/tn/FTAMqZhDGgSr6hVnpcU41abdBNn2zag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7", + "@graphql-codegen/add": "^7.1.0", + "@graphql-codegen/gql-tag-operations": "^6.1.0", + "@graphql-codegen/plugin-helpers": "^7.1.0", + "@graphql-codegen/typed-document-node": "^7.1.0", + "@graphql-codegen/typescript": "^6.1.0", + "@graphql-codegen/typescript-operations": "^6.1.6", + "@graphql-codegen/visitor-plugin-common": "^7.2.5", + "@graphql-tools/documents": "^1.0.0", + "@graphql-tools/utils": "^11.2.0", + "@graphql-typed-document-node/core": "3.2.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0", + "graphql-sock": "^1.0.0" + }, + "peerDependenciesMeta": { + "graphql-sock": { + "optional": true + } + } + }, + "node_modules/@graphql-codegen/core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-6.2.0.tgz", + "integrity": "sha512-RZadhhwYhuy2ZdIGK40vYVBMzXEFGkCC+58MUC/F2af/gKznEYNzHgmNBUBCk/BTklyUsNu0mIXmyGE4tTA0PA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^7.1.0", + "@graphql-tools/schema": "^10.0.0", + "@graphql-tools/utils": "^11.2.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/gql-tag-operations": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-6.1.0.tgz", + "integrity": "sha512-AmMcZFwonufvWJnQm7I0lBxKpAm+35BcCrOOvUlBoviohiR17aPoTGAOaNAEtpcpI86lnZ9m9AXUdiKMdm8nnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^7.1.0", + "@graphql-codegen/visitor-plugin-common": "^7.2.0", + "@graphql-tools/utils": "^11.2.0", + "auto-bind": "^5.0.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/plugin-helpers": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-7.1.0.tgz", + "integrity": "sha512-ieJH7kZ5oSZKBPJs7CvHMrFY/CLYLklqv74ir93qMwRna6geZsbIMoJzTDBXohxcQTITiProiYSGrEtZjIpYGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.2.0", + "change-case-all": "^2.1.0", + "common-tags": "1.8.2", + "import-from": "4.0.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/schema-ast": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-6.1.0.tgz", + "integrity": "sha512-/xuGkM5gUNFRoaQLumKbENdX7Hc8ha49z9OXsEZY8E+46mMjqzXGF0NtCJ892cmoX7EUgI5c8T+LZqS2upx2Aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^7.1.0", + "@graphql-tools/utils": "^11.2.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/typed-document-node": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typed-document-node/-/typed-document-node-7.1.0.tgz", + "integrity": "sha512-V6H+ItyqXtYY+JQb76LAoN627Xfzpn29/ifwCFAv61iEepzNzh86sa+yZclflr0G8LDmhcVY5hpPJd3a1qbOfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^7.1.0", + "@graphql-codegen/visitor-plugin-common": "^7.2.0", + "auto-bind": "^5.0.0", + "change-case-all": "^2.1.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/typescript": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-6.1.0.tgz", + "integrity": "sha512-2Hu3111O/AwV28Ap7tNsixlmXSAJuQbQArQklx+IC/tNswpckZnCfmlcBtTJrGU1+mJXEneJXGfb2XWvKjbhlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^7.1.0", + "@graphql-codegen/schema-ast": "^6.1.0", + "@graphql-codegen/visitor-plugin-common": "^7.2.0", + "auto-bind": "^5.0.0", + "tslib": "~2.8.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-codegen/typescript-operations": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-6.1.6.tgz", + "integrity": "sha512-qsYRkK27YbSL2doifPvldVwdwHRQtpsxXJINs22wQWGksC1Mrgn9YNaAGUZ2so46U20TKTm4SBoiNXRJE3esqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^7.1.0", + "@graphql-codegen/schema-ast": "^6.1.0", + "@graphql-codegen/visitor-plugin-common": "^7.2.5", + "auto-bind": "^5.0.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0", + "graphql-sock": "^1.0.0" + }, + "peerDependenciesMeta": { + "graphql-sock": { + "optional": true + } + } + }, + "node_modules/@graphql-codegen/visitor-plugin-common": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-7.2.5.tgz", + "integrity": "sha512-hqOemBp0Ue+WSmk8EDcKP+lghuLC2zsI+jHzSUuoffTZnEN2qZH4VP2C9c1fVd2yy6v+YQiiObOarTMaqF4q9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-codegen/plugin-helpers": "^7.1.0", + "@graphql-tools/optimize": "^2.0.0", + "@graphql-tools/relay-operation-optimizer": "^7.1.1", + "@graphql-tools/utils": "^11.2.0", + "auto-bind": "^5.0.0", + "change-case-all": "^2.1.0", + "dependency-graph": "^1.0.0", + "graphql-tag": "^2.11.0", + "parse-filepath": "^1.0.2", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-hive/signal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@graphql-hive/signal/-/signal-2.0.0.tgz", + "integrity": "sha512-Pz8wB3K0iU6ae9S1fWfsmJX24CcGeTo6hE7T44ucmV/ALKRj+bxClmqrYcDT7v3f0d12Rh4FAXBb6gon+WkDpQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@graphql-tools/apollo-engine-loader": { + "version": "8.0.35", + "resolved": "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.35.tgz", + "integrity": "sha512-9tX4Z+kQnLHt1rXb+JVa8ME4f4N90FM0s0CB2ss3k+Ua8wfjMbv5lFT4WpCzzmhMIK6lZ1KMn+0SIaJMYLVGJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^12.0.0", + "@whatwg-node/fetch": "^0.10.13", + "sync-fetch": "0.6.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/apollo-engine-loader/node_modules/@graphql-tools/utils": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-12.0.0.tgz", + "integrity": "sha512-aMdIo/l+8j4lhamWAf+MWHr+lOW8zArSBKXspqtKHgt5I2JF9LS55KDLUe/L9AiJOV/O6qJJ60hgYydbnJHbxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/batch-execute": { + "version": "10.0.9", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-10.0.9.tgz", + "integrity": "sha512-khIgAPlyaWJ3dVX6SsqOkABZCH1Gii32WHn3xMzavupsxPCfb/9G3zjdswptzTFrOcZ92dWo7MXvwNFkRfNN4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.0.0", + "@whatwg-node/promise-helpers": "^1.3.2", + "dataloader": "^2.2.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/code-file-loader": { + "version": "8.1.37", + "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-8.1.37.tgz", + "integrity": "sha512-ne+mr8XUvN+8EZ+dTKalSt74KUNYnzZq1904SJ0+l8NybmkSHBb821AcKLAfYxFXPFGGC4oQwyIxZa+iVB6K9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/graphql-tag-pluck": "8.3.36", + "@graphql-tools/utils": "^12.0.0", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/code-file-loader/node_modules/@graphql-tools/utils": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-12.0.0.tgz", + "integrity": "sha512-aMdIo/l+8j4lhamWAf+MWHr+lOW8zArSBKXspqtKHgt5I2JF9LS55KDLUe/L9AiJOV/O6qJJ60hgYydbnJHbxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/delegate": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-12.1.1.tgz", + "integrity": "sha512-BiePOU2Nev9KDpAEOw25isTm6y/Ea6Sb3c/aH0P9s25c/6mzluvpEo66nnA9vWeirIRScS7rUtN0Jv3P02h3VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/batch-execute": "^10.0.9", + "@graphql-tools/executor": "^1.4.13", + "@graphql-tools/schema": "^10.0.29", + "@graphql-tools/utils": "^11.0.0", + "@repeaterjs/repeater": "^3.0.6", + "@whatwg-node/promise-helpers": "^1.3.2", + "dataloader": "^2.2.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/documents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/documents/-/documents-1.0.1.tgz", + "integrity": "sha512-aweoMH15wNJ8g7b2r4C4WRuJxZ0ca8HtNO54rkye/3duxTkW4fGBEutCx03jCIr5+a1l+4vFJNP859QnAVBVCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.5.7.tgz", + "integrity": "sha512-UcXVClkBml+qyGEsQxfEaAkboqySVGFUd9ivn7pDc9jZSckgF6zL21cNxuRH5ZA2exneV3PTtcc0I0rDOdE0Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^11.2.2", + "@graphql-typed-document-node/core": "^3.2.0", + "@repeaterjs/repeater": "^3.1.0", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/promise-helpers": "^1.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-common": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-common/-/executor-common-1.0.6.tgz", + "integrity": "sha512-23/K5C+LSlHDI0mj2SwCJ33RcELCcyDUgABm1Z8St7u/4Z5+95i925H/NAjUyggRjiaY8vYtNiMOPE49aPX1sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@envelop/core": "^5.4.0", + "@graphql-tools/utils": "^11.0.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-graphql-ws": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-3.1.5.tgz", + "integrity": "sha512-WXRsfwu9AkrORD9nShrd61OwwxeQ5+eXYcABRR3XPONFIS8pWQfDJGGqxql9/227o/s0DV5SIfkBURb5Knzv+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/executor-common": "^1.0.6", + "@graphql-tools/utils": "^11.0.0", + "@whatwg-node/disposablestack": "^0.0.6", + "graphql-ws": "^6.0.6", + "isows": "^1.0.7", + "tslib": "^2.8.1", + "ws": "^8.18.3" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-http": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-3.3.0.tgz", + "integrity": "sha512-IkKXIjSg9U8MNsQUBVJAXE4+LSxaQ0cs7p5JTALLGDABY1o17vPDRwWALsX81AXD5dY27ihi/+OhGMueW/Fopg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-hive/signal": "^2.0.0", + "@graphql-tools/executor-common": "^1.0.6", + "@graphql-tools/utils": "^11.0.0", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/fetch": "^0.10.13", + "@whatwg-node/promise-helpers": "^1.3.2", + "meros": "^1.3.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-legacy-ws": { + "version": "1.1.33", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.1.33.tgz", + "integrity": "sha512-KxYRFVuqYm/37DW2NsbbS6mwUS8G3glgEGz2yEhY66wFixT0lIy8X4OsV/PixIuh7AwILS/B/A4gZIIGuV2oFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^12.0.0", + "@types/ws": "^8.0.0", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.4.0", + "ws": "^8.21.3" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/executor-legacy-ws/node_modules/@graphql-tools/utils": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-12.0.0.tgz", + "integrity": "sha512-aMdIo/l+8j4lhamWAf+MWHr+lOW8zArSBKXspqtKHgt5I2JF9LS55KDLUe/L9AiJOV/O6qJJ60hgYydbnJHbxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/git-loader": { + "version": "8.0.41", + "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-8.0.41.tgz", + "integrity": "sha512-KhEaFCWRYfPDwvAEIaNgdkvOepclJL/1lwmfpn2LO1/Isq8u8wZwOu1TSaZkp/ICip0UkhzWTnx84FBPCfds5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/graphql-tag-pluck": "8.3.36", + "@graphql-tools/utils": "^12.0.0", + "is-glob": "4.0.3", + "micromatch": "^4.0.8", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/git-loader/node_modules/@graphql-tools/utils": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-12.0.0.tgz", + "integrity": "sha512-aMdIo/l+8j4lhamWAf+MWHr+lOW8zArSBKXspqtKHgt5I2JF9LS55KDLUe/L9AiJOV/O6qJJ60hgYydbnJHbxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/github-loader": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-9.1.7.tgz", + "integrity": "sha512-VcA9JFh6G/kBN8bosgs6lZLF3VlW270o1IbA17e+Kqg6atKhEqLQSZ3eJ0RYoL02Nl7DI7hS+N9O5uTO31FZqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/executor-http": "^3.3.0", + "@graphql-tools/graphql-tag-pluck": "^8.3.36", + "@graphql-tools/utils": "^12.0.0", + "@whatwg-node/fetch": "^0.10.13", + "@whatwg-node/promise-helpers": "^1.0.0", + "sync-fetch": "0.6.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/github-loader/node_modules/@graphql-tools/utils": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-12.0.0.tgz", + "integrity": "sha512-aMdIo/l+8j4lhamWAf+MWHr+lOW8zArSBKXspqtKHgt5I2JF9LS55KDLUe/L9AiJOV/O6qJJ60hgYydbnJHbxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-file-loader": { + "version": "8.1.19", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.1.19.tgz", + "integrity": "sha512-aB7kelZK4Rk4iPMS1bFjlTvtqbByxE98XL/hyFxSAKRyEQ+fNQ1HHnO1yHRlnG+6BGhesImWo3B1b7mUzlkCbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/import": "^7.1.19", + "@graphql-tools/utils": "^12.0.0", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-file-loader/node_modules/@graphql-tools/utils": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-12.0.0.tgz", + "integrity": "sha512-aMdIo/l+8j4lhamWAf+MWHr+lOW8zArSBKXspqtKHgt5I2JF9LS55KDLUe/L9AiJOV/O6qJJ60hgYydbnJHbxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-tag-pluck": { + "version": "8.3.36", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.36.tgz", + "integrity": "sha512-o+J7i2i1MhswlCcfuWg2JmHZMcKTtFtSzTdDmDOC0/jroHL0pQTtnGPg4yM3UqKAaqntSYPTUW0QSphq8+xCEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.7", + "@babel/parser": "^7.29.3", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "@graphql-tools/utils": "^12.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/graphql-tag-pluck/node_modules/@graphql-tools/utils": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-12.0.0.tgz", + "integrity": "sha512-aMdIo/l+8j4lhamWAf+MWHr+lOW8zArSBKXspqtKHgt5I2JF9LS55KDLUe/L9AiJOV/O6qJJ60hgYydbnJHbxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/import": { + "version": "7.1.19", + "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-7.1.19.tgz", + "integrity": "sha512-oC5BL5T44zprAYpx3EvTX9JgooBQ7qUS9wdRvBUx7SwdFvMvPuGtcNaNBkprBb+mj1ZR65Gh6ni893iPZhOkvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^12.0.0", + "resolve-from": "5.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/import/node_modules/@graphql-tools/utils": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-12.0.0.tgz", + "integrity": "sha512-aMdIo/l+8j4lhamWAf+MWHr+lOW8zArSBKXspqtKHgt5I2JF9LS55KDLUe/L9AiJOV/O6qJJ60hgYydbnJHbxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/json-file-loader": { + "version": "8.0.33", + "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-8.0.33.tgz", + "integrity": "sha512-k0qSrgP1kOkVX7fB+pVxe2HOBrop08VFjJPmx/b3BSZTiZQLs4Pkb/aENGEsKuhS9CI2NbUnCHy0oJdIvIb5BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^12.0.0", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/json-file-loader/node_modules/@graphql-tools/utils": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-12.0.0.tgz", + "integrity": "sha512-aMdIo/l+8j4lhamWAf+MWHr+lOW8zArSBKXspqtKHgt5I2JF9LS55KDLUe/L9AiJOV/O6qJJ60hgYydbnJHbxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/load": { + "version": "8.1.16", + "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-8.1.16.tgz", + "integrity": "sha512-b3VK4+lX9w3c0TPp0UBzqpPziZKRLmcmF4dDVWlCylhQAlB0SlHJK+oIovMX2qCfmB/Q5Y/7ayFsVy2la+pW6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/schema": "^10.1.0", + "@graphql-tools/utils": "^12.0.0", + "p-limit": "3.1.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/load/node_modules/@graphql-tools/utils": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-12.0.0.tgz", + "integrity": "sha512-aMdIo/l+8j4lhamWAf+MWHr+lOW8zArSBKXspqtKHgt5I2JF9LS55KDLUe/L9AiJOV/O6qJJ60hgYydbnJHbxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/merge": { + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.2.3.tgz", + "integrity": "sha512-cKRoXqJGy2zSRBLvotQpkACbXlHAb0yuHLN0l0ypKGCuL3NnF0zofYalkBJqiBxxxpK0lr3s9uowKFHCKi1/ZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^12.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/merge/node_modules/@graphql-tools/utils": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-12.0.0.tgz", + "integrity": "sha512-aMdIo/l+8j4lhamWAf+MWHr+lOW8zArSBKXspqtKHgt5I2JF9LS55KDLUe/L9AiJOV/O6qJJ60hgYydbnJHbxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/optimize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-2.0.0.tgz", + "integrity": "sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/relay-operation-optimizer": { + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.1.9.tgz", + "integrity": "sha512-sbkTNbuwT0iGSaQ5hc7dWzfmxTOPVXMZhb5TmdrIWVqhbw8sRenwd/tGCF6jFTG67CSCm0zXOmb9FJhmdM3FmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ardatan/relay-compiler": "^13.0.2", + "@graphql-tools/utils": "^12.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/relay-operation-optimizer/node_modules/@graphql-tools/utils": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-12.0.0.tgz", + "integrity": "sha512-aMdIo/l+8j4lhamWAf+MWHr+lOW8zArSBKXspqtKHgt5I2JF9LS55KDLUe/L9AiJOV/O6qJJ60hgYydbnJHbxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/schema": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.1.0.tgz", + "integrity": "sha512-wao48XQnfY631s3jXoNrhEHvCI8mlKXmIuWrR7F6zAdv92VuSOfHoq9P9KL2EnUMgBUnaStnByOx9Mn6RieWDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/merge": "^9.2.3", + "@graphql-tools/utils": "^12.0.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/schema/node_modules/@graphql-tools/utils": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-12.0.0.tgz", + "integrity": "sha512-aMdIo/l+8j4lhamWAf+MWHr+lOW8zArSBKXspqtKHgt5I2JF9LS55KDLUe/L9AiJOV/O6qJJ60hgYydbnJHbxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/url-loader": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-9.1.7.tgz", + "integrity": "sha512-SqaJW+Eo+zWXOgjSZepfVhZcIbwjw36Voo/ft4h0fAnWKP+T/St0Kd+ZRMSnV7mtmhp0WtCw+ugQfSWaG22Lzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/executor-graphql-ws": "^3.1.4", + "@graphql-tools/executor-http": "^3.3.0", + "@graphql-tools/executor-legacy-ws": "^1.1.33", + "@graphql-tools/utils": "^12.0.0", + "@graphql-tools/wrap": "^11.1.1", + "@types/ws": "^8.0.0", + "@whatwg-node/fetch": "^0.10.13", + "@whatwg-node/promise-helpers": "^1.0.0", + "isomorphic-ws": "^5.0.0", + "sync-fetch": "0.6.0", + "tslib": "^2.4.0", + "ws": "^8.21.3" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/url-loader/node_modules/@graphql-tools/utils": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-12.0.0.tgz", + "integrity": "sha512-aMdIo/l+8j4lhamWAf+MWHr+lOW8zArSBKXspqtKHgt5I2JF9LS55KDLUe/L9AiJOV/O6qJJ60hgYydbnJHbxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/utils": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-11.2.2.tgz", + "integrity": "sha512-Do2A/t6ayqOma8m7PvpYMsCBswL+NB35BQSng4GWSBqafL2/BnfAZy/NSENPwV721Rm2fG0BHETFC0+FJJZmLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@graphql-tools/wrap": { + "version": "11.1.21", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-11.1.21.tgz", + "integrity": "sha512-28a+cTtDONeO+Bg+241biALEHdZuIyFk7libduztuh+Ecwk5hCZgLVFn1S5yJXgvMvkm9+MRVSRQaWILsyougA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/delegate": "^12.1.1", + "@graphql-tools/schema": "^10.0.29", + "@graphql-tools/utils": "^11.0.0", + "@whatwg-node/promise-helpers": "^1.3.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, "node_modules/@graphql-typed-document-node/core": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", @@ -624,6 +1761,350 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@inquirer/ansi": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.7.tgz", + "integrity": "sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.2.1.tgz", + "integrity": "sha512-b6xmA/VlTe0ZgDQHDui+Nav470u7u49nRd8/iuhOcQPO9Ch7lGuogydhi2VOmNlZ+zXcM8IcPuNSwQcdJaF/kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^11.2.1", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.1.1.tgz", + "integrity": "sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.2.1.tgz", + "integrity": "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7", + "cli-width": "^4.1.0", + "fast-wrap-ansi": "^0.2.0", + "mute-stream": "^3.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/editor": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-5.2.2.tgz", + "integrity": "sha512-ZRVd/oD+sYsUd5zVm0NflqEzlqfYCyHNsqkHl2oWXEUHs12tCbcSFi+wVFEvD8+LGRaMUsVrE7qeo6lSG/S1Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/external-editor": "^3.0.3", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-5.1.1.tgz", + "integrity": "sha512-YmQpenjbFSHAK3sOd44puHh3V1KXXr+JiNpUztoSQ4drLh2rTVzTap/YtlAVu/5xavifIlBfNEzJ/neZJ1a/1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-6thf5I8q7lZwzGLAxPaaGEREEkZ3nyePPDQ1oyobblxmEE8mqTLguScP7pDjUTAibiyb4hfXl+qjUEJ+di/aNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.2" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.7.tgz", + "integrity": "sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + } + }, + "node_modules/@inquirer/input": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.1.2.tgz", + "integrity": "sha512-9K/DDBSQpOyZSkt6sOVP9Vo0TR7atX2kuILsUu0x3wVcVbe97lJwIJKMLdMw25tDYuXl/qp6erT0Xs1rfmcfZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-4.1.1.tgz", + "integrity": "sha512-XF4IXAbPnGPgw0wsbC/i2tPcyfdZgDpUlhsqU0SfT4IRIGWha6Xm9VRgN5yYxJq+jnyXlfXI/nQ3ulfk0iEICA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-5.1.1.tgz", + "integrity": "sha512-3XBfF7DAsp5qeDsvN5Rd1HmbNokVvEQoUM0QLrRcybC9nX96w3Pbmu7qUsb3IT3J3jBvs2+mTXaKHOUsgHMLzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-8.5.2.tgz", + "integrity": "sha512-IYR/3C/paEVVQYQvdDlFZVjRCJVYHHON0XXMH91KO9GSxs0TdKYWlUdvfQl2EfAHDxUaN3IBffkE/BDTh5nJ6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^5.2.1", + "@inquirer/confirm": "^6.1.1", + "@inquirer/editor": "^5.2.2", + "@inquirer/expand": "^5.1.1", + "@inquirer/input": "^5.1.2", + "@inquirer/number": "^4.1.1", + "@inquirer/password": "^5.1.1", + "@inquirer/rawlist": "^5.3.1", + "@inquirer/search": "^4.2.1", + "@inquirer/select": "^5.2.1" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-5.3.1.tgz", + "integrity": "sha512-QqdTqQddL3qPX/PPrjobpsO25NZ4dWXgTLenrR445L2ptLEYE6Z+PD5c5CNDJNx4ugRgELAIpSIJxZaO2jJ2Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-4.2.1.tgz", + "integrity": "sha512-xJj8QWKRSrfKoBIITLZK61dD3zwo0Rz11fgDImku30/Oe81zMdIdGgrLY2h6RkJ+KZ/GhNYIRMKnH/62qBTA5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.2.1.tgz", + "integrity": "sha512-FlDndEUww8m7BfukO2nJa25vhD+H5jxxCv4oGioKqzyWz3nPHhhw4LKdYRSlXuAx7DsdWia7iyaBPKKS95Evfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^11.2.1", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.0.7.tgz", + "integrity": "sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@internationalized/date": { "version": "3.12.1", "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.12.1.tgz", @@ -702,6 +2183,44 @@ "@emnapi/runtime": "^1.7.1" } }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@oxc-project/types": { "version": "0.127.0", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz", @@ -1704,6 +3223,13 @@ "react-dom": "^19.0.0" } }, + "node_modules/@repeaterjs/repeater": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@repeaterjs/repeater/-/repeater-3.1.0.tgz", + "integrity": "sha512-TaoVksZRSx2KWYYpyLQtMQXXeS98VsgZImzW65xmiVgbYhXLk+aEsmzPLirqVuE4/XuUapH2iMtxUzaBNDzdSQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@rolldown/binding-android-arm64": { "version": "1.0.0-rc.17", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.17.tgz", @@ -2122,6 +3648,16 @@ "@types/react": "^19.2.0" } }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.0.tgz", @@ -2404,6 +3940,63 @@ } } }, + "node_modules/@whatwg-node/disposablestack": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@whatwg-node/disposablestack/-/disposablestack-0.0.6.tgz", + "integrity": "sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@whatwg-node/promise-helpers": "^1.0.0", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@whatwg-node/fetch": { + "version": "0.10.13", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.10.13.tgz", + "integrity": "sha512-b4PhJ+zYj4357zwk4TTuF2nEe0vVtOrwdsrNo5hL+u1ojXNhh1FgJ6pg1jzDlwlT4oBdzfSwaBwMCtFCsIWg8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@whatwg-node/node-fetch": "^0.8.3", + "urlpattern-polyfill": "^10.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@whatwg-node/node-fetch": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.8.6.tgz", + "integrity": "sha512-BDMdYFcerLQkwA2RTldxOqRCs6ZQD1S7UgP3pUdGUkcbgTrP/V5ko77ZkCww9DHmC4lpoYuwigGfQYj285gMvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^3.1.1", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/promise-helpers": "^1.3.2", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@whatwg-node/promise-helpers": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@whatwg-node/promise-helpers/-/promise-helpers-1.3.2.tgz", + "integrity": "sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@wry/caches": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@wry/caches/-/caches-1.0.1.tgz", @@ -2492,6 +4085,55 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, "node_modules/aria-hidden": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", @@ -2504,6 +4146,29 @@ "node": ">=10" } }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/auto-bind": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz", + "integrity": "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/balanced-match": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", @@ -2515,9 +4180,9 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.10.21", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.21.tgz", - "integrity": "sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA==", + "version": "2.11.15", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.15.tgz", + "integrity": "sha512-FwMjJJ7HnyZpWe+oWxegG0fezZyBZUagI5LZEoO3GCbtbKNwRfMH9Ue5d5v01PNePBy1QSfPSDTTeVL0Hb9EzA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -2540,10 +4205,23 @@ "node": "18 || 20 || >=22" } }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", "dev": true, "funding": [ { @@ -2561,11 +4239,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" }, "bin": { "browserslist": "cli.js" @@ -2574,10 +4252,20 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/caniuse-lite": { - "version": "1.0.30001790", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001790.tgz", - "integrity": "sha512-bOoxfJPyYo+ds6W0YfptaCWbFnJYjh2Y1Eow5lRv+vI2u8ganPZqNm1JwNh0t2ELQCqIWg4B3dWEusgAmsoyOw==", + "version": "1.0.30001809", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", + "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", "dev": true, "funding": [ { @@ -2595,6 +4283,46 @@ ], "license": "CC-BY-4.0" }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/change-case-all": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/change-case-all/-/change-case-all-2.1.0.tgz", + "integrity": "sha512-v6b0WWWkZUMHVuYk82l+WROgkUm4qEN2w5hKRNWtEOYwWqUGoi8C6xH0l1RLF1EoWqDFK6MFclmN3od6ws3/uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "change-case": "^5.2.0", + "sponge-case": "^2.0.2", + "swap-case": "^3.0.2", + "title-case": "^3.0.3" + } + }, + "node_modules/chardet": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz", + "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==", + "dev": true, + "license": "MIT" + }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -2610,6 +4338,110 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", + "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^8.0.0", + "string-width": "^8.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -2630,6 +4462,46 @@ "url": "https://opencollective.com/express" } }, + "node_modules/cosmiconfig": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", + "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-inspect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cross-inspect/-/cross-inspect-1.0.1.tgz", + "integrity": "sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2652,6 +4524,23 @@ "devOptional": true, "license": "MIT" }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/dataloader": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.3.tgz", + "integrity": "sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==", + "dev": true, + "license": "MIT" + }, "node_modules/date-fns": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", @@ -2668,6 +4557,19 @@ "integrity": "sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg==", "license": "MIT" }, + "node_modules/debounce": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-3.0.0.tgz", + "integrity": "sha512-64byRbF0/AirwbuHqB3/ZpMG9/nckDa6ZA0yd6UnaQNwbbemCOwvz2sL5sjXLHhZHADyiwLm0M5qMhltUUx+TA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -2693,6 +4595,29 @@ "dev": true, "license": "MIT" }, + "node_modules/dependency-graph": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/detect-indent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.2.tgz", + "integrity": "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -2709,6 +4634,19 @@ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", "license": "MIT" }, + "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, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/echarts": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/echarts/-/echarts-6.0.0.tgz", @@ -2740,12 +4678,52 @@ "license": "0BSD" }, "node_modules/electron-to-chromium": { - "version": "1.5.344", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz", - "integrity": "sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==", + "version": "1.5.411", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.411.tgz", + "integrity": "sha512-gglkxzokjHfawpGxq75XdBV2/l3BAPzrsMs70qgaZdTW5rpV1tC4MdgJVP9fN126bODA4ZJQkn1wryEzJyQXIg==", "dev": true, "license": "ISC" }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -2951,12 +4929,49 @@ "node": ">=0.10.0" } }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "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.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -2971,6 +4986,43 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-string-truncated-width": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", + "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-string-width": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", + "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-string-truncated-width": "^3.0.2" + } + }, + "node_modules/fast-wrap-ansi": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", + "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-string-width": "^3.0.2" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -2989,6 +5041,30 @@ } } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -3002,6 +5078,19 @@ "node": ">=16.0.0" } }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -3040,6 +5129,19 @@ "dev": true, "license": "ISC" }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/framer-motion": { "version": "12.40.0", "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.40.0.tgz", @@ -3092,6 +5194,29 @@ "node": ">=6.9.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", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-nonce": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", @@ -3127,6 +5252,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/graphql": { "version": "16.13.2", "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.13.2.tgz", @@ -3136,6 +5282,65 @@ "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } }, + "node_modules/graphql-config": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/graphql-config/-/graphql-config-5.1.6.tgz", + "integrity": "sha512-fCkYnm4Kdq3un0YIM4BCZHVR5xl0UeLP6syxxO7KAstdY7QVyVvTHP0kRPDYEP1v08uwtJVgis5sj3IOTLOniQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/graphql-file-loader": "^8.0.0", + "@graphql-tools/json-file-loader": "^8.0.0", + "@graphql-tools/load": "^8.1.0", + "@graphql-tools/merge": "^9.0.0", + "@graphql-tools/url-loader": "^9.0.0", + "@graphql-tools/utils": "^11.0.0", + "cosmiconfig": "^8.1.0", + "jiti": "^2.0.0", + "minimatch": "^10.0.0", + "string-env-interpolation": "^1.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">= 16.0.0" + }, + "peerDependencies": { + "cosmiconfig-toml-loader": "^1.0.0", + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "cosmiconfig-toml-loader": { + "optional": true + } + } + }, + "node_modules/graphql-config/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/graphql-tag": { "version": "2.12.6", "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", @@ -3151,6 +5356,33 @@ "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, + "node_modules/graphql-ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-6.2.1.tgz", + "integrity": "sha512-NMbPNeTwXpUOxmczdMtzEnynLNbbR267E9hRcJ81SSbQeIvZup3cMjbD1ZT3jpS2xkpxooisitvO7LZNOyz17Q==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@fastify/websocket": "^10 || ^11", + "crossws": "~0.3", + "graphql": "^15.10.1 || ^16 || ^17", + "ws": "^8" + }, + "peerDependenciesMeta": { + "@fastify/websocket": { + "optional": true + }, + "crossws": { + "optional": true + }, + "ws": { + "optional": true + } + } + }, "node_modules/hermes-estree": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", @@ -3168,6 +5400,23 @@ "hermes-estree": "0.25.1" } }, + "node_modules/iconv-lite": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -3179,11 +5428,51 @@ } }, "node_modules/immutable": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", - "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", + "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", "license": "MIT" }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", + "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -3194,6 +5483,37 @@ "node": ">=0.8.19" } }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT" + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3204,6 +5524,22 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -3217,6 +5553,65 @@ "node": ">=0.10.0" } }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "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/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -3224,6 +5619,42 @@ "dev": true, "license": "ISC" }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/isows": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.7.tgz", + "integrity": "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3231,6 +5662,29 @@ "dev": true, "license": "MIT" }, + "node_modules/js-yaml": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -3251,6 +5705,13 @@ "dev": true, "license": "MIT" }, + "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, + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -3265,6 +5726,20 @@ "dev": true, "license": "MIT" }, + "node_modules/json-to-pretty-yaml": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz", + "integrity": "sha512-rvm6hunfCcqegwYaG5T4yKJWxc9FXFgBVrcTZ4XfSVRwa5HA/Xs+vB/Eo9treYYHCeNM0nrSUr82V/M31Urc7A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "remedial": "^1.0.7", + "remove-trailing-spaces": "^1.0.6" + }, + "engines": { + "node": ">= 0.2.0" + } + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -3581,6 +6056,30 @@ "url": "https://opencollective.com/parcel" } }, + "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, + "license": "MIT" + }, + "node_modules/listr2": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-10.2.2.tgz", + "integrity": "sha512-JtNtbZj8q5BnDMR7trpwvwk3RIrANtIVzEUm8w7amp6xelLgyuq+4WZoTH913XaQAoH/cNdYhaNzBPA2U3xbDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^5.2.0", + "eventemitter3": "^5.0.4", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^10.0.0" + }, + "engines": { + "node": ">=22.13.0" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -3609,6 +6108,116 @@ "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", "license": "MIT" }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -3628,6 +6237,84 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/meros": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/meros/-/meros-1.3.2.tgz", + "integrity": "sha512-Q3mobPbvEx7XbwhnC1J1r60+5H6EZyNccdzSz0eGexJRwouUtTZxPVRGdqKtxlpD84ScK4+tIGldkqDtCKdI0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=13" + }, + "peerDependencies": { + "@types/node": ">=13" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "10.2.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", @@ -3666,6 +6353,16 @@ "dev": true, "license": "MIT" }, + "node_modules/mute-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz", + "integrity": "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -3699,12 +6396,68 @@ "license": "MIT", "optional": true }, - "node_modules/node-releases": { - "version": "2.0.38", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", - "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", "dev": true, - "license": "MIT" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-releases": { + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/normalize-wheel": { "version": "1.0.1", @@ -3712,6 +6465,22 @@ "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==", "license": "BSD-3-Clause" }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optimism": { "version": "0.18.1", "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.18.1.tgz", @@ -3774,6 +6543,53 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "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, + "license": "MIT", + "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/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3794,6 +6610,39 @@ "node": ">=8" } }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -3872,6 +6721,27 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "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" + } + ], + "license": "MIT" + }, "node_modules/react": { "version": "19.2.5", "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz", @@ -4079,6 +6949,75 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/remedial": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/remedial/-/remedial-1.0.8.tgz", + "integrity": "sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "engines": { + "node": "*" + } + }, + "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, + "license": "ISC" + }, + "node_modules/remove-trailing-spaces": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/remove-trailing-spaces/-/remove-trailing-spaces-1.0.9.tgz", + "integrity": "sha512-xzG7w5IRijvIkHIjDk65URsJJ7k4J95wmcArY5PRcmjldIOl7oTvG8+X2Ag690R7SfwiOcHrWZKVc1Pp5WIOzA==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "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/rolldown": { "version": "1.0.0-rc.17", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.17.tgz", @@ -4120,6 +7059,30 @@ "dev": true, "license": "MIT" }, + "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, + "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", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -4130,6 +7093,13 @@ "tslib": "^2.1.0" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, "node_modules/sass": { "version": "1.99.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.99.0.tgz", @@ -4195,6 +7165,32 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz", + "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/simplebar": { "version": "6.3.3", "resolved": "https://registry.npmjs.org/simplebar/-/simplebar-6.3.3.tgz", @@ -4232,6 +7228,33 @@ "integrity": "sha512-+k9mJ2/rQMiRmQUcjn+qznch260leIXY8r4FyYKKyRBO/s5UoeMAHGkCJyE1R/4wrIhTJONfyloY55SkE7ve3A==", "license": "ISC" }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", + "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.3", + "is-fullwidth-code-point": "^5.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -4241,6 +7264,85 @@ "node": ">=0.10.0" } }, + "node_modules/sponge-case": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/sponge-case/-/sponge-case-2.0.3.tgz", + "integrity": "sha512-i4h9ZGRfxV6Xw3mpZSFOfbXjf0cQcYmssGWutgNIfFZ2VM+YIWfD71N/kjjwK6X/AAHzBr+rciEcn/L34S8TGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-env-interpolation": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string-env-interpolation/-/string-env-interpolation-1.0.1.tgz", + "integrity": "sha512-78lwMoCcn0nNu8LszbP1UA7g55OeE4v7rCeWnM5B453rnNr4aq+5it3FEYtZrSEiMvHZOZ9Jlqb0OD0M2VInqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/swap-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-3.0.3.tgz", + "integrity": "sha512-6p4op8wE9CQv7uDFzulI6YXUw4lD9n4oQierdbFThEKVWVQcbQcUjdP27W8XE7V4QnWmnq9jueSHceyyQnqQVA==", + "dev": true, + "license": "MIT" + }, + "node_modules/sync-fetch": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/sync-fetch/-/sync-fetch-0.6.0.tgz", + "integrity": "sha512-IELLEvzHuCfc1uTsshPK58ViSdNqXxlml1U+fmwJIKLYKOr/rAtBrorE2RYm5IHaMpDNlmC0fr1LAvdXvyheEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-fetch": "^3.3.2", + "timeout-signal": "^2.0.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/timeout-signal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/timeout-signal/-/timeout-signal-2.0.0.tgz", + "integrity": "sha512-YBGpG4bWsHoPvofT6y/5iqulfXIiIErl5B0LdtHT1mGXDFTAhhRrbUpTvBgYbovr+3cKblya2WAOcpoy90XguA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/tinyglobby": { "version": "0.2.16", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", @@ -4258,6 +7360,29 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/title-case": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-3.0.3.tgz", + "integrity": "sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/ts-api-utils": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", @@ -4271,6 +7396,17 @@ "typescript": ">=4.8.4" } }, + "node_modules/ts-log": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ts-log/-/ts-log-3.0.3.tgz", + "integrity": "sha512-4uxVlS/cbNFeSmZbXgBCq+MRkbck1iW7B2Vqd+gziasf//uZP/HFI2IcoHlyYWFgFRl+5G5iqHe4RvY/h/qUxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20", + "npm": ">=10" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -4328,6 +7464,16 @@ "typescript": ">=4.8.4 <6.1.0" } }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/undici-types": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", @@ -4335,10 +7481,23 @@ "dev": true, "license": "MIT" }, + "node_modules/unixify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unixify/-/unixify-1.0.0.tgz", + "integrity": "sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "normalize-path": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", + "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", "dev": true, "funding": [ { @@ -4376,6 +7535,13 @@ "punycode": "^2.1.0" } }, + "node_modules/urlpattern-polyfill": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", + "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", + "dev": true, + "license": "MIT" + }, "node_modules/use-callback-ref": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", @@ -4497,6 +7663,26 @@ } } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4523,6 +7709,55 @@ "node": ">=0.10.0" } }, + "node_modules/wrap-ansi": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-10.0.1.tgz", + "integrity": "sha512-M0N4xzyzosiIok3svYlEo1sdLZts/8FPgYH/GPC3wvlmPoRvnoManGMrE54waYj3tISA8w6lsdesfVv67qSr8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.3", + "string-width": "^8.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -4530,6 +7765,50 @@ "dev": true, "license": "ISC" }, + "node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz", + "integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^8.2.1", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -4543,6 +7822,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yoctocolors": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz", + "integrity": "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zod": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", diff --git a/mdm-front/package.json b/mdm-front/package.json index 6793b65..3b546cd 100644 --- a/mdm-front/package.json +++ b/mdm-front/package.json @@ -4,8 +4,10 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "vite --host 192.168.1.181", + "dev": "vite --host 192.168.1.91", "build": "tsc -b && vite build", + "codegen": "graphql-codegen --config codegen.ts", + "codegen:watch": "graphql-codegen --config codegen.ts --watch", "lint": "eslint .", "preview": "vite preview" }, @@ -41,6 +43,8 @@ }, "devDependencies": { "@eslint/js": "^10.0.1", + "@graphql-codegen/cli": "^7.2.0", + "@graphql-codegen/client-preset": "^6.1.3", "@types/leaflet": "^1.9.21", "@types/node": "^24.12.2", "@types/react": "^19.2.14", diff --git a/mdm-front/src/entities/device/api/device.documents.graphql b/mdm-front/src/entities/device/api/device.documents.graphql new file mode 100644 index 0000000..7f8519a --- /dev/null +++ b/mdm-front/src/entities/device/api/device.documents.graphql @@ -0,0 +1,471 @@ +query GetPhones( + $page: Int! + $query: String + $locked: Boolean + $needMaintenance: Boolean + $networkStatus: [PhoneNetworkStatus!] + $technicalStatus: [PhoneTechnicalStatus!] + $orgs: [ID!] + $sortDirection: SortDirection! + $sortField: PhoneSortField! + ) { + getPhones( + page: $page + query: $query + locked: $locked + needMaintenance: $needMaintenance + networkStatus: $networkStatus + technicalStatus: $technicalStatus + orgs: $orgs + sortDirection: $sortDirection + sortField: $sortField + ) { + page { + id + imei + imei2 + serial + networkStatus + + lastLocation { + alt + date + lat + lng + } + + org { + id + logoUrl + name + + policy { + bluetooth + bluetoothEditable + camera + cameraEditable + GPS + gpsEditable + sim + simEditable + offlineTimeThreshold + } + } + + orgId + + policy { + bluetooth + camera + GPS + sim + locked + } + + techState { + batteryLevel + malfunctions + malfunctionComment + needMaintenance + status + temperature + } + } + + totalElements + totalPages + } + } + +query GetPhonesTabsStats($query: String, $orgs: [ID!]) { + totalPhones: getPhones( + page: 0 + query: $query + orgs: $orgs + sortDirection: DESC + sortField: ID + ) { + totalElements + } + + onlinePhones: getPhones( + page: 0 + query: $query + networkStatus: [Online] + orgs: $orgs + sortDirection: DESC + sortField: ID + ) { + totalElements + } + + lockedPhones: getPhones( + page: 0 + query: $query + locked: true + orgs: $orgs + sortDirection: DESC + sortField: ID + ) { + totalElements + } + + lostPhones: getPhones( + page: 0 + query: $query + networkStatus: [Lost] + orgs: $orgs + sortDirection: DESC + sortField: ID + ) { + totalElements + } + + maintenancePhones: getPhones( + page: 0 + query: $query + technicalStatus: [NeedsMaintenance] + orgs: $orgs + sortDirection: DESC + sortField: ID + ) { + totalElements + } + + servicePhones: getPhones( + page: 0 + query: $query + technicalStatus: [InService] + orgs: $orgs + sortDirection: DESC + sortField: ID + ) { + totalElements + } + } + +query GetPhone($id: Int!) { + getPhone(id: $id) { + id + imei + imei2 + networkStatus + + lastLocation { + alt + date + lat + lng + } + + org { + creationDate + id + name + policy { + bluetooth + bluetoothEditable + camera + cameraEditable + GPS + gpsEditable + sim + simEditable + offlineTimeThreshold + } + } + + orgId + + policy { + bluetooth + camera + GPS + sim + locked + } + + registerDate + serial + + techState { + batteryCycles + batteryLevel + batteryRemainingCapacity + hits + malfunctions + malfunctionComment + needMaintenance + overheats + status + temperature + worktime + } + } + } + +query GetPhoneGpsTrack($phoneId: ID!, $startDate: Float!, $endDate: Float) { + getPhoneGpsTrack(phoneId: $phoneId, startDate: $startDate, endDate: $endDate) { + alt + date + lat + lng + } + } + +query GetPhonePackages($phoneId: ID!) { + getPhonePackages(phoneId: $phoneId) { + category + iconUrl + installDate + name + packageName + version + versionName + } + } + +query GetTelemetry( + $phoneId: Int! + $packagesPhoneId: ID! + $startDate: Float! + $endDate: Float + ) { + getTelemetry(phoneId: $phoneId, startDate: $startDate, endDate: $endDate) { + batteryCapacity + batteryCycles + batteryLevel + date + temperature + } + + getPhoneStateEvents(phoneId: $packagesPhoneId, startDate: $startDate, endDate: $endDate) { + date + phoneId + type + } + + getPhonePackagesUseEvents( + phoneId: $packagesPhoneId + startDate: $startDate + endDate: $endDate + ) { + events { + type + packageName + date + } + + phonePackage { + category + iconUrl + installDate + name + packageName + version + versionName + } + } + } + +query GetDevicePage( + $id: Int! + $phoneId: ID! + $telemetryStartDate: Float! + $telemetryEndDate: Float + $gpsStartDate: Float! + $gpsEndDate: Float + ) { + getPhone(id: $id) { + id + imei + imei2 + networkStatus + + lastLocation { + alt + date + lat + lng + } + + org { + creationDate + id + name + policy { + bluetooth + bluetoothEditable + camera + cameraEditable + GPS + gpsEditable + sim + simEditable + offlineTimeThreshold + } + } + + orgId + + policy { + bluetooth + camera + GPS + sim + locked + } + + registerDate + serial + + techState { + batteryCycles + batteryLevel + batteryRemainingCapacity + hits + malfunctions + malfunctionComment + needMaintenance + overheats + status + temperature + worktime + } +} + + getTelemetry( + phoneId: $id + startDate: $telemetryStartDate + endDate: $telemetryEndDate + ) { + batteryCapacity + batteryCycles + batteryLevel + date + temperature + } + + getPhoneGpsTrack( + phoneId: $phoneId + startDate: $gpsStartDate + endDate: $gpsEndDate + ) { + alt + date + lat + lng + } + } + +mutation CreatePhoneRegistrationToken { + createPhoneRegistrationToken { + address + expiresIn + token + } + } + +mutation ChangePhonePolicy( + $id: ID! + $bluetooth: ServiceUseOption! + $camera: ComponentUseOption! + $GPS: ServiceUseOption! + $sim: ServiceUseOption! + $locked: Boolean! + ) { + changePhonePolicy( + id: $id + policy: { + bluetooth: $bluetooth + camera: $camera + GPS: $GPS + sim: $sim + locked: $locked + } + ) { + bluetooth + camera + GPS + sim + locked + } + } + +query GetActivePhoneMaintenanceCase($phoneId: ID!) { + getActivePhoneMaintenanceCase(phoneId: $phoneId) { + id + phoneId + status + malfunctions + comment + detectedAt + serviceStartedAt + closedAt + + metrics { + hits + overheats + batteryCycles + worktime + batteryCapacity + } + } +} + +query GetPhoneMaintenanceHistory($phoneId: ID!) { + getPhoneMaintenanceHistory(phoneId: $phoneId) { + id + phoneId + status + malfunctions + comment + detectedAt + serviceStartedAt + closedAt + + metrics { + hits + overheats + batteryCycles + worktime + batteryCapacity + } + } +} + +mutation SetPhoneMaintenanceRequired( + $id: ID! + $malfunctions: [PhoneMalfunction!]! + $comment: String +) { + setPhoneMaintenanceRequired( + id: $id + form: { + malfunctions: $malfunctions + comment: $comment + } + ) +} + +mutation MarkPhoneHealthy($id: ID!) { + markPhoneHealthy(id: $id) +} + +mutation SendPhoneToMaintenance( + $id: ID! + $malfunctions: [PhoneMalfunction!]! + $comment: String +) { + sendPhoneToMaintenance( + id: $id + form: { + malfunctions: $malfunctions + comment: $comment + } + ) +} + +mutation ReturnPhoneFromMaintenance($id: ID!) { + returnPhoneFromMaintenance(id: $id) +} diff --git a/mdm-front/src/entities/device/api/device.graphql.ts b/mdm-front/src/entities/device/api/device.graphql.ts index 31d641e..a3b8063 100644 --- a/mdm-front/src/entities/device/api/device.graphql.ts +++ b/mdm-front/src/entities/device/api/device.graphql.ts @@ -1,390 +1,17 @@ -import { gql } from '@apollo/client' - -export const GET_PHONES_QUERY = gql` - query GetPhones( - $page: Int! - $query: String - $locked: Boolean - $needMaintenance: Boolean - $networkStatus: [PhoneNetworkStatus!] - $orgs: [ID!] - $sortDirection: SortDirection! - $sortField: PhoneSortField! - ) { - getPhones( - page: $page - query: $query - locked: $locked - needMaintenance: $needMaintenance - networkStatus: $networkStatus - orgs: $orgs - sortDirection: $sortDirection - sortField: $sortField - ) { - page { - id - imei - imei2 - serial - networkStatus - - lastLocation { - alt - date - lat - lng - } - - org { - id - logoUrl - name - - policy { - bluetooth - bluetoothEditable - camera - cameraEditable - GPS - gpsEditable - sim - simEditable - offlineTimeThreshold - } - } - - orgId - - policy { - bluetooth - camera - GPS - sim - locked - } - - techState { - batteryLevel - needMaintenance - temperature - } - } - - totalElements - totalPages - } - } -` - -export const GET_PHONES_TABS_STATS_QUERY = gql` - query GetPhonesTabsStats($query: String, $orgs: [ID!]) { - totalPhones: getPhones( - page: 0 - query: $query - orgs: $orgs - sortDirection: DESC - sortField: ID - ) { - totalElements - } - - onlinePhones: getPhones( - page: 0 - query: $query - networkStatus: [Online] - orgs: $orgs - sortDirection: DESC - sortField: ID - ) { - totalElements - } - - lockedPhones: getPhones( - page: 0 - query: $query - locked: true - orgs: $orgs - sortDirection: DESC - sortField: ID - ) { - totalElements - } - - lostPhones: getPhones( - page: 0 - query: $query - networkStatus: [Lost] - orgs: $orgs - sortDirection: DESC - sortField: ID - ) { - totalElements - } - - maintenancePhones: getPhones( - page: 0 - query: $query - needMaintenance: true - orgs: $orgs - sortDirection: DESC - sortField: ID - ) { - totalElements - } - } -` - -export const GET_PHONE_QUERY = gql` - query GetPhone($id: Int!) { - getPhone(id: $id) { - id - imei - imei2 - networkStatus - - lastLocation { - alt - date - lat - lng - } - - org { - creationDate - id - name - policy { - bluetooth - bluetoothEditable - camera - cameraEditable - GPS - gpsEditable - sim - simEditable - offlineTimeThreshold - } - } - - orgId - - policy { - bluetooth - camera - GPS - sim - locked - } - - registerDate - serial - - techState { - batteryCycles - batteryLevel - batteryRemainingCapacity - hits - needMaintenance - overheats - worktime - } - } - } -` - -export const GET_PHONE_GPS_TRACK_QUERY = gql` - query GetPhoneGpsTrack($phoneId: ID!, $startDate: Float!, $endDate: Float) { - getPhoneGpsTrack(phoneId: $phoneId, startDate: $startDate, endDate: $endDate) { - alt - date - lat - lng - } - } -` - -export const GET_PHONE_PACKAGES_QUERY = gql` - query GetPhonePackages($phoneId: ID!) { - getPhonePackages(phoneId: $phoneId) { - category - iconUrl - installDate - name - packageName - version - versionName - } - } -` - -export const GET_TELEMETRY_QUERY = gql` - query GetTelemetry( - $phoneId: Int! - $packagesPhoneId: ID! - $startDate: Float! - $endDate: Float - ) { - getTelemetry(phoneId: $phoneId, startDate: $startDate, endDate: $endDate) { - batteryCapacity - batteryCycles - batteryLevel - date - temperature - } - - getPhoneStateEvents(phoneId: $packagesPhoneId, startDate: $startDate, endDate: $endDate) { - date - phoneId - type - } - - getPhonePackagesUseEvents( - phoneId: $packagesPhoneId - startDate: $startDate - endDate: $endDate - ) { - events { - type - packageName - date - } - - phonePackage { - category - iconUrl - installDate - name - packageName - version - versionName - } - } - } -` - -export const GET_DEVICE_PAGE_QUERY = gql` - query GetDevicePage( - $id: Int! - $phoneId: ID! - $telemetryStartDate: Float! - $telemetryEndDate: Float - $gpsStartDate: Float! - $gpsEndDate: Float - ) { - getPhone(id: $id) { - id - imei - imei2 - networkStatus - - lastLocation { - alt - date - lat - lng - } - - org { - creationDate - id - name - policy { - bluetooth - bluetoothEditable - camera - cameraEditable - GPS - gpsEditable - sim - simEditable - offlineTimeThreshold - } - } - - orgId - - policy { - bluetooth - camera - GPS - sim - locked - } - - registerDate - serial - - techState { - batteryCycles - batteryLevel - batteryRemainingCapacity - hits - needMaintenance - overheats - temperature - worktime - } -} - - getTelemetry( - phoneId: $id - startDate: $telemetryStartDate - endDate: $telemetryEndDate - ) { - batteryCapacity - batteryCycles - batteryLevel - date - temperature - } - - getPhoneGpsTrack( - phoneId: $phoneId - startDate: $gpsStartDate - endDate: $gpsEndDate - ) { - alt - date - lat - lng - } - } -` - -export const CREATE_PHONE_REGISTRATION_TOKEN_MUTATION = gql` - mutation CreatePhoneRegistrationToken { - createPhoneRegistrationToken { - address - expiresIn - token - } - } -` - -export const CHANGE_PHONE_POLICY_MUTATION = gql` - mutation ChangePhonePolicy( - $id: ID! - $bluetooth: ServiceUseOption! - $camera: ComponentUseOption! - $GPS: ServiceUseOption! - $sim: ServiceUseOption! - $locked: Boolean! - ) { - changePhonePolicy( - id: $id - policy: { - bluetooth: $bluetooth - camera: $camera - GPS: $GPS - sim: $sim - locked: $locked - } - ) { - bluetooth - camera - GPS - sim - locked - } - } -` +export { + GetPhonesDocument as GET_PHONES_QUERY, + GetPhonesTabsStatsDocument as GET_PHONES_TABS_STATS_QUERY, + GetPhoneDocument as GET_PHONE_QUERY, + GetPhoneGpsTrackDocument as GET_PHONE_GPS_TRACK_QUERY, + GetPhonePackagesDocument as GET_PHONE_PACKAGES_QUERY, + GetTelemetryDocument as GET_TELEMETRY_QUERY, + GetDevicePageDocument as GET_DEVICE_PAGE_QUERY, + CreatePhoneRegistrationTokenDocument as CREATE_PHONE_REGISTRATION_TOKEN_MUTATION, + ChangePhonePolicyDocument as CHANGE_PHONE_POLICY_MUTATION, + GetActivePhoneMaintenanceCaseDocument as GET_ACTIVE_PHONE_MAINTENANCE_CASE_QUERY, + GetPhoneMaintenanceHistoryDocument as GET_PHONE_MAINTENANCE_HISTORY_QUERY, + SetPhoneMaintenanceRequiredDocument as SET_PHONE_MAINTENANCE_REQUIRED_MUTATION, + MarkPhoneHealthyDocument as MARK_PHONE_HEALTHY_MUTATION, + SendPhoneToMaintenanceDocument as SEND_PHONE_TO_MAINTENANCE_MUTATION, + ReturnPhoneFromMaintenanceDocument as RETURN_PHONE_FROM_MAINTENANCE_MUTATION, +} from '../../../shared/api/generated/graphql' diff --git a/mdm-front/src/entities/device/lib/maintenance.ts b/mdm-front/src/entities/device/lib/maintenance.ts new file mode 100644 index 0000000..d6b0727 --- /dev/null +++ b/mdm-front/src/entities/device/lib/maintenance.ts @@ -0,0 +1,54 @@ +import type { + DeviceMalfunction, + DeviceTechnicalStatus, +} from '../model/types' + +export const deviceMalfunctionLabels: Record = { + LowBatteryCapacity: 'Низкая ёмкость АКБ', + CriticalHits: 'Критические удары', + CriticalChargeCycles: 'Критические циклы зарядки', + DoesNotTurnOn: 'Не включается', + Other: 'Другое', +} + +export const deviceTechnicalStatusLabels: Record< + DeviceTechnicalStatus, + string +> = { + Healthy: 'Исправно', + NeedsMaintenance: 'Требует ТО', + InService: 'На обслуживании', +} + +export function getDeviceMalfunctionSummary( + malfunctions: DeviceMalfunction[] = [], + comment?: string | null, +) { + const details = malfunctions.map((item) => deviceMalfunctionLabels[item]) + const normalizedDetails = new Set( + details.map((item) => item.trim().toLocaleLowerCase('ru-RU')), + ) + + if ( + comment?.trim() && + !normalizedDetails.has(comment.trim().toLocaleLowerCase('ru-RU')) + ) { + details.push(comment.trim()) + } + + return details.join('. ') +} + +export function isRedundantMalfunctionComment( + malfunctions: DeviceMalfunction[] = [], + comment?: string | null, +) { + if (!comment?.trim()) return true + + const normalizedComment = comment.trim().toLocaleLowerCase('ru-RU') + return malfunctions.some( + (item) => + deviceMalfunctionLabels[item].trim().toLocaleLowerCase('ru-RU') === + normalizedComment, + ) +} diff --git a/mdm-front/src/entities/device/model/types.ts b/mdm-front/src/entities/device/model/types.ts index ea39e04..dff675e 100644 --- a/mdm-front/src/entities/device/model/types.ts +++ b/mdm-front/src/entities/device/model/types.ts @@ -1,3 +1,42 @@ +import type { + ChangePhonePolicyMutation, + ChangePhonePolicyMutationVariables, + ComponentUseOption as GeneratedComponentUseOption, + CreatePhoneRegistrationTokenMutation, + CreatePhoneRegistrationTokenMutationVariables, + GetDevicePageQuery, + GetDevicePageQueryVariables, + GetActivePhoneMaintenanceCaseQuery, + GetActivePhoneMaintenanceCaseQueryVariables, + GetPhoneGpsTrackQuery, + GetPhoneGpsTrackQueryVariables, + GetPhoneMaintenanceHistoryQuery, + GetPhoneMaintenanceHistoryQueryVariables, + GetPhonePackagesQuery, + GetPhonePackagesQueryVariables, + GetPhoneQuery, + GetPhoneQueryVariables, + GetPhonesQuery, + GetPhonesQueryVariables, + GetPhonesTabsStatsQuery, + GetPhonesTabsStatsQueryVariables, + GetTelemetryQuery, + GetTelemetryQueryVariables, + MarkPhoneHealthyMutation, + MarkPhoneHealthyMutationVariables, + PhoneMaintenanceCaseStatus as GeneratedPhoneMaintenanceCaseStatus, + PhoneMalfunction as GeneratedPhoneMalfunction, + PhoneNetworkStatus, + PhoneTechnicalStatus as GeneratedPhoneTechnicalStatus, + ReturnPhoneFromMaintenanceMutation, + ReturnPhoneFromMaintenanceMutationVariables, + SendPhoneToMaintenanceMutation, + SendPhoneToMaintenanceMutationVariables, + ServiceUseOption as GeneratedServiceUseOption, + SetPhoneMaintenanceRequiredMutation, + SetPhoneMaintenanceRequiredMutationVariables, +} from '../../../shared/api/generated/graphql' + export type DeviceLocation = { alt: number date: number @@ -5,14 +44,9 @@ export type DeviceLocation = { lng: number } -export type ServiceUseOption = - | 'Disabled' - | 'Enabled' - | 'Unspecified' +export type ServiceUseOption = GeneratedServiceUseOption -export type ComponentUseOption = - | 'Allowed' - | 'Disallowed' +export type ComponentUseOption = GeneratedComponentUseOption export type PhoneUsePolicyOption = ServiceUseOption | ComponentUseOption @@ -47,17 +81,23 @@ export type DevicePolicy = { } export type DeviceTechState = { - batteryCycles: number | null - batteryLevel: number | null - batteryRemainingCapacity: number | null - hits: number | null - needMaintenance: boolean - overheats: number | null + batteryCycles?: number | null + batteryLevel?: number | null + batteryRemainingCapacity?: number | null + hits?: number | null + malfunctions?: DeviceMalfunction[] + malfunctionComment?: string | null + needMaintenance?: boolean + overheats?: number | null + status?: DeviceTechnicalStatus temperature?: number | null - worktime: number | null + worktime?: number | null } -export type DeviceNetworkStatus = 'Online' | 'Offline' | 'Lost' +export type DeviceNetworkStatus = PhoneNetworkStatus +export type DeviceTechnicalStatus = GeneratedPhoneTechnicalStatus +export type DeviceMalfunction = GeneratedPhoneMalfunction +export type DeviceMaintenanceCaseStatus = GeneratedPhoneMaintenanceCaseStatus export type DeviceOrganisation = { creationDate?: number @@ -70,60 +110,23 @@ export type DeviceOrganisation = { export type Device = { id: number imei: string - imei2: string + imei2: string | null serial: string - networkStatus?: DeviceNetworkStatus + networkStatus: DeviceNetworkStatus orgId: number - registerDate: number + registerDate?: number org: DeviceOrganisation | null policy: DevicePolicy | null techState: DeviceTechState | null lastLocation: DeviceLocation | null } -export type GetPhonesData = { - getPhones: { - page: Device[] - totalElements: number - totalPages: number - } -} - -export type GetPhonesVariables = { - page: number - query?: string - locked?: boolean - needMaintenance?: boolean - networkStatus?: DeviceNetworkStatus[] - orgs?: string[] - sortDirection: 'ASC' | 'DESC' - sortField: 'ID' | 'Serial' | 'Date' -} - -type GetPhonesStatsPage = { - totalElements: number -} - -export type GetPhonesTabsStatsData = { - totalPhones: GetPhonesStatsPage - onlinePhones: GetPhonesStatsPage - lockedPhones: GetPhonesStatsPage - lostPhones: GetPhonesStatsPage - maintenancePhones: GetPhonesStatsPage -} - -export type GetPhonesTabsStatsVariables = { - query?: string - orgs?: string[] -} - -export type GetPhoneData = { - getPhone: Device | null -} - -export type GetPhoneVariables = { - id: number -} +export type GetPhonesData = GetPhonesQuery +export type GetPhonesVariables = GetPhonesQueryVariables +export type GetPhonesTabsStatsData = GetPhonesTabsStatsQuery +export type GetPhonesTabsStatsVariables = GetPhonesTabsStatsQueryVariables +export type GetPhoneData = GetPhoneQuery +export type GetPhoneVariables = GetPhoneQueryVariables export type DeviceTelemetryItem = { batteryCapacity: number | null @@ -174,13 +177,8 @@ export type DevicePackage = { versionName: string | null } -export type GetPhonePackagesData = { - getPhonePackages: DevicePackage[] -} - -export type GetPhonePackagesVariables = { - phoneId: string -} +export type GetPhonePackagesData = GetPhonePackagesQuery +export type GetPhonePackagesVariables = GetPhonePackagesQueryVariables export type DevicePackageUseEventType = | 'ResumeActivity' @@ -199,18 +197,8 @@ export type DevicePackageUseEventsGroup = { phonePackage: DevicePackage | null } -export type GetTelemetryData = { - getTelemetry: DeviceTelemetryItem[] - getPhoneStateEvents: DevicePhoneStateEvent[] - getPhonePackagesUseEvents: DevicePackageUseEventsGroup[] -} - -export type GetTelemetryVariables = { - phoneId: number - packagesPhoneId: string - startDate: number - endDate?: number -} +export type GetTelemetryData = GetTelemetryQuery +export type GetTelemetryVariables = GetTelemetryQueryVariables export type DeviceGpsTrackPoint = { alt: number @@ -219,50 +207,33 @@ export type DeviceGpsTrackPoint = { lng: number } -export type GetPhoneGpsTrackData = { - getPhoneGpsTrack: DeviceGpsTrackPoint[] -} - -export type GetPhoneGpsTrackVariables = { - phoneId: string - startDate: number - endDate?: number -} - -export type GetDevicePageData = { - getPhone: Device | null - getTelemetry: DeviceTelemetryItem[] - getPhoneGpsTrack: DeviceGpsTrackPoint[] -} - -export type GetDevicePageVariables = { - id: number - phoneId: string - telemetryStartDate: number - telemetryEndDate?: number - gpsStartDate: number - gpsEndDate?: number -} - -export type ChangePhonePolicyData = { - changePhonePolicy: DevicePolicy -} - -export type ChangePhonePolicyVariables = { - id: string - bluetooth: ServiceUseOption - camera: ComponentUseOption - GPS: ServiceUseOption - sim: ServiceUseOption - locked: boolean -} - -export type CreatePhoneRegistrationTokenData = { - createPhoneRegistrationToken: { - address: string - expiresIn: number - token: string - } -} - -export type CreatePhoneRegistrationTokenVariables = Record +export type GetPhoneGpsTrackData = GetPhoneGpsTrackQuery +export type GetPhoneGpsTrackVariables = GetPhoneGpsTrackQueryVariables +export type GetDevicePageData = GetDevicePageQuery +export type GetDevicePageVariables = GetDevicePageQueryVariables +export type ChangePhonePolicyData = ChangePhonePolicyMutation +export type ChangePhonePolicyVariables = ChangePhonePolicyMutationVariables +export type CreatePhoneRegistrationTokenData = + CreatePhoneRegistrationTokenMutation +export type CreatePhoneRegistrationTokenVariables = + CreatePhoneRegistrationTokenMutationVariables +export type GetPhoneMaintenanceHistoryData = GetPhoneMaintenanceHistoryQuery +export type GetPhoneMaintenanceHistoryVariables = + GetPhoneMaintenanceHistoryQueryVariables +export type GetActivePhoneMaintenanceCaseData = + GetActivePhoneMaintenanceCaseQuery +export type GetActivePhoneMaintenanceCaseVariables = + GetActivePhoneMaintenanceCaseQueryVariables +export type SetPhoneMaintenanceRequiredData = + SetPhoneMaintenanceRequiredMutation +export type SetPhoneMaintenanceRequiredVariables = + SetPhoneMaintenanceRequiredMutationVariables +export type MarkPhoneHealthyData = MarkPhoneHealthyMutation +export type MarkPhoneHealthyVariables = MarkPhoneHealthyMutationVariables +export type SendPhoneToMaintenanceData = SendPhoneToMaintenanceMutation +export type SendPhoneToMaintenanceVariables = + SendPhoneToMaintenanceMutationVariables +export type ReturnPhoneFromMaintenanceData = + ReturnPhoneFromMaintenanceMutation +export type ReturnPhoneFromMaintenanceVariables = + ReturnPhoneFromMaintenanceMutationVariables diff --git a/mdm-front/src/entities/employee/api/employee.documents.graphql b/mdm-front/src/entities/employee/api/employee.documents.graphql new file mode 100644 index 0000000..2371b13 --- /dev/null +++ b/mdm-front/src/entities/employee/api/employee.documents.graphql @@ -0,0 +1,299 @@ +query GetUsers( + $page: Int! + $query: String + $orgs: [ID!] + $roles: [Role!] + $sortDirection: SortDirection! + $sortField: UserSortField! + ) { + getUsers( + page: $page + query: $query + orgs: $orgs + roles: $roles + sortDirection: $sortDirection + sortField: $sortField + ) { + totalPages + totalElements + page { + avatarUrl + firstName + id + lastName + middleName + org { + creationDate + id + logoUrl + name + } + orgId + role + username + } + } + } + +query GetOrganisation($id: ID!) { + getOrganisation(id: $id) { + creationDate + id + name + logoUrl + policy { + bluetooth + bluetoothEditable + camera + cameraEditable + GPS + gpsEditable + sim + simEditable + offlineTimeThreshold + } + } + } + +mutation DeleteOrganisation($id: ID!) { + deleteOrganisation(id: $id) + } + +query GetOrganisations( + $page: Int! + $query: String + $sortDirection: SortDirection! + $sortField: OrganisationSortField! + ) { + getOrganisations( + page: $page + query: $query + sortDirection: $sortDirection + sortField: $sortField + ) { + totalPages + totalElements + page { + creationDate + id + name + logoUrl + } + } + } + +mutation CreateOrganisation( + $name: String! + $bluetooth: ServiceUseOption! + $bluetoothEditable: Boolean! + $camera: ComponentUseOption! + $cameraEditable: Boolean! + $GPS: ServiceUseOption! + $gpsEditable: Boolean! + $sim: ServiceUseOption! + $simEditable: Boolean! + $offlineTimeThreshold: Float! + ) { + createOrganisation( + name: $name + policy: { + bluetooth: $bluetooth + bluetoothEditable: $bluetoothEditable + camera: $camera + cameraEditable: $cameraEditable + GPS: $GPS + gpsEditable: $gpsEditable + sim: $sim + simEditable: $simEditable + offlineTimeThreshold: $offlineTimeThreshold + } + ) { + id + name + } + } + +mutation ChangeOrganisation( + $id: ID! + $name: String! + $bluetooth: ServiceUseOption! + $bluetoothEditable: Boolean! + $camera: ComponentUseOption! + $cameraEditable: Boolean! + $GPS: ServiceUseOption! + $gpsEditable: Boolean! + $sim: ServiceUseOption! + $simEditable: Boolean! + $offlineTimeThreshold: Float! + ) { + changeOrganisation( + id: $id + name: $name + policy: { + bluetooth: $bluetooth + bluetoothEditable: $bluetoothEditable + camera: $camera + cameraEditable: $cameraEditable + GPS: $GPS + gpsEditable: $gpsEditable + sim: $sim + simEditable: $simEditable + offlineTimeThreshold: $offlineTimeThreshold + } + ) { + creationDate + id + name + } + } + +mutation ChangeOrganisationPolicy( + $id: ID! + $name: String! + $bluetooth: ServiceUseOption! + $bluetoothEditable: Boolean! + $camera: ComponentUseOption! + $cameraEditable: Boolean! + $GPS: ServiceUseOption! + $gpsEditable: Boolean! + $sim: ServiceUseOption! + $simEditable: Boolean! + $offlineTimeThreshold: Float! + ) { + changeOrganisation( + id: $id + name: $name + policy: { + bluetooth: $bluetooth + bluetoothEditable: $bluetoothEditable + camera: $camera + cameraEditable: $cameraEditable + GPS: $GPS + gpsEditable: $gpsEditable + sim: $sim + simEditable: $simEditable + offlineTimeThreshold: $offlineTimeThreshold + } + ) { + creationDate + id + name + } + } + +mutation createUser( + $orgId: ID! + $firstName: String! + $lastName: String! + $middleName: String! + $username: String! + $password: String! + $role: Role! + ) { + createUser( + payload: { + orgId: $orgId + firstName: $firstName + lastName: $lastName + middleName: $middleName + username: $username + password: $password + role: $role + } + ) { + id + firstName + lastName + middleName + orgId + role + org { + id + name + } + } + } + +mutation ChangeUser( + $userId: ID! + $orgId: ID! + $firstName: String! + $lastName: String! + $middleName: String! + $username: String! + $role: Role! + ) { + changeUser( + userId: $userId + form: { + orgId: $orgId + firstName: $firstName + lastName: $lastName + middleName: $middleName + username: $username + role: $role + } + ) { + avatarUrl + firstName + id + lastName + middleName + org { + creationDate + id + logoUrl + name + } + orgId + role + username + } + } + +mutation ChangeUserWithPassword( + $userId: ID! + $orgId: ID! + $firstName: String! + $lastName: String! + $middleName: String! + $username: String! + $password: String! + $role: Role! + ) { + changeUser( + userId: $userId + form: { + orgId: $orgId + firstName: $firstName + lastName: $lastName + middleName: $middleName + username: $username + password: $password + role: $role + } + ) { + avatarUrl + firstName + id + lastName + middleName + org { + creationDate + id + logoUrl + name + } + orgId + role + username + } + } + +mutation CreateUploadUserAvatarUrl($userId: ID!) { + createUploadUserAvatarUrl(userId: $userId) + } + +mutation CreateUploadOrganisationLogoUrl($orgId: ID!) { + createUploadOrganisationLogoUrl(orgId: $orgId) + } diff --git a/mdm-front/src/entities/employee/api/employee.graphql.ts b/mdm-front/src/entities/employee/api/employee.graphql.ts index 890ba25..1e6f0b1 100644 --- a/mdm-front/src/entities/employee/api/employee.graphql.ts +++ b/mdm-front/src/entities/employee/api/employee.graphql.ts @@ -1,325 +1,14 @@ -import { gql } from '@apollo/client' - -export const GET_USERS_QUERY = gql` - query GetUsers( - $page: Int! - $query: String - $orgs: [ID!] - $roles: [Role!] - $sortDirection: SortDirection! - $sortField: UserSortField! - ) { - getUsers( - page: $page - query: $query - orgs: $orgs - roles: $roles - sortDirection: $sortDirection - sortField: $sortField - ) { - totalPages - totalElements - page { - avatarUrl - firstName - id - lastName - middleName - org { - creationDate - id - logoUrl - name - } - orgId - role - username - } - } - } -` - -export const GET_ORGANISATION_QUERY = gql` - query GetOrganisation($id: ID!) { - getOrganisation(id: $id) { - creationDate - id - name - logoUrl - policy { - bluetooth - bluetoothEditable - camera - cameraEditable - GPS - gpsEditable - sim - simEditable - offlineTimeThreshold - } - } - } -` - -export const DELETE_ORGANISATION_MUTATION = gql` - mutation DeleteOrganisation($id: ID!) { - deleteOrganisation(id: $id) - } -` - -export const GET_ORGANISATIONS_QUERY = gql` - query GetOrganisations( - $page: Int! - $query: String - $sortDirection: SortDirection! - $sortField: OrganisationSortField! - ) { - getOrganisations( - page: $page - query: $query - sortDirection: $sortDirection - sortField: $sortField - ) { - totalPages - totalElements - page { - creationDate - id - name - logoUrl - } - } - } -` - -export const CREATE_ORGANISATION_MUTATION = gql` - mutation CreateOrganisation( - $name: String! - $bluetooth: ServiceUseOption! - $bluetoothEditable: Boolean! - $camera: ComponentUseOption! - $cameraEditable: Boolean! - $GPS: ServiceUseOption! - $gpsEditable: Boolean! - $sim: ServiceUseOption! - $simEditable: Boolean! - $offlineTimeThreshold: Float! - ) { - createOrganisation( - name: $name - policy: { - bluetooth: $bluetooth - bluetoothEditable: $bluetoothEditable - camera: $camera - cameraEditable: $cameraEditable - GPS: $GPS - gpsEditable: $gpsEditable - sim: $sim - simEditable: $simEditable - offlineTimeThreshold: $offlineTimeThreshold - } - ) { - id - name - } - } -` - -export const CHANGE_ORGANISATION_MUTATION = gql` - mutation ChangeOrganisation( - $id: ID! - $name: String! - $bluetooth: ServiceUseOption! - $bluetoothEditable: Boolean! - $camera: ComponentUseOption! - $cameraEditable: Boolean! - $GPS: ServiceUseOption! - $gpsEditable: Boolean! - $sim: ServiceUseOption! - $simEditable: Boolean! - $offlineTimeThreshold: Float! - ) { - changeOrganisation( - id: $id - name: $name - policy: { - bluetooth: $bluetooth - bluetoothEditable: $bluetoothEditable - camera: $camera - cameraEditable: $cameraEditable - GPS: $GPS - gpsEditable: $gpsEditable - sim: $sim - simEditable: $simEditable - offlineTimeThreshold: $offlineTimeThreshold - } - ) { - creationDate - id - name - } - } -` - -export const CHANGE_ORGANISATION_POLICY_MUTATION = gql` - mutation ChangeOrganisationPolicy( - $id: ID! - $name: String! - $bluetooth: ServiceUseOption! - $bluetoothEditable: Boolean! - $camera: ComponentUseOption! - $cameraEditable: Boolean! - $GPS: ServiceUseOption! - $gpsEditable: Boolean! - $sim: ServiceUseOption! - $simEditable: Boolean! - $offlineTimeThreshold: Float! - ) { - changeOrganisation( - id: $id - name: $name - policy: { - bluetooth: $bluetooth - bluetoothEditable: $bluetoothEditable - camera: $camera - cameraEditable: $cameraEditable - GPS: $GPS - gpsEditable: $gpsEditable - sim: $sim - simEditable: $simEditable - offlineTimeThreshold: $offlineTimeThreshold - } - ) { - creationDate - id - name - } - } -` - -export const CREATE_USER_MUTATION = gql` - mutation createUser( - $orgId: ID! - $firstName: String! - $lastName: String! - $middleName: String! - $username: String! - $password: String! - $role: Role! - ) { - createUser( - payload: { - orgId: $orgId - firstName: $firstName - lastName: $lastName - middleName: $middleName - username: $username - password: $password - role: $role - } - ) { - id - firstName - lastName - middleName - orgId - role - org { - id - name - } - } - } -` - -export const CHANGE_USER_MUTATION = gql` - mutation ChangeUser( - $userId: ID! - $orgId: ID! - $firstName: String! - $lastName: String! - $middleName: String! - $username: String! - $role: Role! - ) { - changeUser( - userId: $userId - form: { - orgId: $orgId - firstName: $firstName - lastName: $lastName - middleName: $middleName - username: $username - role: $role - } - ) { - avatarUrl - firstName - id - lastName - middleName - org { - creationDate - id - logoUrl - name - } - orgId - role - username - } - } -` - -export const CHANGE_USER_WITH_PASSWORD_MUTATION = gql` - mutation ChangeUserWithPassword( - $userId: ID! - $orgId: ID! - $firstName: String! - $lastName: String! - $middleName: String! - $username: String! - $password: String! - $role: Role! - ) { - changeUser( - userId: $userId - form: { - orgId: $orgId - firstName: $firstName - lastName: $lastName - middleName: $middleName - username: $username - password: $password - role: $role - } - ) { - avatarUrl - firstName - id - lastName - middleName - org { - creationDate - id - logoUrl - name - } - orgId - role - username - } - } -` - -export const CREATE_UPLOAD_USER_AVATAR_URL_MUTATION = gql` - mutation CreateUploadUserAvatarUrl($userId: ID!) { - createUploadUserAvatarUrl(userId: $userId) - } -` - -export const CREATE_UPLOAD_ORGANISATION_LOGO_URL_MUTATION = gql` - mutation CreateUploadOrganisationLogoUrl($orgId: ID!) { - createUploadOrganisationLogoUrl(orgId: $orgId) - } -` +export { + GetUsersDocument as GET_USERS_QUERY, + GetOrganisationDocument as GET_ORGANISATION_QUERY, + DeleteOrganisationDocument as DELETE_ORGANISATION_MUTATION, + GetOrganisationsDocument as GET_ORGANISATIONS_QUERY, + CreateOrganisationDocument as CREATE_ORGANISATION_MUTATION, + ChangeOrganisationDocument as CHANGE_ORGANISATION_MUTATION, + ChangeOrganisationPolicyDocument as CHANGE_ORGANISATION_POLICY_MUTATION, + CreateUserDocument as CREATE_USER_MUTATION, + ChangeUserDocument as CHANGE_USER_MUTATION, + ChangeUserWithPasswordDocument as CHANGE_USER_WITH_PASSWORD_MUTATION, + CreateUploadUserAvatarUrlDocument as CREATE_UPLOAD_USER_AVATAR_URL_MUTATION, + CreateUploadOrganisationLogoUrlDocument as CREATE_UPLOAD_ORGANISATION_LOGO_URL_MUTATION, +} from '../../../shared/api/generated/graphql' diff --git a/mdm-front/src/entities/employee/model/types.ts b/mdm-front/src/entities/employee/model/types.ts index a225e8d..60a3286 100644 --- a/mdm-front/src/entities/employee/model/types.ts +++ b/mdm-front/src/entities/employee/model/types.ts @@ -1,11 +1,42 @@ -export type EmployeeRole = 'User' | 'Admin' | string +import type { + ChangeOrganisationMutation, + ChangeOrganisationMutationVariables, + ChangeOrganisationPolicyMutationVariables, + ChangeUserMutation, + ChangeUserMutationVariables, + ChangeUserWithPasswordMutationVariables, + ComponentUseOption as GeneratedComponentUseOption, + CreateOrganisationMutation, + CreateOrganisationMutationVariables, + CreateUploadOrganisationLogoUrlMutation, + CreateUploadOrganisationLogoUrlMutationVariables, + CreateUploadUserAvatarUrlMutation, + CreateUploadUserAvatarUrlMutationVariables, + CreateUserMutation, + CreateUserMutationVariables, + DeleteOrganisationMutation, + DeleteOrganisationMutationVariables, + GetOrganisationQuery, + GetOrganisationQueryVariables, + GetOrganisationsQuery, + GetOrganisationsQueryVariables, + GetUsersQuery, + GetUsersQueryVariables, + OrganisationSortField as GeneratedOrganisationSortField, + Role, + ServiceUseOption as GeneratedServiceUseOption, + SortDirection, + UserSortField as GeneratedUserSortField, +} from '../../../shared/api/generated/graphql' + +export type EmployeeRole = Role export type Employee = { avatarUrl?: string | null id: number firstName: string lastName: string - middleName: string + middleName: string | null username?: string orgId: number role: EmployeeRole @@ -17,41 +48,19 @@ export type Employee = { } | null } -export type UserSortDirection = 'ASC' | 'DESC' +export type UserSortDirection = SortDirection -export type UserSortField = 'ID' | 'Name' | 'Date' +export type UserSortField = GeneratedUserSortField -export type ServiceUseOption = - | 'Disabled' - | 'Enabled' - | 'Unspecified' +export type ServiceUseOption = GeneratedServiceUseOption -export type ComponentUseOption = - | 'Allowed' - | 'Disallowed' +export type ComponentUseOption = GeneratedComponentUseOption export type GroupUsePolicyOption = | 'Allowed' | 'Disallowed' | 'Changeable' -export type GetUsersData = { - getUsers: { - totalPages: number - totalElements: number - page: Employee[] - } -} - -export type GetUsersVariables = { - page: number - query?: string - orgs?: string[] - roles?: EmployeeRole[] - sortDirection: UserSortDirection - sortField: UserSortField -} - export type OrganisationPolicy = { bluetooth?: ServiceUseOption | GroupUsePolicyOption bluetoothEditable?: boolean @@ -77,161 +86,33 @@ export type Organisation = { logoUrl?: string | null } -export type GetOrganisationData = { - getOrganisation: Organisation | null -} - -export type GetOrganisationVariables = { - id: string -} - -export type ChangeOrganisationData = { - changeOrganisation: { - id: number - name: string - } -} - -export type ChangeOrganisationVariables = { - id: string - name: string - bluetooth: ServiceUseOption - bluetoothEditable: boolean - camera: ComponentUseOption - cameraEditable: boolean - GPS: ServiceUseOption - gpsEditable: boolean - sim: ServiceUseOption - simEditable: boolean - offlineTimeThreshold: number -} - -export type ChangeOrganisationPolicyVariables = { - id: string - name: string - bluetooth: ServiceUseOption - bluetoothEditable: boolean - camera: ComponentUseOption - cameraEditable: boolean - GPS: ServiceUseOption - gpsEditable: boolean - sim: ServiceUseOption - simEditable: boolean - offlineTimeThreshold: number -} - -export type GetUsersPageData = { - getUsersPage: { - page: Employee[] - nextKey: string | null - } -} - -export type GetUsersPageVariables = { - key?: string -} - -export type GetOrganisationsData = { - getOrganisations: { - totalPages: number - totalElements: number - page: Organisation[] - } -} - -export type GetOrganisationsVariables = { - page: number - query?: string - sortDirection: OrganisationSortDirection - sortField: OrganisationSortField -} - -export type DeleteOrganisationData = { - deleteOrganisation: boolean -} - -export type DeleteOrganisationVariables = { - id: string -} - -export type CreateUserData = { - createUser: Employee -} - -export type CreateUserVariables = { - orgId: string - firstName: string - lastName: string - middleName: string - username: string - password: string - role: EmployeeRole -} - -export type ChangeUserData = { - changeUser: Employee -} - -export type ChangeUserVariables = { - userId: string - orgId: string - firstName: string - lastName: string - middleName: string - username: string - role: EmployeeRole -} - -export type ChangeUserWithPasswordVariables = ChangeUserVariables & { - password: string -} - -export type SignUpVariables = { - orgId: string - firstName: string - lastName: string - middleName: string - username: string - password: string - role: EmployeeRole -} - -export type CreateOrganisationData = { - createOrganisation: { - id: number - name: string - } -} - -export type CreateOrganisationVariables = { - name: string - bluetooth: ServiceUseOption - bluetoothEditable: boolean - camera: ComponentUseOption - cameraEditable: boolean - GPS: ServiceUseOption - gpsEditable: boolean - sim: ServiceUseOption - simEditable: boolean - offlineTimeThreshold: number -} - -export type OrganisationSortDirection = 'ASC' | 'DESC' - -export type OrganisationSortField = 'ID' | 'Name' | 'Date' - -export type CreateUploadUserAvatarUrlData = { - createUploadUserAvatarUrl: string -} - -export type CreateUploadUserAvatarUrlVariables = { - userId: string -} - -export type CreateUploadOrganisationLogoUrlData = { - createUploadOrganisationLogoUrl: string -} - -export type CreateUploadOrganisationLogoUrlVariables = { - orgId: string -} +export type GetUsersData = GetUsersQuery +export type GetUsersVariables = GetUsersQueryVariables +export type GetOrganisationData = GetOrganisationQuery +export type GetOrganisationVariables = GetOrganisationQueryVariables +export type ChangeOrganisationData = ChangeOrganisationMutation +export type ChangeOrganisationVariables = ChangeOrganisationMutationVariables +export type ChangeOrganisationPolicyVariables = + ChangeOrganisationPolicyMutationVariables +export type GetOrganisationsData = GetOrganisationsQuery +export type GetOrganisationsVariables = GetOrganisationsQueryVariables +export type DeleteOrganisationData = DeleteOrganisationMutation +export type DeleteOrganisationVariables = DeleteOrganisationMutationVariables +export type CreateUserData = CreateUserMutation +export type CreateUserVariables = CreateUserMutationVariables +export type ChangeUserData = ChangeUserMutation +export type ChangeUserVariables = ChangeUserMutationVariables +export type ChangeUserWithPasswordVariables = + ChangeUserWithPasswordMutationVariables +export type CreateOrganisationData = CreateOrganisationMutation +export type CreateOrganisationVariables = CreateOrganisationMutationVariables +export type OrganisationSortDirection = SortDirection +export type OrganisationSortField = GeneratedOrganisationSortField +export type CreateUploadUserAvatarUrlData = + CreateUploadUserAvatarUrlMutation +export type CreateUploadUserAvatarUrlVariables = + CreateUploadUserAvatarUrlMutationVariables +export type CreateUploadOrganisationLogoUrlData = + CreateUploadOrganisationLogoUrlMutation +export type CreateUploadOrganisationLogoUrlVariables = + CreateUploadOrganisationLogoUrlMutationVariables diff --git a/mdm-front/src/features/auth/api/auth.documents.graphql b/mdm-front/src/features/auth/api/auth.documents.graphql new file mode 100644 index 0000000..e701926 --- /dev/null +++ b/mdm-front/src/features/auth/api/auth.documents.graphql @@ -0,0 +1,37 @@ +mutation SignIn($username: String!, $password: String!) { + signIn(username: $username, password: $password) { + id + role + } + } + +mutation RefreshSession { + refreshSession { + id + firstName + lastName + middleName + orgId + role + org { + id + name + } + } + } + +query CurrentUser { + currentUser { + avatarUrl + id + role + firstName + middleName + lastName + username + org { + id + name + } + } + } diff --git a/mdm-front/src/features/auth/api/auth.graphql.ts b/mdm-front/src/features/auth/api/auth.graphql.ts index c76f24a..3dadfea 100644 --- a/mdm-front/src/features/auth/api/auth.graphql.ts +++ b/mdm-front/src/features/auth/api/auth.graphql.ts @@ -1,45 +1,5 @@ -import { gql } from '@apollo/client' - -export const SIGN_IN_MUTATION = gql` - mutation SignIn($username: String!, $password: String!) { - signIn(username: $username, password: $password) { - id - role - } - } -` - -export const REFRESH_SESSION_MUTATION = gql` - mutation RefreshSession { - refreshSession { - id - firstName - lastName - middleName - orgId - role - org { - id - name - } - } - } -` - -export const CURRENT_USER_QUERY = gql` - query CurrentUser { - currentUser { - avatarUrl - id - role - firstName - middleName - lastName - username - org { - id - name - } - } - } -` \ No newline at end of file +export { + SignInDocument as SIGN_IN_MUTATION, + RefreshSessionDocument as REFRESH_SESSION_MUTATION, + CurrentUserDocument as CURRENT_USER_QUERY, +} from '../../../shared/api/generated/graphql' diff --git a/mdm-front/src/features/auth/ui/AuthGate.tsx b/mdm-front/src/features/auth/ui/AuthGate.tsx index 8ac1769..a95fd04 100644 --- a/mdm-front/src/features/auth/ui/AuthGate.tsx +++ b/mdm-front/src/features/auth/ui/AuthGate.tsx @@ -8,28 +8,6 @@ import { } from '../api/auth.graphql' import { LoginPage } from '../../../pages/LoginPage/LoginPage' -type CurrentUser = { - id: string - role: string - avatarUrl: string - firstName: string - middleName: string - lastName: string - username: string - org: { - id: number - name: string - } | null -} - -type CurrentUserQueryData = { - currentUser: CurrentUser | null -} - -type RefreshSessionData = { - refreshSession: CurrentUser | null -} - type AuthGateProps = { children: ReactNode } @@ -38,7 +16,7 @@ export function AuthGate({ children }: AuthGateProps) { const [isForcedLogout, setIsForcedLogout] = useState(false) const [isRefreshFailed, setIsRefreshFailed] = useState(false) - const { data, loading, error, refetch } = useQuery( + const { data, loading, error, refetch } = useQuery( CURRENT_USER_QUERY, { fetchPolicy: 'network-only', @@ -47,7 +25,7 @@ export function AuthGate({ children }: AuthGateProps) { ) const [refreshSession, { loading: isRefreshing }] = - useMutation(REFRESH_SESSION_MUTATION, { + useMutation(REFRESH_SESSION_MUTATION, { onCompleted: async (result) => { if (!result.refreshSession) { setIsRefreshFailed(true) @@ -112,4 +90,4 @@ export function AuthGate({ children }: AuthGateProps) { } return children -} \ No newline at end of file +} diff --git a/mdm-front/src/index.scss b/mdm-front/src/index.scss index c23139f..134f995 100644 --- a/mdm-front/src/index.scss +++ b/mdm-front/src/index.scss @@ -49,6 +49,18 @@ html{ background: $color-bg; } +::view-transition-old(root), +::view-transition-new(root) { + animation: none; + mix-blend-mode: normal; +} + +html.theme-transition-no-css-transitions *, +html.theme-transition-no-css-transitions *::before, +html.theme-transition-no-css-transitions *::after { + transition: none !important; +} + button{ font-family: inherit; } diff --git a/mdm-front/src/pages/DevicePage/DevicePage.scss b/mdm-front/src/pages/DevicePage/DevicePage.scss index ca0b0b3..cf14dc4 100644 --- a/mdm-front/src/pages/DevicePage/DevicePage.scss +++ b/mdm-front/src/pages/DevicePage/DevicePage.scss @@ -12,6 +12,35 @@ padding: 20px 20px 36px 20px; } +.device-page--apps { + flex: 1 1 0; + box-sizing: border-box; + min-width: 0; + min-height: 0; + height: 100%; + max-height: 100%; + overflow: visible; + + .device-page__motion-view { + overflow: visible; + } + + .device-page__apps-motion { + display: flex; + flex: 1 1 0; + min-width: 0; + min-height: 0; + height: 100%; + max-height: 100%; + flex-direction: column; + } + + .device-apps-view { + min-height: 0; + height: 100%; + } +} + .device-page__grid { display: grid; grid-template-columns: 340px 340px minmax(360px, 1fr); @@ -30,7 +59,7 @@ .device-card { border-radius: 20px; - background: rgba($color-surface-rgb, .5); + background: $color-surface; backdrop-filter: blur(22px); padding: 20px; box-shadow: $shadow-card; @@ -116,35 +145,153 @@ gap: 4px; } +.device-status-row { + display: flex; + align-items: center; + gap: 4px; +} + .device-status { display: inline-flex; align-items: center; - gap: 9px; + gap: 2px; color: $color-text-strong; - font-size: $font-size-18; - font-weight: 500; + font-size: $font-size-14; + font-weight: 550; + text-transform: uppercase; + + padding-right: 12px; + border-radius: 12px; + line-height: 1; + border: none; svg { - padding: 4px; - width: 24px; - height: 24px; - border-radius: 8px; + padding: 6px; + width: 20px; + height: 20px; + border-radius: 12px; background: $color-bg; } - &.is-success svg { + &.is-success { color: $green; - background: $color-success-bg; + background-color: var(--color-success-bg); + + svg { + color: $green; + background: $color-success-bg; + } } - &.is-danger svg { - color: $red; + &.is-danger { background: $color-danger-bg; + color: $red; + + svg { + color: $red; + background: $color-danger-bg; + } } - &.is-muted svg { + &.is-muted { + background: var(--color-bg); color: $gray50; + + svg { + color: $gray50; + } + } + + &.is-service { + background: $color-primary-muted; + color: $blue; + + svg { + color: $blue; + background: $color-primary-muted; + } + } +} + +.device-status--interactive { + border: 0; + font-family: inherit; + cursor: pointer; + transition: + filter 0.18s ease, + box-shadow 0.18s ease; +} + +.device-status-menu__trigger { + width: auto; + aspect-ratio: 1/1; + height: 100%; + display: inline-flex; + align-items: center; + justify-content: center; + border: 0; + border-radius: 12px; + background: transparent; + padding: 0; + color: $gray50; + cursor: pointer; + transition: 0.18s ease; + + &:hover, + &[data-state='open'] { + background: $color-bg; + } + + &:focus-visible { + outline: none; + outline-offset: 1px; + } +} + +.device-status-menu { + z-index: 600; + min-width: 228px; + border: 1px solid $color-border-muted; + border-radius: 12px; + background: $color-surface; + padding: 6px; + box-shadow: $shadow-popover; + animation: device-status-menu-in 0.16s ease; +} + +.device-status-menu__item { + min-height: 38px; + display: flex; + align-items: center; + gap: 9px; + border-radius: 8px; + padding: 0 10px; + outline: none; + color: $color-text-strong; + font-size: $font-size-13; + font-weight: 550; + cursor: pointer; + + svg { + flex: 0 0 auto; + color: $gray50; + } + + &[data-highlighted] { + background: $color-surface-hover; + } +} + +@keyframes device-status-menu-in { + from { + opacity: 0; + transform: translateY(-4px) scale(0.98); + } + + to { + opacity: 1; + transform: translateY(0) scale(1); } } @@ -744,7 +891,8 @@ } .device-page__grid { - grid-template-columns: 540px minmax(360px, 1fr);; + grid-template-columns: 540px minmax(360px, 1fr); + ; } .device-card--main { @@ -761,19 +909,23 @@ height: calc(100% - 36px); border-radius: 16px; } - .device-card-stats{ + + .device-card-stats { height: calc(100%); } - .device-impacts{ + + .device-impacts { flex: 0; } - .device-battery{ + + .device-battery { display: flex; flex-direction: column; justify-content: space-between; flex: 1; } - .device-permissions{ + + .device-permissions { height: calc(100% - 12px); padding: 8px 8px 4px 18px; } @@ -789,22 +941,27 @@ .device-map { min-height: 252px; } - .history-period-tabs{ + + .history-period-tabs { display: none; } - .device-card__title{ + + .device-card__title { gap: 8px; - svg{ + + svg { width: 22px; height: 22px; } - h3{ + + h3 { font-size: var(--font-size-16); } } - .device-card__header{ - p{ - font-size: var(--font-size-14); + + .device-card__header { + p { + font-size: var(--font-size-14); } } } diff --git a/mdm-front/src/pages/DevicePage/DevicePage.tsx b/mdm-front/src/pages/DevicePage/DevicePage.tsx index 29f851d..934cd88 100644 --- a/mdm-front/src/pages/DevicePage/DevicePage.tsx +++ b/mdm-front/src/pages/DevicePage/DevicePage.tsx @@ -4,6 +4,7 @@ import { useCallback, useEffect, useMemo, + useRef, useState, } from 'react' import { @@ -21,6 +22,7 @@ import { GET_DEVICE_PAGE_QUERY } from '../../entities/device/api/device.graphql' import type { Device as ApiDevice, DeviceNetworkStatus, + DeviceTechnicalStatus, GetPhoneGpsTrackData, GetTelemetryData, GetDevicePageData, @@ -42,8 +44,10 @@ import { DevicePageSkeleton } from './components/DevicePageSkeleton/DevicePageSk import type { AppLayoutOutletContext } from '../../app/layouts/AppLayout' import { preloadOnIdle, + useDeferredModalPayload, useLazyMount, } from '../../shared/lib/lazyMount' +import { isPresent } from '../../shared/lib/isPresent' const loadDeviceHistoryModal = () => import('./components/DeviceHistoryModal/DeviceHistoryModal').then( @@ -54,6 +58,26 @@ const loadDeviceHistoryModal = () => const DeviceHistoryModal = lazy(loadDeviceHistoryModal) +const loadDeviceMaintenanceModal = () => + import('./components/DeviceMaintenanceModal/DeviceMaintenanceModal').then( + (module) => ({ + default: module.DeviceMaintenanceModal, + }), + ) + +const DeviceMaintenanceModal = lazy(loadDeviceMaintenanceModal) + +const loadDeviceMaintenanceHistoryModal = () => + import( + './components/DeviceMaintenanceHistoryModal/DeviceMaintenanceHistoryModal' + ).then((module) => ({ + default: module.DeviceMaintenanceHistoryModal, + })) + +const DeviceMaintenanceHistoryModal = lazy( + loadDeviceMaintenanceHistoryModal, +) + function formatLocationDate(timestamp: number) { if (!timestamp) return 'Нет данных' @@ -77,7 +101,7 @@ function getLatestTelemetryItem(telemetry: GetTelemetryData['getTelemetry']) { } function getSortedGpsTrack(track: GetPhoneGpsTrackData['getPhoneGpsTrack']) { - return [...track].sort((a, b) => a.date - b.date) + return track.filter(isPresent).sort((a, b) => a.date - b.date) } function getDeviceNetworkConnection(status?: DeviceNetworkStatus) { @@ -94,6 +118,13 @@ function getDeviceNetworkLabel(status?: DeviceNetworkStatus) { return 'Не в сети' } +function getDeviceCondition(status?: DeviceTechnicalStatus) { + if (status === 'InService') return 'service' + if (status === 'NeedsMaintenance') return 'inspection' + + return 'ok' +} + function mapApiDeviceToPageDevice( device: ApiDevice, batteryLevel?: number, @@ -103,7 +134,6 @@ function mapApiDeviceToPageDevice( const sortedGpsTrack = getSortedGpsTrack(gpsTrack) const policy = device.policy const techState = device.techState - const needMaintenance = techState?.needMaintenance ?? false const bluetoothEnabled = isPhonePolicyOptionEnabled( policy?.bluetooth ?? policy?.canUseBluetooth, ) @@ -157,7 +187,10 @@ function mapApiDeviceToPageDevice( policy, organisationPolicy: device.org?.policy ?? null, - condition: needMaintenance ? 'inspection' : 'ok', + condition: getDeviceCondition(techState?.status), + technicalStatus: techState?.status ?? 'Healthy', + malfunctions: techState?.malfunctions ?? [], + malfunctionComment: techState?.malfunctionComment, connection: getDeviceNetworkConnection(device.networkStatus), connectionText: getDeviceNetworkLabel(device.networkStatus), @@ -217,12 +250,35 @@ export function DevicePage() { const [searchParams, setSearchParams] = useSearchParams() const [isHistoryOpen, setIsHistoryOpen] = useState(false) const shouldMountHistoryModal = useLazyMount(isHistoryOpen) + const [maintenanceMode, setMaintenanceMode] = useState< + 'view' | 'manage' | null + >(null) + const renderMaintenanceMode = useDeferredModalPayload(maintenanceMode) + const shouldMountMaintenanceModal = useLazyMount(maintenanceMode !== null) + const [isMaintenanceHistoryOpen, setIsMaintenanceHistoryOpen] = + useState(false) + const shouldMountMaintenanceHistoryModal = useLazyMount( + isMaintenanceHistoryOpen, + ) + const maintenanceHistoryTimerRef = useRef(null) const numericDeviceId = Number(deviceId) const isAppsView = searchParams.get('view') === 'apps' useEffect(() => { - return preloadOnIdle([loadDeviceHistoryModal]) + return preloadOnIdle([ + loadDeviceHistoryModal, + loadDeviceMaintenanceModal, + loadDeviceMaintenanceHistoryModal, + ]) + }, []) + + useEffect(() => { + return () => { + if (maintenanceHistoryTimerRef.current !== null) { + window.clearTimeout(maintenanceHistoryTimerRef.current) + } + } }, []) const { @@ -315,6 +371,35 @@ export function DevicePage() { setIsHistoryOpen(true) }, []) + const handleOpenMaintenanceDetails = useCallback(() => { + setMaintenanceMode('view') + }, []) + + const handleManageMaintenance = useCallback(() => { + setMaintenanceMode('manage') + }, []) + + const handleOpenMaintenanceHistory = useCallback(() => { + setMaintenanceMode(null) + + if (maintenanceHistoryTimerRef.current !== null) { + window.clearTimeout(maintenanceHistoryTimerRef.current) + } + + maintenanceHistoryTimerRef.current = window.setTimeout(() => { + setIsMaintenanceHistoryOpen(true) + maintenanceHistoryTimerRef.current = null + }, 220) + }, []) + + const handleOpenMaintenanceHistoryFromCard = useCallback(() => { + setIsMaintenanceHistoryOpen(true) + }, []) + + const handleMaintenanceUpdated = useCallback(async () => { + await refetch() + }, [refetch]) + const handleRefetchPolicy = useCallback(async () => { const result = await refetch() @@ -372,12 +457,12 @@ export function DevicePage() { } return ( -
+
{isAppsView ? ( @@ -433,6 +521,29 @@ export function DevicePage() { /> )} + {shouldMountMaintenanceModal && renderMaintenanceMode && ( + + { + if (!nextOpen) setMaintenanceMode(null) + }} + onUpdated={handleMaintenanceUpdated} + /> + + )} + {shouldMountMaintenanceHistoryModal && ( + + + + )}
) } diff --git a/mdm-front/src/pages/DevicePage/components/DeviceAppsView/DeviceAppsView.scss b/mdm-front/src/pages/DevicePage/components/DeviceAppsView/DeviceAppsView.scss index 9ea3329..0c6eb43 100644 --- a/mdm-front/src/pages/DevicePage/components/DeviceAppsView/DeviceAppsView.scss +++ b/mdm-front/src/pages/DevicePage/components/DeviceAppsView/DeviceAppsView.scss @@ -1,10 +1,13 @@ @use '../../../../shared/styles/variables' as *; .device-apps-view { - display: flex; - flex: 1; + display: grid; + grid-template-rows: auto auto minmax(0, 1fr); + flex: 1 1 0; + min-width: 0; min-height: 0; - flex-direction: column; + height: 100%; + max-height: 100%; gap: 14px; } @@ -237,16 +240,43 @@ } .device-apps-view__panel { + position: relative; + display: flex; + flex-direction: column; + width: 100%; min-height: 0; - flex: 1; + height: 100%; + max-height: 100%; + flex: 1 1 0; border-radius: 20px; background: $color-surface; box-shadow: 5px 5px 40px -10px rgba($gray50-rgb, 0.2); - overflow: hidden; } .device-apps-view__scroll { + position: relative; + flex: 1 1 0; + width: 100%; + min-height: 0; height: 100%; + max-height: 100%; + border-radius: 20px; + background: $color-surface; + + .simplebar-wrapper, + .simplebar-mask, + .simplebar-offset, + .simplebar-content-wrapper { + min-width: 0; + min-height: 0; + max-width: 100%; + height: 100%; + max-height: 100%; + } + + .simplebar-content-wrapper { + border-radius: 20px; + } .simplebar-content { min-height: 100%; @@ -254,18 +284,29 @@ .simplebar-track.simplebar-vertical { top: 14px; - right: 6px; + right: -7px; bottom: 14px; - width: 8px; + width: 14px; } .simplebar-scrollbar::before { - background: $gray50; - border-radius: 4px; + background: color-mix(in srgb, var(--gray50) 85%, transparent); + border-radius: 6px; opacity: 1; } } +.device-apps-view__reveal { + display: block; + min-height: 100%; + + .reveal-content__fallback, + .reveal-content__content { + display: block; + min-height: 100%; + } +} + .device-apps-view__state { min-height: 220px; padding: 24px; diff --git a/mdm-front/src/pages/DevicePage/components/DeviceAppsView/DeviceAppsView.tsx b/mdm-front/src/pages/DevicePage/components/DeviceAppsView/DeviceAppsView.tsx index 6e5b2dc..221fce4 100644 --- a/mdm-front/src/pages/DevicePage/components/DeviceAppsView/DeviceAppsView.tsx +++ b/mdm-front/src/pages/DevicePage/components/DeviceAppsView/DeviceAppsView.tsx @@ -483,7 +483,11 @@ export function DeviceAppsView({
- }> + } + > {error && (
Не удалось загрузить список приложений diff --git a/mdm-front/src/pages/DevicePage/components/DeviceHistoryModal/DeviceHistoryModal.tsx b/mdm-front/src/pages/DevicePage/components/DeviceHistoryModal/DeviceHistoryModal.tsx index b7e9d8a..dee3e8e 100644 --- a/mdm-front/src/pages/DevicePage/components/DeviceHistoryModal/DeviceHistoryModal.tsx +++ b/mdm-front/src/pages/DevicePage/components/DeviceHistoryModal/DeviceHistoryModal.tsx @@ -25,6 +25,7 @@ import type { DevicePackageUseEventsGroup, DevicePhoneStateEventType } from '../../../../entities/device/model/types' +import { isPresent } from '../../../../shared/lib/isPresent' import { DeviceHistoryPeriodControl, @@ -194,7 +195,7 @@ export function DeviceHistoryModal({ return [ ...telemetryData.getTelemetry, - ...telemetryData.getPhoneStateEvents.map( + ...telemetryData.getPhoneStateEvents.filter(isPresent).map( (event): DeviceHistoryChartItem => ({ date: event.date, type: 'event', diff --git a/mdm-front/src/pages/DevicePage/components/DeviceMainCard/DeviceMainCard.tsx b/mdm-front/src/pages/DevicePage/components/DeviceMainCard/DeviceMainCard.tsx index 387f23c..01eb6da 100644 --- a/mdm-front/src/pages/DevicePage/components/DeviceMainCard/DeviceMainCard.tsx +++ b/mdm-front/src/pages/DevicePage/components/DeviceMainCard/DeviceMainCard.tsx @@ -1,23 +1,35 @@ import { memo, useState } from 'react' import { AnimatePresence, m, useReducedMotion } from 'framer-motion' import { Link } from 'react-router-dom' +import * as DropdownMenu from '@radix-ui/react-dropdown-menu' import { Building2, + CircleAlert, + Eye, + History, Lock, + Menu, + Pencil, ShieldCheck, Signal, Smartphone, Trash2, + Wrench, } from 'lucide-react' import type { Device } from '../../types' import { conditionText, connectionText, getStatusClass } from '../../types' import { ConfirmDangerDialog } from '../../../../widgets/ConfirmDangerDialog/ConfirmDangerDialog' import { useDeferredModalPayload } from '../../../../shared/lib/lazyMount' +import { getDeviceMalfunctionSummary } from '../../../../entities/device/lib/maintenance' +import { Tooltip } from '../../../../shared/ui/Tooltip/Tooltip' type DeviceMainCardProps = { device: Device onOpenHistory: () => void + onOpenMaintenanceDetails: () => void + onManageMaintenance: () => void + onOpenMaintenanceHistory: () => void } function getDeviceFullName(device: Device) { @@ -30,6 +42,9 @@ function areDeviceMainCardPropsEqual( ) { return ( prev.onOpenHistory === next.onOpenHistory && + prev.onOpenMaintenanceDetails === next.onOpenMaintenanceDetails && + prev.onManageMaintenance === next.onManageMaintenance && + prev.onOpenMaintenanceHistory === next.onOpenMaintenanceHistory && prev.device.id === next.device.id && prev.device.image === next.device.image && prev.device.model === next.device.model && @@ -38,6 +53,9 @@ function areDeviceMainCardPropsEqual( prev.device.imei === next.device.imei && prev.device.imei2 === next.device.imei2 && prev.device.condition === next.device.condition && + prev.device.technicalStatus === next.device.technicalStatus && + prev.device.malfunctionComment === next.device.malfunctionComment && + prev.device.malfunctions.join(',') === next.device.malfunctions.join(',') && prev.device.connection === next.device.connection && prev.device.connectionText === next.device.connectionText && prev.device.permissions?.locked === next.device.permissions?.locked && @@ -51,6 +69,9 @@ function areDeviceMainCardPropsEqual( export const DeviceMainCard = memo(function DeviceMainCard({ device, onOpenHistory, + onOpenMaintenanceDetails, + onManageMaintenance, + onOpenMaintenanceHistory, }: DeviceMainCardProps) { const [deletingDevice, setDeletingDevice] = useState(null) const renderDeletingDevice = useDeferredModalPayload(deletingDevice) @@ -61,12 +82,32 @@ export const DeviceMainCard = memo(function DeviceMainCard({ duration: 0.24, ease: [0.34, 1.42, 0.64, 1] as [number, number, number, number], } - const statusItems = [ + const statusItems: Array<{ + key: string + className: string + icon: React.ReactNode + content: string + title?: string + isTechnical?: boolean + }> = [ { key: `condition-${device.condition}`, className: getStatusClass(device.condition), - icon: , + icon: + device.condition === 'ok' ? ( + + ) : device.condition === 'service' ? ( + + ) : ( + + ), content: conditionText[device.condition], + title: + getDeviceMalfunctionSummary( + device.malfunctions, + device.malfunctionComment, + ) || undefined, + isTechnical: true, }, { key: `connection-${device.connection}-${device.connectionText ?? ''}`, @@ -133,7 +174,7 @@ export const DeviceMainCard = memo(function DeviceMainCard({ - {status.icon} - {status.content} + + {status.isTechnical ? ( + + ) : ( + + {status.icon} + {status.content} + + )} + + + {status.isTechnical && ( + + + + + + + + + + Просмотреть состояние + + + + Изменить состояние + + + + Журнал обслуживания + + + + + )} ))} diff --git a/mdm-front/src/pages/DevicePage/components/DeviceMaintenanceHistoryModal/DeviceMaintenanceHistoryModal.scss b/mdm-front/src/pages/DevicePage/components/DeviceMaintenanceHistoryModal/DeviceMaintenanceHistoryModal.scss new file mode 100644 index 0000000..d622d86 --- /dev/null +++ b/mdm-front/src/pages/DevicePage/components/DeviceMaintenanceHistoryModal/DeviceMaintenanceHistoryModal.scss @@ -0,0 +1,235 @@ +@use '../../../../shared/styles/variables' as *; + +.device-maintenance-history-modal__overlay { + position: fixed; + inset: 0; + z-index: 500; + background: $color-backdrop; + backdrop-filter: blur(3px); +} + +.device-maintenance-history-modal { + position: fixed; + z-index: 510; + top: 50%; + left: 50%; + width: min(860px, calc(100vw - 32px)); + height: min(760px, calc(100vh - 32px)); + display: flex; + flex-direction: column; + overflow: hidden; + border-radius: 24px; + background: $color-surface; + box-shadow: $shadow-modal; +} + +.device-maintenance-history-modal__header { + flex: 0 0 auto; + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 20px; + padding: 22px 24px 18px; + border-bottom: 1px solid $color-border-muted; + + h2 { + margin: 0; + color: $color-text-strong; + font-size: $font-size-24; + font-weight: 650; + } + + p { + margin: 5px 0 0; + color: $color-text-muted; + font-size: $font-size-14; + } +} + +.device-maintenance-history-modal__close { + flex: 0 0 auto; + width: 38px; + height: 38px; + display: inline-flex; + align-items: center; + justify-content: center; + border: 0; + border-radius: 11px; + background: $color-bg; + color: $color-text-muted; + cursor: pointer; + transition: 0.2s ease; + + &:hover { + background: $color-surface-hover; + color: $color-primary; + } +} + +.device-maintenance-history-modal__scroll { + flex: 1 1 auto; + min-height: 0; +} + +.device-maintenance-history-modal__body { + padding: 20px 24px 24px; +} + +.device-maintenance-history { + display: flex; + flex-direction: column; + gap: 9px; +} + +.device-maintenance-history-case { + overflow: hidden; + border: 1px solid $color-border-muted; + border-radius: 15px; + background: $color-surface-muted; + + h3 { + margin: 0; + } + + [data-radix-collection-item] { + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + border: 0; + background: transparent; + padding: 13px 14px; + color: $color-text-strong; + text-align: left; + cursor: pointer; + + > span { + display: flex; + flex-direction: column; + gap: 3px; + } + + b { + font-size: $font-size-14; + font-weight: 600; + } + + small { + color: $color-text-muted; + font-size: $font-size-12; + } + + svg { + flex: 0 0 auto; + color: $color-text-muted; + transition: transform 0.2s ease; + } + + &[data-state='open'] svg { + transform: rotate(180deg); + } + } +} + +.device-maintenance-history-case__details { + padding: 0 14px 14px; +} + +.device-maintenance-history-case__malfunctions { + display: flex; + flex-wrap: wrap; + gap: 6px; + + span { + border-radius: 12px; + background: $color-danger-bg; + padding: 4px 10px; + color: $color-danger; + font-size: $font-size-12; + font-weight: 600; + } +} + +.device-maintenance-history-case__comment { + margin-top: 11px; + padding: 10px 12px; + border-radius: 11px; + background: $color-surface; + + span { + color: $color-text-muted; + font-size: $font-size-11; + font-weight: 500; + } + + p { + margin: 3px 0 0; + color: $color-text; + font-size: $font-size-13; + line-height: 1.45; + } +} + +.device-maintenance-history-case__dates { + display: flex; + flex-wrap: wrap; + gap: 6px 18px; + margin-top: 12px; + color: $color-text-muted; + font-size: $font-size-12; + + b { + color: $color-text; + font-weight: 600; + } +} + +.device-maintenance-history-case__metrics { + margin-top: 12px; +} + +.device-maintenance-history-modal__message { + padding: 28px; + border-radius: 15px; + background: $color-surface-muted; + color: $color-text-muted; + font-size: $font-size-14; + text-align: center; + + &.is-error { + background: $color-danger-bg; + color: $color-danger; + } +} + +.device-maintenance-history-modal__footer { + position: relative; + z-index: 2; + flex: 0 0 auto; + min-height: 72px; + display: flex; + align-items: center; + justify-content: flex-end; + padding: 14px 24px; + border-top: 1px solid $color-border-muted; + background: $color-surface; + + button { + min-height: 42px; + border: 0; + border-radius: 12px; + background: $color-bg; + padding: 0 18px; + color: $color-text-strong; + font-size: $font-size-14; + font-weight: 600; + cursor: pointer; + transition: 0.18s ease; + + &:hover { + background: $color-surface-hover; + color: $color-primary; + } + } +} diff --git a/mdm-front/src/pages/DevicePage/components/DeviceMaintenanceHistoryModal/DeviceMaintenanceHistoryModal.tsx b/mdm-front/src/pages/DevicePage/components/DeviceMaintenanceHistoryModal/DeviceMaintenanceHistoryModal.tsx new file mode 100644 index 0000000..2904844 --- /dev/null +++ b/mdm-front/src/pages/DevicePage/components/DeviceMaintenanceHistoryModal/DeviceMaintenanceHistoryModal.tsx @@ -0,0 +1,193 @@ +import { useMemo } from 'react' +import * as Accordion from '@radix-ui/react-accordion' +import * as Dialog from '@radix-ui/react-dialog' +import { useQuery } from '@apollo/client/react' +import SimpleBar from 'simplebar-react' +import { + ChevronDown, + X, +} from 'lucide-react' + +import { GET_PHONE_MAINTENANCE_HISTORY_QUERY } from '../../../../entities/device/api/device.graphql' +import { + deviceMalfunctionLabels, + isRedundantMalfunctionComment, +} from '../../../../entities/device/lib/maintenance' +import type { + GetPhoneMaintenanceHistoryData, + GetPhoneMaintenanceHistoryVariables, +} from '../../../../entities/device/model/types' +import { MotionDialogContent } from '../../../../shared/ui/MotionDialog/MotionDialog' +import type { Device } from '../../types' +import { DeviceMaintenanceMetrics } from '../DeviceMaintenanceMetrics/DeviceMaintenanceMetrics' + +import './DeviceMaintenanceHistoryModal.scss' + +type DeviceMaintenanceHistoryModalProps = { + open: boolean + device: Device + onOpenChange: (open: boolean) => void +} + +type MaintenanceCase = + GetPhoneMaintenanceHistoryData['getPhoneMaintenanceHistory'][number] + +const maintenanceStatusLabels = { + Open: 'Ожидает обслуживания', + InService: 'На обслуживании', + Closed: 'Обслуживание завершено', +} as const + +function formatDate(value?: number | null) { + if (!value) return 'Не указано' + + return new Intl.DateTimeFormat('ru-RU', { + day: '2-digit', + month: '2-digit', + year: 'numeric', + hour: '2-digit', + minute: '2-digit', + }).format(new Date(value)) +} + +function CaseDetails({ item }: { item: MaintenanceCase }) { + const showComment = !isRedundantMalfunctionComment( + item.malfunctions, + item.comment, + ) + + return ( +
+
+ {item.malfunctions.map((malfunction) => ( + {deviceMalfunctionLabels[malfunction]} + ))} +
+ + {showComment && ( +
+ Комментарий +

{item.comment}

+
+ )} + +
+ Обнаружено: {formatDate(item.detectedAt)} + {item.serviceStartedAt && ( + Передано в сервис: {formatDate(item.serviceStartedAt)} + )} + {item.closedAt && ( + Возвращено: {formatDate(item.closedAt)} + )} +
+ +
+ +
+
+ ) +} + +export function DeviceMaintenanceHistoryModal({ + open, + device, + onOpenChange, +}: DeviceMaintenanceHistoryModalProps) { + const { data, loading, error } = useQuery< + GetPhoneMaintenanceHistoryData, + GetPhoneMaintenanceHistoryVariables + >(GET_PHONE_MAINTENANCE_HISTORY_QUERY, { + variables: { phoneId: String(device.id) }, + skip: !open, + fetchPolicy: 'network-only', + }) + + const history = useMemo( + () => [...(data?.getPhoneMaintenanceHistory ?? [])] + .sort((a, b) => b.detectedAt - a.detectedAt), + [data], + ) + const activeCase = history.find((item) => item.status !== 'Closed') ?? null + + return ( + + +
+
+ Журнал обслуживания + + {device.factoryNumber} · ID {device.id} + +
+ + + + +
+ + +
+ {loading && history.length === 0 ? ( +
+ Загружаем журнал... +
+ ) : error ? ( +
+ Не удалось загрузить журнал обслуживания. +
+ ) : history.length > 0 ? ( + + {history.map((item) => ( + + + + + {maintenanceStatusLabels[item.status]} + {formatDate(item.detectedAt)} + + + + + + + + + ))} + + ) : ( +
+ История обслуживания пока пуста. +
+ )} +
+
+ +
+ + + +
+
+
+ ) +} diff --git a/mdm-front/src/pages/DevicePage/components/DeviceMaintenanceMetrics/DeviceMaintenanceMetrics.scss b/mdm-front/src/pages/DevicePage/components/DeviceMaintenanceMetrics/DeviceMaintenanceMetrics.scss new file mode 100644 index 0000000..1a6a427 --- /dev/null +++ b/mdm-front/src/pages/DevicePage/components/DeviceMaintenanceMetrics/DeviceMaintenanceMetrics.scss @@ -0,0 +1,42 @@ +@use '../../../../shared/styles/variables' as *; + +.device-maintenance-metrics { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 7px; +} + +.device-maintenance-metric { + min-width: 0; + display: grid; + grid-template-columns: 22px minmax(0, 1fr) auto; + align-items: center; + gap: 7px; + padding: 9px; + border-radius: 10px; + background: $color-surface; + color: $color-text-muted; + font-size: $font-size-12; + + svg { + color: $color-primary; + } + + span { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + b { + color: $color-text-strong; + font-weight: 650; + } +} + +@media (max-width: 760px) { + .device-maintenance-metrics { + grid-template-columns: 1fr; + } +} diff --git a/mdm-front/src/pages/DevicePage/components/DeviceMaintenanceMetrics/DeviceMaintenanceMetrics.tsx b/mdm-front/src/pages/DevicePage/components/DeviceMaintenanceMetrics/DeviceMaintenanceMetrics.tsx new file mode 100644 index 0000000..f412950 --- /dev/null +++ b/mdm-front/src/pages/DevicePage/components/DeviceMaintenanceMetrics/DeviceMaintenanceMetrics.tsx @@ -0,0 +1,82 @@ +import { + BatteryMedium, + Clock3, + Hammer, + RotateCcw, + Thermometer, +} from 'lucide-react' + +import './DeviceMaintenanceMetrics.scss' + +export type DeviceMaintenanceMetricsValue = { + hits: number + overheats: number + batteryCycles: number + worktime: number + batteryCapacity?: number | null +} + +type DeviceMaintenanceMetricsProps = { + metrics: DeviceMaintenanceMetricsValue +} + +function formatWorktime(value: number) { + if (!Number.isFinite(value)) return '-' + + const hours = value / 1000 / 60 / 60 + + if (hours < 1) { + return `${Math.round(value / 1000 / 60).toLocaleString('ru-RU')} мин` + } + + return `${(Math.round(hours * 10) / 10).toLocaleString('ru-RU')} ч` +} + +function formatMetric(value?: number | null, suffix = '') { + if (value === null || value === undefined) return '-' + return `${value.toLocaleString('ru-RU')}${suffix}` +} + +export function DeviceMaintenanceMetrics({ + metrics, +}: DeviceMaintenanceMetricsProps) { + const items = [ + { + label: 'Удары', + value: formatMetric(metrics.hits), + icon: , + }, + { + label: 'Перегревы', + value: formatMetric(metrics.overheats), + icon: , + }, + { + label: 'Циклы зарядки', + value: formatMetric(metrics.batteryCycles), + icon: , + }, + { + label: 'Время работы', + value: formatWorktime(metrics.worktime), + icon: , + }, + { + label: 'Ёмкость АКБ', + value: formatMetric(metrics.batteryCapacity, '%'), + icon: , + }, + ] + + return ( +
+ {items.map((item) => ( +
+ {item.icon} + {item.label} + {item.value} +
+ ))} +
+ ) +} diff --git a/mdm-front/src/pages/DevicePage/components/DeviceMaintenanceModal/DeviceMaintenanceModal.scss b/mdm-front/src/pages/DevicePage/components/DeviceMaintenanceModal/DeviceMaintenanceModal.scss new file mode 100644 index 0000000..5f23d92 --- /dev/null +++ b/mdm-front/src/pages/DevicePage/components/DeviceMaintenanceModal/DeviceMaintenanceModal.scss @@ -0,0 +1,421 @@ +@use '../../../../shared/styles/variables' as *; + +.device-maintenance-modal__overlay { + position: fixed; + inset: 0; + z-index: 500; + background: $color-backdrop; + backdrop-filter: blur(3px); +} + +.device-maintenance-modal { + position: fixed; + z-index: 510; + top: 50%; + left: 50%; + width: min(860px, calc(100vw - 32px)); + max-height: calc(100vh - 32px); + display: flex; + flex-direction: column; + overflow: hidden; + border-radius: 24px; + background: $color-surface; + box-shadow: $shadow-modal; +} + +.device-maintenance-modal__header { + flex: 0 0 auto; + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 20px; + padding: 22px 24px 18px; + border-bottom: 1px solid $color-border-muted; + + h2 { + margin: 0; + color: $color-text-strong; + font-size: $font-size-24; + font-weight: 650; + } + + p { + margin: 5px 0 0; + color: $color-text-muted; + font-size: $font-size-14; + } +} + +.device-maintenance-modal__close { + flex: 0 0 auto; + width: 38px; + height: 38px; + display: inline-flex; + align-items: center; + justify-content: center; + border: 0; + border-radius: 11px; + background: $color-bg; + color: $color-text-muted; + cursor: pointer; + transition: 0.2s ease; + + &:hover { + background: $color-surface-hover; + color: $color-primary; + } + + &:disabled { + opacity: 0.5; + cursor: default; + } +} + +.device-maintenance-modal__scroll { + flex: 1 1 auto; + min-height: 0; + max-height: calc(100vh - 190px); +} + +.device-maintenance-modal__body { + display: flex; + flex-direction: column; + gap: 16px; + padding: 20px 24px 24px; +} + +.device-maintenance-summary { + display: grid; + grid-template-columns: 44px minmax(170px, auto) minmax(0, 1fr); + align-items: center; + gap: 14px; + padding: 15px; + border-radius: 16px; + background: $color-surface-muted; +} + +.device-maintenance-summary__icon { + width: 42px; + height: 42px; + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 13px; + background: $color-bg; + color: $color-text-muted; + + &.is-success { + background: $color-success-bg; + color: $color-success; + } + + &.is-danger { + background: $color-danger-bg; + color: $color-danger; + } + + &.is-service { + background: $color-primary-muted; + color: $color-primary; + } +} + +.device-maintenance-summary__field { + min-width: 0; + display: flex; + flex-direction: column; + gap: 8px; + line-height: 1; + + > span { + color: $color-text-muted; + font-size: $font-size-12; + font-weight: 500; + } + + strong { + color: $color-text-strong; + font-size: $font-size-17; + } + + p { + margin: 0; + overflow-wrap: anywhere; + color: $color-text; + font-size: $font-size-13; + line-height: 1.4; + } +} + +.device-maintenance-summary__comment { + align-self: stretch; + justify-content: center; + padding-left: 16px; + border-left: 1px solid $color-border-muted; +} + +.device-maintenance-section { + padding: 16px; + border: 1px solid $color-border-muted; + border-radius: 18px; + background: $color-surface; +} + +.device-maintenance-section__heading { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 16px; + margin-bottom: 14px; + + h3 { + margin: 0; + color: $color-text-strong; + font-size: $font-size-16; + font-weight: 650; + } + + p { + margin: 0; + color: $color-text-muted; + font-size: $font-size-13; + } + + > svg { + color: $color-text-muted; + } +} + +.device-maintenance-current-malfunctions { + display: flex; + flex-wrap: wrap; + gap: 6px; + + span { + border-radius: 12px; + background: $color-danger-bg; + padding: 4px 10px; + color: $color-danger; + font-size: $font-size-12; + font-weight: 600; + } +} + +.device-maintenance-metrics-message { + margin: 0; + color: $color-text-muted; + font-size: $font-size-13; + + &.is-error { + color: $color-danger; + } +} + +.device-maintenance-options { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 8px; +} + +.device-maintenance-option { + min-width: 0; + display: grid; + grid-template-columns: 22px minmax(0, 1fr); + align-items: flex-start; + gap: 10px; + padding: 11px; + border: 1px solid $color-border-muted; + border-radius: 13px; + background: $color-surface-muted; + color: $color-text; + text-align: left; + cursor: pointer; + transition: 0.18s ease; + + &:hover { + border-color: $color-border-accent; + background: $color-surface-hover; + } + + &.is-selected { + border-color: $color-primary; + background: $color-primary-tint-soft; + } + + &:disabled { + opacity: 0.65; + cursor: default; + } + + > span:last-child { + min-width: 0; + display: flex; + flex-direction: column; + gap: 3px; + } + + b { + color: $color-text-strong; + font-size: $font-size-14; + font-weight: 600; + } + + small { + color: $color-text-muted; + font-size: $font-size-12; + line-height: 1.35; + } +} + +.device-maintenance-option__check { + width: 20px; + height: 20px; + display: inline-flex; + align-items: center; + justify-content: center; + border: 1px solid $color-border-strong; + border-radius: 7px; + background: $color-surface; + color: $color-text-inverse; + + .is-selected & { + border-color: $color-primary; + background: $color-primary; + } +} + +.device-maintenance-comment { + display: flex; + flex-direction: column; + gap: 7px; + margin-top: 12px; + + > span { + color: $color-text-strong; + font-size: $font-size-13; + font-weight: 600; + + b { + color: $color-danger; + font-weight: 600; + } + } + + textarea { + min-height: 78px; + resize: vertical; + border: 1px solid $color-border-strong; + border-radius: 13px; + background: $color-surface-muted; + padding: 11px 13px; + outline: none; + color: $color-text-strong; + font: inherit; + font-size: $font-size-14; + transition: 0.18s ease; + + &:focus { + border-color: $color-primary; + box-shadow: 0 0 0 3px $color-primary-focus; + } + + &::placeholder { + color: $color-text-soft; + } + } +} + +.device-maintenance-modal__footer { + position: relative; + z-index: 2; + flex: 0 0 auto; + min-height: 72px; + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 14px 24px; + border-top: 1px solid $color-border-muted; + background: $color-surface; +} + +.device-maintenance-modal__actions { + display: flex; + align-items: center; + justify-content: flex-end; + flex-wrap: wrap; + gap: 9px; +} + +.device-maintenance-action { + min-height: 42px; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + border: 0; + border-radius: 12px; + background: $color-bg; + padding: 0 16px; + color: $color-text-strong; + font-size: $font-size-14; + font-weight: 600; + white-space: nowrap; + cursor: pointer; + transition: 0.18s ease; + + &:hover:not(:disabled) { + background: $color-surface-hover; + //color: $color-primary; + } + + &.is-primary { + background: $color-primary; + color: $color-text-inverse; + + &:hover:not(:disabled) { + background: $color-primary-hover; + color: $color-text-inverse; + } + } + + &:disabled { + opacity: 0.5; + cursor: default; + } +} + +.device-maintenance-action--history { + flex: 0 0 auto; +} + +@media (max-width: 760px) { + .device-maintenance-summary { + grid-template-columns: 44px minmax(0, 1fr); + } + + .device-maintenance-summary__comment { + grid-column: 1 / -1; + padding: 12px 0 0; + border-top: 1px solid $color-border-muted; + border-left: 0; + } + + .device-maintenance-options { + grid-template-columns: 1fr; + } + + .device-maintenance-modal__footer { + align-items: stretch; + flex-direction: column; + } + + .device-maintenance-modal__actions, + .device-maintenance-action--history { + width: 100%; + } + + .device-maintenance-action { + flex: 1; + } +} diff --git a/mdm-front/src/pages/DevicePage/components/DeviceMaintenanceModal/DeviceMaintenanceModal.tsx b/mdm-front/src/pages/DevicePage/components/DeviceMaintenanceModal/DeviceMaintenanceModal.tsx new file mode 100644 index 0000000..200bd74 --- /dev/null +++ b/mdm-front/src/pages/DevicePage/components/DeviceMaintenanceModal/DeviceMaintenanceModal.tsx @@ -0,0 +1,525 @@ +import { + useEffect, + useRef, + useState, + type ReactNode, +} from 'react' +import * as Dialog from '@radix-ui/react-dialog' +import { useMutation, useQuery } from '@apollo/client/react' +import SimpleBar from 'simplebar-react' +import { Check, CircleAlert, History, Wrench, X } from 'lucide-react' + +import { + GET_ACTIVE_PHONE_MAINTENANCE_CASE_QUERY, + MARK_PHONE_HEALTHY_MUTATION, + RETURN_PHONE_FROM_MAINTENANCE_MUTATION, + SEND_PHONE_TO_MAINTENANCE_MUTATION, + SET_PHONE_MAINTENANCE_REQUIRED_MUTATION, +} from '../../../../entities/device/api/device.graphql' +import { + deviceMalfunctionLabels, + isRedundantMalfunctionComment, +} from '../../../../entities/device/lib/maintenance' +import type { + DeviceMalfunction, + GetActivePhoneMaintenanceCaseData, + GetActivePhoneMaintenanceCaseVariables, + MarkPhoneHealthyData, + MarkPhoneHealthyVariables, + ReturnPhoneFromMaintenanceData, + ReturnPhoneFromMaintenanceVariables, + SendPhoneToMaintenanceData, + SendPhoneToMaintenanceVariables, + SetPhoneMaintenanceRequiredData, + SetPhoneMaintenanceRequiredVariables, +} from '../../../../entities/device/model/types' +import { MotionDialogContent } from '../../../../shared/ui/MotionDialog/MotionDialog' +import { + Notification, + type NotificationVariant, +} from '../../../../widgets/Notification/Notification' +import type { Device } from '../../types' +import { conditionText, getStatusClass } from '../../types' +import { DeviceMaintenanceMetrics } from '../DeviceMaintenanceMetrics/DeviceMaintenanceMetrics' + +import './DeviceMaintenanceModal.scss' + +export type DeviceMaintenanceMode = 'view' | 'manage' + +type DeviceMaintenanceModalProps = { + open: boolean + mode: DeviceMaintenanceMode + device: Device + onOpenChange: (open: boolean) => void + onOpenHistory: () => void + onUpdated: () => Promise | unknown +} + +type NotificationState = { + variant: NotificationVariant + title: string + description?: string +} + +const malfunctionOptions: Array<{ + value: DeviceMalfunction + description: string +}> = [ + { + value: 'LowBatteryCapacity', + description: 'Остаточная ёмкость аккумулятора ниже допустимой.', + }, + { + value: 'CriticalHits', + description: 'Количество зафиксированных ударов достигло лимита.', + }, + { + value: 'CriticalChargeCycles', + description: 'Количество циклов зарядки достигло лимита.', + }, + { + value: 'DoesNotTurnOn', + description: 'Устройство не загружается или не реагирует на включение.', + }, + { + value: 'Other', + description: 'Неисправность не относится к перечисленным категориям.', + }, +] + +function getErrorMessage(error: unknown) { + return error instanceof Error ? error.message : 'Не удалось выполнить действие.' +} + +function ActionButton({ + children, + className = '', + disabled, + onClick, +}: { + children: ReactNode + className?: string + disabled?: boolean + onClick: () => void +}) { + return ( + + ) +} + +export function DeviceMaintenanceModal({ + open, + mode, + device, + onOpenChange, + onOpenHistory, + onUpdated, +}: DeviceMaintenanceModalProps) { + const [selectedMalfunctions, setSelectedMalfunctions] = useState([]) + const [comment, setComment] = useState('') + const [notification, setNotification] = useState(null) + const [activeAction, setActiveAction] = useState(null) + const initializedDraftKey = useRef('') + + const { + data: activeCaseData, + loading: isActiveCaseLoading, + error: activeCaseError, + refetch: refetchActiveCase, + } = useQuery< + GetActivePhoneMaintenanceCaseData, + GetActivePhoneMaintenanceCaseVariables + >(GET_ACTIVE_PHONE_MAINTENANCE_CASE_QUERY, { + variables: { phoneId: String(device.id) }, + skip: !open, + fetchPolicy: 'cache-and-network', + }) + + const [setMaintenanceRequired] = useMutation< + SetPhoneMaintenanceRequiredData, + SetPhoneMaintenanceRequiredVariables + >(SET_PHONE_MAINTENANCE_REQUIRED_MUTATION) + const [markPhoneHealthy] = useMutation< + MarkPhoneHealthyData, + MarkPhoneHealthyVariables + >(MARK_PHONE_HEALTHY_MUTATION) + const [sendPhoneToMaintenance] = useMutation< + SendPhoneToMaintenanceData, + SendPhoneToMaintenanceVariables + >(SEND_PHONE_TO_MAINTENANCE_MUTATION) + const [returnPhoneFromMaintenance] = useMutation< + ReturnPhoneFromMaintenanceData, + ReturnPhoneFromMaintenanceVariables + >(RETURN_PHONE_FROM_MAINTENANCE_MUTATION) + + const isManageMode = mode === 'manage' + const isBusy = activeAction !== null + const isOtherSelected = selectedMalfunctions.includes('Other') + const isDraftValid = + selectedMalfunctions.length > 0 && (!isOtherSelected || comment.trim().length > 0) + const visibleComment = isRedundantMalfunctionComment( + device.malfunctions, + device.malfunctionComment, + ) + ? '' + : device.malfunctionComment?.trim() ?? '' + const activeMaintenanceCase = + activeCaseData?.getActivePhoneMaintenanceCase ?? null + + useEffect(() => { + if (!open) { + initializedDraftKey.current = '' + return + } + + const draftKey = `${device.id}:${device.technicalStatus}` + if (initializedDraftKey.current === draftKey) return + + initializedDraftKey.current = draftKey + setSelectedMalfunctions(device.malfunctions) + setComment(device.malfunctionComment ?? '') + }, [ + device.id, + device.malfunctionComment, + device.malfunctions, + device.technicalStatus, + open, + ]) + + function toggleMalfunction(value: DeviceMalfunction) { + setSelectedMalfunctions((current) => + current.includes(value) + ? current.filter((item) => item !== value) + : [...current, value], + ) + } + + async function runAction( + action: string, + title: string, + callback: () => Promise, + ) { + setActiveAction(action) + + try { + await callback() + await Promise.all([ + Promise.resolve(onUpdated()), + refetchActiveCase(), + ]) + setNotification({ variant: 'success', title }) + } catch (actionError) { + setNotification({ + variant: 'error', + title: 'Не удалось изменить состояние устройства', + description: getErrorMessage(actionError), + }) + } finally { + setActiveAction(null) + } + } + + function saveMaintenanceRequired() { + if (!isDraftValid) return + + void runAction('save', 'Неисправность сохранена', () => + setMaintenanceRequired({ + variables: { + id: String(device.id), + malfunctions: selectedMalfunctions, + comment: comment.trim() || null, + }, + }), + ) + } + + function setHealthy() { + void runAction('healthy', 'Устройство признано исправным', () => + markPhoneHealthy({ variables: { id: String(device.id) } }), + ) + } + + function sendToMaintenance() { + if (!isDraftValid) return + + void runAction('service', 'Устройство отправлено на обслуживание', () => + sendPhoneToMaintenance({ + variables: { + id: String(device.id), + malfunctions: selectedMalfunctions, + comment: comment.trim() || null, + }, + }), + ) + } + + function returnToService() { + void runAction('return', 'Устройство возвращено в эксплуатацию', () => + returnPhoneFromMaintenance({ variables: { id: String(device.id) } }), + ) + } + + return ( + <> + + +
+
+ Техническое состояние + + {device.factoryNumber} · ID {device.id} + +
+ + + + +
+ + +
+
+
+ {device.condition === 'ok' ? : } +
+ +
+ Текущее состояние + {conditionText[device.condition]} +
+ + {visibleComment && ( +
+ Комментарий +

{visibleComment}

+
+ )} +
+ + {device.technicalStatus !== 'Healthy' && ( +
+
+
+

+ {device.technicalStatus === 'InService' + ? 'Показатели при отправке' + : 'Показатели устройства'} +

+

+ {device.technicalStatus === 'InService' + ? 'Снимок устройства при передаче на обслуживание.' + : 'Текущие показатели для открытого случая.'} +

+
+
+ + {activeMaintenanceCase ? ( + + ) : ( +

+ {isActiveCaseLoading + ? 'Загружаем показатели...' + : activeCaseError + ? 'Не удалось загрузить показатели.' + : 'Показатели не зафиксированы.'} +

+ )} +
+ )} + + {!isManageMode && device.malfunctions.length > 0 && ( +
+
+
+

Неисправности

+

Неисправности, закреплённые за текущим состоянием.

+
+
+ +
+ {device.malfunctions.map((malfunction) => ( + + {deviceMalfunctionLabels[malfunction]} + + ))} +
+
+ )} + + {isManageMode && device.technicalStatus !== 'InService' && ( +
+
+
+

Неисправности

+

Укажите одну или несколько обнаруженных неисправностей.

+
+ +
+ +
+ {malfunctionOptions.map((option) => { + const isSelected = selectedMalfunctions.includes(option.value) + + return ( + + ) + })} +
+ +