From acbf46df3f00e7ffe7983ea0673cf2a15dff8176 Mon Sep 17 00:00:00 2001 From: Pujit Mehrotra Date: Mon, 17 Mar 2025 10:26:07 -0400 Subject: [PATCH] feat: connect settings web component (#1211) Replaces the Connect Settings form at Settings > Management Access with a webcomponent containing a generated form. CodeRabbit: - **New Features** - Enhanced connection settings with an updated UI, including a new custom element ``. - Introduced several new form components (e.g., `NumberField`, `StringArrayField`, `Select`, `Switch`, `PreconditionsLabel`, `ControlLayout`, and `VerticalLayout`) for a more dynamic experience. - Added a notification system with the `Toaster` component for user feedback. - New GraphQL operations for managing connection settings and API updates. - **Chores** - Upgraded multiple backend and frontend dependencies and refined configuration files. - **Tests** - Expanded test coverage for CSV conversion, form settings merging, and the new `csvStringToArray` function. - **Documentation** - Added introductory documentation for form components and a readme for the forms directory. --- api/.env.production | 4 + api/.eslintrc.ts | 1 + api/package.json | 19 +- api/src/__test__/json-forms.test.ts | 180 +++ api/src/__test__/utils.test.ts | 36 +- api/src/graphql/generated/api/operations.ts | 36 +- api/src/graphql/generated/api/types.ts | 76 +- .../schema/types/connect/connect.graphql | 69 ++ api/src/unraid-api/auth/user.decorator.ts | 2 +- .../graph/connect/connect-settings.service.ts | 331 +++++ .../graph/connect/connect.resolver.spec.ts | 22 - .../graph/connect/connect.resolver.ts | 40 +- api/src/unraid-api/graph/graph.module.ts | 10 +- .../graph/resolvers/resolvers.module.ts | 2 + api/src/unraid-api/main.ts | 2 +- api/src/unraid-api/types/json-forms.ts | 64 + .../downloaded/.login.php.last-download-time | 2 +- .../DefaultPageLayout.php.last-download-time | 2 +- .../Notifications.page.last-download-time | 2 +- .../auth-request.php.last-download-time | 2 +- api/src/utils.ts | 27 + .../plugins/dynamix.my.servers/Connect.page | 170 +-- pnpm-lock.yaml | 1094 ++++++++++++----- unraid-ui/package.json | 7 +- .../src/components/brand/BrandButton.vue | 14 +- .../components/brand/brand-button.variants.ts | 8 +- .../components/form/number/NumberField.vue | 23 + .../form/number/NumberFieldContent.vue | 22 + .../form/number/NumberFieldDecrement.vue | 34 + .../form/number/NumberFieldIncrement.vue | 34 + .../form/number/NumberFieldInput.vue | 21 + unraid-ui/src/components/form/number/index.ts | 5 + unraid-ui/src/forms/ControlLayout.vue | 33 + unraid-ui/src/forms/NumberField.vue | 56 + unraid-ui/src/forms/PreconditionsLabel.vue | 45 + unraid-ui/src/forms/Select.vue | 65 + unraid-ui/src/forms/StringArrayField.vue | 72 ++ unraid-ui/src/forms/Switch.vue | 28 + unraid-ui/src/forms/VerticalLayout.vue | 44 + unraid-ui/src/forms/jsonforms.d.ts | 7 + unraid-ui/src/forms/readme.md | 3 + unraid-ui/src/forms/renderer-entries.ts | 50 + unraid-ui/src/forms/renderers.ts | 24 + .../src/forms/vertical-layout.renderer.ts | 8 + unraid-ui/src/index.ts | 2 + unraid-ui/src/theme/preset.ts | 3 + unraid-ui/tsconfig.json | 1 + web/.env.production | 2 +- web/codegen.ts | 2 +- .../ConnectSettings/AllowedOrigins.vue | 16 +- .../ConnectSettings/ConnectSettings.ce.vue | 136 +- .../ConnectSettings/graphql/settings.query.ts | 33 + web/composables/gql/gql.ts | 12 + web/composables/gql/graphql.ts | 61 +- web/eslint.config.mjs | 1 + web/nuxt.config.ts | 16 +- web/package.json | 8 +- web/pages/index.vue | 3 +- web/pages/webComponents.vue | 2 + web/scripts/deploy-dev.sh | 8 +- web/tailwind.config.ts | 3 +- 61 files changed, 2531 insertions(+), 574 deletions(-) create mode 100644 api/.env.production create mode 100644 api/src/__test__/json-forms.test.ts create mode 100644 api/src/unraid-api/graph/connect/connect-settings.service.ts delete mode 100644 api/src/unraid-api/graph/connect/connect.resolver.spec.ts create mode 100644 api/src/unraid-api/types/json-forms.ts create mode 100644 unraid-ui/src/components/form/number/NumberField.vue create mode 100644 unraid-ui/src/components/form/number/NumberFieldContent.vue create mode 100644 unraid-ui/src/components/form/number/NumberFieldDecrement.vue create mode 100644 unraid-ui/src/components/form/number/NumberFieldIncrement.vue create mode 100644 unraid-ui/src/components/form/number/NumberFieldInput.vue create mode 100644 unraid-ui/src/components/form/number/index.ts create mode 100644 unraid-ui/src/forms/ControlLayout.vue create mode 100644 unraid-ui/src/forms/NumberField.vue create mode 100644 unraid-ui/src/forms/PreconditionsLabel.vue create mode 100644 unraid-ui/src/forms/Select.vue create mode 100644 unraid-ui/src/forms/StringArrayField.vue create mode 100644 unraid-ui/src/forms/Switch.vue create mode 100644 unraid-ui/src/forms/VerticalLayout.vue create mode 100644 unraid-ui/src/forms/jsonforms.d.ts create mode 100644 unraid-ui/src/forms/readme.md create mode 100644 unraid-ui/src/forms/renderer-entries.ts create mode 100644 unraid-ui/src/forms/renderers.ts create mode 100644 unraid-ui/src/forms/vertical-layout.renderer.ts create mode 100644 web/components/ConnectSettings/graphql/settings.query.ts diff --git a/api/.env.production b/api/.env.production new file mode 100644 index 000000000..e6c6ac72e --- /dev/null +++ b/api/.env.production @@ -0,0 +1,4 @@ +ENVIRONMENT="production" +NODE_ENV="production" +PORT="/var/run/unraid-api.sock" +MOTHERSHIP_GRAPHQL_LINK="https://mothership.unraid.net/ws" diff --git a/api/.eslintrc.ts b/api/.eslintrc.ts index 881f777bb..6f224624d 100644 --- a/api/.eslintrc.ts +++ b/api/.eslintrc.ts @@ -50,6 +50,7 @@ export default tseslint.config(eslint.configs.recommended, ...tseslint.configs.r message: 'Use import.meta.url instead of __filename in ESM', }, ], + 'eol-last': ['error', 'always'], }, ignores: ['src/graphql/generated/client/**/*'], diff --git a/api/package.json b/api/package.json index 90f5d68c9..6f2c8f336 100644 --- a/api/package.json +++ b/api/package.json @@ -51,19 +51,20 @@ "@apollo/client": "^3.11.8", "@apollo/server": "^4.11.2", "@as-integrations/fastify": "^2.1.1", - "@fastify/cookie": "^9.4.0", + "@fastify/cookie": "^11.0.2", "@fastify/helmet": "^13.0.1", "@graphql-codegen/client-preset": "^4.5.0", "@graphql-tools/load-files": "^7.0.0", "@graphql-tools/merge": "^9.0.8", "@graphql-tools/schema": "^10.0.7", "@graphql-tools/utils": "^10.5.5", - "@nestjs/apollo": "^12.2.1", - "@nestjs/common": "^10.4.7", - "@nestjs/core": "^10.4.7", - "@nestjs/graphql": "^12.2.1", + "@jsonforms/core": "^3.5.1", + "@nestjs/apollo": "^13.0.3", + "@nestjs/common": "^11.0.11", + "@nestjs/core": "^11.0.11", + "@nestjs/graphql": "^13.0.3", "@nestjs/passport": "^10.0.3", - "@nestjs/platform-fastify": "^10.4.7", + "@nestjs/platform-fastify": "^11.0.11", "@nestjs/schedule": "^5.0.0", "@nestjs/throttler": "^6.2.1", "@reduxjs/toolkit": "^2.3.0", @@ -89,7 +90,7 @@ "dotenv": "^16.4.5", "execa": "^9.5.1", "exit-hook": "^4.0.0", - "fastify": "^4.28.1", + "fastify": "^5.2.1", "filenamify": "^6.0.0", "fs-extra": "^11.2.0", "glob": "^11.0.1", @@ -109,7 +110,7 @@ "lodash-es": "^4.17.21", "multi-ini": "^2.3.2", "mustache": "^4.2.0", - "nest-authz": "^2.11.0", + "nest-authz": "^2.14.0", "nest-commander": "^3.15.0", "nestjs-pino": "^4.1.0", "node-cache": "^5.1.2", @@ -145,7 +146,7 @@ "@graphql-codegen/typescript-resolvers": "4.4.3", "@graphql-typed-document-node/core": "^3.2.0", "@ianvs/prettier-plugin-sort-imports": "^4.4.0", - "@nestjs/testing": "^10.4.7", + "@nestjs/testing": "^11.0.11", "@originjs/vite-plugin-commonjs": "^1.0.3", "@rollup/plugin-node-resolve": "^16.0.0", "@swc/core": "^1.10.1", diff --git a/api/src/__test__/json-forms.test.ts b/api/src/__test__/json-forms.test.ts new file mode 100644 index 000000000..c4a9d8b11 --- /dev/null +++ b/api/src/__test__/json-forms.test.ts @@ -0,0 +1,180 @@ +import type { ControlElement } from '@jsonforms/core'; +import { describe, expect, it } from 'vitest'; + +import type { SettingSlice } from '@app/unraid-api/types/json-forms.js'; +import { createEmptySettingSlice, mergeSettingSlices } from '@app/unraid-api/types/json-forms.js'; + +describe('mergeSettingSlices', () => { + it('returns an empty slice when given an empty array', () => { + const result = mergeSettingSlices([]); + expect(result).toEqual(createEmptySettingSlice()); + }); + + it('returns the same slice when given a single slice', () => { + const slice: SettingSlice = { + properties: { + test: { type: 'string' }, + }, + elements: [{ type: 'Control', scope: '#/properties/test' }], + }; + + const result = mergeSettingSlices([slice]); + expect(result).toEqual(slice); + }); + + it('merges properties and concatenates elements from multiple slices', () => { + const slice1: SettingSlice = { + properties: { + prop1: { type: 'string' }, + }, + elements: [{ type: 'Control', scope: '#/properties/prop1' }], + }; + + const slice2: SettingSlice = { + properties: { + prop2: { type: 'number' }, + }, + elements: [{ type: 'Control', scope: '#/properties/prop2' }], + }; + + const expected: SettingSlice = { + properties: { + prop1: { type: 'string' }, + prop2: { type: 'number' }, + }, + elements: [ + { type: 'Control', scope: '#/properties/prop1' }, + { type: 'Control', scope: '#/properties/prop2' }, + ], + }; + + const result = mergeSettingSlices([slice1, slice2]); + expect(result).toEqual(expected); + }); + + it('handles more complex schema properties and UI elements', () => { + const slice1: SettingSlice = { + properties: { + name: { + type: 'string', + title: 'Name', + minLength: 3, + }, + }, + elements: [ + { + type: 'Control', + scope: '#/properties/name', + label: 'Full Name', + } as ControlElement, + ], + }; + + const slice2: SettingSlice = { + properties: { + age: { + type: 'number', + title: 'Age', + minimum: 0, + maximum: 120, + }, + }, + elements: [ + { + type: 'Control', + scope: '#/properties/age', + label: 'Your Age', + } as ControlElement, + ], + }; + + const slice3: SettingSlice = { + properties: { + active: { + type: 'boolean', + title: 'Active Status', + default: true, + }, + }, + elements: [ + { + type: 'Control', + scope: '#/properties/active', + label: 'Is Active', + options: { + toggle: true, + }, + } as ControlElement, + ], + }; + + const result = mergeSettingSlices([slice1, slice2, slice3]); + + // Check properties were merged correctly + expect(result.properties).toHaveProperty('name'); + expect(result.properties).toHaveProperty('age'); + expect(result.properties).toHaveProperty('active'); + expect(result.properties.name.type).toBe('string'); + expect(result.properties.age.type).toBe('number'); + expect(result.properties.active.type).toBe('boolean'); + + // Check elements were concatenated in order + expect(result.elements).toHaveLength(3); + expect(result.elements[0]).toEqual(slice1.elements[0]); + expect(result.elements[1]).toEqual(slice2.elements[0]); + expect(result.elements[2]).toEqual(slice3.elements[0]); + }); + + it('later properties override earlier ones with the same key', () => { + const slice1: SettingSlice = { + properties: { + prop: { type: 'string', title: 'Original' }, + }, + elements: [ + { type: 'Control', scope: '#/properties/prop', label: 'First' } as ControlElement, + ], + }; + + const slice2: SettingSlice = { + properties: { + prop: { type: 'number', title: 'Override' }, + }, + elements: [ + { type: 'Control', scope: '#/properties/prop', label: 'Second' } as ControlElement, + ], + }; + + const result = mergeSettingSlices([slice1, slice2]); + + // The property from slice2 should override the one from slice1 + expect(result.properties.prop.type).toBe('number'); + expect(result.properties.prop.title).toBe('Override'); + + // Both elements should be present + expect(result.elements).toHaveLength(2); + expect((result.elements[0] as ControlElement).label).toBe('First'); + expect((result.elements[1] as ControlElement).label).toBe('Second'); + }); + + it('preserves empty properties and elements', () => { + const slice1: SettingSlice = { + properties: {}, + elements: [], + }; + + const slice2: SettingSlice = { + properties: { + prop: { type: 'string' }, + }, + elements: [{ type: 'Control', scope: '#/properties/prop' }], + }; + + const result = mergeSettingSlices([slice1, slice2]); + expect(result.properties).toHaveProperty('prop'); + expect(result.elements).toHaveLength(1); + + const result2 = mergeSettingSlices([slice2, slice1]); + expect(result2.properties).toHaveProperty('prop'); + expect(result2.elements).toHaveLength(1); + }); +}); diff --git a/api/src/__test__/utils.test.ts b/api/src/__test__/utils.test.ts index 0a8d3481f..e09a8c879 100644 --- a/api/src/__test__/utils.test.ts +++ b/api/src/__test__/utils.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { formatDatetime } from '@app/utils.js'; +import { csvStringToArray, formatDatetime } from '@app/utils.js'; describe('formatDatetime', () => { const testDate = new Date('2024-02-14T12:34:56'); @@ -69,3 +69,37 @@ describe('formatDatetime', () => { ); }); }); + +describe('csvStringToArray', () => { + it('returns an empty array for null, undefined, or empty strings', () => { + expect(csvStringToArray(null)).toEqual([]); + expect(csvStringToArray(undefined)).toEqual([]); + expect(csvStringToArray('')).toEqual([]); + }); + + it('returns an array of strings for a CSV string', () => { + expect(csvStringToArray('one,two,three')).toEqual(['one', 'two', 'three']); + }); + + it('returns an array of strings for a CSV string with spaces', () => { + expect(csvStringToArray('one, two, three')).toEqual(['one', 'two', 'three']); + }); + + it('handles single element edge cases', () => { + expect(csvStringToArray('one', { noEmpty: false })).toEqual(['one']); + expect(csvStringToArray('one,', { noEmpty: false })).toEqual(['one', '']); + expect(csvStringToArray(',one', { noEmpty: false })).toEqual(['', 'one']); + expect(csvStringToArray(',one,', { noEmpty: false })).toEqual(['', 'one', '']); + }); + + it('handles non-empty option', () => { + expect(csvStringToArray('one', { noEmpty: true })).toEqual(['one']); + expect(csvStringToArray('one,', { noEmpty: true })).toEqual(['one']); + expect(csvStringToArray(',one', { noEmpty: true })).toEqual(['one']); + expect(csvStringToArray(',one,', { noEmpty: true })).toEqual(['one']); + }); + + it('defaults to noEmpty', () => { + expect(csvStringToArray(',one,')).toEqual(['one']); + }); +}); diff --git a/api/src/graphql/generated/api/operations.ts b/api/src/graphql/generated/api/operations.ts index bb5d20ffc..be37febd1 100755 --- a/api/src/graphql/generated/api/operations.ts +++ b/api/src/graphql/generated/api/operations.ts @@ -2,7 +2,7 @@ import * as Types from '@app/graphql/generated/api/types.js'; import { z } from 'zod' -import { AccessUrl, AccessUrlInput, AddPermissionInput, AddRoleForApiKeyInput, AddRoleForUserInput, AllowedOriginInput, ApiKey, ApiKeyResponse, ApiKeyWithSecret, ArrayType, ArrayCapacity, ArrayDisk, ArrayDiskFsColor, ArrayDiskStatus, ArrayDiskType, ArrayPendingState, ArrayState, Baseboard, Capacity, Case, Cloud, CloudResponse, Config, ConfigErrorState, Connect, ConnectSignInInput, ConnectUserInfoInput, ContainerHostConfig, ContainerMount, ContainerPort, ContainerPortType, ContainerState, CreateApiKeyInput, Devices, Disk, DiskFsType, DiskInterfaceType, DiskPartition, DiskSmartStatus, Display, Docker, DockerContainer, DockerNetwork, DynamicRemoteAccessStatus, DynamicRemoteAccessType, EnableDynamicRemoteAccessInput, Flash, Gpu, Importance, Info, InfoApps, InfoCpu, InfoMemory, KeyFile, Me, MemoryFormFactor, MemoryLayout, MemoryType, MinigraphStatus, MinigraphqlResponse, Mount, Network, Node, Notification, NotificationCounts, NotificationData, NotificationFilter, NotificationOverview, NotificationType, Notifications, NotificationslistArgs, Os, Owner, ParityCheck, Partition, Pci, Permission, ProfileModel, Registration, RegistrationState, RelayResponse, RemoteAccess, RemoveRoleFromApiKeyInput, Resource, Role, Server, ServerStatus, Service, SetupRemoteAccessInput, Share, System, Temperature, Theme, URL_TYPE, UnassignedDevice, Uptime, Usb, User, UserAccount, Vars, Versions, VmDomain, VmState, Vms, WAN_ACCESS_TYPE, WAN_FORWARD_TYPE, Welcome, addUserInput, arrayDiskInput, deleteUserInput, mdState, registrationType, usersInput } from '@app/graphql/generated/api/types.js' +import { AccessUrl, AccessUrlInput, AddPermissionInput, AddRoleForApiKeyInput, AddRoleForUserInput, AllowedOriginInput, ApiKey, ApiKeyResponse, ApiKeyWithSecret, ApiSettingsInput, ArrayType, ArrayCapacity, ArrayDisk, ArrayDiskFsColor, ArrayDiskStatus, ArrayDiskType, ArrayPendingState, ArrayState, Baseboard, Capacity, Case, Cloud, CloudResponse, Config, ConfigErrorState, Connect, ConnectSettings, ConnectSettingsValues, ConnectSignInInput, ConnectUserInfoInput, ContainerHostConfig, ContainerMount, ContainerPort, ContainerPortType, ContainerState, CreateApiKeyInput, Devices, Disk, DiskFsType, DiskInterfaceType, DiskPartition, DiskSmartStatus, Display, Docker, DockerContainer, DockerNetwork, DynamicRemoteAccessStatus, DynamicRemoteAccessType, EnableDynamicRemoteAccessInput, Flash, Gpu, Importance, Info, InfoApps, InfoCpu, InfoMemory, KeyFile, Me, MemoryFormFactor, MemoryLayout, MemoryType, MinigraphStatus, MinigraphqlResponse, Mount, Network, Node, Notification, NotificationCounts, NotificationData, NotificationFilter, NotificationOverview, NotificationType, Notifications, NotificationslistArgs, Os, Owner, ParityCheck, Partition, Pci, Permission, ProfileModel, Registration, RegistrationState, RelayResponse, RemoteAccess, RemoveRoleFromApiKeyInput, Resource, Role, Server, ServerStatus, Service, SetupRemoteAccessInput, Share, System, Temperature, Theme, URL_TYPE, UnassignedDevice, Uptime, Usb, User, UserAccount, Vars, Versions, VmDomain, VmState, Vms, WAN_ACCESS_TYPE, WAN_FORWARD_TYPE, Welcome, addUserInput, arrayDiskInput, deleteUserInput, mdState, registrationType, usersInput } from '@app/graphql/generated/api/types.js' import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; type Properties = Required<{ @@ -152,6 +152,16 @@ export function ApiKeyWithSecretSchema(): z.ZodObject> { + return z.object({ + accessType: WAN_ACCESS_TYPESchema.nullish(), + extraOrigins: z.array(z.string()).nullish(), + forwardType: WAN_FORWARD_TYPESchema.nullish(), + port: z.number().nullish(), + sandbox: z.boolean().nullish() + }) +} + export function ArrayTypeSchema(): z.ZodObject> { return z.object({ __typename: z.literal('Array').optional(), @@ -267,7 +277,29 @@ export function ConnectSchema(): z.ZodObject> { return z.object({ __typename: z.literal('Connect').optional(), dynamicRemoteAccess: DynamicRemoteAccessStatusSchema(), - id: z.string() + id: z.string(), + settings: ConnectSettingsSchema() + }) +} + +export function ConnectSettingsSchema(): z.ZodObject> { + return z.object({ + __typename: z.literal('ConnectSettings').optional(), + dataSchema: z.record(z.string(), z.any()), + id: z.string(), + uiSchema: z.record(z.string(), z.any()), + values: ConnectSettingsValuesSchema() + }) +} + +export function ConnectSettingsValuesSchema(): z.ZodObject> { + return z.object({ + __typename: z.literal('ConnectSettingsValues').optional(), + accessType: WAN_ACCESS_TYPESchema, + extraOrigins: z.array(z.string()), + forwardType: WAN_FORWARD_TYPESchema.nullish(), + port: z.number().nullish(), + sandbox: z.boolean() }) } diff --git a/api/src/graphql/generated/api/types.ts b/api/src/graphql/generated/api/types.ts index 695a0377a..c011a6b06 100644 --- a/api/src/graphql/generated/api/types.ts +++ b/api/src/graphql/generated/api/types.ts @@ -86,6 +86,26 @@ export type ApiKeyWithSecret = { roles: Array; }; +/** + * Input should be a subset of ApiSettings that can be updated. + * Some field combinations may be required or disallowed. Please refer to each field for more information. + */ +export type ApiSettingsInput = { + /** The type of WAN access to use for Remote Access. */ + accessType?: InputMaybe; + /** A list of origins allowed to interact with the API. */ + extraOrigins?: InputMaybe>; + /** The type of port forwarding to use for Remote Access. */ + forwardType?: InputMaybe; + /** The port to use for Remote Access. */ + port?: InputMaybe; + /** + * If true, the GraphQL sandbox will be enabled and available at /graphql. + * If false, the GraphQL sandbox will be disabled and only the production API will be available. + */ + sandbox?: InputMaybe; +}; + export type ArrayType = Node & { __typename?: 'Array'; /** Current boot disk */ @@ -296,6 +316,25 @@ export type Connect = Node & { __typename?: 'Connect'; dynamicRemoteAccess: DynamicRemoteAccessStatus; id: Scalars['ID']['output']; + settings: ConnectSettings; +}; + +export type ConnectSettings = Node & { + __typename?: 'ConnectSettings'; + dataSchema: Scalars['JSON']['output']; + id: Scalars['ID']['output']; + uiSchema: Scalars['JSON']['output']; + values: ConnectSettingsValues; +}; + +/** Intersection type of ApiSettings and RemoteAccess */ +export type ConnectSettingsValues = { + __typename?: 'ConnectSettingsValues'; + accessType: WAN_ACCESS_TYPE; + extraOrigins: Array; + forwardType?: Maybe; + port?: Maybe; + sandbox: Scalars['Boolean']['output']; }; export type ConnectSignInInput = { @@ -705,6 +744,7 @@ export type Mutation = { unmountArrayDisk?: Maybe; /** Marks a notification as unread. */ unreadNotification: Notification; + updateApiSettings: ConnectSettingsValues; }; @@ -839,6 +879,11 @@ export type MutationunreadNotificationArgs = { id: Scalars['String']['input']; }; + +export type MutationupdateApiSettingsArgs = { + input: ApiSettingsInput; +}; + export type Network = Node & { __typename?: 'Network'; accessUrls?: Maybe>; @@ -1813,7 +1858,7 @@ export type DirectiveResolverFn> = ResolversObject<{ - Node: ( ArrayType ) | ( Config ) | ( Connect ) | ( Docker ) | ( Info ) | ( Network ) | ( Notification ) | ( Notifications ) | ( Service ) | ( Vars ); + Node: ( ArrayType ) | ( Config ) | ( Connect ) | ( ConnectSettings ) | ( Docker ) | ( Info ) | ( Network ) | ( Notification ) | ( Notifications ) | ( Service ) | ( Vars ); UserAccount: ( Me ) | ( User ); }>; @@ -1828,6 +1873,7 @@ export type ResolversTypes = ResolversObject<{ ApiKey: ResolverTypeWrapper; ApiKeyResponse: ResolverTypeWrapper; ApiKeyWithSecret: ResolverTypeWrapper; + ApiSettingsInput: ApiSettingsInput; Array: ResolverTypeWrapper; ArrayCapacity: ResolverTypeWrapper; ArrayDisk: ResolverTypeWrapper; @@ -1845,6 +1891,8 @@ export type ResolversTypes = ResolversObject<{ Config: ResolverTypeWrapper; ConfigErrorState: ConfigErrorState; Connect: ResolverTypeWrapper; + ConnectSettings: ResolverTypeWrapper; + ConnectSettingsValues: ResolverTypeWrapper; ConnectSignInInput: ConnectSignInInput; ConnectUserInfoInput: ConnectUserInfoInput; ContainerHostConfig: ResolverTypeWrapper; @@ -1958,6 +2006,7 @@ export type ResolversParentTypes = ResolversObject<{ ApiKey: ApiKey; ApiKeyResponse: ApiKeyResponse; ApiKeyWithSecret: ApiKeyWithSecret; + ApiSettingsInput: ApiSettingsInput; Array: ArrayType; ArrayCapacity: ArrayCapacity; ArrayDisk: ArrayDisk; @@ -1969,6 +2018,8 @@ export type ResolversParentTypes = ResolversObject<{ CloudResponse: CloudResponse; Config: Config; Connect: Connect; + ConnectSettings: ConnectSettings; + ConnectSettingsValues: ConnectSettingsValues; ConnectSignInInput: ConnectSignInInput; ConnectUserInfoInput: ConnectUserInfoInput; ContainerHostConfig: ContainerHostConfig; @@ -2179,6 +2230,24 @@ export type ConfigResolvers = ResolversObject<{ dynamicRemoteAccess?: Resolver; id?: Resolver; + settings?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type ConnectSettingsResolvers = ResolversObject<{ + dataSchema?: Resolver; + id?: Resolver; + uiSchema?: Resolver; + values?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}>; + +export type ConnectSettingsValuesResolvers = ResolversObject<{ + accessType?: Resolver; + extraOrigins?: Resolver, ParentType, ContextType>; + forwardType?: Resolver, ParentType, ContextType>; + port?: Resolver, ParentType, ContextType>; + sandbox?: Resolver; __isTypeOf?: IsTypeOfResolverFn; }>; @@ -2492,6 +2561,7 @@ export type MutationResolvers>; unmountArrayDisk?: Resolver, ParentType, ContextType, RequireFields>; unreadNotification?: Resolver>; + updateApiSettings?: Resolver>; }>; export type NetworkResolvers = ResolversObject<{ @@ -2513,7 +2583,7 @@ export type NetworkResolvers; export type NodeResolvers = ResolversObject<{ - __resolveType: TypeResolveFn<'Array' | 'Config' | 'Connect' | 'Docker' | 'Info' | 'Network' | 'Notification' | 'Notifications' | 'Service' | 'Vars', ParentType, ContextType>; + __resolveType: TypeResolveFn<'Array' | 'Config' | 'Connect' | 'ConnectSettings' | 'Docker' | 'Info' | 'Network' | 'Notification' | 'Notifications' | 'Service' | 'Vars', ParentType, ContextType>; id?: Resolver; }>; @@ -3120,6 +3190,8 @@ export type Resolvers = ResolversObject<{ CloudResponse?: CloudResponseResolvers; Config?: ConfigResolvers; Connect?: ConnectResolvers; + ConnectSettings?: ConnectSettingsResolvers; + ConnectSettingsValues?: ConnectSettingsValuesResolvers; ContainerHostConfig?: ContainerHostConfigResolvers; ContainerMount?: ContainerMountResolvers; ContainerPort?: ContainerPortResolvers; diff --git a/api/src/graphql/schema/types/connect/connect.graphql b/api/src/graphql/schema/types/connect/connect.graphql index 179268d45..60cf94694 100644 --- a/api/src/graphql/schema/types/connect/connect.graphql +++ b/api/src/graphql/schema/types/connect/connect.graphql @@ -58,9 +58,73 @@ type DynamicRemoteAccessStatus { error: String } +""" + Intersection type of ApiSettings and RemoteAccess +""" +type ConnectSettingsValues { + """ + If true, the GraphQL sandbox is enabled and available at /graphql. + If false, the GraphQL sandbox is disabled and only the production API will be available. + """ + sandbox: Boolean! + """ + A list of origins allowed to interact with the API. + """ + extraOrigins: [String!]! + """ + The type of WAN access used for Remote Access. + """ + accessType: WAN_ACCESS_TYPE! + """ + The type of port forwarding used for Remote Access. + """ + forwardType: WAN_FORWARD_TYPE + """ + The port used for Remote Access. + """ + port: Port +} + +""" + Input should be a subset of ApiSettings that can be updated. + Some field combinations may be required or disallowed. Please refer to each field for more information. +""" +input ApiSettingsInput { + """ + If true, the GraphQL sandbox will be enabled and available at /graphql. + If false, the GraphQL sandbox will be disabled and only the production API will be available. + """ + sandbox: Boolean + """ + A list of origins allowed to interact with the API. + """ + extraOrigins: [String!] + """ + The type of WAN access to use for Remote Access. + """ + accessType: WAN_ACCESS_TYPE + """ + The type of port forwarding to use for Remote Access. + """ + forwardType: WAN_FORWARD_TYPE + """ + The port to use for Remote Access. Not required for UPNP forwardType. Required for STATIC forwardType. + Ignored if accessType is DISABLED or forwardType is UPNP. + """ + port: Port +} + +type ConnectSettings implements Node { + id: ID! + dataSchema: JSON! + uiSchema: JSON! + values: ConnectSettingsValues! +} + type Connect implements Node { id: ID! dynamicRemoteAccess: DynamicRemoteAccessStatus! + settings: ConnectSettings! } type Query { @@ -75,4 +139,9 @@ type Mutation { enableDynamicRemoteAccess(input: EnableDynamicRemoteAccessInput!): Boolean! setAdditionalAllowedOrigins(input: AllowedOriginInput!): [String!]! setupRemoteAccess(input: SetupRemoteAccessInput!): Boolean! + """ + Update the API settings. + Some setting combinations may be required or disallowed. Please refer to each setting for more information. + """ + updateApiSettings(input: ApiSettingsInput!): ConnectSettingsValues! } \ No newline at end of file diff --git a/api/src/unraid-api/auth/user.decorator.ts b/api/src/unraid-api/auth/user.decorator.ts index 791d62f90..340fd9663 100644 --- a/api/src/unraid-api/auth/user.decorator.ts +++ b/api/src/unraid-api/auth/user.decorator.ts @@ -4,7 +4,7 @@ import { GqlContextType, GqlExecutionContext } from '@nestjs/graphql'; import { UserSchema } from '@app/graphql/generated/api/operations.js'; import { UserAccount } from '@app/graphql/generated/api/types.js'; -export const GraphqlUser = createParamDecorator( +export const GraphqlUser = createParamDecorator( (data: null, context: ExecutionContext): UserAccount => { if (context.getType() === 'graphql') { const ctx = GqlExecutionContext.create(context); diff --git a/api/src/unraid-api/graph/connect/connect-settings.service.ts b/api/src/unraid-api/graph/connect/connect-settings.service.ts new file mode 100644 index 000000000..65a2c191c --- /dev/null +++ b/api/src/unraid-api/graph/connect/connect-settings.service.ts @@ -0,0 +1,331 @@ +import { Injectable } from '@nestjs/common'; + +import type { SchemaBasedCondition } from '@jsonforms/core'; +import { RuleEffect } from '@jsonforms/core'; +import { GraphQLError } from 'graphql/error/GraphQLError.js'; + +import type { + ApiSettingsInput, + ConnectSettingsValues, + RemoteAccess, + SetupRemoteAccessInput, +} from '@app/graphql/generated/api/types.js'; +import type { DataSlice, SettingSlice, UIElement } from '@app/unraid-api/types/json-forms.js'; +import { fileExistsSync } from '@app/core/utils/files/file-exists.js'; +import { + DynamicRemoteAccessType, + WAN_ACCESS_TYPE, + WAN_FORWARD_TYPE, +} from '@app/graphql/generated/api/types.js'; +import { setupRemoteAccessThunk } from '@app/store/actions/setup-remote-access.js'; +import { updateAllowedOrigins, updateUserConfig } from '@app/store/modules/config.js'; +import { mergeSettingSlices } from '@app/unraid-api/types/json-forms.js'; +import { csvStringToArray } from '@app/utils.js'; + +@Injectable() +export class ConnectSettingsService { + isConnectPluginInstalled(): boolean { + // logic ported from webguid + return ['/var/lib/pkgtools/packages/dynamix.unraid.net', '/usr/local/sbin/unraid-api'].every( + (path) => fileExistsSync(path) + ); + } + + async isSignedIn(): Promise { + if (!this.isConnectPluginInstalled()) return false; + const { getters } = await import('@app/store/index.js'); + const { apikey } = getters.config().remote; + return Boolean(apikey) && apikey.trim().length > 0; + } + + async isSSLCertProvisioned(): Promise { + const { getters } = await import('@app/store/index.js'); + const { nginx } = getters.emhttp(); + return nginx.certificateName.endsWith('.myunraid.net'); + } + + /**------------------------------------------------------------------------ + * Settings Form Data + *------------------------------------------------------------------------**/ + + async getCurrentSettings(): Promise { + const { getters } = await import('@app/store/index.js'); + const { local, api } = getters.config(); + return { + ...(await this.dynamicRemoteAccessSettings()), + sandbox: local.sandbox === 'yes', + extraOrigins: csvStringToArray(api.extraOrigins), + }; + } + + /** + * Syncs the settings to the store and writes the config to disk + * @param settings - The settings to sync + */ + async syncSettings(settings: Partial) { + const { getters } = await import('@app/store/index.js'); + const { nginx } = getters.emhttp(); + if (settings.accessType === WAN_ACCESS_TYPE.DISABLED) { + settings.port = null; + } + if ( + !nginx.sslEnabled && + settings.accessType === WAN_ACCESS_TYPE.DYNAMIC && + settings.forwardType === WAN_FORWARD_TYPE.STATIC + ) { + throw new GraphQLError( + 'SSL must be provisioned and enabled for dynamic access and static port forwarding.' + ); + } + if (settings.accessType) { + await this.updateRemoteAccess({ + accessType: settings.accessType, + forwardType: settings.forwardType, + port: settings.port, + }); + } + + if (settings.extraOrigins) { + await this.updateAllowedOrigins(settings.extraOrigins); + } + if (typeof settings.sandbox === 'boolean') { + await this.setSandboxMode(settings.sandbox); + } + const { writeConfigSync } = await import('@app/store/sync/config-disk-sync.js'); + writeConfigSync('flash'); + } + + private async updateAllowedOrigins(origins: string[]) { + const { store } = await import('@app/store/index.js'); + store.dispatch(updateAllowedOrigins(origins)); + } + + private async setSandboxMode(sandbox: boolean) { + const { store } = await import('@app/store/index.js'); + store.dispatch(updateUserConfig({ local: { sandbox: sandbox ? 'yes' : 'no' } })); + } + + private async updateRemoteAccess(input: SetupRemoteAccessInput): Promise { + const { store } = await import('@app/store/index.js'); + await store.dispatch(setupRemoteAccessThunk(input)).unwrap(); + return true; + } + + private async dynamicRemoteAccessSettings(): Promise> { + const { getters } = await import('@app/store/index.js'); + const hasWanAccess = getters.config().remote.wanaccess === 'yes'; + return { + accessType: hasWanAccess + ? getters.config().remote.dynamicRemoteAccessType !== DynamicRemoteAccessType.DISABLED + ? WAN_ACCESS_TYPE.DYNAMIC + : WAN_ACCESS_TYPE.ALWAYS + : WAN_ACCESS_TYPE.DISABLED, + forwardType: getters.config().remote.upnpEnabled + ? WAN_FORWARD_TYPE.UPNP + : WAN_FORWARD_TYPE.STATIC, + port: getters.config().remote.wanport ? Number(getters.config().remote.wanport) : null, + }; + } + + /**------------------------------------------------------------------------ + * Settings Form Slices + *------------------------------------------------------------------------**/ + + /** + * Builds the complete settings schema + */ + async buildSettingsSchema(): Promise { + const slices = [ + await this.remoteAccessSlice(), + this.sandboxSlice(), + this.flashBackupSlice(), + // Because CORS is effectively disabled, this setting is no longer necessary + // keeping it here for in case it needs to be re-enabled + // + // this.extraOriginsSlice(), + ]; + + return mergeSettingSlices(slices); + } + + /** + * Computes the JSONForms schema definition for remote access settings. + */ + async remoteAccessSlice(): Promise { + const precondition = (await this.isSignedIn()) && (await this.isSSLCertProvisioned()); + + /** shown when preconditions are not met */ + const requirements: UIElement[] = [ + { + type: 'Label', + text: 'Allow Remote Access', + options: { + format: 'preconditions', + description: 'Remote Access is disabled. To enable, please make sure:', + items: [ + { + text: 'You are signed in to Unraid Connect', + status: await this.isSignedIn(), + }, + { + text: 'You have provisioned a valid SSL certificate', + status: await this.isSSLCertProvisioned(), + }, + ], + }, + }, + ]; + + /** shown when preconditions are met */ + const formControls: UIElement[] = [ + { + type: 'Control', + scope: '#/properties/accessType', + label: 'Allow Remote Access', + }, + { + type: 'Control', + scope: '#/properties/forwardType', + label: 'Remote Access Forward Type', + rule: { + effect: RuleEffect.DISABLE, + condition: { + scope: '#/properties/accessType', + schema: { + enum: [WAN_ACCESS_TYPE.DISABLED], + }, + } as SchemaBasedCondition, + }, + }, + { + type: 'Control', + scope: '#/properties/port', + label: 'Remote Access WAN Port', + options: { + format: 'short', + formatOptions: { + useGrouping: false, + }, + }, + rule: { + effect: RuleEffect.SHOW, + condition: { + schema: { + properties: { + forwardType: { + enum: [WAN_FORWARD_TYPE.STATIC], + }, + accessType: { + enum: [WAN_ACCESS_TYPE.DYNAMIC, WAN_ACCESS_TYPE.ALWAYS], + }, + }, + }, + } as Omit, + }, + }, + ]; + + /** shape of the data associated with remote access settings, as json schema properties*/ + const properties: DataSlice = { + accessType: { + type: 'string', + enum: Object.values(WAN_ACCESS_TYPE), + title: 'Allow Remote Access', + default: 'DISABLED', + }, + forwardType: { + type: 'string', + enum: Object.values(WAN_FORWARD_TYPE), + title: 'Forward Type', + default: 'STATIC', + }, + port: { + type: 'number', + title: 'WAN Port', + minimum: 0, + maximum: 65535, + default: 0, + }, + }; + + return { + properties, + elements: precondition ? formControls : requirements, + }; + } + + /** + * Developer sandbox settings slice + */ + sandboxSlice(): SettingSlice { + return { + properties: { + sandbox: { + type: 'boolean', + title: 'Enable Developer Sandbox', + default: false, + }, + }, + elements: [ + { + type: 'Control', + scope: '#/properties/sandbox', + label: 'Enable Developer Sandbox:', + options: { + toggle: true, + }, + }, + ], + }; + } + + /** + * Flash backup settings slice + */ + flashBackupSlice(): SettingSlice { + return { + properties: { + flashBackup: { + type: 'object', + properties: { + status: { + type: 'string', + enum: ['inactive', 'active', 'updating'], + default: 'inactive', + }, + }, + }, + }, + elements: [], // No UI elements needed for this system-managed setting + }; + } + + /** + * Extra origins settings slice + */ + extraOriginsSlice(): SettingSlice { + return { + properties: { + extraOrigins: { + type: 'array', + items: { + type: 'string', + format: 'url', + }, + title: 'Unraid API extra origins', + description: `Provide a comma separated list of urls that are allowed to access the unraid-api. \ne.g. https://abc.myreverseproxy.com`, + }, + }, + elements: [ + { + type: 'Control', + scope: '#/properties/extraOrigins', + options: { + inputType: 'url', + placeholder: 'https://example.com', + }, + }, + ], + }; + } +} diff --git a/api/src/unraid-api/graph/connect/connect.resolver.spec.ts b/api/src/unraid-api/graph/connect/connect.resolver.spec.ts deleted file mode 100644 index bb4368191..000000000 --- a/api/src/unraid-api/graph/connect/connect.resolver.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { TestingModule } from '@nestjs/testing'; -import { Test } from '@nestjs/testing'; - -import { beforeEach, describe, expect, it } from 'vitest'; - -import { ConnectResolver } from '@app/unraid-api/graph/connect/connect.resolver.js'; - -describe('ConnectResolver', () => { - let resolver: ConnectResolver; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [ConnectResolver], - }).compile(); - - resolver = module.get(ConnectResolver); - }); - - it('should be defined', () => { - expect(resolver).toBeDefined(); - }); -}); diff --git a/api/src/unraid-api/graph/connect/connect.resolver.ts b/api/src/unraid-api/graph/connect/connect.resolver.ts index e80cd3198..ade8d57ee 100644 --- a/api/src/unraid-api/graph/connect/connect.resolver.ts +++ b/api/src/unraid-api/graph/connect/connect.resolver.ts @@ -5,21 +5,22 @@ import { GraphQLError } from 'graphql'; import { AuthActionVerb, AuthPossession, UsePermissions } from 'nest-authz'; import type { + ApiSettingsInput, + ConnectResolvers, + ConnectSettings, DynamicRemoteAccessStatus, EnableDynamicRemoteAccessInput, } from '@app/graphql/generated/api/types.js'; -import { - ConnectResolvers, - DynamicRemoteAccessType, - Resource, -} from '@app/graphql/generated/api/types.js'; +import { DynamicRemoteAccessType, Resource } from '@app/graphql/generated/api/types.js'; import { RemoteAccessController } from '@app/remoteAccess/remote-access-controller.js'; import { store } from '@app/store/index.js'; import { setAllowedRemoteAccessUrl } from '@app/store/modules/dynamic-remote-access.js'; +import { ConnectSettingsService } from '@app/unraid-api/graph/connect/connect-settings.service.js'; @Resolver('Connect') export class ConnectResolver implements ConnectResolvers { protected logger = new Logger(ConnectResolver.name); + constructor(private readonly connectSettingsService: ConnectSettingsService) {} @Query('connect') @UsePermissions({ @@ -36,6 +37,35 @@ export class ConnectResolver implements ConnectResolvers { return 'connect'; } + @ResolveField() + public async settings(): Promise { + const { properties, elements } = await this.connectSettingsService.buildSettingsSchema(); + return { + id: 'connectSettingsForm', + dataSchema: { + type: 'object', + properties, + }, + uiSchema: { + type: 'VerticalLayout', + elements, + }, + values: await this.connectSettingsService.getCurrentSettings(), + }; + } + + @Mutation() + @UsePermissions({ + action: AuthActionVerb.UPDATE, + resource: Resource.CONFIG, + possession: AuthPossession.ANY, + }) + public async updateApiSettings(@Args('input') settings: ApiSettingsInput) { + this.logger.verbose(`Attempting to update API settings: ${JSON.stringify(settings, null, 2)}`); + await this.connectSettingsService.syncSettings(settings); + return this.connectSettingsService.getCurrentSettings(); + } + @ResolveField() public dynamicRemoteAccess(): DynamicRemoteAccessStatus { return { diff --git a/api/src/unraid-api/graph/graph.module.ts b/api/src/unraid-api/graph/graph.module.ts index b664bfedc..76c2a9842 100644 --- a/api/src/unraid-api/graph/graph.module.ts +++ b/api/src/unraid-api/graph/graph.module.ts @@ -15,6 +15,7 @@ import { import { GraphQLLong } from '@app/graphql/resolvers/graphql-type-long.js'; import { loadTypeDefs } from '@app/graphql/schema/loadTypesDefs.js'; import { getters } from '@app/store/index.js'; +import { ConnectSettingsService } from '@app/unraid-api/graph/connect/connect-settings.service.js'; import { ConnectResolver } from '@app/unraid-api/graph/connect/connect.resolver.js'; import { ConnectService } from '@app/unraid-api/graph/connect/connect.service.js'; import { idPrefixPlugin } from '@app/unraid-api/graph/id-prefix-plugin.js'; @@ -57,6 +58,13 @@ import { SharesResolver } from '@app/unraid-api/graph/shares/shares.resolver.js' }), }), ], - providers: [NetworkResolver, ServicesResolver, SharesResolver, ConnectResolver, ConnectService], + providers: [ + NetworkResolver, + ServicesResolver, + SharesResolver, + ConnectResolver, + ConnectService, + ConnectSettingsService, + ], }) export class GraphModule {} diff --git a/api/src/unraid-api/graph/resolvers/resolvers.module.ts b/api/src/unraid-api/graph/resolvers/resolvers.module.ts index 801fe64cc..f87fad21f 100644 --- a/api/src/unraid-api/graph/resolvers/resolvers.module.ts +++ b/api/src/unraid-api/graph/resolvers/resolvers.module.ts @@ -1,6 +1,7 @@ import { Module } from '@nestjs/common'; import { AuthModule } from '@app/unraid-api/auth/auth.module.js'; +import { ConnectSettingsService } from '@app/unraid-api/graph/connect/connect-settings.service.js'; import { ApiKeyResolver } from '@app/unraid-api/graph/resolvers/api-key/api-key.resolver.js'; import { ArrayResolver } from '@app/unraid-api/graph/resolvers/array/array.resolver.js'; import { CloudResolver } from '@app/unraid-api/graph/resolvers/cloud/cloud.resolver.js'; @@ -41,6 +42,7 @@ import { VmsResolver } from '@app/unraid-api/graph/resolvers/vms/vms.resolver.js VmsResolver, NotificationsService, MeResolver, + ConnectSettingsService, ], exports: [AuthModule, ApiKeyResolver], }) diff --git a/api/src/unraid-api/main.ts b/api/src/unraid-api/main.ts index b2c69da98..6fdf78320 100644 --- a/api/src/unraid-api/main.ts +++ b/api/src/unraid-api/main.ts @@ -1,6 +1,6 @@ import type { NestFastifyApplication } from '@nestjs/platform-fastify'; import { NestFactory } from '@nestjs/core'; -import { FastifyAdapter } from '@nestjs/platform-fastify/adapters'; +import { FastifyAdapter } from '@nestjs/platform-fastify/index.js'; import fastifyCookie from '@fastify/cookie'; import fastifyHelmet from '@fastify/helmet'; diff --git a/api/src/unraid-api/types/json-forms.ts b/api/src/unraid-api/types/json-forms.ts new file mode 100644 index 000000000..b7eeb91e6 --- /dev/null +++ b/api/src/unraid-api/types/json-forms.ts @@ -0,0 +1,64 @@ +import type { + Categorization, + ComposableCondition, + ControlElement, + JsonSchema, + LabelElement, + Layout, + LeafCondition, + SchemaBasedCondition, + UISchemaElement, +} from '@jsonforms/core'; + +/** + * JSON schema properties. + */ +export type DataSlice = Record; + +/** + * A JSONForms UI schema element. + */ +export type UIElement = UISchemaElement | LabelElement | Layout | ControlElement | Categorization; + +/** + * A condition for a JSONForms rule. + */ +export type RuleCondition = + | LeafCondition + | ComposableCondition + | SchemaBasedCondition + | Omit; + +/** + * A slice of settings form data. + */ +export type SettingSlice = { + /** One or more JSON schema properties. + * Conceptually, this is a subset (slice) of the JSON schema, + * specific to a piece or logical group of data. + */ + properties: DataSlice; + /** One or more UI schema elements that describe the form layout of this piece/subset of data. */ + elements: UIElement[]; +}; + +export function createEmptySettingSlice(): SettingSlice { + return { properties: {}, elements: [] }; +} + +/** + * Reduces multiple setting slices into a single slice + */ +function reduceSlices(slices: SettingSlice[]): SettingSlice { + const result = createEmptySettingSlice(); + for (const slice of slices) { + Object.assign(result.properties, slice.properties); + result.elements.push(...slice.elements); + } + return result; +} + +/** + * Merges multiple setting slices into a single, holistic slice. + */ +export const mergeSettingSlices = reduceSlices; diff --git a/api/src/unraid-api/unraid-file-modifier/modifications/__test__/__fixtures__/downloaded/.login.php.last-download-time b/api/src/unraid-api/unraid-file-modifier/modifications/__test__/__fixtures__/downloaded/.login.php.last-download-time index bfdd52e50..9c1059e07 100644 --- a/api/src/unraid-api/unraid-file-modifier/modifications/__test__/__fixtures__/downloaded/.login.php.last-download-time +++ b/api/src/unraid-api/unraid-file-modifier/modifications/__test__/__fixtures__/downloaded/.login.php.last-download-time @@ -1 +1 @@ -1741881521869 \ No newline at end of file +1741960696861 diff --git a/api/src/unraid-api/unraid-file-modifier/modifications/__test__/__fixtures__/downloaded/DefaultPageLayout.php.last-download-time b/api/src/unraid-api/unraid-file-modifier/modifications/__test__/__fixtures__/downloaded/DefaultPageLayout.php.last-download-time index a1c8b7082..d1b6f33be 100644 --- a/api/src/unraid-api/unraid-file-modifier/modifications/__test__/__fixtures__/downloaded/DefaultPageLayout.php.last-download-time +++ b/api/src/unraid-api/unraid-file-modifier/modifications/__test__/__fixtures__/downloaded/DefaultPageLayout.php.last-download-time @@ -1 +1 @@ -1741881520894 \ No newline at end of file +1741960696132 diff --git a/api/src/unraid-api/unraid-file-modifier/modifications/__test__/__fixtures__/downloaded/Notifications.page.last-download-time b/api/src/unraid-api/unraid-file-modifier/modifications/__test__/__fixtures__/downloaded/Notifications.page.last-download-time index e783e2b63..8f1392f5f 100644 --- a/api/src/unraid-api/unraid-file-modifier/modifications/__test__/__fixtures__/downloaded/Notifications.page.last-download-time +++ b/api/src/unraid-api/unraid-file-modifier/modifications/__test__/__fixtures__/downloaded/Notifications.page.last-download-time @@ -1 +1 @@ -1741881521463 \ No newline at end of file +1741960696408 diff --git a/api/src/unraid-api/unraid-file-modifier/modifications/__test__/__fixtures__/downloaded/auth-request.php.last-download-time b/api/src/unraid-api/unraid-file-modifier/modifications/__test__/__fixtures__/downloaded/auth-request.php.last-download-time index 2f8016ba3..ca825c3bb 100644 --- a/api/src/unraid-api/unraid-file-modifier/modifications/__test__/__fixtures__/downloaded/auth-request.php.last-download-time +++ b/api/src/unraid-api/unraid-file-modifier/modifications/__test__/__fixtures__/downloaded/auth-request.php.last-download-time @@ -1 +1 @@ -1741881522200 \ No newline at end of file +1741960697108 diff --git a/api/src/utils.ts b/api/src/utils.ts index f44f73a0b..bf08d28e1 100644 --- a/api/src/utils.ts +++ b/api/src/utils.ts @@ -245,3 +245,30 @@ export function handleAuthError( throw new UnauthorizedException(`${operation}: ${errorMessage}`); } + +/** + * Converts a Comma Separated (CSV) string to an array of strings. + * + * @example + * csvStringToArray('one,two,three') // ['one', 'two', 'three'] + * csvStringToArray('one, two, three') // ['one', 'two', 'three'] + * csvStringToArray(null) // [] + * csvStringToArray(undefined) // [] + * csvStringToArray('') // [] + * + * @param csvString - The Comma Separated string to convert + * @param opts - Options + * @param opts.noEmpty - Whether to omit empty strings. Default is true. + * @returns An array of strings + */ +export function csvStringToArray( + csvString?: string | null, + opts: { noEmpty?: boolean } = { noEmpty: true } +): string[] { + if (!csvString) return []; + const result = csvString.split(',').map((item) => item.trim()); + if (opts.noEmpty) { + return result.filter((item) => item !== ''); + } + return result; +} diff --git a/plugin/source/dynamix.unraid.net/usr/local/emhttp/plugins/dynamix.my.servers/Connect.page b/plugin/source/dynamix.unraid.net/usr/local/emhttp/plugins/dynamix.my.servers/Connect.page index 24f563c27..668e4f889 100644 --- a/plugin/source/dynamix.unraid.net/usr/local/emhttp/plugins/dynamix.my.servers/Connect.page +++ b/plugin/source/dynamix.unraid.net/usr/local/emhttp/plugins/dynamix.my.servers/Connect.page @@ -486,143 +486,6 @@ $('body').on('click', '.js-setCurrentHostExtraOrigins', function(e) { }); -
- -combinedKnownOrigins): ?> -
-
-
- - _(Warning)_ - host) ?>. -
- _(For best results, add the current url to the **Unraid API extra origins** field below then apply the change)_. -
-
-

