diff --git a/apps/api-gql/internal/gql/resolvers/overlays.resolver.go b/apps/api-gql/internal/gql/resolvers/overlays.resolver.go index c397806f3..209a0c522 100644 --- a/apps/api-gql/internal/gql/resolvers/overlays.resolver.go +++ b/apps/api-gql/internal/gql/resolvers/overlays.resolver.go @@ -14,22 +14,42 @@ import ( ) // ChatOverlayUpdate is the resolver for the chatOverlayUpdate field. -func (r *mutationResolver) ChatOverlayUpdate(ctx context.Context, opts gqlmodel.ChatOverlayUpdateOpts) (bool, error) { +func (r *mutationResolver) ChatOverlayUpdate( + ctx context.Context, + opts gqlmodel.ChatOverlayUpdateOpts, +) (bool, error) { return r.updateChatOverlay(ctx, opts) } -// ChatOverlay is the resolver for the chatOverlay field. -func (r *queryResolver) ChatOverlay(ctx context.Context) (*gqlmodel.ChatOverlay, error) { +// ChatOverlays is the resolver for the chatOverlays field. +func (r *queryResolver) ChatOverlays(ctx context.Context) ([]gqlmodel.ChatOverlay, error) { + overlays, err := r.chatOverlays(ctx) + if err != nil { + return nil, err + } + + return overlays, nil +} + +// ChatOverlaysByID is the resolver for the chatOverlaysById field. +func (r *queryResolver) ChatOverlaysByID(ctx context.Context, id string) ( + *gqlmodel.ChatOverlay, + error, +) { dashboardId, err := r.sessions.GetSelectedDashboard(ctx) if err != nil { return nil, err } - return r.getChatOverlaySettings(ctx, dashboardId) + return r.getChatOverlaySettings(ctx, id, dashboardId) } // ChatOverlaySettings is the resolver for the chatOverlaySettings field. -func (r *subscriptionResolver) ChatOverlaySettings(ctx context.Context, apiKey string) (<-chan *gqlmodel.ChatOverlay, error) { +func (r *subscriptionResolver) ChatOverlaySettings( + ctx context.Context, + id string, + apiKey string, +) (<-chan *gqlmodel.ChatOverlay, error) { user := model.Users{} if err := r.gorm.Where(`"apiKey" = ?`, apiKey).First(&user).Error; err != nil { return nil, fmt.Errorf("failed to get user: %w", err) @@ -40,7 +60,7 @@ func (r *subscriptionResolver) ChatOverlaySettings(ctx context.Context, apiKey s go func() { sub, err := r.wsRouter.Subscribe( []string{ - chatOverlaySubscriptionKeyCreate(user.ID), + chatOverlaySubscriptionKeyCreate(id, user.ID), }, ) if err != nil { @@ -51,7 +71,7 @@ func (r *subscriptionResolver) ChatOverlaySettings(ctx context.Context, apiKey s close(channel) }() - initialSettings, err := r.getChatOverlaySettings(ctx, user.ID) + initialSettings, err := r.getChatOverlaySettings(ctx, id, user.ID) if err == nil { channel <- initialSettings } diff --git a/apps/api-gql/internal/gql/resolvers/overlays.resolver.service.go b/apps/api-gql/internal/gql/resolvers/overlays.resolver.service.go index 52cf5438e..ecb9f4c93 100644 --- a/apps/api-gql/internal/gql/resolvers/overlays.resolver.service.go +++ b/apps/api-gql/internal/gql/resolvers/overlays.resolver.service.go @@ -5,6 +5,7 @@ import ( "fmt" "log/slog" + "github.com/google/uuid" "github.com/samber/lo" model "github.com/satont/twir/libs/gomodels" "github.com/twirapp/twir/apps/api-gql/internal/gql/gqlmodel" @@ -38,16 +39,42 @@ func chatOverlayDbToGql(entity *model.ChatOverlaySettings) *gqlmodel.ChatOverlay } } +func (r *queryResolver) chatOverlays( + ctx context.Context, +) ([]gqlmodel.ChatOverlay, error) { + dashboardId, err := r.sessions.GetSelectedDashboard(ctx) + if err != nil { + return nil, err + } + + var entities []model.ChatOverlaySettings + if err := r.gorm. + WithContext(ctx). + Where("channel_id = ?", dashboardId). + Find(&entities).Error; err != nil { + return nil, fmt.Errorf("failed to get chat overlay settings: %w", err) + } + + var result []gqlmodel.ChatOverlay + for _, entity := range entities { + result = append(result, *chatOverlayDbToGql(&entity)) + } + + return result, nil +} + func (r *Resolver) getChatOverlaySettings( ctx context.Context, + id, channelId string, ) (*gqlmodel.ChatOverlay, error) { entity := model.ChatOverlaySettings{ + ID: uuid.MustParse(id), ChannelID: channelId, } if err := r.gorm. WithContext(ctx). - FirstOrCreate(&entity).Error; err != nil { + First(&entity).Error; err != nil { return nil, fmt.Errorf("failed to get chat overlay settings: %w", err) } @@ -66,7 +93,7 @@ func (r *mutationResolver) updateChatOverlay( entity := model.ChatOverlaySettings{} if err := r.gorm. WithContext(ctx). - Where("channel_id = ?", dashboardId). + Where("channel_id = ? AND id = ?", dashboardId, opts.ID). First(&entity).Error; err != nil { return false, fmt.Errorf("failed to get chat overlay settings: %w", err) } @@ -146,7 +173,7 @@ func (r *mutationResolver) updateChatOverlay( } if err := r.wsRouter.Publish( - chatOverlaySubscriptionKeyCreate(entity.ChannelID), + chatOverlaySubscriptionKeyCreate(entity.ID.String(), entity.ChannelID), chatOverlayDbToGql(&entity), ); err != nil { r.logger.Error("failed to publish settings", slog.Any("err", err)) diff --git a/apps/api-gql/internal/gql/resolvers/subscriptions.keys.go b/apps/api-gql/internal/gql/resolvers/subscriptions.keys.go index 0d4b68b64..ac0ab7c87 100644 --- a/apps/api-gql/internal/gql/resolvers/subscriptions.keys.go +++ b/apps/api-gql/internal/gql/resolvers/subscriptions.keys.go @@ -5,6 +5,6 @@ const ( chatOverlaySubscriptionKey = "api.chatOverlaySettings" ) -func chatOverlaySubscriptionKeyCreate(userId string) string { - return chatOverlaySubscriptionKey + "." + userId +func chatOverlaySubscriptionKeyCreate(id, userId string) string { + return chatOverlaySubscriptionKey + "." + userId + "." + id } diff --git a/apps/api-gql/internal/gql/resolvers/twitch.resolver.go b/apps/api-gql/internal/gql/resolvers/twitch.resolver.go index 3a668a91a..dccac9c8b 100644 --- a/apps/api-gql/internal/gql/resolvers/twitch.resolver.go +++ b/apps/api-gql/internal/gql/resolvers/twitch.resolver.go @@ -8,17 +8,14 @@ import ( "context" "fmt" - "github.com/nicklaw5/helix/v2" + helix "github.com/nicklaw5/helix/v2" "github.com/satont/twir/libs/twitch" data_loader "github.com/twirapp/twir/apps/api-gql/internal/gql/data-loader" "github.com/twirapp/twir/apps/api-gql/internal/gql/gqlmodel" ) // TwitchGetUserByID is the resolver for the twitchGetUserById field. -func (r *queryResolver) TwitchGetUserByID( - ctx context.Context, - id string, -) (*gqlmodel.TwirUserTwitchInfo, error) { +func (r *queryResolver) TwitchGetUserByID(ctx context.Context, id string) (*gqlmodel.TwirUserTwitchInfo, error) { if id == "" { return nil, fmt.Errorf("id is required") } @@ -27,10 +24,7 @@ func (r *queryResolver) TwitchGetUserByID( } // TwitchGetUserByName is the resolver for the twitchGetUserByName field. -func (r *queryResolver) TwitchGetUserByName( - ctx context.Context, - name string, -) (*gqlmodel.TwirUserTwitchInfo, error) { +func (r *queryResolver) TwitchGetUserByName(ctx context.Context, name string) (*gqlmodel.TwirUserTwitchInfo, error) { if name == "" { return nil, fmt.Errorf("name is required") } @@ -39,10 +33,7 @@ func (r *queryResolver) TwitchGetUserByName( } // TwitchGetChannelRewards is the resolver for the twitchGetChannelRewards field. -func (r *queryResolver) TwitchGetChannelRewards( - ctx context.Context, - channelID *string, -) (*gqlmodel.TwirTwitchChannelRewardResponse, error) { +func (r *queryResolver) TwitchGetChannelRewards(ctx context.Context, channelID *string) (*gqlmodel.TwirTwitchChannelRewardResponse, error) { var channelId string if channelID == nil { dashboardId, err := r.sessions.GetSelectedDashboard(ctx) @@ -143,10 +134,7 @@ func (r *queryResolver) TwitchGetChannelRewards( } // TwitchGetChannelBadges is the resolver for the twitchGetChannelBadges field. -func (r *queryResolver) TwitchGetChannelBadges( - ctx context.Context, - channelID *string, -) (*gqlmodel.TwirTwitchChannelBadgeResponse, error) { +func (r *queryResolver) TwitchGetChannelBadges(ctx context.Context, channelID *string) (*gqlmodel.TwirTwitchChannelBadgeResponse, error) { var userId string if channelID != nil { userId = *channelID @@ -213,11 +201,7 @@ func (r *queryResolver) TwitchGetChannelBadges( } // TwitchGetGlobalBadges is the resolver for the twitchGetGlobalBadges field. -func (r *queryResolver) TwitchGetGlobalBadges(ctx context.Context) ( - *gqlmodel.TwirTwitchGlobalBadgeResponse, - error, -) { - +func (r *queryResolver) TwitchGetGlobalBadges(ctx context.Context) (*gqlmodel.TwirTwitchGlobalBadgeResponse, error) { twitchClient, err := twitch.NewAppClientWithContext(ctx, r.config, r.tokensClient) if err != nil { return nil, err diff --git a/apps/api-gql/schema/overlays.graphqls b/apps/api-gql/schema/overlays.graphqls index d5f49fe23..fc624e77b 100644 --- a/apps/api-gql/schema/overlays.graphqls +++ b/apps/api-gql/schema/overlays.graphqls @@ -1,5 +1,6 @@ extend type Query { - chatOverlay: ChatOverlay! @isAuthenticated @hasChannelRolesDashboardPermission(permission: VIEW_OVERLAYS) + chatOverlays: [ChatOverlay!]! @isAuthenticated @hasChannelRolesDashboardPermission(permission: VIEW_OVERLAYS) + chatOverlaysById(id: String!): ChatOverlay @isAuthenticated @hasChannelRolesDashboardPermission(permission: VIEW_OVERLAYS) } extend type Mutation { @@ -7,7 +8,7 @@ extend type Mutation { } extend type Subscription { - chatOverlaySettings(apiKey: String!): ChatOverlay! + chatOverlaySettings(id: String!, apiKey: String!): ChatOverlay } enum ChatOverlayAnimation { @@ -36,6 +37,7 @@ type ChatOverlay { } input ChatOverlayUpdateOpts { + id: String! messageHideTimeout: Int messageShowDelay: Int preset: String diff --git a/frontend/overlays/.gitignore b/frontend/overlays/.gitignore new file mode 100644 index 000000000..426da550f --- /dev/null +++ b/frontend/overlays/.gitignore @@ -0,0 +1 @@ +src/gql diff --git a/frontend/overlays/codegen.ts b/frontend/overlays/codegen.ts new file mode 100644 index 000000000..56c6171f6 --- /dev/null +++ b/frontend/overlays/codegen.ts @@ -0,0 +1,27 @@ +import { join, resolve } from 'node:path' +import process from 'node:process' + +import type { CodegenConfig } from '@graphql-codegen/cli' + +const schemaDir = resolve(join(process.cwd(), '..', '..', 'apps', 'api-gql', 'schema', '*.graphqls')) + +const config: CodegenConfig = { + config: { + scalars: { + Upload: 'File', + }, + }, + schema: schemaDir, + documents: ['src/**/*.ts'], + ignoreNoDocuments: true, // for better experience with the watcher + generates: { + './src/gql/': { + preset: 'client', + config: { + useTypeImports: true, + }, + }, + }, +} + +export default config diff --git a/frontend/overlays/package.json b/frontend/overlays/package.json index b844c081d..ba04210ea 100644 --- a/frontend/overlays/package.json +++ b/frontend/overlays/package.json @@ -5,7 +5,8 @@ "scripts": { "dev": "vite", "build": "vue-tsc && vite build", - "preview": "vite preview" + "preview": "vite preview", + "codegen": "graphql-codegen" }, "dependencies": { "@plugin-web-update-notification/vite": "1.7.1", @@ -17,9 +18,11 @@ "@twir/grpc": "workspace:*", "@twirapp/dudes-vue": "0.1.0", "@twirapp/kappagen": "1.0.1", + "@urql/vue": "1.1.3", "@vueuse/core": "10.9.0", "@zero-dependency/utils": "1.7.7", "emoji-regex": "10.3.0", + "graphql-ws": "5.16.0", "nested-css-to-flat": "1.0.5", "obs-websocket-js": "5.0.5", "tmi.js": "1.8.5", @@ -27,11 +30,13 @@ "vue-router": "4.3.0" }, "devDependencies": { + "@graphql-codegen/cli": "5.0.2", "@twir/types": "workspace:*", "@types/tmi.js": "1.8.6", "@vitejs/plugin-vue": "5.0.4", "typescript": "5.4.5", "vite": "5.2.8", + "vite-plugin-watch": "0.3.1", "vue-tsc": "2.0.13" } } diff --git a/frontend/overlays/src/composables/chat/use-chat-overlay-socket.ts b/frontend/overlays/src/composables/chat/use-chat-overlay-socket.ts index da829b6c7..f2db3be50 100644 --- a/frontend/overlays/src/composables/chat/use-chat-overlay-socket.ts +++ b/frontend/overlays/src/composables/chat/use-chat-overlay-socket.ts @@ -1,12 +1,73 @@ +import { useQuery, useSubscription } from '@urql/vue' import { createGlobalState, useWebSocket } from '@vueuse/core' import { ref, watch } from 'vue' +import { useRoute } from 'vue-router' import type { TwirWebSocketEvent } from '@/api.js' import type { BadgeVersion, ChatBadge, Settings } from '@twir/frontend-chat' +import { graphql } from '@/gql' import { generateSocketUrlWithParams } from '@/helpers.js' export const useChatOverlaySocket = createGlobalState(() => { + const route = useRoute() + + useQuery({ + query: graphql(` + query ChatOverlayWithAdditionalData($overlayId: String!) { + authenticatedUser { + id + twitchProfile { + login + displayName + profileImageUrl + } + } + chatOverlaysById(id: $overlayId) { + id + messageHideTimeout + } + twitchGetGlobalBadges { + badges { + set_id + versions { + image_url_1x + } + } + } + twitchGetChannelBadges { + badges { + set_id + versions { + image_url_1x + } + } + } + } + `), + variables: { + overlayId: route.query.id, + }, + }) + + const sub = useSubscription({ + query: graphql(` + subscription ChatOverlaySettings($id: String!, $apiKey: String!) { + chatOverlaySettings(id: $id, apiKey: $apiKey) { + id + animation + fontSize + } + } + `), + variables: { + id: route.query.id, + apiKey: route.params.apiKey, + }, + }) + + watch(sub.data, (n) => console.log(n)) + const settings = ref({ channelId: '', channelName: '', diff --git a/frontend/overlays/src/gql/fragment-masking.ts b/frontend/overlays/src/gql/fragment-masking.ts new file mode 100644 index 000000000..653eda3e2 --- /dev/null +++ b/frontend/overlays/src/gql/fragment-masking.ts @@ -0,0 +1,67 @@ +/* eslint-disable */ +import type { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core'; +import type { FragmentDefinitionNode } from 'graphql'; +import type { Incremental } from './graphql'; + + +export type FragmentType> = TDocumentType extends DocumentTypeDecoration< + infer TType, + any +> + ? [TType] extends [{ ' $fragmentName'?: infer TKey }] + ? TKey extends string + ? { ' $fragmentRefs'?: { [key in TKey]: TType } } + : never + : never + : never; + +// return non-nullable if `fragmentType` is non-nullable +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: FragmentType> +): TType; +// return nullable if `fragmentType` is nullable +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: FragmentType> | null | undefined +): TType | null | undefined; +// return array of non-nullable if `fragmentType` is array of non-nullable +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: ReadonlyArray>> +): ReadonlyArray; +// return array of nullable if `fragmentType` is array of nullable +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: ReadonlyArray>> | null | undefined +): ReadonlyArray | null | undefined; +export function useFragment( + _documentNode: DocumentTypeDecoration, + fragmentType: FragmentType> | ReadonlyArray>> | null | undefined +): TType | ReadonlyArray | null | undefined { + return fragmentType as any; +} + + +export function makeFragmentData< + F extends DocumentTypeDecoration, + FT extends ResultOf +>(data: FT, _fragment: F): FragmentType { + return data as FragmentType; +} +export function isFragmentReady( + queryNode: DocumentTypeDecoration, + fragmentNode: TypedDocumentNode, + data: FragmentType, any>> | null | undefined +): data is FragmentType { + const deferredFields = (queryNode as { __meta__?: { deferredFields: Record } }).__meta__ + ?.deferredFields; + + if (!deferredFields) return true; + + const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined; + const fragName = fragDef?.name?.value; + + const fields = (fragName && deferredFields[fragName]) || []; + return fields.length > 0 && fields.every(field => data && field in data); +} diff --git a/frontend/overlays/src/gql/gql.ts b/frontend/overlays/src/gql/gql.ts new file mode 100644 index 000000000..3f000fb3b --- /dev/null +++ b/frontend/overlays/src/gql/gql.ts @@ -0,0 +1,47 @@ +/* eslint-disable */ +import * as types from './graphql'; +import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; + +/** + * Map of all GraphQL operations in the project. + * + * This map has several performance disadvantages: + * 1. It is not tree-shakeable, so it will include all operations in the project. + * 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle. + * 3. It does not support dead code elimination, so it will add unused operations. + * + * Therefore it is highly recommended to use the babel or swc plugin for production. + */ +const documents = { + "\n\t\t\tquery ChatOverlayWithAdditionalData($overlayId: String!) {\n\t\t\t\tauthenticatedUser {\n\t\t\t\t\tid\n\t\t\t\t\ttwitchProfile {\n\t\t\t\t\t\tlogin\n\t\t\t\t\t\tdisplayName\n\t\t\t\t\t\tprofileImageUrl\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tchatOverlaysById(id: $overlayId) {\n\t\t\t\t\tid\n\t\t\t\t\tmessageHideTimeout\n\t\t\t\t}\n\t\t\t\ttwitchGetGlobalBadges {\n\t\t\t\t\tbadges {\n\t\t\t\t\t\tset_id\n\t\t\t\t\t\tversions {\n\t\t\t\t\t\t\timage_url_1x\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttwitchGetChannelBadges {\n\t\t\t\t\tbadges {\n\t\t\t\t\t\tset_id\n\t\t\t\t\t\tversions {\n\t\t\t\t\t\t\timage_url_1x\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t": types.ChatOverlayWithAdditionalDataDocument, + "\n\t\t\tsubscription ChatOverlaySettings($id: String!, $apiKey: String!) {\n\t\t\t\tchatOverlaySettings(id: $id, apiKey: $apiKey) {\n\t\t\t\t\tid\n\t\t\t\t\tanimation\n\t\t\t\t\tfontSize\n\t\t\t\t}\n\t\t\t}\n\t\t": types.ChatOverlaySettingsDocument, +}; + +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + * + * + * @example + * ```ts + * const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`); + * ``` + * + * The query argument is unknown! + * Please regenerate the types. + */ +export function graphql(source: string): unknown; + +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n\t\t\tquery ChatOverlayWithAdditionalData($overlayId: String!) {\n\t\t\t\tauthenticatedUser {\n\t\t\t\t\tid\n\t\t\t\t\ttwitchProfile {\n\t\t\t\t\t\tlogin\n\t\t\t\t\t\tdisplayName\n\t\t\t\t\t\tprofileImageUrl\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tchatOverlaysById(id: $overlayId) {\n\t\t\t\t\tid\n\t\t\t\t\tmessageHideTimeout\n\t\t\t\t}\n\t\t\t\ttwitchGetGlobalBadges {\n\t\t\t\t\tbadges {\n\t\t\t\t\t\tset_id\n\t\t\t\t\t\tversions {\n\t\t\t\t\t\t\timage_url_1x\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttwitchGetChannelBadges {\n\t\t\t\t\tbadges {\n\t\t\t\t\t\tset_id\n\t\t\t\t\t\tversions {\n\t\t\t\t\t\t\timage_url_1x\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t"): (typeof documents)["\n\t\t\tquery ChatOverlayWithAdditionalData($overlayId: String!) {\n\t\t\t\tauthenticatedUser {\n\t\t\t\t\tid\n\t\t\t\t\ttwitchProfile {\n\t\t\t\t\t\tlogin\n\t\t\t\t\t\tdisplayName\n\t\t\t\t\t\tprofileImageUrl\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tchatOverlaysById(id: $overlayId) {\n\t\t\t\t\tid\n\t\t\t\t\tmessageHideTimeout\n\t\t\t\t}\n\t\t\t\ttwitchGetGlobalBadges {\n\t\t\t\t\tbadges {\n\t\t\t\t\t\tset_id\n\t\t\t\t\t\tversions {\n\t\t\t\t\t\t\timage_url_1x\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttwitchGetChannelBadges {\n\t\t\t\t\tbadges {\n\t\t\t\t\t\tset_id\n\t\t\t\t\t\tversions {\n\t\t\t\t\t\t\timage_url_1x\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n\t\t\tsubscription ChatOverlaySettings($id: String!, $apiKey: String!) {\n\t\t\t\tchatOverlaySettings(id: $id, apiKey: $apiKey) {\n\t\t\t\t\tid\n\t\t\t\t\tanimation\n\t\t\t\t\tfontSize\n\t\t\t\t}\n\t\t\t}\n\t\t"): (typeof documents)["\n\t\t\tsubscription ChatOverlaySettings($id: String!, $apiKey: String!) {\n\t\t\t\tchatOverlaySettings(id: $id, apiKey: $apiKey) {\n\t\t\t\t\tid\n\t\t\t\t\tanimation\n\t\t\t\t\tfontSize\n\t\t\t\t}\n\t\t\t}\n\t\t"]; + +export function graphql(source: string) { + return (documents as any)[source] ?? {}; +} + +export type DocumentType> = TDocumentNode extends DocumentNode< infer TType, any> ? TType : never; \ No newline at end of file diff --git a/frontend/overlays/src/gql/graphql.ts b/frontend/overlays/src/gql/graphql.ts new file mode 100644 index 000000000..234a6cf47 --- /dev/null +++ b/frontend/overlays/src/gql/graphql.ts @@ -0,0 +1,1859 @@ +/* eslint-disable */ +import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; +export type Maybe = T | null; +export type InputMaybe = Maybe; +export type Exact = { [K in keyof T]: T[K] }; +export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; +export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; +export type MakeEmpty = { [_ in K]?: never }; +export type Incremental = T | { [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never }; +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: { input: string; output: string; } + String: { input: string; output: string; } + Boolean: { input: boolean; output: boolean; } + Int: { input: number; output: number; } + Float: { input: number; output: number; } + Time: { input: any; output: any; } + Upload: { input: File; output: File; } +}; + +export type AdminNotification = Notification & { + __typename?: 'AdminNotification'; + createdAt: Scalars['Time']['output']; + id: Scalars['ID']['output']; + text: Scalars['String']['output']; + twitchProfile?: Maybe; + userId?: Maybe; +}; + +export type AdminNotificationsParams = { + page?: InputMaybe; + perPage?: InputMaybe; + search?: InputMaybe; + type?: InputMaybe; +}; + +export type AdminNotificationsResponse = { + __typename?: 'AdminNotificationsResponse'; + notifications: Array; + total: Scalars['Int']['output']; +}; + +export type AuthenticatedUser = TwirUser & { + __typename?: 'AuthenticatedUser'; + apiKey: Scalars['String']['output']; + availableDashboards: Array; + botId?: Maybe; + hideOnLandingPage: Scalars['Boolean']['output']; + id: Scalars['ID']['output']; + isBanned: Scalars['Boolean']['output']; + isBotAdmin: Scalars['Boolean']['output']; + isBotModerator?: Maybe; + isEnabled?: Maybe; + selectedDashboardId: Scalars['String']['output']; + selectedDashboardTwitchUser: TwirUserTwitchInfo; + twitchProfile: TwirUserTwitchInfo; +}; + +export type Badge = { + __typename?: 'Badge'; + createdAt: Scalars['String']['output']; + enabled: Scalars['Boolean']['output']; + ffzSlot: Scalars['Int']['output']; + fileUrl: Scalars['String']['output']; + id: Scalars['ID']['output']; + name: Scalars['String']['output']; + /** IDS of users which has this badge */ + users?: Maybe>; +}; + +export type BuiltInVariable = { + __typename?: 'BuiltInVariable'; + canBeUsedInRegistry: Scalars['Boolean']['output']; + description: Scalars['String']['output']; + example: Scalars['String']['output']; + name: Scalars['String']['output']; + visible: Scalars['Boolean']['output']; +}; + +export type ChannelAlert = { + __typename?: 'ChannelAlert'; + audioId?: Maybe; + audioVolume?: Maybe; + commandIds?: Maybe>; + greetingsIds?: Maybe>; + id: Scalars['ID']['output']; + keywordsIds?: Maybe>; + name: Scalars['String']['output']; + rewardIds?: Maybe>; +}; + +export type ChannelAlertCreateInput = { + audioId?: InputMaybe; + audioVolume?: InputMaybe; + commandIds?: InputMaybe>; + greetingsIds?: InputMaybe>; + keywordsIds?: InputMaybe>; + name: Scalars['String']['input']; + rewardIds?: InputMaybe>; +}; + +export type ChannelAlertUpdateInput = { + audioId?: InputMaybe; + audioVolume?: InputMaybe; + commandIds?: InputMaybe>; + greetingsIds?: InputMaybe>; + keywordsIds?: InputMaybe>; + name?: InputMaybe; + rewardIds?: InputMaybe>; +}; + +export enum ChannelRolePermissionEnum { + CanAccessDashboard = 'CAN_ACCESS_DASHBOARD', + ManageAlerts = 'MANAGE_ALERTS', + ManageCommands = 'MANAGE_COMMANDS', + ManageEvents = 'MANAGE_EVENTS', + ManageGames = 'MANAGE_GAMES', + ManageGreetings = 'MANAGE_GREETINGS', + ManageIntegrations = 'MANAGE_INTEGRATIONS', + ManageKeywords = 'MANAGE_KEYWORDS', + ManageModeration = 'MANAGE_MODERATION', + ManageOverlays = 'MANAGE_OVERLAYS', + ManageRoles = 'MANAGE_ROLES', + ManageSongRequests = 'MANAGE_SONG_REQUESTS', + ManageTimers = 'MANAGE_TIMERS', + ManageVariables = 'MANAGE_VARIABLES', + UpdateChannelCategory = 'UPDATE_CHANNEL_CATEGORY', + UpdateChannelTitle = 'UPDATE_CHANNEL_TITLE', + ViewAlerts = 'VIEW_ALERTS', + ViewCommands = 'VIEW_COMMANDS', + ViewEvents = 'VIEW_EVENTS', + ViewGames = 'VIEW_GAMES', + ViewGreetings = 'VIEW_GREETINGS', + ViewIntegrations = 'VIEW_INTEGRATIONS', + ViewKeywords = 'VIEW_KEYWORDS', + ViewModeration = 'VIEW_MODERATION', + ViewOverlays = 'VIEW_OVERLAYS', + ViewRoles = 'VIEW_ROLES', + ViewSongRequests = 'VIEW_SONG_REQUESTS', + ViewTimers = 'VIEW_TIMERS', + ViewVariables = 'VIEW_VARIABLES' +} + +export type ChatAlerts = { + __typename?: 'ChatAlerts'; + ban?: Maybe; + chatCleared?: Maybe; + cheers?: Maybe; + donations?: Maybe; + firstUserMessage?: Maybe; + followers?: Maybe; + messageDelete?: Maybe; + raids?: Maybe; + redemptions?: Maybe; + streamOffline?: Maybe; + streamOnline?: Maybe; + subscribers?: Maybe; + unbanRequestCreate?: Maybe; + unbanRequestResolve?: Maybe; +}; + +export type ChatAlertsBan = { + __typename?: 'ChatAlertsBan'; + cooldown: Scalars['Int']['output']; + enabled: Scalars['Boolean']['output']; + ignoreTimeoutFrom: Array; + messages: Array; +}; + +export type ChatAlertsBanInput = { + cooldown?: InputMaybe; + enabled?: InputMaybe; + ignoreTimeoutFrom?: InputMaybe>>; + messages?: InputMaybe>>; +}; + +export type ChatAlertsChatCleared = { + __typename?: 'ChatAlertsChatCleared'; + cooldown: Scalars['Int']['output']; + enabled: Scalars['Boolean']['output']; + messages: Array; +}; + +export type ChatAlertsChatClearedInput = { + cooldown?: InputMaybe; + enabled?: InputMaybe; + messages?: InputMaybe>>; +}; + +export type ChatAlertsCheers = { + __typename?: 'ChatAlertsCheers'; + cooldown: Scalars['Int']['output']; + enabled: Scalars['Boolean']['output']; + messages: Array; +}; + +export type ChatAlertsCheersInput = { + cooldown?: InputMaybe; + enabled?: InputMaybe; + messages?: InputMaybe>>; +}; + +export type ChatAlertsCountedMessage = { + __typename?: 'ChatAlertsCountedMessage'; + count: Scalars['Int']['output']; + text: Scalars['String']['output']; +}; + +export type ChatAlertsCountedMessageInput = { + count?: InputMaybe; + text?: InputMaybe; +}; + +export type ChatAlertsDonations = { + __typename?: 'ChatAlertsDonations'; + cooldown: Scalars['Int']['output']; + enabled: Scalars['Boolean']['output']; + messages: Array; +}; + +export type ChatAlertsDonationsInput = { + cooldown?: InputMaybe; + enabled?: InputMaybe; + messages?: InputMaybe>>; +}; + +export type ChatAlertsFirstUserMessage = { + __typename?: 'ChatAlertsFirstUserMessage'; + cooldown: Scalars['Int']['output']; + enabled: Scalars['Boolean']['output']; + messages: Array; +}; + +export type ChatAlertsFirstUserMessageInput = { + cooldown?: InputMaybe; + enabled?: InputMaybe; + messages?: InputMaybe>>; +}; + +export type ChatAlertsFollowersSettings = { + __typename?: 'ChatAlertsFollowersSettings'; + cooldown: Scalars['Int']['output']; + enabled: Scalars['Boolean']['output']; + messages: Array; +}; + +export type ChatAlertsFollowersSettingsInput = { + cooldown?: InputMaybe; + enabled?: InputMaybe; + messages?: InputMaybe>>; +}; + +export type ChatAlertsInput = { + ban?: InputMaybe; + chatCleared?: InputMaybe; + cheers?: InputMaybe; + donations?: InputMaybe; + firstUserMessage?: InputMaybe; + followers?: InputMaybe; + messageDelete?: InputMaybe; + raids?: InputMaybe; + redemptions?: InputMaybe; + streamOffline?: InputMaybe; + streamOnline?: InputMaybe; + subscribers?: InputMaybe; + unbanRequestCreate?: InputMaybe; + unbanRequestResolve?: InputMaybe; +}; + +export type ChatAlertsMessage = { + __typename?: 'ChatAlertsMessage'; + text: Scalars['String']['output']; +}; + +export type ChatAlertsMessageDelete = { + __typename?: 'ChatAlertsMessageDelete'; + cooldown: Scalars['Int']['output']; + enabled: Scalars['Boolean']['output']; + messages: Array; +}; + +export type ChatAlertsMessageDeleteInput = { + cooldown?: InputMaybe; + enabled?: InputMaybe; + messages?: InputMaybe>>; +}; + +export type ChatAlertsMessageInput = { + text?: InputMaybe; +}; + +export type ChatAlertsRaids = { + __typename?: 'ChatAlertsRaids'; + cooldown: Scalars['Int']['output']; + enabled: Scalars['Boolean']['output']; + messages: Array; +}; + +export type ChatAlertsRaidsInput = { + cooldown?: InputMaybe; + enabled?: InputMaybe; + messages?: InputMaybe>>; +}; + +export type ChatAlertsRedemptions = { + __typename?: 'ChatAlertsRedemptions'; + cooldown: Scalars['Int']['output']; + enabled: Scalars['Boolean']['output']; + messages: Array; +}; + +export type ChatAlertsRedemptionsInput = { + cooldown?: InputMaybe; + enabled?: InputMaybe; + messages?: InputMaybe>>; +}; + +export type ChatAlertsSettings = ChatAlertsBan | ChatAlertsChatCleared | ChatAlertsCheers | ChatAlertsDonations | ChatAlertsFirstUserMessage | ChatAlertsFollowersSettings | ChatAlertsMessageDelete | ChatAlertsRaids | ChatAlertsRedemptions | ChatAlertsStreamOffline | ChatAlertsStreamOnline | ChatAlertsSubscribers | ChatAlertsUnbanRequestCreate | ChatAlertsUnbanRequestResolve; + +export type ChatAlertsStreamOffline = { + __typename?: 'ChatAlertsStreamOffline'; + cooldown: Scalars['Int']['output']; + enabled: Scalars['Boolean']['output']; + messages: Array; +}; + +export type ChatAlertsStreamOfflineInput = { + cooldown?: InputMaybe; + enabled?: InputMaybe; + messages?: InputMaybe>>; +}; + +export type ChatAlertsStreamOnline = { + __typename?: 'ChatAlertsStreamOnline'; + cooldown: Scalars['Int']['output']; + enabled: Scalars['Boolean']['output']; + messages: Array; +}; + +export type ChatAlertsStreamOnlineInput = { + cooldown?: InputMaybe; + enabled?: InputMaybe; + messages?: InputMaybe>>; +}; + +export type ChatAlertsSubscribers = { + __typename?: 'ChatAlertsSubscribers'; + cooldown: Scalars['Int']['output']; + enabled: Scalars['Boolean']['output']; + messages: Array; +}; + +export type ChatAlertsSubscribersInput = { + cooldown?: InputMaybe; + enabled?: InputMaybe; + messages?: InputMaybe>>; +}; + +export type ChatAlertsUnbanRequestCreate = { + __typename?: 'ChatAlertsUnbanRequestCreate'; + cooldown: Scalars['Int']['output']; + enabled: Scalars['Boolean']['output']; + messages: Array; +}; + +export type ChatAlertsUnbanRequestCreateInput = { + cooldown?: InputMaybe; + enabled?: InputMaybe; + messages?: InputMaybe>>; +}; + +export type ChatAlertsUnbanRequestResolve = { + __typename?: 'ChatAlertsUnbanRequestResolve'; + cooldown: Scalars['Int']['output']; + enabled: Scalars['Boolean']['output']; + messages: Array; +}; + +export type ChatAlertsUnbanRequestResolveInput = { + cooldown?: InputMaybe; + enabled?: InputMaybe; + messages?: InputMaybe>>; +}; + +export type ChatOverlay = { + __typename?: 'ChatOverlay'; + animation?: Maybe; + chatBackgroundColor: Scalars['String']['output']; + direction: Scalars['String']['output']; + fontFamily: Scalars['String']['output']; + fontSize: Scalars['Int']['output']; + fontStyle: Scalars['String']['output']; + fontWeight: Scalars['Int']['output']; + hideBots: Scalars['Boolean']['output']; + hideCommands: Scalars['Boolean']['output']; + id: Scalars['String']['output']; + messageHideTimeout: Scalars['Int']['output']; + messageShowDelay: Scalars['Int']['output']; + paddingContainer: Scalars['Int']['output']; + preset: Scalars['String']['output']; + showAnnounceBadge: Scalars['Boolean']['output']; + showBadges: Scalars['Boolean']['output']; + textShadowColor: Scalars['String']['output']; + textShadowSize: Scalars['Int']['output']; +}; + +export enum ChatOverlayAnimation { + Disabled = 'DISABLED' +} + +export type ChatOverlayUpdateOpts = { + animation?: InputMaybe; + chatBackgroundColor?: InputMaybe; + direction?: InputMaybe; + fontFamily?: InputMaybe; + fontSize?: InputMaybe; + fontStyle?: InputMaybe; + fontWeight?: InputMaybe; + hideBots?: InputMaybe; + hideCommands?: InputMaybe; + id: Scalars['String']['input']; + messageHideTimeout?: InputMaybe; + messageShowDelay?: InputMaybe; + paddingContainer?: InputMaybe; + preset?: InputMaybe; + showAnnounceBadge?: InputMaybe; + showBadges?: InputMaybe; + textShadowColor?: InputMaybe; + textShadowSize?: InputMaybe; +}; + +export type Command = { + __typename?: 'Command'; + aliases: Array; + allowedUsersIds: Array; + cooldown: Scalars['Int']['output']; + cooldownRolesIds: Array; + cooldownType: Scalars['String']['output']; + default: Scalars['Boolean']['output']; + defaultName?: Maybe; + deniedUsersIds: Array; + description: Scalars['String']['output']; + enabled: Scalars['Boolean']['output']; + enabledCategories: Array; + group?: Maybe; + id: Scalars['ID']['output']; + isReply: Scalars['Boolean']['output']; + keepResponsesOrder: Scalars['Boolean']['output']; + module: Scalars['String']['output']; + name: Scalars['String']['output']; + onlineOnly: Scalars['Boolean']['output']; + requiredMessages: Scalars['Int']['output']; + requiredUsedChannelPoints: Scalars['Int']['output']; + requiredWatchTime: Scalars['Int']['output']; + responses: Array; + rolesIds: Array; + visible: Scalars['Boolean']['output']; +}; + +export type CommandGroup = { + __typename?: 'CommandGroup'; + color: Scalars['String']['output']; + id: Scalars['ID']['output']; + name: Scalars['String']['output']; +}; + +export type CommandResponse = { + __typename?: 'CommandResponse'; + commandId: Scalars['ID']['output']; + id: Scalars['ID']['output']; + order: Scalars['Int']['output']; + text: Scalars['String']['output']; +}; + +export type CommandsCreateOpts = { + aliases: Array; + allowedUsersIds: Array; + cooldown: Scalars['Int']['input']; + cooldownRolesIds: Array; + cooldownType: Scalars['String']['input']; + deniedUsersIds: Array; + description: Scalars['String']['input']; + enabled: Scalars['Boolean']['input']; + enabledCategories: Array; + groupId?: InputMaybe; + isReply: Scalars['Boolean']['input']; + keepResponsesOrder: Scalars['Boolean']['input']; + name: Scalars['String']['input']; + onlineOnly: Scalars['Boolean']['input']; + requiredMessages: Scalars['Int']['input']; + requiredUsedChannelPoints: Scalars['Int']['input']; + requiredWatchTime: Scalars['Int']['input']; + responses: Array; + rolesIds: Array; + visible: Scalars['Boolean']['input']; +}; + +export type CommandsGroupsCreateOpts = { + color: Scalars['String']['input']; + name: Scalars['String']['input']; +}; + +export type CommandsGroupsUpdateOpts = { + color?: InputMaybe; + name?: InputMaybe; +}; + +export type CommandsUpdateOpts = { + aliases?: InputMaybe>; + allowedUsersIds?: InputMaybe>; + cooldown?: InputMaybe; + cooldownRolesIds?: InputMaybe>; + cooldownType?: InputMaybe; + deniedUsersIds?: InputMaybe>; + description?: InputMaybe; + enabled?: InputMaybe; + enabledCategories?: InputMaybe>; + groupId?: InputMaybe; + isReply?: InputMaybe; + keepResponsesOrder?: InputMaybe; + name?: InputMaybe; + onlineOnly?: InputMaybe; + requiredMessages?: InputMaybe; + requiredUsedChannelPoints?: InputMaybe; + requiredWatchTime?: InputMaybe; + responses?: InputMaybe>; + rolesIds?: InputMaybe>; + visible?: InputMaybe; +}; + +export type CommunityUser = TwirUser & { + __typename?: 'CommunityUser'; + id: Scalars['ID']['output']; + messages: Scalars['Int']['output']; + twitchProfile: TwirUserTwitchInfo; + usedChannelPoints: Scalars['Int']['output']; + usedEmotes: Scalars['Int']['output']; + watchedMs: Scalars['Int']['output']; +}; + +export type CommunityUsersOpts = { + channelId: Scalars['ID']['input']; + order?: InputMaybe; + page?: InputMaybe; + perPage?: InputMaybe; + search?: InputMaybe; + sortBy?: InputMaybe; +}; + +export enum CommunityUsersOrder { + Asc = 'ASC', + Desc = 'DESC' +} + +export enum CommunityUsersResetType { + Messages = 'MESSAGES', + UsedChannelsPoints = 'USED_CHANNELS_POINTS', + UsedEmotes = 'USED_EMOTES', + Watched = 'WATCHED' +} + +export type CommunityUsersResponse = { + __typename?: 'CommunityUsersResponse'; + total: Scalars['Int']['output']; + users: Array; +}; + +export enum CommunityUsersSortBy { + Messages = 'MESSAGES', + UsedChannelsPoints = 'USED_CHANNELS_POINTS', + UsedEmotes = 'USED_EMOTES', + Watched = 'WATCHED' +} + +export type CreateOrUpdateCommandResponseInput = { + order: Scalars['Int']['input']; + text: Scalars['String']['input']; +}; + +export type CreateOrUpdateRoleSettingsInput = { + requiredMessages: Scalars['Int']['input']; + requiredUserChannelPoints: Scalars['Int']['input']; + requiredWatchTime: Scalars['Int']['input']; +}; + +export type Dashboard = { + __typename?: 'Dashboard'; + flags: Array; + id: Scalars['String']['output']; + twitchProfile: TwirUserTwitchInfo; +}; + +export type DashboardStats = { + __typename?: 'DashboardStats'; + categoryId: Scalars['ID']['output']; + categoryName: Scalars['String']['output']; + chatMessages: Scalars['Int']['output']; + followers: Scalars['Int']['output']; + requestedSongs: Scalars['Int']['output']; + startedAt?: Maybe; + subs: Scalars['Int']['output']; + title: Scalars['String']['output']; + usedEmotes: Scalars['Int']['output']; + viewers?: Maybe; +}; + +export type DuelGame = { + __typename?: 'DuelGame'; + bothDieMessage: Scalars['String']['output']; + bothDiePercent: Scalars['Int']['output']; + enabled: Scalars['Boolean']['output']; + globalCooldown: Scalars['Int']['output']; + pointsPerLose: Scalars['Int']['output']; + pointsPerWin: Scalars['Int']['output']; + resultMessage: Scalars['String']['output']; + secondsToAccept: Scalars['Int']['output']; + startMessage: Scalars['String']['output']; + timeoutSeconds: Scalars['Int']['output']; + userCooldown: Scalars['Int']['output']; +}; + +export type DuelGameOpts = { + bothDieMessage?: InputMaybe; + bothDiePercent?: InputMaybe; + enabled?: InputMaybe; + globalCooldown?: InputMaybe; + pointsPerLose?: InputMaybe; + pointsPerWin?: InputMaybe; + resultMessage?: InputMaybe; + secondsToAccept?: InputMaybe; + startMessage?: InputMaybe; + timeoutSeconds?: InputMaybe; + userCooldown?: InputMaybe; +}; + +export type EightBallGame = { + __typename?: 'EightBallGame'; + answers: Array; + enabled: Scalars['Boolean']['output']; +}; + +export type EightBallGameOpts = { + answers?: InputMaybe>; + enabled?: InputMaybe; +}; + +export enum EmoteStatisticRange { + LastDay = 'LAST_DAY', + LastMonth = 'LAST_MONTH', + LastThreeMonth = 'LAST_THREE_MONTH', + LastWeek = 'LAST_WEEK', + LastYear = 'LAST_YEAR' +} + +export type EmoteStatisticTopUser = { + __typename?: 'EmoteStatisticTopUser'; + count: Scalars['Int']['output']; + twitchProfile: TwirUserTwitchInfo; + userId: Scalars['String']['output']; +}; + +export type EmoteStatisticUsage = { + __typename?: 'EmoteStatisticUsage'; + count: Scalars['Int']['output']; + timestamp: Scalars['Int']['output']; +}; + +export type EmoteStatisticUserUsage = { + __typename?: 'EmoteStatisticUserUsage'; + date: Scalars['Time']['output']; + twitchProfile: TwirUserTwitchInfo; + userId: Scalars['String']['output']; +}; + +export type EmotesStatistic = { + __typename?: 'EmotesStatistic'; + emoteName: Scalars['String']['output']; + graphicUsages: Array; + lastUsedTimestamp: Scalars['Int']['output']; + totalUsages: Scalars['Int']['output']; +}; + +export type EmotesStatisticEmoteDetailedOpts = { + emoteName: Scalars['String']['input']; + range: EmoteStatisticRange; + topUsersPage?: InputMaybe; + topUsersPerPage?: InputMaybe; + usagesByUsersPage?: InputMaybe; + usagesByUsersPerPage?: InputMaybe; +}; + +export type EmotesStatisticEmoteDetailedResponse = { + __typename?: 'EmotesStatisticEmoteDetailedResponse'; + emoteName: Scalars['String']['output']; + graphicUsages: Array; + lastUsedTimestamp: Scalars['Int']['output']; + topUsers: Array; + topUsersTotal: Scalars['Int']['output']; + totalUsages: Scalars['Int']['output']; + usagesByUsersTotal: Scalars['Int']['output']; + usagesHistory: Array; +}; + +export type EmotesStatisticResponse = { + __typename?: 'EmotesStatisticResponse'; + emotes: Array; + total: Scalars['Int']['output']; +}; + +export type EmotesStatisticsOpts = { + graphicRange?: InputMaybe; + order?: InputMaybe; + page?: InputMaybe; + perPage?: InputMaybe; + search?: InputMaybe; +}; + +export enum EmotesStatisticsOptsOrder { + Asc = 'ASC', + Desc = 'DESC' +} + +export enum EventsubSubscribeConditionInput { + Channel = 'CHANNEL', + ChannelWithBotId = 'CHANNEL_WITH_BOT_ID', + ChannelWithModeratorId = 'CHANNEL_WITH_MODERATOR_ID', + User = 'USER' +} + +export type EventsubSubscribeInput = { + condition: EventsubSubscribeConditionInput; + type: Scalars['String']['input']; + version: Scalars['String']['input']; +}; + +export type Greeting = { + __typename?: 'Greeting'; + enabled: Scalars['Boolean']['output']; + id: Scalars['ID']['output']; + isReply: Scalars['Boolean']['output']; + text: Scalars['String']['output']; + twitchProfile: TwirUserTwitchInfo; + userId: Scalars['String']['output']; +}; + +export type GreetingsCreateInput = { + enabled: Scalars['Boolean']['input']; + isReply: Scalars['Boolean']['input']; + text: Scalars['String']['input']; + userId: Scalars['String']['input']; +}; + +export type GreetingsUpdateInput = { + enabled?: InputMaybe; + isReply?: InputMaybe; + text?: InputMaybe; + userId?: InputMaybe; +}; + +export type Keyword = { + __typename?: 'Keyword'; + cooldown: Scalars['Int']['output']; + enabled: Scalars['Boolean']['output']; + id: Scalars['ID']['output']; + isRegularExpression: Scalars['Boolean']['output']; + isReply: Scalars['Boolean']['output']; + response?: Maybe; + text: Scalars['String']['output']; + usageCount: Scalars['Int']['output']; +}; + +export type KeywordCreateInput = { + cooldown?: InputMaybe; + enabled?: InputMaybe; + isRegularExpression?: InputMaybe; + isReply?: InputMaybe; + response?: InputMaybe; + text: Scalars['String']['input']; + usageCount?: InputMaybe; +}; + +export type KeywordUpdateInput = { + cooldown?: InputMaybe; + enabled?: InputMaybe; + isRegularExpression?: InputMaybe; + isReply?: InputMaybe; + response?: InputMaybe; + text?: InputMaybe; + usageCount?: InputMaybe; +}; + +export type Mutation = { + __typename?: 'Mutation'; + authenticatedUserRegenerateApiKey: Scalars['String']['output']; + authenticatedUserSelectDashboard: Scalars['Boolean']['output']; + authenticatedUserUpdatePublicPage: Scalars['Boolean']['output']; + authenticatedUserUpdateSettings: Scalars['Boolean']['output']; + badgesAddUser: Scalars['Boolean']['output']; + badgesCreate: Badge; + badgesDelete: Scalars['Boolean']['output']; + badgesRemoveUser: Scalars['Boolean']['output']; + badgesUpdate: Badge; + channelAlertsCreate: ChannelAlert; + channelAlertsDelete: Scalars['Boolean']['output']; + channelAlertsUpdate: ChannelAlert; + chatOverlayUpdate: Scalars['Boolean']['output']; + commandsCreate: Scalars['Boolean']['output']; + commandsGroupsCreate: Scalars['Boolean']['output']; + commandsGroupsRemove: Scalars['Boolean']['output']; + commandsGroupsUpdate: Scalars['Boolean']['output']; + commandsRemove: Scalars['Boolean']['output']; + commandsUpdate: Scalars['Boolean']['output']; + communityResetStats: Scalars['Boolean']['output']; + dropAllAuthSessions: Scalars['Boolean']['output']; + eventsubSubscribe: Scalars['Boolean']['output']; + gamesDuelUpdate: DuelGame; + gamesEightBallUpdate: EightBallGame; + gamesRussianRouletteUpdate: RussianRouletteGame; + gamesSeppukuUpdate: SeppukuGame; + gamesVotebanUpdate: VotebanGame; + greetingsCreate: Greeting; + greetingsRemove: Scalars['Boolean']['output']; + greetingsUpdate: Greeting; + keywordCreate: Keyword; + keywordRemove: Scalars['Boolean']['output']; + keywordUpdate: Keyword; + logout: Scalars['Boolean']['output']; + notificationsCreate: AdminNotification; + notificationsDelete: Scalars['Boolean']['output']; + notificationsUpdate: AdminNotification; + rolesCreate: Scalars['Boolean']['output']; + rolesRemove: Scalars['Boolean']['output']; + rolesUpdate: Scalars['Boolean']['output']; + songRequestsUpdate: Scalars['Boolean']['output']; + switchUserAdmin: Scalars['Boolean']['output']; + switchUserBan: Scalars['Boolean']['output']; + timersCreate: Timer; + timersRemove: Scalars['Boolean']['output']; + timersUpdate: Timer; + updateChatAlerts: ChatAlerts; + variablesCreate: Variable; + variablesDelete: Scalars['Boolean']['output']; + variablesUpdate: Variable; +}; + + +export type MutationAuthenticatedUserSelectDashboardArgs = { + dashboardId: Scalars['String']['input']; +}; + + +export type MutationAuthenticatedUserUpdatePublicPageArgs = { + opts: UserUpdatePublicSettingsInput; +}; + + +export type MutationAuthenticatedUserUpdateSettingsArgs = { + opts: UserUpdateSettingsInput; +}; + + +export type MutationBadgesAddUserArgs = { + id: Scalars['ID']['input']; + userId: Scalars['String']['input']; +}; + + +export type MutationBadgesCreateArgs = { + opts: TwirBadgeCreateOpts; +}; + + +export type MutationBadgesDeleteArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationBadgesRemoveUserArgs = { + id: Scalars['ID']['input']; + userId: Scalars['String']['input']; +}; + + +export type MutationBadgesUpdateArgs = { + id: Scalars['ID']['input']; + opts: TwirBadgeUpdateOpts; +}; + + +export type MutationChannelAlertsCreateArgs = { + input: ChannelAlertCreateInput; +}; + + +export type MutationChannelAlertsDeleteArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationChannelAlertsUpdateArgs = { + id: Scalars['ID']['input']; + input: ChannelAlertUpdateInput; +}; + + +export type MutationChatOverlayUpdateArgs = { + opts: ChatOverlayUpdateOpts; +}; + + +export type MutationCommandsCreateArgs = { + opts: CommandsCreateOpts; +}; + + +export type MutationCommandsGroupsCreateArgs = { + opts: CommandsGroupsCreateOpts; +}; + + +export type MutationCommandsGroupsRemoveArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationCommandsGroupsUpdateArgs = { + id: Scalars['ID']['input']; + opts: CommandsGroupsUpdateOpts; +}; + + +export type MutationCommandsRemoveArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationCommandsUpdateArgs = { + id: Scalars['ID']['input']; + opts: CommandsUpdateOpts; +}; + + +export type MutationCommunityResetStatsArgs = { + type: CommunityUsersResetType; +}; + + +export type MutationEventsubSubscribeArgs = { + opts: EventsubSubscribeInput; +}; + + +export type MutationGamesDuelUpdateArgs = { + opts: DuelGameOpts; +}; + + +export type MutationGamesEightBallUpdateArgs = { + opts: EightBallGameOpts; +}; + + +export type MutationGamesRussianRouletteUpdateArgs = { + opts: RussianRouletteGameOpts; +}; + + +export type MutationGamesSeppukuUpdateArgs = { + opts: SeppukuGameOpts; +}; + + +export type MutationGamesVotebanUpdateArgs = { + opts: VotebanGameOpts; +}; + + +export type MutationGreetingsCreateArgs = { + opts: GreetingsCreateInput; +}; + + +export type MutationGreetingsRemoveArgs = { + id: Scalars['String']['input']; +}; + + +export type MutationGreetingsUpdateArgs = { + id: Scalars['String']['input']; + opts: GreetingsUpdateInput; +}; + + +export type MutationKeywordCreateArgs = { + opts: KeywordCreateInput; +}; + + +export type MutationKeywordRemoveArgs = { + id: Scalars['String']['input']; +}; + + +export type MutationKeywordUpdateArgs = { + id: Scalars['String']['input']; + opts: KeywordUpdateInput; +}; + + +export type MutationNotificationsCreateArgs = { + text: Scalars['String']['input']; + userId?: InputMaybe; +}; + + +export type MutationNotificationsDeleteArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationNotificationsUpdateArgs = { + id: Scalars['ID']['input']; + opts: NotificationUpdateOpts; +}; + + +export type MutationRolesCreateArgs = { + opts: RolesCreateOrUpdateOpts; +}; + + +export type MutationRolesRemoveArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationRolesUpdateArgs = { + id: Scalars['ID']['input']; + opts: RolesCreateOrUpdateOpts; +}; + + +export type MutationSongRequestsUpdateArgs = { + opts: SongRequestsSettingsOpts; +}; + + +export type MutationSwitchUserAdminArgs = { + userId: Scalars['ID']['input']; +}; + + +export type MutationSwitchUserBanArgs = { + userId: Scalars['ID']['input']; +}; + + +export type MutationTimersCreateArgs = { + opts: TimerCreateInput; +}; + + +export type MutationTimersRemoveArgs = { + id: Scalars['String']['input']; +}; + + +export type MutationTimersUpdateArgs = { + id: Scalars['String']['input']; + opts: TimerUpdateInput; +}; + + +export type MutationUpdateChatAlertsArgs = { + input: ChatAlertsInput; +}; + + +export type MutationVariablesCreateArgs = { + opts: VariableCreateInput; +}; + + +export type MutationVariablesDeleteArgs = { + id: Scalars['ID']['input']; +}; + + +export type MutationVariablesUpdateArgs = { + id: Scalars['ID']['input']; + opts: VariableUpdateInput; +}; + +export type Notification = { + createdAt: Scalars['Time']['output']; + id: Scalars['ID']['output']; + text: Scalars['String']['output']; + userId?: Maybe; +}; + +export enum NotificationType { + Global = 'GLOBAL', + User = 'USER' +} + +export type NotificationUpdateOpts = { + text?: InputMaybe; +}; + +export type PublicCommand = { + __typename?: 'PublicCommand'; + aliases: Array; + cooldown: Scalars['Int']['output']; + cooldownType: Scalars['String']['output']; + description: Scalars['String']['output']; + module: Scalars['String']['output']; + name: Scalars['String']['output']; + permissions: Array; + responses: Array; +}; + +export type PublicCommandPermission = { + __typename?: 'PublicCommandPermission'; + name: Scalars['String']['output']; + type: Scalars['String']['output']; +}; + +export type PublicSettings = { + __typename?: 'PublicSettings'; + description?: Maybe; + socialLinks: Array; +}; + +export type Query = { + __typename?: 'Query'; + authLink: Scalars['String']['output']; + authenticatedUser: AuthenticatedUser; + channelAlerts: Array; + chatAlerts?: Maybe; + chatOverlays: Array; + chatOverlaysById?: Maybe; + commands: Array; + commandsGroups: Array; + commandsPublic: Array; + communityUsers: CommunityUsersResponse; + emotesStatisticEmoteDetailedInformation: EmotesStatisticEmoteDetailedResponse; + emotesStatistics: EmotesStatisticResponse; + gamesDuel: DuelGame; + gamesEightBall: EightBallGame; + gamesRussianRoulette: RussianRouletteGame; + gamesSeppuku: SeppukuGame; + gamesVoteban: VotebanGame; + greetings: Array; + keywords: Array; + notificationsByAdmin: AdminNotificationsResponse; + notificationsByUser: Array; + rewardsRedemptionsHistory: TwitchRedemptionResponse; + roles: Array; + songRequests?: Maybe; + songRequestsSearchChannelOrVideo: SongRequestsSearchChannelOrVideoResponse; + timers: Array; + /** Twir badges */ + twirBadges: Array; + /** finding users on twitch with filter does they exists in database */ + twirUsers: TwirUsersResponse; + /** + * Get channel badges. + * If channelId is not provided - selected dashboard/authenticated user channelId is used, depending on context. + * For example if queried by apiKey - userId belongs to apiKey owner id. + */ + twitchGetChannelBadges: TwirTwitchChannelBadgeResponse; + twitchGetChannelRewards: TwirTwitchChannelRewardResponse; + twitchGetGlobalBadges: TwirTwitchGlobalBadgeResponse; + twitchGetUserById?: Maybe; + twitchGetUserByName?: Maybe; + /** Channel id is optional */ + twitchRewards: Array; + userPublicSettings: PublicSettings; + variables: Array; + variablesBuiltIn: Array; +}; + + +export type QueryAuthLinkArgs = { + redirectTo: Scalars['String']['input']; +}; + + +export type QueryChatOverlaysByIdArgs = { + id: Scalars['String']['input']; +}; + + +export type QueryCommandsPublicArgs = { + channelId: Scalars['ID']['input']; +}; + + +export type QueryCommunityUsersArgs = { + opts: CommunityUsersOpts; +}; + + +export type QueryEmotesStatisticEmoteDetailedInformationArgs = { + opts: EmotesStatisticEmoteDetailedOpts; +}; + + +export type QueryEmotesStatisticsArgs = { + opts: EmotesStatisticsOpts; +}; + + +export type QueryNotificationsByAdminArgs = { + opts: AdminNotificationsParams; +}; + + +export type QueryRewardsRedemptionsHistoryArgs = { + opts: TwitchRedemptionsOpts; +}; + + +export type QuerySongRequestsSearchChannelOrVideoArgs = { + opts: SongRequestsSearchChannelOrVideoOpts; +}; + + +export type QueryTwirUsersArgs = { + opts: TwirUsersSearchParams; +}; + + +export type QueryTwitchGetChannelBadgesArgs = { + channelId?: InputMaybe; +}; + + +export type QueryTwitchGetChannelRewardsArgs = { + channelId?: InputMaybe; +}; + + +export type QueryTwitchGetUserByIdArgs = { + id: Scalars['ID']['input']; +}; + + +export type QueryTwitchGetUserByNameArgs = { + name: Scalars['String']['input']; +}; + + +export type QueryTwitchRewardsArgs = { + channelId?: InputMaybe; +}; + + +export type QueryUserPublicSettingsArgs = { + userId?: InputMaybe; +}; + +export type Role = { + __typename?: 'Role'; + channelId: Scalars['String']['output']; + id: Scalars['ID']['output']; + name: Scalars['String']['output']; + permissions: Array; + settings: RoleSettings; + type: RoleTypeEnum; + /** This is a list of user ids */ + users: Array; +}; + +export type RoleSettings = { + __typename?: 'RoleSettings'; + requiredMessages: Scalars['Int']['output']; + requiredUserChannelPoints: Scalars['Int']['output']; + requiredWatchTime: Scalars['Int']['output']; +}; + +export enum RoleTypeEnum { + Broadcaster = 'BROADCASTER', + Custom = 'CUSTOM', + Moderator = 'MODERATOR', + Subscriber = 'SUBSCRIBER', + Viewer = 'VIEWER', + Vip = 'VIP' +} + +export type RolesCreateOrUpdateOpts = { + name: Scalars['String']['input']; + permissions: Array; + settings: CreateOrUpdateRoleSettingsInput; + /** This is a list of user ids */ + users: Array; +}; + +export type RussianRouletteGame = { + __typename?: 'RussianRouletteGame'; + canBeUsedByModerator: Scalars['Boolean']['output']; + chargedBullets: Scalars['Int']['output']; + deathMessage: Scalars['String']['output']; + decisionSeconds: Scalars['Int']['output']; + enabled: Scalars['Boolean']['output']; + initMessage: Scalars['String']['output']; + surviveMessage: Scalars['String']['output']; + timeoutSeconds: Scalars['Int']['output']; + tumberSize: Scalars['Int']['output']; +}; + +export type RussianRouletteGameOpts = { + canBeUsedByModerator?: InputMaybe; + chargedBullets?: InputMaybe; + deathMessage?: InputMaybe; + decisionSeconds?: InputMaybe; + enabled?: InputMaybe; + initMessage?: InputMaybe; + surviveMessage?: InputMaybe; + timeoutSeconds?: InputMaybe; + tumberSize?: InputMaybe; +}; + +export type SeppukuGame = { + __typename?: 'SeppukuGame'; + enabled: Scalars['Boolean']['output']; + message: Scalars['String']['output']; + messageModerators: Scalars['String']['output']; + timeoutModerators: Scalars['Boolean']['output']; + timeoutSeconds: Scalars['Int']['output']; +}; + +export type SeppukuGameOpts = { + enabled?: InputMaybe; + message?: InputMaybe; + messageModerators?: InputMaybe; + timeoutModerators?: InputMaybe; + timeoutSeconds?: InputMaybe; +}; + +export type SocialLink = { + __typename?: 'SocialLink'; + href: Scalars['String']['output']; + title: Scalars['String']['output']; +}; + +export type SocialLinkInput = { + href: Scalars['String']['input']; + title: Scalars['String']['input']; +}; + +export type SongRequestsChannelTranslations = { + __typename?: 'SongRequestsChannelTranslations'; + denied: Scalars['String']['output']; +}; + +export type SongRequestsChannelTranslationsOpts = { + denied: Scalars['String']['input']; +}; + +export type SongRequestsDenyList = { + __typename?: 'SongRequestsDenyList'; + artistsNames: Array; + channels: Array; + songs: Array; + users: Array; + words: Array; +}; + +export type SongRequestsDenyListOpts = { + artistsNames: Array; + channels: Array; + songs: Array; + users: Array; + words: Array; +}; + +export type SongRequestsSearchChannelOrVideoItem = { + __typename?: 'SongRequestsSearchChannelOrVideoItem'; + id: Scalars['String']['output']; + thumbnail: Scalars['String']['output']; + title: Scalars['String']['output']; +}; + +export type SongRequestsSearchChannelOrVideoOpts = { + query: Array; + type: SongRequestsSearchChannelOrVideoOptsType; +}; + +export enum SongRequestsSearchChannelOrVideoOptsType { + Channel = 'CHANNEL', + Video = 'VIDEO' +} + +export type SongRequestsSearchChannelOrVideoResponse = { + __typename?: 'SongRequestsSearchChannelOrVideoResponse'; + items: Array; +}; + +export type SongRequestsSettings = { + __typename?: 'SongRequestsSettings'; + acceptOnlyWhenOnline: Scalars['Boolean']['output']; + announcePlay: Scalars['Boolean']['output']; + channelPointsRewardId?: Maybe; + denyList: SongRequestsDenyList; + enabled: Scalars['Boolean']['output']; + maxRequests: Scalars['Int']['output']; + neededVotesForSkip: Scalars['Int']['output']; + playerNoCookieMode: Scalars['Boolean']['output']; + song: SongRequestsSongSettings; + takeSongFromDonationMessages: Scalars['Boolean']['output']; + translations: SongRequestsTranslations; + user: SongRequestsUserSettings; +}; + +export type SongRequestsSettingsOpts = { + acceptOnlyWhenOnline: Scalars['Boolean']['input']; + announcePlay: Scalars['Boolean']['input']; + channelPointsRewardId?: InputMaybe; + denyList: SongRequestsDenyListOpts; + enabled: Scalars['Boolean']['input']; + maxRequests: Scalars['Int']['input']; + neededVotesForSkip: Scalars['Int']['input']; + playerNoCookieMode: Scalars['Boolean']['input']; + song: SongRequestsSongSettingsOpts; + takeSongFromDonationMessages: Scalars['Boolean']['input']; + translations: SongRequestsTranslationsOpts; + user: SongRequestsUserSettingsOpts; +}; + +export type SongRequestsSongSettings = { + __typename?: 'SongRequestsSongSettings'; + acceptedCategories: Array; + maxLength: Scalars['Int']['output']; + minLength: Scalars['Int']['output']; + minViews: Scalars['Int']['output']; +}; + +export type SongRequestsSongSettingsOpts = { + acceptedCategories: Array; + maxLength: Scalars['Int']['input']; + minLength: Scalars['Int']['input']; + minViews: Scalars['Int']['input']; +}; + +export type SongRequestsSongTranslations = { + __typename?: 'SongRequestsSongTranslations'; + ageRestrictions: Scalars['String']['output']; + alreadyInQueue: Scalars['String']['output']; + cannotGetInformation: Scalars['String']['output']; + denied: Scalars['String']['output']; + live: Scalars['String']['output']; + maxLength: Scalars['String']['output']; + maximumOrdered: Scalars['String']['output']; + minLength: Scalars['String']['output']; + minViews: Scalars['String']['output']; + notFound: Scalars['String']['output']; + requestedMessage: Scalars['String']['output']; +}; + +export type SongRequestsSongTranslationsOpts = { + ageRestrictions: Scalars['String']['input']; + alreadyInQueue: Scalars['String']['input']; + cannotGetInformation: Scalars['String']['input']; + denied: Scalars['String']['input']; + live: Scalars['String']['input']; + maxLength: Scalars['String']['input']; + maximumOrdered: Scalars['String']['input']; + minLength: Scalars['String']['input']; + minViews: Scalars['String']['input']; + notFound: Scalars['String']['input']; + requestedMessage: Scalars['String']['input']; +}; + +export type SongRequestsTranslations = { + __typename?: 'SongRequestsTranslations'; + acceptOnlyWhenOnline: Scalars['String']['output']; + channel: SongRequestsChannelTranslations; + noText: Scalars['String']['output']; + notEnabled: Scalars['String']['output']; + nowPlaying: Scalars['String']['output']; + song: SongRequestsSongTranslations; + user: SongRequestsUserTranslations; +}; + +export type SongRequestsTranslationsOpts = { + acceptOnlyWhenOnline: Scalars['String']['input']; + channel: SongRequestsChannelTranslationsOpts; + noText: Scalars['String']['input']; + notEnabled: Scalars['String']['input']; + nowPlaying: Scalars['String']['input']; + song: SongRequestsSongTranslationsOpts; + user: SongRequestsUserTranslationsOpts; +}; + +export type SongRequestsUserSettings = { + __typename?: 'SongRequestsUserSettings'; + maxRequests: Scalars['Int']['output']; + minFollowTime: Scalars['Int']['output']; + minMessages: Scalars['Int']['output']; + minWatchTime: Scalars['Int']['output']; +}; + +export type SongRequestsUserSettingsOpts = { + maxRequests: Scalars['Int']['input']; + minFollowTime: Scalars['Int']['input']; + minMessages: Scalars['Int']['input']; + minWatchTime: Scalars['Int']['input']; +}; + +export type SongRequestsUserTranslations = { + __typename?: 'SongRequestsUserTranslations'; + denied: Scalars['String']['output']; + maxRequests: Scalars['String']['output']; + minFollow: Scalars['String']['output']; + minMessages: Scalars['String']['output']; + minWatched: Scalars['String']['output']; +}; + +export type SongRequestsUserTranslationsOpts = { + denied: Scalars['String']['input']; + maxRequests: Scalars['String']['input']; + minFollow: Scalars['String']['input']; + minMessages: Scalars['String']['input']; + minWatched: Scalars['String']['input']; +}; + +export type Subscription = { + __typename?: 'Subscription'; + chatOverlaySettings?: Maybe; + dashboardStats: DashboardStats; + /** `newNotification` will return a stream of `Notification` objects. */ + newNotification: UserNotification; +}; + + +export type SubscriptionChatOverlaySettingsArgs = { + apiKey: Scalars['String']['input']; + id: Scalars['String']['input']; +}; + +export type Timer = { + __typename?: 'Timer'; + enabled: Scalars['Boolean']['output']; + id: Scalars['ID']['output']; + messageInterval: Scalars['Int']['output']; + name: Scalars['String']['output']; + responses: Array; + timeInterval: Scalars['Int']['output']; +}; + +export type TimerCreateInput = { + enabled: Scalars['Boolean']['input']; + messageInterval: Scalars['Int']['input']; + name: Scalars['String']['input']; + responses: Array; + timeInterval: Scalars['Int']['input']; +}; + +export type TimerResponse = { + __typename?: 'TimerResponse'; + id: Scalars['ID']['output']; + isAnnounce: Scalars['Boolean']['output']; + text: Scalars['String']['output']; +}; + +export type TimerResponseCreateInput = { + isAnnounce: Scalars['Boolean']['input']; + text: Scalars['String']['input']; +}; + +export type TimerResponseUpdateInput = { + isAnnounce: Scalars['Boolean']['input']; + text: Scalars['String']['input']; +}; + +export type TimerUpdateInput = { + enabled?: InputMaybe; + messageInterval?: InputMaybe; + name?: InputMaybe; + responses?: InputMaybe>; + timeInterval?: InputMaybe; +}; + +export type TwirAdminUser = TwirUser & { + __typename?: 'TwirAdminUser'; + apiKey: Scalars['String']['output']; + id: Scalars['ID']['output']; + isBanned: Scalars['Boolean']['output']; + isBotAdmin: Scalars['Boolean']['output']; + isBotEnabled: Scalars['Boolean']['output']; + isBotModerator: Scalars['Boolean']['output']; + twitchProfile: TwirUserTwitchInfo; +}; + +export type TwirBadgeCreateOpts = { + enabled?: InputMaybe; + ffzSlot: Scalars['Int']['input']; + file: Scalars['Upload']['input']; + name: Scalars['String']['input']; +}; + +export type TwirBadgeUpdateOpts = { + enabled?: InputMaybe; + ffzSlot?: InputMaybe; + file?: InputMaybe; + name?: InputMaybe; +}; + +export type TwirTwitchChannelBadgeResponse = { + __typename?: 'TwirTwitchChannelBadgeResponse'; + badges: Array; +}; + +export type TwirTwitchChannelReward = { + __typename?: 'TwirTwitchChannelReward'; + background_color: Scalars['String']['output']; + broadcaster_id: Scalars['ID']['output']; + broadcaster_login: Scalars['String']['output']; + broadcaster_name: Scalars['String']['output']; + cooldown_expires_at: Scalars['String']['output']; + cost: Scalars['Int']['output']; + global_cooldown_setting: TwirTwitchChannelRewardGlobalCooldownSetting; + id: Scalars['ID']['output']; + /** In case of image is not set - default image is used */ + image: TwirTwitchChannelRewardImage; + is_enabled: Scalars['Boolean']['output']; + is_in_stock: Scalars['Boolean']['output']; + is_paused: Scalars['Boolean']['output']; + is_user_input_required: Scalars['Boolean']['output']; + max_per_stream_setting: TwirTwitchChannelRewardMaxPerStreamSetting; + max_per_user_per_stream_setting: TwirTwitchChannelRewardMaxPerUserPerStreamSetting; + prompt: Scalars['String']['output']; + redemptions_redeemed_current_stream: Scalars['Int']['output']; + should_redemptions_skip_request_queue: Scalars['Boolean']['output']; + title: Scalars['String']['output']; +}; + +export type TwirTwitchChannelRewardGlobalCooldownSetting = { + __typename?: 'TwirTwitchChannelRewardGlobalCooldownSetting'; + global_cooldown_seconds: Scalars['Int']['output']; + is_enabled: Scalars['Boolean']['output']; +}; + +export type TwirTwitchChannelRewardImage = { + __typename?: 'TwirTwitchChannelRewardImage'; + url_1x: Scalars['String']['output']; + url_2x: Scalars['String']['output']; + url_4x: Scalars['String']['output']; +}; + +export type TwirTwitchChannelRewardMaxPerStreamSetting = { + __typename?: 'TwirTwitchChannelRewardMaxPerStreamSetting'; + is_enabled: Scalars['Boolean']['output']; + max_per_stream: Scalars['Int']['output']; +}; + +export type TwirTwitchChannelRewardMaxPerUserPerStreamSetting = { + __typename?: 'TwirTwitchChannelRewardMaxPerUserPerStreamSetting'; + is_enabled: Scalars['Boolean']['output']; + max_per_user_per_stream: Scalars['Int']['output']; +}; + +export type TwirTwitchChannelRewardResponse = { + __typename?: 'TwirTwitchChannelRewardResponse'; + partnerOrAffiliate: Scalars['Boolean']['output']; + rewards: Array; +}; + +export type TwirTwitchGlobalBadgeResponse = { + __typename?: 'TwirTwitchGlobalBadgeResponse'; + badges: Array; +}; + +export type TwirUser = { + id: Scalars['ID']['output']; + twitchProfile: TwirUserTwitchInfo; +}; + +export type TwirUserTwitchInfo = { + __typename?: 'TwirUserTwitchInfo'; + description: Scalars['String']['output']; + displayName: Scalars['String']['output']; + id: Scalars['String']['output']; + login: Scalars['String']['output']; + notFound: Scalars['Boolean']['output']; + profileImageUrl: Scalars['String']['output']; +}; + +export type TwirUsersResponse = { + __typename?: 'TwirUsersResponse'; + total: Scalars['Int']['output']; + users: Array; +}; + +export type TwirUsersSearchParams = { + badges?: InputMaybe>; + isBanned?: InputMaybe; + isBotAdmin?: InputMaybe; + isBotEnabled?: InputMaybe; + page?: InputMaybe; + perPage?: InputMaybe; + search?: InputMaybe; +}; + +export type TwitchBadge = { + __typename?: 'TwitchBadge'; + set_id: Scalars['String']['output']; + versions: Array; +}; + +export type TwitchBadgeVersion = { + __typename?: 'TwitchBadgeVersion'; + id: Scalars['String']['output']; + image_url_1x: Scalars['String']['output']; + image_url_2x: Scalars['String']['output']; + image_url_4x: Scalars['String']['output']; +}; + +export type TwitchRedemption = { + __typename?: 'TwitchRedemption'; + channelId: Scalars['String']['output']; + id: Scalars['ID']['output']; + prompt?: Maybe; + redeemedAt: Scalars['Time']['output']; + reward: TwitchReward; + user: TwirUserTwitchInfo; +}; + +export type TwitchRedemptionResponse = { + __typename?: 'TwitchRedemptionResponse'; + redemptions: Array; + total: Scalars['Int']['output']; +}; + +export type TwitchRedemptionsOpts = { + byChannelId?: InputMaybe; + page?: InputMaybe; + perPage?: InputMaybe; + rewardsIds?: InputMaybe>; + userSearch?: InputMaybe; +}; + +export type TwitchReward = { + __typename?: 'TwitchReward'; + backgroundColor: Scalars['String']['output']; + cost: Scalars['Int']['output']; + enabled: Scalars['Boolean']['output']; + id: Scalars['ID']['output']; + imageUrls?: Maybe>; + title: Scalars['String']['output']; + usedTimes: Scalars['Int']['output']; +}; + +export type UserNotification = Notification & { + __typename?: 'UserNotification'; + createdAt: Scalars['Time']['output']; + id: Scalars['ID']['output']; + text: Scalars['String']['output']; + userId?: Maybe; +}; + +export type UserUpdatePublicSettingsInput = { + description?: InputMaybe; + socialLinks?: InputMaybe>; +}; + +export type UserUpdateSettingsInput = { + hideOnLandingPage?: InputMaybe; +}; + +export type Variable = { + __typename?: 'Variable'; + description?: Maybe; + evalValue: Scalars['String']['output']; + id: Scalars['ID']['output']; + name: Scalars['String']['output']; + response: Scalars['String']['output']; + type: VariableType; +}; + +export type VariableCreateInput = { + description?: InputMaybe; + evalValue: Scalars['String']['input']; + name: Scalars['String']['input']; + response: Scalars['String']['input']; + type: VariableType; +}; + +export enum VariableType { + Number = 'NUMBER', + Script = 'SCRIPT', + Text = 'TEXT' +} + +export type VariableUpdateInput = { + description?: InputMaybe; + evalValue?: InputMaybe; + name?: InputMaybe; + response?: InputMaybe; + type?: InputMaybe; +}; + +export enum VoteBanGameVotingMode { + Chat = 'CHAT', + Polls = 'POLLS' +} + +export type VotebanGame = { + __typename?: 'VotebanGame'; + banMessage: Scalars['String']['output']; + banMessageModerators: Scalars['String']['output']; + chatVotesWordsNegative: Array; + chatVotesWordsPositive: Array; + enabled: Scalars['Boolean']['output']; + initMessage: Scalars['String']['output']; + neededVotes: Scalars['Int']['output']; + surviveMessage: Scalars['String']['output']; + surviveMessageModerators: Scalars['String']['output']; + timeoutModerators: Scalars['Boolean']['output']; + timeoutSeconds: Scalars['Int']['output']; + voteDuration: Scalars['Int']['output']; + votingMode: VoteBanGameVotingMode; +}; + +export type VotebanGameOpts = { + banMessage?: InputMaybe; + banMessageModerators?: InputMaybe; + chatVotesWordsNegative?: InputMaybe>; + chatVotesWordsPositive?: InputMaybe>; + enabled?: InputMaybe; + initMessage?: InputMaybe; + neededVotes?: InputMaybe; + surviveMessage?: InputMaybe; + surviveMessageModerators?: InputMaybe; + timeoutModerators?: InputMaybe; + timeoutSeconds?: InputMaybe; + voteDuration?: InputMaybe; + votingMode?: InputMaybe; +}; + +export type ChatOverlayWithAdditionalDataQueryVariables = Exact<{ + overlayId: Scalars['String']['input']; +}>; + + +export type ChatOverlayWithAdditionalDataQuery = { __typename?: 'Query', authenticatedUser: { __typename?: 'AuthenticatedUser', id: string, twitchProfile: { __typename?: 'TwirUserTwitchInfo', login: string, displayName: string, profileImageUrl: string } }, chatOverlaysById?: { __typename?: 'ChatOverlay', id: string, messageHideTimeout: number } | null, twitchGetGlobalBadges: { __typename?: 'TwirTwitchGlobalBadgeResponse', badges: Array<{ __typename?: 'TwitchBadge', set_id: string, versions: Array<{ __typename?: 'TwitchBadgeVersion', image_url_1x: string }> }> }, twitchGetChannelBadges: { __typename?: 'TwirTwitchChannelBadgeResponse', badges: Array<{ __typename?: 'TwitchBadge', set_id: string, versions: Array<{ __typename?: 'TwitchBadgeVersion', image_url_1x: string }> }> } }; + +export type ChatOverlaySettingsSubscriptionVariables = Exact<{ + id: Scalars['String']['input']; + apiKey: Scalars['String']['input']; +}>; + + +export type ChatOverlaySettingsSubscription = { __typename?: 'Subscription', chatOverlaySettings?: { __typename?: 'ChatOverlay', id: string, animation?: ChatOverlayAnimation | null, fontSize: number } | null }; + + +export const ChatOverlayWithAdditionalDataDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ChatOverlayWithAdditionalData"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"overlayId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"authenticatedUser"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"twitchProfile"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"login"}},{"kind":"Field","name":{"kind":"Name","value":"displayName"}},{"kind":"Field","name":{"kind":"Name","value":"profileImageUrl"}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"chatOverlaysById"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"overlayId"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"messageHideTimeout"}}]}},{"kind":"Field","name":{"kind":"Name","value":"twitchGetGlobalBadges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"badges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"set_id"}},{"kind":"Field","name":{"kind":"Name","value":"versions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"image_url_1x"}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"twitchGetChannelBadges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"badges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"set_id"}},{"kind":"Field","name":{"kind":"Name","value":"versions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"image_url_1x"}}]}}]}}]}}]}}]} as unknown as DocumentNode; +export const ChatOverlaySettingsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"ChatOverlaySettings"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"apiKey"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"chatOverlaySettings"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}},{"kind":"Argument","name":{"kind":"Name","value":"apiKey"},"value":{"kind":"Variable","name":{"kind":"Name","value":"apiKey"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"animation"}},{"kind":"Field","name":{"kind":"Name","value":"fontSize"}}]}}]}}]} as unknown as DocumentNode; \ No newline at end of file diff --git a/frontend/overlays/src/gql/index.ts b/frontend/overlays/src/gql/index.ts new file mode 100644 index 000000000..f51599168 --- /dev/null +++ b/frontend/overlays/src/gql/index.ts @@ -0,0 +1,2 @@ +export * from "./fragment-masking"; +export * from "./gql"; \ No newline at end of file diff --git a/frontend/overlays/src/main.ts b/frontend/overlays/src/main.ts index a13af24b8..b07d2595b 100644 --- a/frontend/overlays/src/main.ts +++ b/frontend/overlays/src/main.ts @@ -1,10 +1,19 @@ +import urql from '@urql/vue' import { createApp } from 'vue' import MainApp from './app.vue' -import { routes } from './routes.js' +import { router } from './plugins/router.js' + import './style.css' +import { urqlClientOptions } from '@/plugins/urql.ts' + +const app = createApp(MainApp) + +app + .use(router) + .use(urql, urqlClientOptions) -createApp(MainApp).use(routes).mount('#app') +app.mount('#app') // refresh the page when new version comes document.body.addEventListener('plugin_web_update_notice', () => { diff --git a/frontend/overlays/src/routes.ts b/frontend/overlays/src/plugins/router.ts similarity index 89% rename from frontend/overlays/src/routes.ts rename to frontend/overlays/src/plugins/router.ts index e4f236a36..754d13a1f 100644 --- a/frontend/overlays/src/routes.ts +++ b/frontend/overlays/src/plugins/router.ts @@ -1,6 +1,6 @@ -import { createRouter, createWebHistory } from 'vue-router'; +import { createRouter, createWebHistory } from 'vue-router' -export const routes = createRouter({ +export const router = createRouter({ history: createWebHistory('/overlays'), routes: [ { @@ -40,4 +40,4 @@ export const routes = createRouter({ component: () => import('@/pages/overlays/now-playing.vue'), }, ], -}); +}) diff --git a/frontend/overlays/src/plugins/urql.ts b/frontend/overlays/src/plugins/urql.ts new file mode 100644 index 000000000..b3404a4f4 --- /dev/null +++ b/frontend/overlays/src/plugins/urql.ts @@ -0,0 +1,43 @@ +import { cacheExchange, fetchExchange, subscriptionExchange } from '@urql/vue' +import { createClient as createWS } from 'graphql-ws' +import { useRoute } from 'vue-router' + +import type { ClientOptions } from '@urql/vue' +import type { SubscribePayload } from 'graphql-ws' + +const wsUrl = `${window.location.protocol === 'https:' ? 'wss' : 'ws'}://${window.location.host}/api/query` +const gqlApiUrl = `${window.location.protocol}//${window.location.host}/api/query` + +const gqlWs = createWS({ + url: wsUrl, + lazy: true, + shouldRetry: () => true, +}) + +export const urqlClientOptions: ClientOptions = { + url: gqlApiUrl, + exchanges: [ + cacheExchange, + fetchExchange, + subscriptionExchange({ + enableAllOperations: true, + forwardSubscription: (operation) => ({ + subscribe: (sink) => ({ + unsubscribe: gqlWs.subscribe(operation as SubscribePayload, sink), + }), + }), + }), + ], + fetchOptions: () => { + const headers: Record = {} + const route = useRoute() + const apiKey = route.params.apiKey + if (typeof apiKey === 'string') { + headers['X-Api-Key'] = apiKey + } + + return { + headers, + } + }, +} diff --git a/frontend/overlays/vite.config.ts b/frontend/overlays/vite.config.ts index b11b4e8be..a10494ad7 100644 --- a/frontend/overlays/vite.config.ts +++ b/frontend/overlays/vite.config.ts @@ -1,17 +1,23 @@ -import path from 'node:path'; +import path from 'node:path' -import { webUpdateNotice } from '@plugin-web-update-notification/vite'; -import vue from '@vitejs/plugin-vue'; -import { defineConfig } from 'vite'; +import { webUpdateNotice } from '@plugin-web-update-notification/vite' +import vue from '@vitejs/plugin-vue' +import { defineConfig } from 'vite' +import { watch } from 'vite-plugin-watch' // https://vitejs.dev/config/ export default defineConfig({ - plugins: [ + plugins: [ + watch({ + onInit: true, + pattern: 'src/**/*.ts', + command: 'graphql-codegen', + }), vue(), webUpdateNotice({ - hiddenDefaultNotification: true, - checkInterval: 1 * 60 * 1000, - }), + hiddenDefaultNotification: true, + checkInterval: 1 * 60 * 1000, + }), ], resolve: { alias: { @@ -19,9 +25,9 @@ export default defineConfig({ }, }, base: '/overlays', - server: { - host: true, - port: 3008, - }, + server: { + host: true, + port: 3008, + }, clearScreen: false, -}); +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4101dcb04..5fd1c1570 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,13 +10,13 @@ importers: devDependencies: '@antfu/eslint-config': specifier: 2.14.0 - version: 2.14.0(@vue/compiler-sfc@3.4.27)(eslint-plugin-astro@0.34.0)(eslint@9.4.0)(typescript@5.4.5) + version: 2.14.0(@vue/compiler-sfc@3.4.27)(eslint-plugin-astro@0.34.0)(eslint@8.57.0)(typescript@5.4.5) '@types/node': specifier: 20.12.7 version: 20.12.7 eslint-plugin-astro: specifier: 0.34.0 - version: 0.34.0(eslint@9.4.0)(typescript@5.4.5) + version: 0.34.0(eslint@8.57.0)(typescript@5.4.5) rimraf: specifier: 5.0.5 version: 5.0.5 @@ -427,6 +427,9 @@ importers: '@twirapp/kappagen': specifier: 1.0.1 version: 1.0.1(vue@3.4.21) + '@urql/vue': + specifier: 1.1.3 + version: 1.1.3(graphql@16.8.1)(vue@3.4.21) '@vueuse/core': specifier: 10.9.0 version: 10.9.0(vue@3.4.21) @@ -436,6 +439,9 @@ importers: emoji-regex: specifier: 10.3.0 version: 10.3.0 + graphql-ws: + specifier: 5.16.0 + version: 5.16.0(graphql@16.8.1) nested-css-to-flat: specifier: 1.0.5 version: 1.0.5 @@ -452,6 +458,9 @@ importers: specifier: 4.3.0 version: 4.3.0(vue@3.4.21) devDependencies: + '@graphql-codegen/cli': + specifier: 5.0.2 + version: 5.0.2(@types/node@20.12.7)(graphql@16.8.1)(typescript@5.4.5) '@twir/types': specifier: workspace:* version: link:../../libs/types @@ -467,6 +476,9 @@ importers: vite: specifier: 5.2.8 version: 5.2.8(@types/node@20.12.7)(sass@1.75.0) + vite-plugin-watch: + specifier: 0.3.1 + version: 0.3.1 vue-tsc: specifier: 2.0.13 version: 2.0.13(typescript@5.4.5) @@ -712,7 +724,7 @@ packages: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - /@antfu/eslint-config@2.14.0(@vue/compiler-sfc@3.4.27)(eslint-plugin-astro@0.34.0)(eslint@9.4.0)(typescript@5.4.5): + /@antfu/eslint-config@2.14.0(@vue/compiler-sfc@3.4.27)(eslint-plugin-astro@0.34.0)(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-9yn/5n/dZnH7qSlCTk1Z3VWPbNb3Wfq31GflQuXkh3jUqSCHuDbuspfDAQ3/ABnrPRJSP1Nm7yTKJbXfcQ3p+A==} hasBin: true peerDependencies: @@ -757,37 +769,37 @@ packages: dependencies: '@antfu/install-pkg': 0.3.3 '@clack/prompts': 0.7.0 - '@stylistic/eslint-plugin': 1.8.1(eslint@9.4.0)(typescript@5.4.5) - '@typescript-eslint/eslint-plugin': 7.12.0(@typescript-eslint/parser@7.12.0)(eslint@9.4.0)(typescript@5.4.5) - '@typescript-eslint/parser': 7.12.0(eslint@9.4.0)(typescript@5.4.5) - eslint: 9.4.0 + '@stylistic/eslint-plugin': 1.8.1(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/eslint-plugin': 7.12.0(@typescript-eslint/parser@7.12.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.12.0(eslint@8.57.0)(typescript@5.4.5) + eslint: 8.57.0 eslint-config-flat-gitignore: 0.1.5 eslint-flat-config-utils: 0.2.5 - eslint-merge-processors: 0.1.0(eslint@9.4.0) - eslint-plugin-antfu: 2.3.3(eslint@9.4.0) - eslint-plugin-astro: 0.34.0(eslint@9.4.0)(typescript@5.4.5) - eslint-plugin-eslint-comments: 3.2.0(eslint@9.4.0) - eslint-plugin-import-x: 0.5.1(eslint@9.4.0)(typescript@5.4.5) - eslint-plugin-jsdoc: 48.2.8(eslint@9.4.0) - eslint-plugin-jsonc: 2.16.0(eslint@9.4.0) - eslint-plugin-markdown: 4.0.1(eslint@9.4.0) - eslint-plugin-n: 17.8.1(eslint@9.4.0) + eslint-merge-processors: 0.1.0(eslint@8.57.0) + eslint-plugin-antfu: 2.3.3(eslint@8.57.0) + eslint-plugin-astro: 0.34.0(eslint@8.57.0)(typescript@5.4.5) + eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.0) + eslint-plugin-import-x: 0.5.1(eslint@8.57.0)(typescript@5.4.5) + eslint-plugin-jsdoc: 48.2.8(eslint@8.57.0) + eslint-plugin-jsonc: 2.16.0(eslint@8.57.0) + eslint-plugin-markdown: 4.0.1(eslint@8.57.0) + eslint-plugin-n: 17.8.1(eslint@8.57.0) eslint-plugin-no-only-tests: 3.1.0 - eslint-plugin-perfectionist: 2.10.0(eslint@9.4.0)(typescript@5.4.5)(vue-eslint-parser@9.4.3) - eslint-plugin-toml: 0.11.0(eslint@9.4.0) - eslint-plugin-unicorn: 52.0.0(eslint@9.4.0) - eslint-plugin-unused-imports: 3.2.0(@typescript-eslint/eslint-plugin@7.12.0)(eslint@9.4.0) - eslint-plugin-vitest: 0.5.4(@typescript-eslint/eslint-plugin@7.12.0)(eslint@9.4.0)(typescript@5.4.5) - eslint-plugin-vue: 9.26.0(eslint@9.4.0) - eslint-plugin-yml: 1.14.0(eslint@9.4.0) - eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.4.27)(eslint@9.4.0) + eslint-plugin-perfectionist: 2.10.0(eslint@8.57.0)(typescript@5.4.5)(vue-eslint-parser@9.4.3) + eslint-plugin-toml: 0.11.0(eslint@8.57.0) + eslint-plugin-unicorn: 52.0.0(eslint@8.57.0) + eslint-plugin-unused-imports: 3.2.0(@typescript-eslint/eslint-plugin@7.12.0)(eslint@8.57.0) + eslint-plugin-vitest: 0.5.4(@typescript-eslint/eslint-plugin@7.12.0)(eslint@8.57.0)(typescript@5.4.5) + eslint-plugin-vue: 9.26.0(eslint@8.57.0) + eslint-plugin-yml: 1.14.0(eslint@8.57.0) + eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.4.27)(eslint@8.57.0) globals: 15.4.0 jsonc-eslint-parser: 2.4.0 local-pkg: 0.5.0 parse-gitignore: 2.0.0 picocolors: 1.0.1 toml-eslint-parser: 0.9.3 - vue-eslint-parser: 9.4.3(eslint@9.4.0) + vue-eslint-parser: 9.4.3(eslint@8.57.0) yaml-eslint-parser: 1.2.3 yargs: 17.7.2 transitivePeerDependencies: @@ -2153,13 +2165,13 @@ packages: requiresBuild: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@9.4.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 9.4.0 + eslint: 8.57.0 eslint-visitor-keys: 3.4.3 dev: true @@ -2168,17 +2180,6 @@ packages: engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true - /@eslint/config-array@0.15.1: - resolution: {integrity: sha512-K4gzNq+yymn/EVsXYmf+SBcBro8MTf+aXJZUphM96CdzUEr+ClGDvAbpmaEK+cGVigVXIgs9gNmvHAlrzzY5JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - '@eslint/object-schema': 2.1.3 - debug: 4.3.5 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - /@eslint/eslintrc@2.1.4: resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2196,31 +2197,9 @@ packages: - supports-color dev: true - /@eslint/eslintrc@3.1.0: - resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.5 - espree: 10.0.1 - globals: 14.0.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@eslint/js@9.4.0: - resolution: {integrity: sha512-fdI7VJjP3Rvc70lC4xkFXHB0fiPeojiL1PxVG6t1ZvXQrarj893PweuBTujxDUFk0Fxj4R7PIIAZ/aiiyZPZcg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true - - /@eslint/object-schema@2.1.3: - resolution: {integrity: sha512-HAbhAYKfsAC2EkTqve00ibWIZlaU74Z1EHwAjYr4PXF0YU2VEA1zSIKSSpKszRLRWwHzzRZXvK632u+uXzvsvw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + /@eslint/js@8.57.0: + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true /@fastify/accept-negotiator@1.1.0: @@ -2965,14 +2944,24 @@ packages: vue-demi: 0.14.8(vue@3.4.21) dev: false + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.5 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} dev: true - /@humanwhocodes/retry@0.3.0: - resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} - engines: {node: '>=18.18'} + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} dev: true /@interactjs/types@1.10.27: @@ -3960,7 +3949,7 @@ packages: '@daybrush/utils': 1.13.0 dev: false - /@stylistic/eslint-plugin-js@1.8.1(eslint@9.4.0): + /@stylistic/eslint-plugin-js@1.8.1(eslint@8.57.0): resolution: {integrity: sha512-c5c2C8Mos5tTQd+NWpqwEu7VT6SSRooAguFPMj1cp2RkTYl1ynKoXo8MWy3k4rkbzoeYHrqC2UlUzsroAN7wtQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -3969,64 +3958,64 @@ packages: '@types/eslint': 8.56.10 acorn: 8.11.3 escape-string-regexp: 4.0.0 - eslint: 9.4.0 + eslint: 8.57.0 eslint-visitor-keys: 3.4.3 espree: 9.6.1 dev: true - /@stylistic/eslint-plugin-jsx@1.8.1(eslint@9.4.0): + /@stylistic/eslint-plugin-jsx@1.8.1(eslint@8.57.0): resolution: {integrity: sha512-k1Eb6rcjMP+mmjvj+vd9y5KUdWn1OBkkPLHXhsrHt5lCDFZxJEs0aVQzE5lpYrtVZVkpc5esTtss/cPJux0lfA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: '>=8.40.0' dependencies: - '@stylistic/eslint-plugin-js': 1.8.1(eslint@9.4.0) + '@stylistic/eslint-plugin-js': 1.8.1(eslint@8.57.0) '@types/eslint': 8.56.10 - eslint: 9.4.0 + eslint: 8.57.0 estraverse: 5.3.0 picomatch: 4.0.2 dev: true - /@stylistic/eslint-plugin-plus@1.8.1(eslint@9.4.0)(typescript@5.4.5): + /@stylistic/eslint-plugin-plus@1.8.1(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-4+40H3lHYTN8OWz+US8CamVkO+2hxNLp9+CAjorI7top/lHqemhpJvKA1LD9Uh+WMY9DYWiWpL2+SZ2wAXY9fQ==} peerDependencies: eslint: '*' dependencies: '@types/eslint': 8.56.10 - '@typescript-eslint/utils': 6.21.0(eslint@9.4.0)(typescript@5.4.5) - eslint: 9.4.0 + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@stylistic/eslint-plugin-ts@1.8.1(eslint@9.4.0)(typescript@5.4.5): + /@stylistic/eslint-plugin-ts@1.8.1(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-/q1m+ZuO1JHfiSF16EATFzv7XSJkc5W6DocfvH5o9oB6WWYFMF77fVoBWnKT3wGptPOc2hkRupRKhmeFROdfWA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: '>=8.40.0' dependencies: - '@stylistic/eslint-plugin-js': 1.8.1(eslint@9.4.0) + '@stylistic/eslint-plugin-js': 1.8.1(eslint@8.57.0) '@types/eslint': 8.56.10 - '@typescript-eslint/utils': 6.21.0(eslint@9.4.0)(typescript@5.4.5) - eslint: 9.4.0 + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@stylistic/eslint-plugin@1.8.1(eslint@9.4.0)(typescript@5.4.5): + /@stylistic/eslint-plugin@1.8.1(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-64My6I7uCcmSQ//427Pfg2vjSf9SDzfsGIWohNFgISMLYdC5BzJqDo647iDDJzSxINh3WTC0Ql46ifiKuOoTyA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: '>=8.40.0' dependencies: - '@stylistic/eslint-plugin-js': 1.8.1(eslint@9.4.0) - '@stylistic/eslint-plugin-jsx': 1.8.1(eslint@9.4.0) - '@stylistic/eslint-plugin-plus': 1.8.1(eslint@9.4.0)(typescript@5.4.5) - '@stylistic/eslint-plugin-ts': 1.8.1(eslint@9.4.0)(typescript@5.4.5) + '@stylistic/eslint-plugin-js': 1.8.1(eslint@8.57.0) + '@stylistic/eslint-plugin-jsx': 1.8.1(eslint@8.57.0) + '@stylistic/eslint-plugin-plus': 1.8.1(eslint@8.57.0)(typescript@5.4.5) + '@stylistic/eslint-plugin-ts': 1.8.1(eslint@8.57.0)(typescript@5.4.5) '@types/eslint': 8.56.10 - eslint: 9.4.0 + eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript @@ -4403,7 +4392,7 @@ packages: '@types/node': 20.12.7 dev: true - /@typescript-eslint/eslint-plugin@7.12.0(@typescript-eslint/parser@7.12.0)(eslint@9.4.0)(typescript@5.4.5): + /@typescript-eslint/eslint-plugin@7.12.0(@typescript-eslint/parser@7.12.0)(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-7F91fcbuDf/d3S8o21+r3ZncGIke/+eWk0EpO21LXhDfLahriZF9CGj4fbAetEjlaBdjdSm9a6VeXbpbT6Z40Q==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -4415,12 +4404,12 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.1 - '@typescript-eslint/parser': 7.12.0(eslint@9.4.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.12.0(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/scope-manager': 7.12.0 - '@typescript-eslint/type-utils': 7.12.0(eslint@9.4.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.12.0(eslint@9.4.0)(typescript@5.4.5) + '@typescript-eslint/type-utils': 7.12.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.12.0(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/visitor-keys': 7.12.0 - eslint: 9.4.0 + eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 @@ -4430,7 +4419,7 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@7.12.0(eslint@9.4.0)(typescript@5.4.5): + /@typescript-eslint/parser@7.12.0(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-dm/J2UDY3oV3TKius2OUZIFHsomQmpHtsV0FTh1WO8EKgHLQ1QCADUqscPgTpU+ih1e21FQSRjXckHn3txn6kQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -4445,7 +4434,7 @@ packages: '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.4.5) '@typescript-eslint/visitor-keys': 7.12.0 debug: 4.3.5 - eslint: 9.4.0 + eslint: 8.57.0 typescript: 5.4.5 transitivePeerDependencies: - supports-color @@ -4475,7 +4464,7 @@ packages: '@typescript-eslint/visitor-keys': 7.12.0 dev: true - /@typescript-eslint/type-utils@7.12.0(eslint@9.4.0)(typescript@5.4.5): + /@typescript-eslint/type-utils@7.12.0(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-lib96tyRtMhLxwauDWUp/uW3FMhLA6D0rJ8T7HmH7x23Gk1Gwwu8UZ94NMXBvOELn6flSPiBrCKlehkiXyaqwA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: @@ -4486,9 +4475,9 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.4.5) - '@typescript-eslint/utils': 7.12.0(eslint@9.4.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.12.0(eslint@8.57.0)(typescript@5.4.5) debug: 4.3.5 - eslint: 9.4.0 + eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.4.5) typescript: 5.4.5 transitivePeerDependencies: @@ -4575,36 +4564,36 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@6.21.0(eslint@9.4.0)(typescript@5.4.5): + /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.4.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) - eslint: 9.4.0 + eslint: 8.57.0 semver: 7.6.2 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/utils@7.12.0(eslint@9.4.0)(typescript@5.4.5): + /@typescript-eslint/utils@7.12.0(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-Y6hhwxwDx41HNpjuYswYp6gDbkiZ8Hin9Bf5aJQn1bpTs3afYY4GX+MPYxma8jtoIV2GRwTM/UJm/2uGCVv+DQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.4.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@typescript-eslint/scope-manager': 7.12.0 '@typescript-eslint/types': 7.12.0 '@typescript-eslint/typescript-estree': 7.12.0(typescript@5.4.5) - eslint: 9.4.0 + eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript @@ -4647,7 +4636,6 @@ packages: /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: false /@urql/core@5.0.4(graphql@16.8.1): resolution: {integrity: sha512-gl86J6B6gWXvvkx5omZ+CaGiPQ0chCUGM0jBsm0zTtkDQPRqufv0NSUN6sp2JhGGtTOB0NR6Pd+w7XAVGGyUOA==} @@ -6736,13 +6724,13 @@ packages: source-map: 0.6.1 dev: true - /eslint-compat-utils@0.5.1(eslint@9.4.0): + /eslint-compat-utils@0.5.1(eslint@8.57.0): resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} engines: {node: '>=12'} peerDependencies: eslint: '>=6.0.0' dependencies: - eslint: 9.4.0 + eslint: 8.57.0 semver: 7.6.2 dev: true @@ -6770,35 +6758,35 @@ packages: - supports-color dev: true - /eslint-merge-processors@0.1.0(eslint@9.4.0): + /eslint-merge-processors@0.1.0(eslint@8.57.0): resolution: {integrity: sha512-IvRXXtEajLeyssvW4wJcZ2etxkR9mUf4zpNwgI+m/Uac9RfXHskuJefkHUcawVzePnd6xp24enp5jfgdHzjRdQ==} peerDependencies: eslint: '*' dependencies: - eslint: 9.4.0 + eslint: 8.57.0 dev: true - /eslint-plugin-antfu@2.3.3(eslint@9.4.0): + /eslint-plugin-antfu@2.3.3(eslint@8.57.0): resolution: {integrity: sha512-TAgYNuc20QyKw8NXtpzR3LeMTTv1qAJVKkjCVzjRSGiSR1EetEY7LRgQVhcgP/C1FnI87isQERAIkKvkYyLq0Q==} peerDependencies: eslint: '*' dependencies: '@antfu/utils': 0.7.8 - eslint: 9.4.0 + eslint: 8.57.0 dev: true - /eslint-plugin-astro@0.34.0(eslint@9.4.0)(typescript@5.4.5): + /eslint-plugin-astro@0.34.0(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-nzw2H4g7HPXPLsWVpGUxuJ/ViVPLI8lM/AaUCJ51qTLTWtaMhvlvoe2d7yIPMFc+7xeCzQdo1POK8eR7NFsdKQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=7.0.0' dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.4.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@jridgewell/sourcemap-codec': 1.4.15 '@typescript-eslint/types': 5.62.0 astro-eslint-parser: 0.17.0(typescript@5.4.5) - eslint: 9.4.0 - eslint-compat-utils: 0.5.1(eslint@9.4.0) + eslint: 8.57.0 + eslint-compat-utils: 0.5.1(eslint@8.57.0) globals: 13.24.0 postcss: 8.4.38 postcss-selector-parser: 6.1.0 @@ -6807,39 +6795,39 @@ packages: - typescript dev: true - /eslint-plugin-es-x@7.6.0(eslint@9.4.0): + /eslint-plugin-es-x@7.6.0(eslint@8.57.0): resolution: {integrity: sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.4.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.10.1 - eslint: 9.4.0 - eslint-compat-utils: 0.5.1(eslint@9.4.0) + eslint: 8.57.0 + eslint-compat-utils: 0.5.1(eslint@8.57.0) dev: true - /eslint-plugin-eslint-comments@3.2.0(eslint@9.4.0): + /eslint-plugin-eslint-comments@3.2.0(eslint@8.57.0): resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} engines: {node: '>=6.5.0'} peerDependencies: eslint: '>=4.19.1' dependencies: escape-string-regexp: 1.0.5 - eslint: 9.4.0 + eslint: 8.57.0 ignore: 5.3.1 dev: true - /eslint-plugin-import-x@0.5.1(eslint@9.4.0)(typescript@5.4.5): + /eslint-plugin-import-x@0.5.1(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-2JK8bbFOLes+gG6tgdnM8safCxMAj4u2wjX8X1BRFPfnY7Ct2hFYESoIcVwABX/DDcdpQFLGtKmzbNEWJZD9iQ==} engines: {node: '>=16'} peerDependencies: eslint: ^8.56.0 || ^9.0.0-0 dependencies: - '@typescript-eslint/utils': 7.12.0(eslint@9.4.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.12.0(eslint@8.57.0)(typescript@5.4.5) debug: 4.3.5 doctrine: 3.0.0 - eslint: 9.4.0 + eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 get-tsconfig: 4.7.5 is-glob: 4.0.3 @@ -6851,7 +6839,7 @@ packages: - typescript dev: true - /eslint-plugin-jsdoc@48.2.8(eslint@9.4.0): + /eslint-plugin-jsdoc@48.2.8(eslint@8.57.0): resolution: {integrity: sha512-b72WNCHxmcrtYh6ejy0Y5rQH0mJpym27fT4P3HU3fbqEo3J95/hdG7VlevOHK0PZrHk1pVnClCBH7wXw2RMIXg==} engines: {node: '>=18'} peerDependencies: @@ -6862,7 +6850,7 @@ packages: comment-parser: 1.4.1 debug: 4.3.5 escape-string-regexp: 4.0.0 - eslint: 9.4.0 + eslint: 8.57.0 esquery: 1.5.0 semver: 7.6.2 spdx-expression-parse: 4.0.0 @@ -6870,15 +6858,15 @@ packages: - supports-color dev: true - /eslint-plugin-jsonc@2.16.0(eslint@9.4.0): + /eslint-plugin-jsonc@2.16.0(eslint@8.57.0): resolution: {integrity: sha512-Af/ZL5mgfb8FFNleH6KlO4/VdmDuTqmM+SPnWcdoWywTetv7kq+vQe99UyQb9XO3b0OWLVuTH7H0d/PXYCMdSg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.4.0) - eslint: 9.4.0 - eslint-compat-utils: 0.5.1(eslint@9.4.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + eslint: 8.57.0 + eslint-compat-utils: 0.5.1(eslint@8.57.0) espree: 9.6.1 graphemer: 1.4.0 jsonc-eslint-parser: 2.4.0 @@ -6886,28 +6874,28 @@ packages: synckit: 0.6.2 dev: true - /eslint-plugin-markdown@4.0.1(eslint@9.4.0): + /eslint-plugin-markdown@4.0.1(eslint@8.57.0): resolution: {integrity: sha512-5/MnGvYU0i8MbHH5cg8S+Vl3DL+bqRNYshk1xUO86DilNBaxtTkhH+5FD0/yO03AmlI6+lfNFdk2yOw72EPzpA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8' dependencies: - eslint: 9.4.0 + eslint: 8.57.0 mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-n@17.8.1(eslint@9.4.0): + /eslint-plugin-n@17.8.1(eslint@8.57.0): resolution: {integrity: sha512-KdG0h0voZms8UhndNu8DeWx1eM4sY+A4iXtsNo6kOfJLYHNeTGPacGalJ9GcvrbmOL3r/7QOMwVZDSw+1SqsrA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.4.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) enhanced-resolve: 5.17.0 - eslint: 9.4.0 - eslint-plugin-es-x: 7.6.0(eslint@9.4.0) + eslint: 8.57.0 + eslint-plugin-es-x: 7.6.0(eslint@8.57.0) get-tsconfig: 4.7.5 globals: 15.4.0 ignore: 5.3.1 @@ -6920,7 +6908,7 @@ packages: engines: {node: '>=5.0.0'} dev: true - /eslint-plugin-perfectionist@2.10.0(eslint@9.4.0)(typescript@5.4.5)(vue-eslint-parser@9.4.3): + /eslint-plugin-perfectionist@2.10.0(eslint@8.57.0)(typescript@5.4.5)(vue-eslint-parser@9.4.3): resolution: {integrity: sha512-P+tdrkHeMWBc55+DZsoDOAftV1WCsEoHaKm6JC7zajFus/syfT4vUPBFb3atGFSuyaVnGQGHlcKpP9X3Q0gH/w==} peerDependencies: astro-eslint-parser: ^0.16.0 @@ -6938,44 +6926,44 @@ packages: vue-eslint-parser: optional: true dependencies: - '@typescript-eslint/utils': 7.12.0(eslint@9.4.0)(typescript@5.4.5) - eslint: 9.4.0 + '@typescript-eslint/utils': 7.12.0(eslint@8.57.0)(typescript@5.4.5) + eslint: 8.57.0 minimatch: 9.0.4 natural-compare-lite: 1.4.0 - vue-eslint-parser: 9.4.3(eslint@9.4.0) + vue-eslint-parser: 9.4.3(eslint@8.57.0) transitivePeerDependencies: - supports-color - typescript dev: true - /eslint-plugin-toml@0.11.0(eslint@9.4.0): + /eslint-plugin-toml@0.11.0(eslint@8.57.0): resolution: {integrity: sha512-sau+YvPU4fWTjB+qtBt3n8WS87aoDCs+BVbSUAemGaIsRNbvR9uEk+Tt892iLHTGvp/DPWYoCX4/8DoyAbB+sQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: debug: 4.3.5 - eslint: 9.4.0 - eslint-compat-utils: 0.5.1(eslint@9.4.0) + eslint: 8.57.0 + eslint-compat-utils: 0.5.1(eslint@8.57.0) lodash: 4.17.21 toml-eslint-parser: 0.9.3 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-unicorn@52.0.0(eslint@9.4.0): + /eslint-plugin-unicorn@52.0.0(eslint@8.57.0): resolution: {integrity: sha512-1Yzm7/m+0R4djH0tjDjfVei/ju2w3AzUGjG6q8JnuNIL5xIwsflyCooW5sfBvQp2pMYQFSWWCFONsjCax1EHng==} engines: {node: '>=16'} peerDependencies: eslint: '>=8.56.0' dependencies: '@babel/helper-validator-identifier': 7.24.7 - '@eslint-community/eslint-utils': 4.4.0(eslint@9.4.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint/eslintrc': 2.1.4 ci-info: 4.0.0 clean-regexp: 1.0.0 core-js-compat: 3.37.1 - eslint: 9.4.0 + eslint: 8.57.0 esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 @@ -6990,7 +6978,7 @@ packages: - supports-color dev: true - /eslint-plugin-unused-imports@3.2.0(@typescript-eslint/eslint-plugin@7.12.0)(eslint@9.4.0): + /eslint-plugin-unused-imports@3.2.0(@typescript-eslint/eslint-plugin@7.12.0)(eslint@8.57.0): resolution: {integrity: sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -7000,12 +6988,12 @@ packages: '@typescript-eslint/eslint-plugin': optional: true dependencies: - '@typescript-eslint/eslint-plugin': 7.12.0(@typescript-eslint/parser@7.12.0)(eslint@9.4.0)(typescript@5.4.5) - eslint: 9.4.0 + '@typescript-eslint/eslint-plugin': 7.12.0(@typescript-eslint/parser@7.12.0)(eslint@8.57.0)(typescript@5.4.5) + eslint: 8.57.0 eslint-rule-composer: 0.3.0 dev: true - /eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@7.12.0)(eslint@9.4.0)(typescript@5.4.5): + /eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@7.12.0)(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-um+odCkccAHU53WdKAw39MY61+1x990uXjSPguUCq3VcEHdqJrOb8OTMrbYlY6f9jAKx7x98kLVlIe3RJeJqoQ==} engines: {node: ^18.0.0 || >= 20.0.0} peerDependencies: @@ -7018,42 +7006,42 @@ packages: vitest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 7.12.0(@typescript-eslint/parser@7.12.0)(eslint@9.4.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.12.0(eslint@9.4.0)(typescript@5.4.5) - eslint: 9.4.0 + '@typescript-eslint/eslint-plugin': 7.12.0(@typescript-eslint/parser@7.12.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.12.0(eslint@8.57.0)(typescript@5.4.5) + eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript dev: true - /eslint-plugin-vue@9.26.0(eslint@9.4.0): + /eslint-plugin-vue@9.26.0(eslint@8.57.0): resolution: {integrity: sha512-eTvlxXgd4ijE1cdur850G6KalZqk65k1JKoOI2d1kT3hr8sPD07j1q98FRFdNnpxBELGPWxZmInxeHGF/GxtqQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.4.0) - eslint: 9.4.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + eslint: 8.57.0 globals: 13.24.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.1.0 semver: 7.6.2 - vue-eslint-parser: 9.4.3(eslint@9.4.0) + vue-eslint-parser: 9.4.3(eslint@8.57.0) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-yml@1.14.0(eslint@9.4.0): + /eslint-plugin-yml@1.14.0(eslint@8.57.0): resolution: {integrity: sha512-ESUpgYPOcAYQO9czugcX5OqRvn/ydDVwGCPXY4YjPqc09rHaUVUA6IE6HLQys4rXk/S+qx3EwTd1wHCwam/OWQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: debug: 4.3.5 - eslint: 9.4.0 - eslint-compat-utils: 0.5.1(eslint@9.4.0) + eslint: 8.57.0 + eslint-compat-utils: 0.5.1(eslint@8.57.0) lodash: 4.17.21 natural-compare: 1.4.0 yaml-eslint-parser: 1.2.3 @@ -7061,14 +7049,14 @@ packages: - supports-color dev: true - /eslint-processor-vue-blocks@0.1.2(@vue/compiler-sfc@3.4.27)(eslint@9.4.0): + /eslint-processor-vue-blocks@0.1.2(@vue/compiler-sfc@3.4.27)(eslint@8.57.0): resolution: {integrity: sha512-PfpJ4uKHnqeL/fXUnzYkOax3aIenlwewXRX8jFinA1a2yCFnLgMuiH3xvCgvHHUlV2xJWQHbCTdiJWGwb3NqpQ==} peerDependencies: '@vue/compiler-sfc': ^3.3.0 eslint: ^8.50.0 || ^9.0.0 dependencies: '@vue/compiler-sfc': 3.4.27 - eslint: 9.4.0 + eslint: 8.57.0 dev: true /eslint-rule-composer@0.3.0: @@ -7084,55 +7072,46 @@ packages: estraverse: 5.3.0 dev: true - /eslint-scope@8.0.1: - resolution: {integrity: sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - /eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint-visitor-keys@4.0.0: - resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true - - /eslint@9.4.0: - resolution: {integrity: sha512-sjc7Y8cUD1IlwYcTS9qPSvGjAC8Ne9LctpxKKu3x/1IC9bnOg98Zy6GxEJUfr1NojMgVPlyANXYns8oE2c1TAA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + /eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.4.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.10.1 - '@eslint/config-array': 0.15.1 - '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.4.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.3.0 '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 debug: 4.3.5 + doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 8.0.1 - eslint-visitor-keys: 4.0.0 - espree: 10.0.1 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 + file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 ignore: 5.3.1 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 + js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 @@ -7150,15 +7129,6 @@ packages: engines: {node: '>=6'} dev: false - /espree@10.0.1: - resolution: {integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - eslint-visitor-keys: 4.0.0 - dev: true - /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7410,11 +7380,11 @@ packages: escape-string-regexp: 1.0.5 dev: true - /file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flat-cache: 4.0.1 + flat-cache: 3.2.0 dev: true /file-manager@2.0.1: @@ -7469,12 +7439,13 @@ packages: pkg-dir: 4.2.0 dev: false - /flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: flatted: 3.3.1 keyv: 4.5.4 + rimraf: 3.0.2 dev: true /flatted@3.3.1: @@ -7668,11 +7639,6 @@ packages: type-fest: 0.20.2 dev: true - /globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - dev: true - /globals@15.4.0: resolution: {integrity: sha512-unnwvMZpv0eDUyjNyh9DH/yxUaRYrEjW/qK4QcdrHg3oO11igUQrCSgODHEqxlKg8v2CD2Sd7UkqqEBoz5U7TQ==} engines: {node: '>=18'} @@ -10905,7 +10871,6 @@ packages: hasBin: true dependencies: glob: 7.2.3 - dev: false /rimraf@5.0.5: resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} @@ -12521,14 +12486,14 @@ packages: dependencies: vue: 3.4.21(typescript@5.4.5) - /vue-eslint-parser@9.4.3(eslint@9.4.0): + /vue-eslint-parser@9.4.3(eslint@8.57.0): resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: debug: 4.3.5 - eslint: 9.4.0 + eslint: 8.57.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1