_(Known Origins)_:

-
    - combinedKnownOrigins as $origin): ?> -
  • - -
-
-
-
-
- - -
- -_(Allow Remote Access)_: - -: _(Disabled until you have signed in)_ - -: _(Disabled until connected to Unraid Connect Cloud - try reloading the page)_ - -: _(Disabled until you Provision a myunraid.net SSL Cert)_ - -: _(Disabled until your root user account is password-protected)_ - -: - - -  -: _(Remark: to use the UPnP options please set "Use UPnP" to "Yes" in Management Access.)_ - - - -  -: _(Remark: to use the "Dynamic - Manual Port Forward" option for Remote Access please set "Use SSL/TLS" to "Strict" in Management Access.)_ - - -  -: - -
- -_(WAN Port)_: -:     - %u/TCP " . _("to") . " %s:%u", $myServersFlashCfg['remote']['wanport'], htmlspecialchars($eth0['IPADDR:0']??''), $var['PORTSSL']??443)?> - -:unraidnet_wanpanel_help: - -
- - - _('Remote T2FA requires Remote Access to be enabled and a *.myunraid.net certificate'), - 'needRemote' => _('Remote T2FA requires Remote Access to be enabled'), - 'needRemoteAndCert' => _('Remote T2FA requires Remote Access to be enabled and a *.myunraid.net certificate'), - 'needCert' => _('Remote T2FA requires a *.myunraid.net certificate'), -]; - -if ($enableRemoteT2fa) - $remoteT2faRemark = ''; -elseif ($currentRemoteAccessValue === 'OFF' && $hasMyUnraidNetCert) - $remoteT2faRemark = $remoteT2faRemarks['needRemote']; -elseif ($currentRemoteAccessValue === 'OFF' && !$hasMyUnraidNetCert) - $remoteT2faRemark = $remoteT2faRemarks['needRemoteAndCert']; -elseif ($currentRemoteAccessValue !== 'OFF' && !$hasMyUnraidNetCert) - $remoteT2faRemark = $remoteT2faRemarks['needCert']; -else - $remoteT2faRemark = $remoteT2faRemarks['all']; - -$localT2faRemarks = [ - 'all' => _('Local T2FA requires Use SSL/TLS to be Strict and a *.myunraid.net certificate'), - 'needSSLAuto' => _('Local T2FA requires Use SSL/TLS to be Strict'), - 'needSSLAutoAndCert' => _('Local T2FA requires Use SSL/TLS to be Strict and a *.myunraid.net certificate'), - 'needCert' => _('Local T2FA requires a *.myunraid.net certificate'), -]; - -if($enableLocalT2fa) - $localT2faRemark = ''; -elseif ($var['USE_SSL'] !== 'auto' && $hasMyUnraidNetCert) - $localT2faRemark = $localT2faRemarks['needSSLAuto']; -elseif ($var['USE_SSL'] !== 'auto' && !$hasMyUnraidNetCert) - $localT2faRemark = $localT2faRemarks['needSSLAutoAndCert']; -elseif ($var['USE_SSL'] === 'auto' && !$hasMyUnraidNetCert) - $localT2faRemark = $localT2faRemarks['needCert']; -else - $localT2faRemark = $localT2faRemarks['all']; -?> - -_(Enable Transparent 2FA for Remote Access)_: -: - -:myservers_remote_t2fa_help: - -_(Enable Transparent 2FA for Local Access)_: -: - -:myservers_local_t2fa_help: - - -  -: - - - -
-
-
_(Flash backup)_: @@ -702,36 +565,5 @@ $(function() {
-
-  -: _(Questions? See the documentation.)_ - -_(Account status)_: -: - - -_(Unraid API extra origins)_: -: - -:unraidnet_extraorigins_help: - -  -:
-combinedKnownOrigins): ?> -
- - - - -_(Connected to Unraid Connect Cloud)_: - -: _(Yes)_ - -: _(No)_ - - - -_(Download unraid-api Logs)_: -: -
+ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d74d8f8ef..38a5cba4d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,10 +22,10 @@ importers: version: 4.11.3(graphql@16.10.0) '@as-integrations/fastify': specifier: ^2.1.1 - version: 2.1.1(@apollo/server@4.11.3(graphql@16.10.0))(fastify@4.28.1) + version: 2.1.1(@apollo/server@4.11.3(graphql@16.10.0))(fastify@5.2.1) '@fastify/cookie': - specifier: ^9.4.0 - version: 9.4.0 + specifier: ^11.0.2 + version: 11.0.2 '@fastify/helmet': specifier: ^13.0.1 version: 13.0.1 @@ -44,30 +44,33 @@ importers: '@graphql-tools/utils': specifier: ^10.5.5 version: 10.8.2(graphql@16.10.0) + '@jsonforms/core': + specifier: ^3.5.1 + version: 3.5.1 '@nestjs/apollo': - specifier: ^12.2.1 - version: 12.2.2(@apollo/server@4.11.3(graphql@16.10.0))(@as-integrations/fastify@2.1.1(@apollo/server@4.11.3(graphql@16.10.0))(fastify@4.28.1))(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/graphql@12.2.2(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(graphql@16.10.0)(reflect-metadata@0.1.14))(graphql@16.10.0) + specifier: ^13.0.3 + version: 13.0.3(@apollo/server@4.11.3(graphql@16.10.0))(@as-integrations/fastify@2.1.1(@apollo/server@4.11.3(graphql@16.10.0))(fastify@5.2.1))(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/graphql@13.0.3(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(graphql@16.10.0)(reflect-metadata@0.1.14))(graphql@16.10.0) '@nestjs/common': - specifier: ^10.4.7 - version: 10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2) + specifier: ^11.0.11 + version: 11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2) '@nestjs/core': - specifier: ^10.4.7 - version: 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) + specifier: ^11.0.11 + version: 11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) '@nestjs/graphql': - specifier: ^12.2.1 - version: 12.2.2(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(graphql@16.10.0)(reflect-metadata@0.1.14) + specifier: ^13.0.3 + version: 13.0.3(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(graphql@16.10.0)(reflect-metadata@0.1.14) '@nestjs/passport': specifier: ^10.0.3 - version: 10.0.3(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(passport@0.7.0) + version: 10.0.3(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(passport@0.7.0) '@nestjs/platform-fastify': - specifier: ^10.4.7 - version: 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2)) + specifier: ^11.0.11 + version: 11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2)) '@nestjs/schedule': specifier: ^5.0.0 - version: 5.0.1(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2)) + version: 5.0.1(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2)) '@nestjs/throttler': specifier: ^6.2.1 - version: 6.4.0(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14) + version: 6.4.0(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14) '@reduxjs/toolkit': specifier: ^2.3.0 version: 2.5.1(react@19.0.0) @@ -138,8 +141,8 @@ importers: specifier: ^4.0.0 version: 4.0.0 fastify: - specifier: ^4.28.1 - version: 4.28.1 + specifier: ^5.2.1 + version: 5.2.1 filenamify: specifier: ^6.0.0 version: 6.0.0 @@ -198,14 +201,14 @@ importers: specifier: ^4.2.0 version: 4.2.0 nest-authz: - specifier: ^2.11.0 - version: 2.14.0(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) + specifier: ^2.14.0 + version: 2.14.0(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) nest-commander: specifier: ^3.15.0 - version: 3.16.0(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(@types/inquirer@8.2.10)(typescript@5.7.3) + version: 3.16.0(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(@types/inquirer@8.2.10)(typescript@5.7.3) nestjs-pino: specifier: ^4.1.0 - version: 4.3.0(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(pino-http@10.4.0) + version: 4.3.0(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(pino-http@10.4.0) node-cache: specifier: ^5.1.2 version: 5.1.2 @@ -301,8 +304,8 @@ importers: specifier: ^4.4.0 version: 4.4.1(@vue/compiler-sfc@3.5.13)(prettier@3.5.2) '@nestjs/testing': - specifier: ^10.4.7 - version: 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2)) + specifier: ^11.0.11 + version: 11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2)) '@originjs/vite-plugin-commonjs': specifier: ^1.0.3 version: 1.0.3 @@ -493,6 +496,18 @@ importers: '@heroicons/vue': specifier: ^2.2.0 version: 2.2.0(vue@3.5.13(typescript@5.7.3)) + '@internationalized/number': + specifier: ^3.6.0 + version: 3.6.0 + '@jsonforms/core': + specifier: ^3.5.1 + version: 3.5.1 + '@jsonforms/vue': + specifier: ^3.5.1 + version: 3.5.1(@jsonforms/core@3.5.1)(vue@3.5.13(typescript@5.7.3)) + '@jsonforms/vue-vanilla': + specifier: ^3.5.1 + version: 3.5.1(@jsonforms/core@3.5.1)(@jsonforms/vue@3.5.1(@jsonforms/core@3.5.1)(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3)) '@vueuse/core': specifier: ^12.0.0 version: 12.7.0(typescript@5.7.3) @@ -511,6 +526,9 @@ importers: radix-vue: specifier: ^1.9.13 version: 1.9.16(vue@3.5.13(typescript@5.7.3)) + reka-ui: + specifier: ^2.0.2 + version: 2.0.2(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)) shadcn-vue: specifier: ^0.11.3 version: 0.11.4(@vitest/ui@3.0.6)(eslint@9.20.1(jiti@2.4.2))(magicast@0.3.5)(vitest@3.0.6)(vue@3.5.13(typescript@5.7.3)) @@ -612,7 +630,7 @@ importers: specifier: ^1.0.7 version: 1.0.7(tailwindcss@3.4.17) typescript: - specifier: ^5.0.0 + specifier: ^5.7.3 version: 5.7.3 vite: specifier: ^6.0.0 @@ -657,6 +675,18 @@ importers: '@heroicons/vue': specifier: ^2.2.0 version: 2.2.0(vue@3.5.13(typescript@5.7.3)) + '@jsonforms/core': + specifier: ^3.5.1 + version: 3.5.1 + '@jsonforms/vue': + specifier: ^3.5.1 + version: 3.5.1(@jsonforms/core@3.5.1)(vue@3.5.13(typescript@5.7.3)) + '@jsonforms/vue-vanilla': + specifier: ^3.5.1 + version: 3.5.1(@jsonforms/core@3.5.1)(@jsonforms/vue@3.5.1(@jsonforms/core@3.5.1)(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3)) + '@jsonforms/vue-vuetify': + specifier: ^3.5.1 + version: 3.5.1(@jsonforms/core@3.5.1)(@jsonforms/vue@3.5.1(@jsonforms/core@3.5.1)(vue@3.5.13(typescript@5.7.3)))(ajv@8.17.1)(dayjs@1.11.13)(lodash@4.17.21)(maska@2.1.11)(vue@3.5.13(typescript@5.7.3))(vuetify@3.7.14) '@nuxtjs/color-mode': specifier: ^3.5.2 version: 3.5.2(magicast@0.3.5) @@ -729,6 +759,9 @@ importers: vue-i18n: specifier: ^10.0.5 version: 10.0.5(vue@3.5.13(typescript@5.7.3)) + vuetify: + specifier: ^3.7.14 + version: 3.7.14(typescript@5.7.3)(vite-plugin-vuetify@2.1.0)(vue@3.5.13(typescript@5.7.3)) wretch: specifier: ^2.11.0 version: 2.11.0 @@ -801,7 +834,7 @@ importers: version: 3.15.4(@parcel/watcher@2.5.1)(@types/node@22.13.4)(db0@0.2.4)(eslint@9.21.0(jiti@2.4.2))(ioredis@5.5.0)(magicast@0.3.5)(meow@9.0.0)(optionator@0.9.4)(rollup@4.34.6)(stylus@0.57.0)(terser@5.39.0)(tsx@4.19.3)(typescript@5.7.3)(vite@6.1.1(@types/node@22.13.4)(jiti@2.4.2)(stylus@0.57.0)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue-tsc@2.2.2(typescript@5.7.3))(xml2js@0.6.2)(yaml@2.7.0) nuxt-custom-elements: specifier: 2.0.0-beta.18 - version: 2.0.0-beta.18(webpack@5.98.0(esbuild@0.24.2)) + version: 2.0.0-beta.18(webpack@5.98.0(esbuild@0.23.1)) prettier: specifier: 3.5.1 version: 3.5.1 @@ -832,6 +865,9 @@ importers: vue-tsc: specifier: ^2.1.10 version: 2.2.2(typescript@5.7.3) + vuetify-nuxt-module: + specifier: 0.18.3 + version: 0.18.3(magicast@0.3.5)(typescript@5.7.3)(vite@6.1.1(@types/node@22.13.4)(jiti@2.4.2)(stylus@0.57.0)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)) optionalDependencies: '@rollup/rollup-linux-x64-gnu': specifier: ^4.30.1 @@ -892,8 +928,8 @@ packages: peerDependencies: graphql: 14.x || 15.x || 16.x - '@apollo/server-plugin-landing-page-graphql-playground@4.0.0': - resolution: {integrity: sha512-PBDtKI/chJ+hHeoJUUH9Kuqu58txQl00vUGuxqiC9XcReulIg7RjsyD0G1u3drX4V709bxkL5S0nTeXfRHD0qA==} + '@apollo/server-plugin-landing-page-graphql-playground@4.0.1': + resolution: {integrity: sha512-tWhQzD7DtiTO/wfbGvasryz7eJSuEh9XJHgRTMZI7+Wu/omylG5gH6K6ksg1Vccg8/Xuglfi2f1M5Nm/IlBBGw==} engines: {node: '>=14.0'} deprecated: The use of GraphQL Playground in Apollo Server was supported in previous versions, but this is no longer the case as of December 31, 2022. This package exists for v4 migration purposes only. We do not intend to resolve security issues or other bugs with this package if they arise, so please migrate away from this to [Apollo Server's default Explorer](https://www.apollographql.com/docs/apollo-server/api/plugin/landing-pages) as soon as possible. peerDependencies: @@ -1441,6 +1477,12 @@ packages: resolution: {integrity: sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==} engines: {node: '>=16'} + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.24.2': resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} engines: {node: '>=18'} @@ -1453,6 +1495,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.24.2': resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} engines: {node: '>=18'} @@ -1465,6 +1513,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.24.2': resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} engines: {node: '>=18'} @@ -1477,6 +1531,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.24.2': resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} engines: {node: '>=18'} @@ -1489,6 +1549,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.24.2': resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} engines: {node: '>=18'} @@ -1501,6 +1567,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.24.2': resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} engines: {node: '>=18'} @@ -1513,6 +1585,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.24.2': resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} engines: {node: '>=18'} @@ -1525,6 +1603,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.24.2': resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} engines: {node: '>=18'} @@ -1537,6 +1621,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.24.2': resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} engines: {node: '>=18'} @@ -1549,6 +1639,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.24.2': resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} engines: {node: '>=18'} @@ -1561,6 +1657,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.24.2': resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} engines: {node: '>=18'} @@ -1579,6 +1681,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.24.2': resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} engines: {node: '>=18'} @@ -1591,6 +1699,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.24.2': resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} engines: {node: '>=18'} @@ -1603,6 +1717,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.24.2': resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} engines: {node: '>=18'} @@ -1615,6 +1735,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.24.2': resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} engines: {node: '>=18'} @@ -1627,6 +1753,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.24.2': resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} engines: {node: '>=18'} @@ -1639,6 +1771,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.24.2': resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} engines: {node: '>=18'} @@ -1663,6 +1801,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.24.2': resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} engines: {node: '>=18'} @@ -1675,6 +1819,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-arm64@0.24.2': resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} engines: {node: '>=18'} @@ -1687,6 +1837,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.24.2': resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} engines: {node: '>=18'} @@ -1699,6 +1855,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.24.2': resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} engines: {node: '>=18'} @@ -1711,6 +1873,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.24.2': resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} engines: {node: '>=18'} @@ -1723,6 +1891,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.24.2': resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} engines: {node: '>=18'} @@ -1735,6 +1909,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.24.2': resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} engines: {node: '>=18'} @@ -1816,32 +1996,38 @@ packages: resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@fastify/ajv-compiler@3.6.0': - resolution: {integrity: sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==} + '@fastify/ajv-compiler@4.0.2': + resolution: {integrity: sha512-Rkiu/8wIjpsf46Rr+Fitd3HRP+VsxUFDDeag0hs9L0ksfnwx2g7SPQQTFL0E8Qv+rfXzQOxBJnjUB9ITUDjfWQ==} - '@fastify/cookie@9.4.0': - resolution: {integrity: sha512-Th+pt3kEkh4MQD/Q2q1bMuJIB5NX/D5SwSpOKu3G/tjoGbwfpurIMJsWSPS0SJJ4eyjtmQ8OipDQspf8RbUOlg==} + '@fastify/cookie@11.0.2': + resolution: {integrity: sha512-GWdwdGlgJxyvNv+QcKiGNevSspMQXncjMZ1J8IvuDQk0jvkzgWWZFNC2En3s+nHndZBGV8IbLwOI/sxCZw/mzA==} - '@fastify/cors@9.0.1': - resolution: {integrity: sha512-YY9Ho3ovI+QHIL2hW+9X4XqQjXLjJqsU+sMV/xFsxZkE8p3GNnYVFpoOxF7SsP5ZL76gwvbo3V9L+FIekBGU4Q==} + '@fastify/cors@11.0.0': + resolution: {integrity: sha512-41Bx0LVGr2a6DnnhDN/SgfDlTRNZtEs8niPxyoymV6Hw09AIdz/9Rn/0Fpu+pBOs6kviwS44JY2mB8NcU2qSAA==} - '@fastify/error@3.4.1': - resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} + '@fastify/error@4.0.0': + resolution: {integrity: sha512-OO/SA8As24JtT1usTUTKgGH7uLvhfwZPwlptRi2Dp5P4KKmJI3gvsZ8MIHnNwDs4sLf/aai5LzTyl66xr7qMxA==} - '@fastify/fast-json-stringify-compiler@4.3.0': - resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} + '@fastify/fast-json-stringify-compiler@5.0.2': + resolution: {integrity: sha512-YdR7gqlLg1xZAQa+SX4sMNzQHY5pC54fu9oC5aYSUqBhyn6fkLkrdtKlpVdCNPlwuUuXA1PjFTEmvMF6ZVXVGw==} - '@fastify/formbody@7.4.0': - resolution: {integrity: sha512-H3C6h1GN56/SMrZS8N2vCT2cZr7mIHzBHzOBa5OPpjfB/D6FzP9mMpE02ZzrFX0ANeh0BAJdoXKOF2e7IbV+Og==} + '@fastify/formbody@8.0.2': + resolution: {integrity: sha512-84v5J2KrkXzjgBpYnaNRPqwgMsmY7ZDjuj0YVuMR3NXCJRCgKEZy/taSP1wUYGn0onfxJpLyRGDLa+NMaDJtnA==} + + '@fastify/forwarded@3.0.0': + resolution: {integrity: sha512-kJExsp4JCms7ipzg7SJ3y8DwmePaELHxKYtg+tZow+k0znUTf3cb+npgyqm8+ATZOdmfgfydIebPDWM172wfyA==} '@fastify/helmet@13.0.1': resolution: {integrity: sha512-i+ifqazG3d0HwHL3zuZdg6B/WPc9Ee6kVfGpwGho4nxm0UaK1htss0zq+1rVhOoAorZlCgTZ3/i4S58hUGkkoA==} - '@fastify/merge-json-schemas@0.1.1': - resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} + '@fastify/merge-json-schemas@0.2.1': + resolution: {integrity: sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==} - '@fastify/middie@8.3.3': - resolution: {integrity: sha512-+WHavMQr9CNTZoy2cjoDxoWp76kZ3JKjAtZj5sXNlxX5XBzHig0TeCPfPc+1+NQmliXtndT3PFwAjrQHE/6wnQ==} + '@fastify/middie@9.0.3': + resolution: {integrity: sha512-7OYovKXp9UKYeVMcjcFLMcSpoMkmcZmfnG+eAvtdiatN35W7c+r9y1dRfpA+pfFVNuHGGqI3W+vDTmjvcfLcMA==} + + '@fastify/proxy-addr@5.0.0': + resolution: {integrity: sha512-37qVVA1qZ5sgH7KpHkkC4z9SK6StIsIcOmpjvMPXNb3vx2GQxhZocogVYbr2PbbeLCQxYIPDok307xEvRZOzGA==} '@fig/complete-commander@3.2.0': resolution: {integrity: sha512-1Holl3XtRiANVKURZwgpjCnPuV4RsHp+XC0MhgvyAX/avQwj7F2HUItYOvGi/bXjJCkEzgBZmVfCr0HBA+q+Bw==} @@ -2096,8 +2282,8 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/merge@9.0.11': - resolution: {integrity: sha512-AJL0XTozn31HoZN8tULzEkbDXyETA5vAFu4Q65kxJDu027p+auaNFYj/y51HP4BhMR4wykoteWyO7/VxKfdpiw==} + '@graphql-tools/merge@9.0.19': + resolution: {integrity: sha512-iJP3Xke+vgnST58A1Q/1+y3bzfbYalIMnegUNupYHNvHHSE0PXoq8YieqQF8JYzWVACMxiq/M4Y1vW75mS2UVg==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -2136,8 +2322,8 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/schema@10.0.10': - resolution: {integrity: sha512-TSdDvwgk1Fq3URDuZBMCPXlWLpRpxwaQ+0KqvycVwoHozYnBRZ2Ql9HVgDKnebkGQKmIk2enSeku+ERKxxSG0g==} + '@graphql-tools/schema@10.0.18': + resolution: {integrity: sha512-6j2O/07v1zbGvASizMSO7YZdGt/9HfPDx8s9n75sD2xoGfeJ2aRSmI4LkyuvqOpi0ecaa9xErnMEEvUaKBqMbw==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -2159,8 +2345,8 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/utils@10.6.1': - resolution: {integrity: sha512-XHl0/DWkMf/8Dmw1F3RRoMPt6ZwU4J707YWcbPjS+49WZNoTVz6f+prQ4GuwZT8RqTPtrRawnGU93AV73ZLTfQ==} + '@graphql-tools/utils@10.8.1': + resolution: {integrity: sha512-fI5NNuqeEAHyp7NuCDjvxWR5PTUXM4AqY9BoC59ZcX4nePAJje27ZsFHbAMS6EKDosY1K/D4ADxsO0P5+FH07A==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 @@ -2301,6 +2487,34 @@ packages: '@jsdevtools/ono@7.1.3': resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + '@jsonforms/core@3.5.1': + resolution: {integrity: sha512-Jrq/UcfvKsAprLJ+9TMFa8pKsfdyv3dAw85XstSNRcjDT19LreBlhVqIvTvtgZidg8Iet3yqy5xlNnB+XyrvrQ==} + + '@jsonforms/vue-vanilla@3.5.1': + resolution: {integrity: sha512-XkaescuGVFX+p80PXeIgDm9oLoWlBHebyC1o8JEjIZoPIuFmG8MGWlclmKLAXQapfotCUMhcUXLHV1Mi6A7ZQg==} + peerDependencies: + '@jsonforms/core': 3.5.1 + '@jsonforms/vue': 3.5.1 + vue: ^3.2.26 + + '@jsonforms/vue-vuetify@3.5.1': + resolution: {integrity: sha512-jOzLkyDYHMPM72Yvos3M6qYrYnPtA/MXRozWNoaAAL4XY0UkNUgH8EWpcoonraJeRNi7ZtTH7Dw+Ob8j0yr+7Q==} + peerDependencies: + '@jsonforms/core': 3.5.1 + '@jsonforms/vue': 3.5.1 + ajv: ^8.6.1 + dayjs: ^1.10.6 + lodash: ^4.17.21 + maska: ^2.1.11 + vue: ^3.4.21 + vuetify: ^3.6.6 + + '@jsonforms/vue@3.5.1': + resolution: {integrity: sha512-mxxZ/RrvxpIyqxRXH1K4f+Zha/JJCeycx/oKC7h2w6ZsQFqLSFJuntQ1nIwNOCIR21lYQZXIt/VkmvAemnis5g==} + peerDependencies: + '@jsonforms/core': 3.5.1 + vue: ^3.2.26 + '@koa/router@12.0.2': resolution: {integrity: sha512-sYcHglGKTxGF+hQ6x67xDfkE9o+NhVlRHBqq6gLywaMc6CojK/5vFZByphdonKinYlMLkEkacm+HEse9HzwgTA==} engines: {node: '>= 12'} @@ -2356,17 +2570,17 @@ packages: '@microsoft/tsdoc@0.14.2': resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} - '@nestjs/apollo@12.2.2': - resolution: {integrity: sha512-gsDqSfsmTSvF0k3XaRESRgM3uE/YFO+59txCsq7T1EadDOVOuoF3zVQiFmi6D50Rlnqohqs63qjjf46mgiiXgQ==} + '@nestjs/apollo@13.0.3': + resolution: {integrity: sha512-Bx25XA6ZLwH2RHmmQ9c5LpyZW7IEQxL2uDtGBLgqjBilcIUwZ3/VpbaCnwMK/2LxvejO0+zFC8Psu+EtnxOqYg==} peerDependencies: '@apollo/gateway': ^2.0.0 - '@apollo/server': ^4.3.2 + '@apollo/server': ^4.11.3 '@apollo/subgraph': ^2.0.0 - '@as-integrations/fastify': ^1.3.0 || ^2.0.0 - '@nestjs/common': ^9.3.8 || ^10.0.0 - '@nestjs/core': ^9.3.8 || ^10.0.0 - '@nestjs/graphql': ^12.0.0 - graphql: ^16.6.0 + '@as-integrations/fastify': ^2.1.1 + '@nestjs/common': ^11.0.1 + '@nestjs/core': ^11.0.1 + '@nestjs/graphql': ^13.0.0 + graphql: ^16.10.0 peerDependenciesMeta: '@apollo/gateway': optional: true @@ -2375,8 +2589,8 @@ packages: '@as-integrations/fastify': optional: true - '@nestjs/common@10.4.15': - resolution: {integrity: sha512-vaLg1ZgwhG29BuLDxPA9OAcIlgqzp9/N8iG0wGapyUNTf4IY4O6zAHgN6QalwLhFxq7nOI021vdRojR1oF3bqg==} + '@nestjs/common@11.0.11': + resolution: {integrity: sha512-b3zYiho5/XGCnLa7W2hHv5ecSBR1huQrXCHu6pxd+g2HY2B7sKP5CXHMv4gHYqpIqu4ClOb7Q4tLKXMp9LyLUg==} peerDependencies: class-transformer: '*' class-validator: '*' @@ -2388,13 +2602,14 @@ packages: class-validator: optional: true - '@nestjs/core@10.4.15': - resolution: {integrity: sha512-UBejmdiYwaH6fTsz2QFBlC1cJHM+3UDeLZN+CiP9I1fRv2KlBZsmozGLbV5eS1JAVWJB4T5N5yQ0gjN8ZvcS2w==} + '@nestjs/core@11.0.11': + resolution: {integrity: sha512-jMH3jrjrPiaGrkQ5hANNcgDWN+j+hcM5GMQ3jSs4vOWNs3lmKHTVR11wJ9y5tTNnwKydzMogeju0VTUdfXDI5Q==} + engines: {node: '>= 20'} peerDependencies: - '@nestjs/common': ^10.0.0 - '@nestjs/microservices': ^10.0.0 - '@nestjs/platform-express': ^10.0.0 - '@nestjs/websockets': ^10.0.0 + '@nestjs/common': ^11.0.0 + '@nestjs/microservices': ^11.0.0 + '@nestjs/platform-express': ^11.0.0 + '@nestjs/websockets': ^11.0.0 reflect-metadata: ^0.1.12 || ^0.2.0 rxjs: ^7.1.0 peerDependenciesMeta: @@ -2405,17 +2620,17 @@ packages: '@nestjs/websockets': optional: true - '@nestjs/graphql@12.2.2': - resolution: {integrity: sha512-lUDy/1uqbRA1kBKpXcmY0aHhcPbfeG52Wg5+9Jzd1d57dwSjCAmuO+mWy5jz9ugopVCZeK0S/kdAMvA+r9fNdA==} + '@nestjs/graphql@13.0.3': + resolution: {integrity: sha512-2pwk7L00uPQADkO+FmzKGX9rMfyYh8FwVdT7iwEcVj5gR6NWB9XSSnaNp0hyK/+LmT+oei1DlwsduM7AVdkS0w==} peerDependencies: - '@apollo/subgraph': ^2.0.0 - '@nestjs/common': ^9.3.8 || ^10.0.0 - '@nestjs/core': ^9.3.8 || ^10.0.0 + '@apollo/subgraph': ^2.9.3 + '@nestjs/common': ^11.0.1 + '@nestjs/core': ^11.0.1 class-transformer: '*' class-validator: '*' - graphql: ^16.6.0 + graphql: ^16.10.0 reflect-metadata: ^0.1.13 || ^0.2.0 - ts-morph: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^24.0.0 + ts-morph: ^20.0.0 || ^21.0.0 || ^24.0.0 || ^25.0.0 peerDependenciesMeta: '@apollo/subgraph': optional: true @@ -2426,10 +2641,10 @@ packages: ts-morph: optional: true - '@nestjs/mapped-types@2.0.6': - resolution: {integrity: sha512-84ze+CPfp1OWdpRi1/lOu59hOhTz38eVzJvRKrg9ykRFwDz+XleKfMsG0gUqNZYFa6v53XYzeD+xItt8uDW7NQ==} + '@nestjs/mapped-types@2.1.0': + resolution: {integrity: sha512-W+n+rM69XsFdwORF11UqJahn4J3xi4g/ZEOlJNL6KoW5ygWSmBB2p0S2BZ4FQeS/NDH72e6xIcu35SfJnE8bXw==} peerDependencies: - '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + '@nestjs/common': ^10.0.0 || ^11.0.0 class-transformer: ^0.4.0 || ^0.5.0 class-validator: ^0.13.0 || ^0.14.0 reflect-metadata: ^0.1.12 || ^0.2.0 @@ -2445,13 +2660,13 @@ packages: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 passport: ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 - '@nestjs/platform-fastify@10.4.15': - resolution: {integrity: sha512-h1raWeoQEI3Q1wLOLDTbwpObFBMbdq22DlJNyTNY1pyNDyc5K99mnhFnk+eAiM/Di+pjewv5Nh2CzPUZIguA/g==} + '@nestjs/platform-fastify@11.0.11': + resolution: {integrity: sha512-Ts7jMc3GE35k8KMY8m7/qtc4/Zqo4BFSXsfUy646o+JeJSkUZOSofevxkkI2smhX6w9SKJzyfEpRHzMZNs/oRA==} peerDependencies: - '@fastify/static': ^6.0.0 || ^7.0.0 - '@fastify/view': ^7.0.0 || ^8.0.0 - '@nestjs/common': ^10.0.0 - '@nestjs/core': ^10.0.0 + '@fastify/static': ^8.0.0 + '@fastify/view': ^10.0.0 + '@nestjs/common': ^11.0.0 + '@nestjs/core': ^11.0.0 peerDependenciesMeta: '@fastify/static': optional: true @@ -2464,13 +2679,13 @@ packages: '@nestjs/common': ^10.0.0 || ^11.0.0 '@nestjs/core': ^10.0.0 || ^11.0.0 - '@nestjs/testing@10.4.15': - resolution: {integrity: sha512-eGlWESkACMKti+iZk1hs6FUY/UqObmMaa8HAN9JLnaYkoLf1Jeh+EuHlGnfqo/Rq77oznNLIyaA3PFjrFDlNUg==} + '@nestjs/testing@11.0.11': + resolution: {integrity: sha512-SoMIrhRpElV53btmGnEwpIQmXn2Xcztb9ae3lv+eVVnPHQuyB2zlgDIQVNjicbj7+3jdycX52KctOoj2eXEo1Q==} peerDependencies: - '@nestjs/common': ^10.0.0 - '@nestjs/core': ^10.0.0 - '@nestjs/microservices': ^10.0.0 - '@nestjs/platform-express': ^10.0.0 + '@nestjs/common': ^11.0.0 + '@nestjs/core': ^11.0.0 + '@nestjs/microservices': ^11.0.0 + '@nestjs/platform-express': ^11.0.0 peerDependenciesMeta: '@nestjs/microservices': optional: true @@ -2588,6 +2803,11 @@ packages: resolution: {integrity: sha512-dr7I7eZOoRLl4uxdxeL2dQsH0OrbEiVPIyBHnBpA4co24CBnoJoF+JINuP9l3PAM3IhUzc5JIVq3/YY3lEc3Hw==} engines: {node: '>=18.12.0'} + '@nuxt/opencollective@0.4.1': + resolution: {integrity: sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==} + engines: {node: ^14.18.0 || >=16.10.0, npm: '>=5.10.0'} + hasBin: true + '@nuxt/schema@3.15.4': resolution: {integrity: sha512-pAYZb/3ocSC/db1EFd5y+otmgHqUkvfxfhd9EknDB5DygnJuOIQNuGJ7LMJM6S2c0DYgBIHOdEelLxKHOjwbgQ==} engines: {node: ^14.18.0 || >=16.10.0} @@ -2606,11 +2826,6 @@ packages: '@nuxtjs/color-mode@3.5.2': resolution: {integrity: sha512-cC6RfgZh3guHBMLLjrBB2Uti5eUoGM9KyauOaYS9ETmxNWBMTvpgjvSiSJp1OFljIXPIqVTJ3xtJpSNZiO3ZaA==} - '@nuxtjs/opencollective@0.3.2': - resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} - engines: {node: '>=8.0.0', npm: '>=5.0.0'} - hasBin: true - '@nuxtjs/tailwindcss@6.13.1': resolution: {integrity: sha512-atL2SaPsxLfMTlXUQvr1UpDYdz6ocNOhH35H+t7M++g4r79QiQScJ7XuyyMR9AyBN19lkPA3nw7NXxazXmYxlA==} @@ -3909,6 +4124,12 @@ packages: '@vuedx/template-ast-types@0.7.1': resolution: {integrity: sha512-Mqugk/F0lFN2u9bhimH6G1kSu2hhLi2WoqgCVxrMvgxm2kDc30DtdvVGRq+UgEmKVP61OudcMtZqkUoGQeFBUQ==} + '@vuetify/loader-shared@2.1.0': + resolution: {integrity: sha512-dNE6Ceym9ijFsmJKB7YGW0cxs7xbYV8+1LjU6jd4P14xOt/ji4Igtgzt0rJFbxu+ZhAzqz853lhB0z8V9Dy9cQ==} + peerDependencies: + vue: ^3.0.0 + vuetify: ^3.0.0 + '@vueuse/components@12.7.0': resolution: {integrity: sha512-LbaKPOx9sTPRxI8ymJt3VCm2CifmC432yaXxCGbjkuKIh2jyNlXvE7sGrLm7kbC7WkBJnUXzm3K/cI1pIE8ueQ==} @@ -4355,8 +4576,8 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - avvio@8.4.0: - resolution: {integrity: sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==} + avvio@9.1.0: + resolution: {integrity: sha512-fYASnYi600CsH/j9EQov7lECAniYiBFiiAtBNuZYLA2leLe9qOvZzqYHFjtIj6gD2VMoMLP14834LFWvr4IfDw==} await-lock@2.2.2: resolution: {integrity: sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==} @@ -4649,10 +4870,6 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chokidar@4.0.1: - resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} - engines: {node: '>= 14.16.0'} - chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -4877,9 +5094,6 @@ packages: config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} - consola@2.15.3: - resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} - consola@3.4.0: resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -5045,10 +5259,6 @@ packages: cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - cookie-signature@1.2.2: - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} - engines: {node: '>=6.6.0'} - cookie@0.7.1: resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} engines: {node: '>= 0.6'} @@ -5836,6 +6046,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + esbuild@0.24.2: resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} engines: {node: '>=18'} @@ -6157,9 +6372,6 @@ packages: resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} engines: {'0': node >=0.6.0} - fast-content-type-parse@1.1.0: - resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} - fast-copy@3.0.2: resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} @@ -6175,10 +6387,6 @@ packages: fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -6189,8 +6397,8 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - fast-json-stringify@5.16.1: - resolution: {integrity: sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==} + fast-json-stringify@6.0.1: + resolution: {integrity: sha512-s7SJE83QKBZwg54dIbD5rCtzOBVD43V1ReWXXYqBgwCwHLYAAT0RQc/FmrQglXqWPpz6omtryJQOau5jI4Nrvg==} fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} @@ -6211,9 +6419,6 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-uri@2.4.0: - resolution: {integrity: sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==} - fast-uri@3.0.6: resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} @@ -6227,8 +6432,8 @@ packages: fastify-plugin@5.0.1: resolution: {integrity: sha512-HCxs+YnRaWzCl+cWRYFnHmeRFyR5GVnJTAaCJQiYzQSDwK9MgJdyAsuL3nh0EWRCYMgQ5MeziymvmAhUHYHDUQ==} - fastify@4.28.1: - resolution: {integrity: sha512-kFWUtpNr4i7t5vY2EJPCN2KgMVpuqfU4NjnJNCgiNB900oiDeYqaNDRcAfeBbOF5hGixixxcKnOU4KN9z6QncQ==} + fastify@5.2.1: + resolution: {integrity: sha512-rslrNBF67eg8/Gyn7P2URV8/6pz8kSAscFL4EThZJ8JBMaXacVdVE4hmUcnPNKERl5o/xTiBSLfdowBRhVF1WA==} fastq@1.19.0: resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} @@ -6291,8 +6496,8 @@ packages: resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} - find-my-way@8.2.2: - resolution: {integrity: sha512-Dobi7gcTEq8yszimcfp/R7+owiT4WncAJ7VTTgFH1jYJ5GaG1FbhjwDG820hptN0QDFvzVY3RfCzdInvGPGzjA==} + find-my-way@9.2.0: + resolution: {integrity: sha512-d3uCir8Hmg7W1Ywp8nKf2lJJYU9Nwinvo+1D39Dn09nz65UKXIxUh7j7K8zeWhxqe1WrkS7FJyON/Q/3lPoc6w==} engines: {node: '>=14'} find-node-modules@2.1.3: @@ -6689,12 +6894,6 @@ packages: peerDependencies: graphql: '>=0.8.0' - graphql-ws@5.16.0: - resolution: {integrity: sha512-Ju2RCU2dQMgSKtArPbEtsK5gNLnsQyTNIo/T7cZNp96niC1x0KdJNZV0TIoilceBPQwfb5itrGl8pkFeOUMl4A==} - engines: {node: '>=10'} - peerDependencies: - graphql: '>=0.11 <=16' - graphql-ws@5.16.2: resolution: {integrity: sha512-E1uccsZxt/96jH/OwmLPuXMACILs76pKF2i3W861LpKBCYtGIyPQGtWLuBLkND4ox1KHns70e83PS4te50nvPQ==} engines: {node: '>=10'} @@ -6717,6 +6916,22 @@ packages: ws: optional: true + graphql-ws@6.0.4: + resolution: {integrity: sha512-8b4OZtNOvv8+NZva8HXamrc0y1jluYC0+13gdh7198FKjVzXyTvVc95DCwGzaKEfn3YuWZxUqjJlHe3qKM/F2g==} + engines: {node: '>=20'} + peerDependencies: + '@fastify/websocket': ^10 || ^11 + graphql: ^15.10.1 || ^16 + uWebSockets.js: ^20 + ws: ^8 + peerDependenciesMeta: + '@fastify/websocket': + optional: true + uWebSockets.js: + optional: true + ws: + optional: true + graphql@14.7.0: resolution: {integrity: sha512-l0xWZpoPKpppFzMfvVyFmp9vLN7w/ZZJPefUicMCepfJeQ8sMcztloGYY9DfjVPo6tIUDzU5Hw3MUbIjj9AVVA==} engines: {node: '>= 6.x'} @@ -6975,6 +7190,9 @@ packages: import-meta-resolve@4.1.0: resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + importx@0.4.4: + resolution: {integrity: sha512-Lo1pukzAREqrBnnHC+tj+lreMTAvyxtkKsMxLY8H15M/bvLl54p3YuoTI70Tz7Il0AsgSlD7Lrk/FaApRcBL7w==} + impound@0.2.0: resolution: {integrity: sha512-gXgeSyp9Hf7qG2/PLKmywHXyQf2xFrw+mJGpoj9DsAB9L7/MIKn+DeEx98UryWXdmbv8wUUPdcQof6qXnZoCGg==} @@ -7045,6 +7263,10 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} + iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} @@ -7363,6 +7585,10 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true + jiti@2.0.0-beta.3: + resolution: {integrity: sha512-pmfRbVRs/7khFrSAYnSiJ8C0D5GvzkE4Ey2pAvUcJsw1ly/p+7ut27jbJrjY79BpAJQJ4gXYFtK6d1Aub+9baQ==} + hasBin: true + jiti@2.4.2: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true @@ -7448,8 +7674,8 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-ref-resolver@1.0.1: - resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} + json-schema-ref-resolver@2.0.1: + resolution: {integrity: sha512-HG0SIB9X4J8bwbxCbnd5FfPEbcXAJYTi1pBJeP/QPON+w8ovSME8iRG+ElHNxZNX2Qh6eYn1GdzJFS4cDFfx0Q==} json-schema-to-typescript-lite@14.1.0: resolution: {integrity: sha512-b8K6P3aiLgiYKYcHacgZKrwPXPyjekqRPV5vkNfBt0EoohcOSXEbcuGzgi6KQmsAhuy5Mh2KMxofXodRhMxURA==} @@ -7565,12 +7791,12 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - light-my-request@5.14.0: - resolution: {integrity: sha512-aORPWntbpH5esaYpGOOmri0OHDOe3wC5M2MQxZ9dvMLZm6DnaAn0kJlcbU9hwsQgLzmZyReKwFwwPkR+nHu5kA==} - light-my-request@6.3.0: resolution: {integrity: sha512-bWTAPJmeWQH5suJNYwG0f5cs0p6ho9e6f1Ppoxv5qMosY+s9Ir2+ZLvvHcgA7VTDop4zl/NCHhOVVqU+kd++Ow==} + light-my-request@6.6.0: + resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -7806,6 +8032,9 @@ packages: engines: {node: '>= 18'} hasBin: true + maska@2.1.11: + resolution: {integrity: sha512-IGqWjBnKxMYcVa06pb4mPfag9sJjnR2T15CdGfQ2llR3gajiSd4AxXCvNqHMEq9W3UBhjjTazgWumsP3sWrUSg==} + matcher@3.0.0: resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} engines: {node: '>=10'} @@ -7995,8 +8224,8 @@ packages: mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} - mnemonist@0.39.6: - resolution: {integrity: sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==} + mnemonist@0.40.0: + resolution: {integrity: sha512-kdd8AFNig2AD5Rkih7EPCXhu/iMvwevQFX/uEiGhZyPZi7fHqOoF4V4kHLpCfysxXMgQ4B52kdPMCwARshKvEg==} modify-values@1.0.1: resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} @@ -8597,12 +8826,13 @@ packages: path-to-regexp@0.1.12: resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} - path-to-regexp@3.3.0: - resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} - path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} + path-type@3.0.0: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} engines: {node: '>=4'} @@ -9061,9 +9291,6 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - process-warning@3.0.0: - resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} - process-warning@4.0.1: resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} @@ -9359,6 +9586,11 @@ packages: react: optional: true + reka-ui@2.0.2: + resolution: {integrity: sha512-pC2UF6Z+kJF96aJvIErhkSO4DJYIeq9pgvh3pntNqcZb3zFGMzw8h2uny+GnLX2CKiQV54kZNYXxecYIiPMGyg==} + peerDependencies: + vue: '>= 3.2.0' + relateurl@0.2.7: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} @@ -9451,8 +9683,8 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} - ret@0.4.3: - resolution: {integrity: sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==} + ret@0.5.0: + resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==} engines: {node: '>=10'} retry@0.13.1: @@ -9536,8 +9768,8 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} - safe-regex2@3.1.0: - resolution: {integrity: sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==} + safe-regex2@4.0.1: + resolution: {integrity: sha512-goqsB+bSlOmVX+CiFX2PFc1OV88j5jvBqIM+DgqrucHnUguAUNtiNOs+aTadq2NqsLQ+TQ3UEVG3gtSFcdlkCg==} safe-stable-stringify@2.5.0: resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} @@ -9579,6 +9811,9 @@ packages: secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + secure-json-parse@3.0.2: + resolution: {integrity: sha512-H6nS2o8bWfpFEV6U38sOSjS7bTbdgbCGU9wEM6W14P5H0QOsz94KCusifV44GpHDTu2nqZbuDNhTzu+mjDSw1w==} + sembear@0.7.0: resolution: {integrity: sha512-XyLTEich2D02FODCkfdto3mB9DetWPLuTzr4tvoofe9SvyM27h4nQSbV3+iVcYQz94AFyKtqBv5pcZbj3k2hdA==} @@ -10465,6 +10700,9 @@ packages: resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} engines: {node: '>=0.10.0'} + unconfig@0.5.5: + resolution: {integrity: sha512-VQZ5PT9HDX+qag0XdgQi8tJepPhXiR/yVOkn707gJDKo31lGjRilPREiQJ9Z6zd/Ugpv6ZvO5VxVIcatldYcNQ==} + uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} @@ -10628,6 +10866,10 @@ packages: unwasm@0.3.9: resolution: {integrity: sha512-LDxTx/2DkFURUd+BU1vUsF/moj0JsoTvl+2tcg2AUOiEzVturhGGx17/IMgGvKUYdZwr33EJHtChCJuhu9Ouvg==} + upath@2.0.1: + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} + engines: {node: '>=4'} + update-browserslist-db@1.1.2: resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} hasBin: true @@ -10671,10 +10913,6 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - uuid@11.0.3: - resolution: {integrity: sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==} - hasBin: true - uuid@11.1.0: resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true @@ -10813,6 +11051,14 @@ packages: peerDependencies: vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 + vite-plugin-vuetify@2.1.0: + resolution: {integrity: sha512-4wEAQtZaigPpwbFcZbrKpYwutOsWwWdeXn22B9XHzDPQNxVsKT+K9lKcXZnI5JESO1Iaql48S9rOk8RZZEt+Mw==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: '>=5' + vue: ^3.0.0 + vuetify: ^3.0.0 + vite-tsconfig-paths@5.1.4: resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} peerDependencies: @@ -11037,6 +11283,25 @@ packages: typescript: optional: true + vuetify-nuxt-module@0.18.3: + resolution: {integrity: sha512-Mv5mcqfqk5dR9oVJiITXn5p4NmDzp57AR2Txf/0iIoAjFlMsDWzTpUvn9ELTzDI3Z0LjiYVqptwxrOlMcju2Wg==} + + vuetify@3.7.14: + resolution: {integrity: sha512-L5oD0x3Wrp49Khp+16dRykAFUZq6WXqX7OHLTwXnyEliJ48ERC9WfEtN0YOuEIhor/b2IOZXl+11fs/m452/Lw==} + engines: {node: ^12.20 || >=14.13} + peerDependencies: + typescript: '>=4.7' + vite-plugin-vuetify: '>=1.0.0' + vue: ^3.3.0 + webpack-plugin-vuetify: '>=2.0.0' + peerDependenciesMeta: + typescript: + optional: true + vite-plugin-vuetify: + optional: true + webpack-plugin-vuetify: + optional: true + w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} @@ -11410,7 +11675,7 @@ snapshots: '@apollo/utils.logger': 2.0.1 graphql: 16.10.0 - '@apollo/server-plugin-landing-page-graphql-playground@4.0.0(@apollo/server@4.11.3(graphql@16.10.0))': + '@apollo/server-plugin-landing-page-graphql-playground@4.0.1(@apollo/server@4.11.3(graphql@16.10.0))': dependencies: '@apollo/server': 4.11.3(graphql@16.10.0) '@apollographql/graphql-playground-html': 1.6.29 @@ -11543,10 +11808,10 @@ snapshots: transitivePeerDependencies: - encoding - '@as-integrations/fastify@2.1.1(@apollo/server@4.11.3(graphql@16.10.0))(fastify@4.28.1)': + '@as-integrations/fastify@2.1.1(@apollo/server@4.11.3(graphql@16.10.0))(fastify@5.2.1)': dependencies: '@apollo/server': 4.11.3(graphql@16.10.0) - fastify: 4.28.1 + fastify: 5.2.1 fastify-plugin: 4.5.1 '@asamuzakjp/css-color@2.8.3': @@ -12172,66 +12437,99 @@ snapshots: esquery: 1.6.0 jsdoc-type-pratt-parser: 4.1.0 + '@esbuild/aix-ppc64@0.23.1': + optional: true + '@esbuild/aix-ppc64@0.24.2': optional: true '@esbuild/aix-ppc64@0.25.0': optional: true + '@esbuild/android-arm64@0.23.1': + optional: true + '@esbuild/android-arm64@0.24.2': optional: true '@esbuild/android-arm64@0.25.0': optional: true + '@esbuild/android-arm@0.23.1': + optional: true + '@esbuild/android-arm@0.24.2': optional: true '@esbuild/android-arm@0.25.0': optional: true + '@esbuild/android-x64@0.23.1': + optional: true + '@esbuild/android-x64@0.24.2': optional: true '@esbuild/android-x64@0.25.0': optional: true + '@esbuild/darwin-arm64@0.23.1': + optional: true + '@esbuild/darwin-arm64@0.24.2': optional: true '@esbuild/darwin-arm64@0.25.0': optional: true + '@esbuild/darwin-x64@0.23.1': + optional: true + '@esbuild/darwin-x64@0.24.2': optional: true '@esbuild/darwin-x64@0.25.0': optional: true + '@esbuild/freebsd-arm64@0.23.1': + optional: true + '@esbuild/freebsd-arm64@0.24.2': optional: true '@esbuild/freebsd-arm64@0.25.0': optional: true + '@esbuild/freebsd-x64@0.23.1': + optional: true + '@esbuild/freebsd-x64@0.24.2': optional: true '@esbuild/freebsd-x64@0.25.0': optional: true + '@esbuild/linux-arm64@0.23.1': + optional: true + '@esbuild/linux-arm64@0.24.2': optional: true '@esbuild/linux-arm64@0.25.0': optional: true + '@esbuild/linux-arm@0.23.1': + optional: true + '@esbuild/linux-arm@0.24.2': optional: true '@esbuild/linux-arm@0.25.0': optional: true + '@esbuild/linux-ia32@0.23.1': + optional: true + '@esbuild/linux-ia32@0.24.2': optional: true @@ -12241,36 +12539,54 @@ snapshots: '@esbuild/linux-loong64@0.14.54': optional: true + '@esbuild/linux-loong64@0.23.1': + optional: true + '@esbuild/linux-loong64@0.24.2': optional: true '@esbuild/linux-loong64@0.25.0': optional: true + '@esbuild/linux-mips64el@0.23.1': + optional: true + '@esbuild/linux-mips64el@0.24.2': optional: true '@esbuild/linux-mips64el@0.25.0': optional: true + '@esbuild/linux-ppc64@0.23.1': + optional: true + '@esbuild/linux-ppc64@0.24.2': optional: true '@esbuild/linux-ppc64@0.25.0': optional: true + '@esbuild/linux-riscv64@0.23.1': + optional: true + '@esbuild/linux-riscv64@0.24.2': optional: true '@esbuild/linux-riscv64@0.25.0': optional: true + '@esbuild/linux-s390x@0.23.1': + optional: true + '@esbuild/linux-s390x@0.24.2': optional: true '@esbuild/linux-s390x@0.25.0': optional: true + '@esbuild/linux-x64@0.23.1': + optional: true + '@esbuild/linux-x64@0.24.2': optional: true @@ -12283,42 +12599,63 @@ snapshots: '@esbuild/netbsd-arm64@0.25.0': optional: true + '@esbuild/netbsd-x64@0.23.1': + optional: true + '@esbuild/netbsd-x64@0.24.2': optional: true '@esbuild/netbsd-x64@0.25.0': optional: true + '@esbuild/openbsd-arm64@0.23.1': + optional: true + '@esbuild/openbsd-arm64@0.24.2': optional: true '@esbuild/openbsd-arm64@0.25.0': optional: true + '@esbuild/openbsd-x64@0.23.1': + optional: true + '@esbuild/openbsd-x64@0.24.2': optional: true '@esbuild/openbsd-x64@0.25.0': optional: true + '@esbuild/sunos-x64@0.23.1': + optional: true + '@esbuild/sunos-x64@0.24.2': optional: true '@esbuild/sunos-x64@0.25.0': optional: true + '@esbuild/win32-arm64@0.23.1': + optional: true + '@esbuild/win32-arm64@0.24.2': optional: true '@esbuild/win32-arm64@0.25.0': optional: true + '@esbuild/win32-ia32@0.23.1': + optional: true + '@esbuild/win32-ia32@0.24.2': optional: true '@esbuild/win32-ia32@0.25.0': optional: true + '@esbuild/win32-x64@0.23.1': + optional: true + '@esbuild/win32-x64@0.24.2': optional: true @@ -12428,49 +12765,56 @@ snapshots: '@eslint/core': 0.12.0 levn: 0.4.1 - '@fastify/ajv-compiler@3.6.0': + '@fastify/ajv-compiler@4.0.2': dependencies: ajv: 8.17.1 - ajv-formats: 2.1.1(ajv@8.17.1) - fast-uri: 2.4.0 + ajv-formats: 3.0.1(ajv@8.17.1) + fast-uri: 3.0.6 - '@fastify/cookie@9.4.0': + '@fastify/cookie@11.0.2': dependencies: - cookie-signature: 1.2.2 - fastify-plugin: 4.5.1 + cookie: 1.0.2 + fastify-plugin: 5.0.1 - '@fastify/cors@9.0.1': + '@fastify/cors@11.0.0': dependencies: - fastify-plugin: 4.5.1 - mnemonist: 0.39.6 + fastify-plugin: 5.0.1 + mnemonist: 0.40.0 - '@fastify/error@3.4.1': {} + '@fastify/error@4.0.0': {} - '@fastify/fast-json-stringify-compiler@4.3.0': + '@fastify/fast-json-stringify-compiler@5.0.2': dependencies: - fast-json-stringify: 5.16.1 + fast-json-stringify: 6.0.1 - '@fastify/formbody@7.4.0': + '@fastify/formbody@8.0.2': dependencies: fast-querystring: 1.1.2 - fastify-plugin: 4.5.1 + fastify-plugin: 5.0.1 + + '@fastify/forwarded@3.0.0': {} '@fastify/helmet@13.0.1': dependencies: fastify-plugin: 5.0.1 helmet: 8.0.0 - '@fastify/merge-json-schemas@0.1.1': + '@fastify/merge-json-schemas@0.2.1': dependencies: - fast-deep-equal: 3.1.3 + dequal: 2.0.3 - '@fastify/middie@8.3.3': + '@fastify/middie@9.0.3': dependencies: - '@fastify/error': 3.4.1 - fastify-plugin: 4.5.1 - path-to-regexp: 6.3.0 + '@fastify/error': 4.0.0 + fastify-plugin: 5.0.1 + path-to-regexp: 8.2.0 reusify: 1.0.4 + '@fastify/proxy-addr@5.0.0': + dependencies: + '@fastify/forwarded': 3.0.0 + ipaddr.js: 2.2.0 + '@fig/complete-commander@3.2.0(commander@11.1.0)': dependencies: commander: 11.1.0 @@ -12496,10 +12840,10 @@ snapshots: - '@vue/composition-api' - vue - '@golevelup/nestjs-discovery@4.0.3(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))': + '@golevelup/nestjs-discovery@4.0.3(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))': dependencies: - '@nestjs/common': 10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2) - '@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/common': 11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) lodash: 4.17.21 '@graphql-codegen/add@3.2.3(graphql@16.10.0)': @@ -12947,7 +13291,7 @@ snapshots: graphql: 16.10.0 tslib: 2.8.1 - '@graphql-tools/merge@9.0.11(graphql@16.10.0)': + '@graphql-tools/merge@9.0.19(graphql@16.10.0)': dependencies: '@graphql-tools/utils': 10.8.2(graphql@16.10.0) graphql: 16.10.0 @@ -13016,13 +13360,12 @@ snapshots: transitivePeerDependencies: - encoding - '@graphql-tools/schema@10.0.10(graphql@16.10.0)': + '@graphql-tools/schema@10.0.18(graphql@16.10.0)': dependencies: '@graphql-tools/merge': 9.0.20(graphql@16.10.0) '@graphql-tools/utils': 10.8.2(graphql@16.10.0) graphql: 16.10.0 tslib: 2.8.1 - value-or-promise: 1.0.12 '@graphql-tools/schema@10.0.19(graphql@16.10.0)': dependencies: @@ -13060,7 +13403,7 @@ snapshots: - uWebSockets.js - utf-8-validate - '@graphql-tools/utils@10.6.1(graphql@16.10.0)': + '@graphql-tools/utils@10.8.1(graphql@16.10.0)': dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.10.0) cross-inspect: 1.0.1 @@ -13214,6 +13557,37 @@ snapshots: '@jsdevtools/ono@7.1.3': {} + '@jsonforms/core@3.5.1': + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + lodash: 4.17.21 + + '@jsonforms/vue-vanilla@3.5.1(@jsonforms/core@3.5.1)(@jsonforms/vue@3.5.1(@jsonforms/core@3.5.1)(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@jsonforms/core': 3.5.1 + '@jsonforms/vue': 3.5.1(@jsonforms/core@3.5.1)(vue@3.5.13(typescript@5.7.3)) + lodash: 4.17.21 + vue: 3.5.13(typescript@5.7.3) + + '@jsonforms/vue-vuetify@3.5.1(@jsonforms/core@3.5.1)(@jsonforms/vue@3.5.1(@jsonforms/core@3.5.1)(vue@3.5.13(typescript@5.7.3)))(ajv@8.17.1)(dayjs@1.11.13)(lodash@4.17.21)(maska@2.1.11)(vue@3.5.13(typescript@5.7.3))(vuetify@3.7.14)': + dependencies: + '@jsonforms/core': 3.5.1 + '@jsonforms/vue': 3.5.1(@jsonforms/core@3.5.1)(vue@3.5.13(typescript@5.7.3)) + ajv: 8.17.1 + dayjs: 1.11.13 + lodash: 4.17.21 + maska: 2.1.11 + vue: 3.5.13(typescript@5.7.3) + vuetify: 3.7.14(typescript@5.7.3)(vite-plugin-vuetify@2.1.0)(vue@3.5.13(typescript@5.7.3)) + + '@jsonforms/vue@3.5.1(@jsonforms/core@3.5.1)(vue@3.5.13(typescript@5.7.3))': + dependencies: + '@jsonforms/core': 3.5.1 + lodash: 4.17.21 + vue: 3.5.13(typescript@5.7.3) + '@koa/router@12.0.2': dependencies: debug: 4.4.0(supports-color@9.4.0) @@ -13317,21 +13691,21 @@ snapshots: '@microsoft/tsdoc@0.14.2': {} - '@nestjs/apollo@12.2.2(@apollo/server@4.11.3(graphql@16.10.0))(@as-integrations/fastify@2.1.1(@apollo/server@4.11.3(graphql@16.10.0))(fastify@4.28.1))(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/graphql@12.2.2(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(graphql@16.10.0)(reflect-metadata@0.1.14))(graphql@16.10.0)': + '@nestjs/apollo@13.0.3(@apollo/server@4.11.3(graphql@16.10.0))(@as-integrations/fastify@2.1.1(@apollo/server@4.11.3(graphql@16.10.0))(fastify@5.2.1))(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/graphql@13.0.3(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(graphql@16.10.0)(reflect-metadata@0.1.14))(graphql@16.10.0)': dependencies: '@apollo/server': 4.11.3(graphql@16.10.0) - '@apollo/server-plugin-landing-page-graphql-playground': 4.0.0(@apollo/server@4.11.3(graphql@16.10.0)) - '@nestjs/common': 10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2) - '@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) - '@nestjs/graphql': 12.2.2(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(graphql@16.10.0)(reflect-metadata@0.1.14) + '@apollo/server-plugin-landing-page-graphql-playground': 4.0.1(@apollo/server@4.11.3(graphql@16.10.0)) + '@nestjs/common': 11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/graphql': 13.0.3(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(graphql@16.10.0)(reflect-metadata@0.1.14) graphql: 16.10.0 iterall: 1.3.0 lodash.omit: 4.5.0 tslib: 2.8.1 optionalDependencies: - '@as-integrations/fastify': 2.1.1(@apollo/server@4.11.3(graphql@16.10.0))(fastify@4.28.1) + '@as-integrations/fastify': 2.1.1(@apollo/server@4.11.3(graphql@16.10.0))(fastify@5.2.1) - '@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2)': + '@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2)': dependencies: iterare: 1.2.1 reflect-metadata: 0.1.14 @@ -13339,82 +13713,82 @@ snapshots: tslib: 2.8.1 uid: 2.0.2 - '@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2)': + '@nestjs/core@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2)': dependencies: - '@nestjs/common': 10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2) - '@nuxtjs/opencollective': 0.3.2 + '@nestjs/common': 11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nuxt/opencollective': 0.4.1 fast-safe-stringify: 2.1.1 iterare: 1.2.1 - path-to-regexp: 3.3.0 + path-to-regexp: 8.2.0 reflect-metadata: 0.1.14 rxjs: 7.8.2 tslib: 2.8.1 uid: 2.0.2 - transitivePeerDependencies: - - encoding - '@nestjs/graphql@12.2.2(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(graphql@16.10.0)(reflect-metadata@0.1.14)': + '@nestjs/graphql@13.0.3(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(graphql@16.10.0)(reflect-metadata@0.1.14)': dependencies: - '@graphql-tools/merge': 9.0.11(graphql@16.10.0) - '@graphql-tools/schema': 10.0.10(graphql@16.10.0) - '@graphql-tools/utils': 10.6.1(graphql@16.10.0) - '@nestjs/common': 10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2) - '@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) - '@nestjs/mapped-types': 2.0.6(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14) - chokidar: 4.0.1 - fast-glob: 3.3.2 + '@graphql-tools/merge': 9.0.19(graphql@16.10.0) + '@graphql-tools/schema': 10.0.18(graphql@16.10.0) + '@graphql-tools/utils': 10.8.1(graphql@16.10.0) + '@nestjs/common': 11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/mapped-types': 2.1.0(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14) + chokidar: 4.0.3 + fast-glob: 3.3.3 graphql: 16.10.0 graphql-tag: 2.12.6(graphql@16.10.0) - graphql-ws: 5.16.0(graphql@16.10.0) + graphql-ws: 6.0.4(graphql@16.10.0)(ws@8.18.0) lodash: 4.17.21 normalize-path: 3.0.0 reflect-metadata: 0.1.14 subscriptions-transport-ws: 0.11.0(graphql@16.10.0) tslib: 2.8.1 - uuid: 11.0.3 ws: 8.18.0 transitivePeerDependencies: + - '@fastify/websocket' - bufferutil + - uWebSockets.js - utf-8-validate - '@nestjs/mapped-types@2.0.6(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)': + '@nestjs/mapped-types@2.1.0(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)': dependencies: - '@nestjs/common': 10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/common': 11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2) reflect-metadata: 0.1.14 - '@nestjs/passport@10.0.3(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(passport@0.7.0)': + '@nestjs/passport@10.0.3(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(passport@0.7.0)': dependencies: - '@nestjs/common': 10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/common': 11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2) passport: 0.7.0 - '@nestjs/platform-fastify@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))': + '@nestjs/platform-fastify@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))': dependencies: - '@fastify/cors': 9.0.1 - '@fastify/formbody': 7.4.0 - '@fastify/middie': 8.3.3 - '@nestjs/common': 10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2) - '@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) - fastify: 4.28.1 - light-my-request: 6.3.0 - path-to-regexp: 3.3.0 + '@fastify/cors': 11.0.0 + '@fastify/formbody': 8.0.2 + '@fastify/middie': 9.0.3 + '@nestjs/common': 11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) + fast-querystring: 1.1.2 + fastify: 5.2.1 + light-my-request: 6.6.0 + path-to-regexp: 8.2.0 tslib: 2.8.1 - '@nestjs/schedule@5.0.1(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))': + '@nestjs/schedule@5.0.1(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))': dependencies: - '@nestjs/common': 10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2) - '@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/common': 11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) cron: 3.5.0 - '@nestjs/testing@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))': + '@nestjs/testing@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))': dependencies: - '@nestjs/common': 10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2) - '@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/common': 11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) tslib: 2.8.1 - '@nestjs/throttler@6.4.0(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)': + '@nestjs/throttler@6.4.0(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)': dependencies: - '@nestjs/common': 10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2) - '@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/common': 11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) reflect-metadata: 0.1.14 '@netlify/functions@2.8.2': @@ -13703,6 +14077,10 @@ snapshots: - magicast - supports-color + '@nuxt/opencollective@0.4.1': + dependencies: + consola: 3.4.0 + '@nuxt/schema@3.15.4': dependencies: consola: 3.4.0 @@ -13798,14 +14176,6 @@ snapshots: - magicast - supports-color - '@nuxtjs/opencollective@0.3.2': - dependencies: - chalk: 4.1.2 - consola: 2.15.3 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - '@nuxtjs/tailwindcss@6.13.1(magicast@0.3.5)': dependencies: '@nuxt/kit': 3.15.4(magicast@0.3.5) @@ -15423,6 +15793,12 @@ snapshots: dependencies: '@vue/compiler-core': 3.5.13 + '@vuetify/loader-shared@2.1.0(vue@3.5.13(typescript@5.7.3))(vuetify@3.7.14)': + dependencies: + upath: 2.0.1 + vue: 3.5.13(typescript@5.7.3) + vuetify: 3.7.14(typescript@5.7.3)(vite-plugin-vuetify@2.1.0)(vue@3.5.13(typescript@5.7.3)) + '@vueuse/components@12.7.0(typescript@5.7.3)': dependencies: '@vueuse/core': 12.7.0(typescript@5.7.3) @@ -15891,9 +16267,9 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - avvio@8.4.0: + avvio@9.1.0: dependencies: - '@fastify/error': 3.4.1 + '@fastify/error': 4.0.0 fastq: 1.19.0 await-lock@2.2.2: {} @@ -16062,6 +16438,11 @@ snapshots: dependencies: run-applescript: 7.0.0 + bundle-require@5.1.0(esbuild@0.23.1): + dependencies: + esbuild: 0.23.1 + load-tsconfig: 0.2.5 + bundle-require@5.1.0(esbuild@0.24.2): dependencies: esbuild: 0.24.2 @@ -16289,10 +16670,6 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chokidar@4.0.1: - dependencies: - readdirp: 4.1.1 - chokidar@4.0.3: dependencies: readdirp: 4.1.1 @@ -16496,8 +16873,6 @@ snapshots: ini: 1.3.8 proto-list: 1.2.4 - consola@2.15.3: {} - consola@3.4.0: {} constant-case@3.0.4: @@ -16710,8 +17085,6 @@ snapshots: cookie-signature@1.0.6: {} - cookie-signature@1.2.2: {} - cookie@0.7.1: {} cookie@1.0.2: {} @@ -17502,6 +17875,33 @@ snapshots: esbuild-windows-64: 0.14.54 esbuild-windows-arm64: 0.14.54 + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + esbuild@0.24.2: optionalDependencies: '@esbuild/aix-ppc64': 0.24.2 @@ -18048,8 +18448,6 @@ snapshots: extsprintf@1.3.0: {} - fast-content-type-parse@1.1.0: {} - fast-copy@3.0.2: {} fast-decode-uri-component@1.0.1: {} @@ -18060,14 +18458,6 @@ snapshots: fast-fifo@1.3.2: {} - fast-glob@3.3.2: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -18080,14 +18470,13 @@ snapshots: fast-json-stable-stringify@2.1.0: {} - fast-json-stringify@5.16.1: + fast-json-stringify@6.0.1: dependencies: - '@fastify/merge-json-schemas': 0.1.1 + '@fastify/merge-json-schemas': 0.2.1 ajv: 8.17.1 ajv-formats: 3.0.1(ajv@8.17.1) - fast-deep-equal: 3.1.3 - fast-uri: 2.4.0 - json-schema-ref-resolver: 1.0.1 + fast-uri: 3.0.6 + json-schema-ref-resolver: 2.0.1 rfdc: 1.4.1 fast-levenshtein@2.0.6: {} @@ -18104,8 +18493,6 @@ snapshots: fast-safe-stringify@2.1.1: {} - fast-uri@2.4.0: {} - fast-uri@3.0.6: {} fast-xml-parser@4.5.1: @@ -18116,22 +18503,21 @@ snapshots: fastify-plugin@5.0.1: {} - fastify@4.28.1: + fastify@5.2.1: dependencies: - '@fastify/ajv-compiler': 3.6.0 - '@fastify/error': 3.4.1 - '@fastify/fast-json-stringify-compiler': 4.3.0 + '@fastify/ajv-compiler': 4.0.2 + '@fastify/error': 4.0.0 + '@fastify/fast-json-stringify-compiler': 5.0.2 + '@fastify/proxy-addr': 5.0.0 abstract-logging: 2.0.1 - avvio: 8.4.0 - fast-content-type-parse: 1.1.0 - fast-json-stringify: 5.16.1 - find-my-way: 8.2.2 - light-my-request: 5.14.0 + avvio: 9.1.0 + fast-json-stringify: 6.0.1 + find-my-way: 9.2.0 + light-my-request: 6.3.0 pino: 9.6.0 - process-warning: 3.0.0 - proxy-addr: 2.0.7 + process-warning: 4.0.1 rfdc: 1.4.1 - secure-json-parse: 2.7.0 + secure-json-parse: 3.0.2 semver: 7.7.1 toad-cache: 3.7.0 @@ -18206,11 +18592,11 @@ snapshots: transitivePeerDependencies: - supports-color - find-my-way@8.2.2: + find-my-way@9.2.0: dependencies: fast-deep-equal: 3.1.3 fast-querystring: 1.1.2 - safe-regex2: 3.1.0 + safe-regex2: 4.0.1 find-node-modules@2.1.3: dependencies: @@ -18683,10 +19069,6 @@ snapshots: dependencies: graphql: 16.10.0 - graphql-ws@5.16.0(graphql@16.10.0): - dependencies: - graphql: 16.10.0 - graphql-ws@5.16.2(graphql@16.10.0): dependencies: graphql: 16.10.0 @@ -18697,6 +19079,12 @@ snapshots: optionalDependencies: ws: 8.18.1 + graphql-ws@6.0.4(graphql@16.10.0)(ws@8.18.0): + dependencies: + graphql: 16.10.0 + optionalDependencies: + ws: 8.18.0 + graphql@14.7.0: dependencies: iterall: 1.3.0 @@ -18834,14 +19222,14 @@ snapshots: html-tags@3.3.1: {} - html-webpack-plugin@5.5.3(webpack@5.98.0(esbuild@0.24.2)): + html-webpack-plugin@5.5.3(webpack@5.98.0(esbuild@0.23.1)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.98.0(esbuild@0.24.2) + webpack: 5.98.0(esbuild@0.23.1) htmlparser2@6.1.0: dependencies: @@ -18976,6 +19364,18 @@ snapshots: import-meta-resolve@4.1.0: optional: true + importx@0.4.4: + dependencies: + bundle-require: 5.1.0(esbuild@0.23.1) + debug: 4.4.0(supports-color@9.4.0) + esbuild: 0.23.1 + jiti: 2.0.0-beta.3 + jiti-v1: jiti@1.21.7 + pathe: 1.1.2 + tsx: 4.19.3 + transitivePeerDependencies: + - supports-color + impound@0.2.0(rollup@4.34.6): dependencies: '@rollup/pluginutils': 5.1.4(rollup@4.34.6) @@ -19078,6 +19478,8 @@ snapshots: ipaddr.js@1.9.1: {} + ipaddr.js@2.2.0: {} + iron-webcrypto@1.2.1: {} is-absolute@1.0.0: @@ -19372,6 +19774,8 @@ snapshots: jiti@1.21.7: {} + jiti@2.0.0-beta.3: {} + jiti@2.4.2: {} jju@1.4.0: {} @@ -19455,9 +19859,9 @@ snapshots: json-parse-even-better-errors@2.3.1: {} - json-schema-ref-resolver@1.0.1: + json-schema-ref-resolver@2.0.1: dependencies: - fast-deep-equal: 3.1.3 + dequal: 2.0.3 json-schema-to-typescript-lite@14.1.0: dependencies: @@ -19597,13 +20001,13 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - light-my-request@5.14.0: + light-my-request@6.3.0: dependencies: - cookie: 0.7.1 - process-warning: 3.0.0 + cookie: 1.0.2 + process-warning: 4.0.1 set-cookie-parser: 2.7.1 - light-my-request@6.3.0: + light-my-request@6.6.0: dependencies: cookie: 1.0.2 process-warning: 4.0.1 @@ -19824,6 +20228,8 @@ snapshots: marked@12.0.2: {} + maska@2.1.11: {} + matcher@3.0.0: dependencies: escape-string-regexp: 4.0.0 @@ -19990,7 +20396,7 @@ snapshots: pkg-types: 1.3.1 ufo: 1.5.4 - mnemonist@0.39.6: + mnemonist@0.40.0: dependencies: obliterator: 2.0.5 @@ -20052,20 +20458,20 @@ snapshots: neo-async@2.6.2: {} - nest-authz@2.14.0(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2): + nest-authz@2.14.0(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2): dependencies: - '@nestjs/common': 10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2) - '@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/common': 11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) casbin: 5.38.0 reflect-metadata: 0.1.14 rxjs: 7.8.2 - nest-commander@3.16.0(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(@types/inquirer@8.2.10)(typescript@5.7.3): + nest-commander@3.16.0(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2))(@types/inquirer@8.2.10)(typescript@5.7.3): dependencies: '@fig/complete-commander': 3.2.0(commander@11.1.0) - '@golevelup/nestjs-discovery': 4.0.3(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2)) - '@nestjs/common': 10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2) - '@nestjs/core': 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@golevelup/nestjs-discovery': 4.0.3(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2)) + '@nestjs/common': 11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/core': 11.0.11(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) '@types/inquirer': 8.2.10 commander: 11.1.0 cosmiconfig: 8.3.6(typescript@5.7.3) @@ -20073,9 +20479,9 @@ snapshots: transitivePeerDependencies: - typescript - nestjs-pino@4.3.0(@nestjs/common@10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2))(pino-http@10.4.0): + nestjs-pino@4.3.0(@nestjs/common@11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2))(pino-http@10.4.0): dependencies: - '@nestjs/common': 10.4.15(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/common': 11.0.11(reflect-metadata@0.1.14)(rxjs@7.8.2) pino-http: 10.4.0 netmask@2.0.2: {} @@ -20304,12 +20710,12 @@ snapshots: nullthrows@1.1.1: {} - nuxt-custom-elements@2.0.0-beta.18(webpack@5.98.0(esbuild@0.24.2)): + nuxt-custom-elements@2.0.0-beta.18(webpack@5.98.0(esbuild@0.23.1)): dependencies: change-case: 4.1.2 clone: 2.1.2 defu: 6.1.2 - html-webpack-plugin: 5.5.3(webpack@5.98.0(esbuild@0.24.2)) + html-webpack-plugin: 5.5.3(webpack@5.98.0(esbuild@0.23.1)) webpack-bundle-analyzer: 4.9.0 transitivePeerDependencies: - bufferutil @@ -20832,10 +21238,10 @@ snapshots: path-to-regexp@0.1.12: {} - path-to-regexp@3.3.0: {} - path-to-regexp@6.3.0: {} + path-to-regexp@8.2.0: {} + path-type@3.0.0: dependencies: pify: 3.0.0 @@ -21284,8 +21690,6 @@ snapshots: process-nextick-args@2.0.1: {} - process-warning@3.0.0: {} - process-warning@4.0.1: {} process@0.11.10: {} @@ -21649,6 +22053,23 @@ snapshots: '@types/react': 19.0.8 react: 19.0.0 + reka-ui@2.0.2(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)): + dependencies: + '@floating-ui/dom': 1.6.13 + '@floating-ui/vue': 1.1.6(vue@3.5.13(typescript@5.7.3)) + '@internationalized/date': 3.7.0 + '@internationalized/number': 3.6.0 + '@tanstack/vue-virtual': 3.13.0(vue@3.5.13(typescript@5.7.3)) + '@vueuse/core': 12.7.0(typescript@5.7.3) + '@vueuse/shared': 12.7.0(typescript@5.7.3) + aria-hidden: 1.2.4 + defu: 6.1.4 + ohash: 1.1.4 + vue: 3.5.13(typescript@5.7.3) + transitivePeerDependencies: + - '@vue/composition-api' + - typescript + relateurl@0.2.7: {} relay-runtime@12.0.0: @@ -21763,7 +22184,7 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 - ret@0.4.3: {} + ret@0.5.0: {} retry@0.13.1: {} @@ -21861,9 +22282,9 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 - safe-regex2@3.1.0: + safe-regex2@4.0.1: dependencies: - ret: 0.4.3 + ret: 0.5.0 safe-stable-stringify@2.5.0: {} @@ -21900,6 +22321,8 @@ snapshots: secure-json-parse@2.7.0: {} + secure-json-parse@3.0.2: {} + sembear@0.7.0: dependencies: semver: 7.7.1 @@ -22586,16 +23009,16 @@ snapshots: mkdirp: 3.0.1 yallist: 5.0.0 - terser-webpack-plugin@5.3.11(esbuild@0.24.2)(webpack@5.98.0(esbuild@0.24.2)): + terser-webpack-plugin@5.3.11(esbuild@0.23.1)(webpack@5.98.0(esbuild@0.23.1)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 4.3.0 serialize-javascript: 6.0.2 terser: 5.39.0 - webpack: 5.98.0(esbuild@0.24.2) + webpack: 5.98.0(esbuild@0.23.1) optionalDependencies: - esbuild: 0.24.2 + esbuild: 0.23.1 terser@5.39.0: dependencies: @@ -22879,6 +23302,14 @@ snapshots: unc-path-regex@0.1.2: {} + unconfig@0.5.5: + dependencies: + '@antfu/utils': 0.7.10 + defu: 6.1.4 + importx: 0.4.4 + transitivePeerDependencies: + - supports-color + uncrypto@0.1.3: {} unctx@2.4.1: @@ -23075,6 +23506,8 @@ snapshots: pkg-types: 1.3.1 unplugin: 1.16.1 + upath@2.0.1: {} + update-browserslist-db@1.1.2(browserslist@4.24.4): dependencies: browserslist: 4.24.4 @@ -23117,8 +23550,6 @@ snapshots: utils-merge@1.0.1: {} - uuid@11.0.3: {} - uuid@11.1.0: {} uuid@3.4.0: {} @@ -23306,6 +23737,17 @@ snapshots: transitivePeerDependencies: - supports-color + vite-plugin-vuetify@2.1.0(vite@6.1.1(@types/node@22.13.4)(jiti@2.4.2)(stylus@0.57.0)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))(vuetify@3.7.14): + dependencies: + '@vuetify/loader-shared': 2.1.0(vue@3.5.13(typescript@5.7.3))(vuetify@3.7.14) + debug: 4.4.0(supports-color@9.4.0) + upath: 2.0.1 + vite: 6.1.1(@types/node@22.13.4)(jiti@2.4.2)(stylus@0.57.0)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) + vue: 3.5.13(typescript@5.7.3) + vuetify: 3.7.14(typescript@5.7.3)(vite-plugin-vuetify@2.1.0)(vue@3.5.13(typescript@5.7.3)) + transitivePeerDependencies: + - supports-color + vite-tsconfig-paths@5.1.4(typescript@5.7.3)(vite@6.1.1(@types/node@22.13.4)(jiti@2.4.2)(stylus@0.57.0)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)): dependencies: debug: 4.4.0(supports-color@9.4.0) @@ -23581,6 +24023,34 @@ snapshots: optionalDependencies: typescript: 5.7.3 + vuetify-nuxt-module@0.18.3(magicast@0.3.5)(typescript@5.7.3)(vite@6.1.1(@types/node@22.13.4)(jiti@2.4.2)(stylus@0.57.0)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)): + dependencies: + '@nuxt/kit': 3.15.4(magicast@0.3.5) + defu: 6.1.4 + destr: 2.0.3 + local-pkg: 0.5.1 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + ufo: 1.5.4 + unconfig: 0.5.5 + upath: 2.0.1 + vite-plugin-vuetify: 2.1.0(vite@6.1.1(@types/node@22.13.4)(jiti@2.4.2)(stylus@0.57.0)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))(vuetify@3.7.14) + vuetify: 3.7.14(typescript@5.7.3)(vite-plugin-vuetify@2.1.0)(vue@3.5.13(typescript@5.7.3)) + transitivePeerDependencies: + - magicast + - supports-color + - typescript + - vite + - vue + - webpack-plugin-vuetify + + vuetify@3.7.14(typescript@5.7.3)(vite-plugin-vuetify@2.1.0)(vue@3.5.13(typescript@5.7.3)): + dependencies: + vue: 3.5.13(typescript@5.7.3) + optionalDependencies: + typescript: 5.7.3 + vite-plugin-vuetify: 2.1.0(vite@6.1.1(@types/node@22.13.4)(jiti@2.4.2)(stylus@0.57.0)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3))(vuetify@3.7.14) + w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 @@ -23620,7 +24090,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.98.0(esbuild@0.24.2): + webpack@5.98.0(esbuild@0.23.1): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.6 @@ -23642,7 +24112,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.11(esbuild@0.24.2)(webpack@5.98.0(esbuild@0.24.2)) + terser-webpack-plugin: 5.3.11(esbuild@0.23.1)(webpack@5.98.0(esbuild@0.23.1)) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: diff --git a/unraid-ui/package.json b/unraid-ui/package.json index 799169001..13cb912ac 100644 --- a/unraid-ui/package.json +++ b/unraid-ui/package.json @@ -40,12 +40,17 @@ "dependencies": { "@headlessui/vue": "^1.7.23", "@heroicons/vue": "^2.2.0", + "@internationalized/number": "^3.6.0", + "@jsonforms/core": "^3.5.1", + "@jsonforms/vue": "^3.5.1", + "@jsonforms/vue-vanilla": "^3.5.1", "@vueuse/core": "^12.0.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "kebab-case": "^2.0.1", "lucide-vue-next": "^0.475.0", "radix-vue": "^1.9.13", + "reka-ui": "^2.0.2", "shadcn-vue": "^0.11.3", "tailwind-merge": "^2.6.0", "vue-sonner": "^1.3.0" @@ -81,7 +86,7 @@ "tailwind-rem-to-rem": "github:unraid/tailwind-rem-to-rem", "tailwindcss": "^3.0.0", "tailwindcss-animate": "^1.0.7", - "typescript": "^5.0.0", + "typescript": "^5.7.3", "vite": "^6.0.0", "vite-plugin-dts": "^3.0.0", "vite-plugin-vue-devtools": "^7.7.1", diff --git a/unraid-ui/src/components/brand/BrandButton.vue b/unraid-ui/src/components/brand/BrandButton.vue index a5536d803..54f5dfb69 100644 --- a/unraid-ui/src/components/brand/BrandButton.vue +++ b/unraid-ui/src/components/brand/BrandButton.vue @@ -1,12 +1,12 @@