@tmdb-graphql-api/resolvers 0.1.12 → 0.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +1 -1
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/production.analysis.txt +26 -26
- package/dist/types/cjs/helpers/buildNoObjArgsResolver.d.cts.map +1 -1
- package/dist/types/esm/helpers/buildNoObjArgsResolver.d.ts.map +1 -1
- package/dist/types/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/helpers/buildNoObjArgsResolver.ts +1 -0
- package/src/helpers/buildObjArgsResolver.ts +2 -2
- package/src/helpers/buildObjResolver.ts +1 -1
package/dist/esm/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../resolvers/src//helpers/createDefaultFieldResolver.ts","../resolvers/src//helpers/typePropNames.ts","../resolvers/src//helpers/makeFallbackFieldResolvers.ts","../resolvers/src//constants.ts","../resolvers/src//helpers/buildArgsResolver.ts","../resolvers/src//queries/certifications.ts","../resolvers/src//helpers/buildObjArgsResolver.ts","../resolvers/src//queries/collection.ts","../resolvers/src//helpers/buildObjResolver.ts","../resolvers/src//queries/collectionImages.ts","../resolvers/src//queries/collectionTranslations.ts","../resolvers/src//queries/company.ts","../resolvers/src//queries/companyAlternativeNames.ts","../resolvers/src//queries/companyLogos.ts","../resolvers/src//helpers/buildNoObjArgsResolver.ts","../resolvers/src//queries/configuration.ts","../resolvers/src//queries/configurationCountries.ts","../resolvers/src//queries/configurationJobs.ts","../resolvers/src//queries/configurationLanguages.ts","../resolvers/src//queries/configurationPrimaryTranslations.ts","../resolvers/src//queries/configurationTimezones.ts","../resolvers/src//queries/credit.ts","../resolvers/src//helpers/removeNullValues.ts","../resolvers/src//helpers/snakeCasePropNames.ts","../resolvers/src//helpers/formatQueryParams.ts","../resolvers/src//helpers/formatDirectionalSuffixes.ts","../resolvers/src//queries/discoverMovies.ts","../resolvers/src//queries/discoverTv.ts","../resolvers/src//helpers/encodeId.ts","../resolvers/src//helpers/getAppendToResponseKeys.ts","../resolvers/src//helpers/getTvIdSeasonAndEpisode.ts","../resolvers/src//helpers/decodeId.ts","../resolvers/src//helpers/setAppendToResponseSearchParams.ts","../resolvers/src//queries/episode.ts","../resolvers/src//queries/episodeCredits.ts","../resolvers/src//queries/episodeExternalIds.ts","../resolvers/src//queries/episodeStills.ts","../resolvers/src//queries/episodeTranslations.ts","../resolvers/src//queries/episodeVideos.ts","../resolvers/src//queries/find.ts","../resolvers/src//queries/genres.ts","../resolvers/src//queries/keyword.ts","../resolvers/src//queries/movie.ts","../resolvers/src//queries/movieAlternativeTitles.ts","../resolvers/src//queries/movieCredits.ts","../resolvers/src//queries/movieExternalIds.ts","../resolvers/src//queries/movieImages.ts","../resolvers/src//queries/movieKeywords.ts","../resolvers/src//queries/movieRecommendations.ts","../resolvers/src//queries/movieReleaseDates.ts","../resolvers/src//queries/movieReviews.ts","../resolvers/src//queries/movieSimilarMovies.ts","../resolvers/src//queries/movieTranslations.ts","../resolvers/src//queries/movieVideos.ts","../resolvers/src//queries/movieWatchProviders.ts","../resolvers/src//queries/network.ts","../resolvers/src//queries/networkAlternativeNames.ts","../resolvers/src//queries/networkLogos.ts","../resolvers/src//queries/person.ts","../resolvers/src//queries/personCombinedCredits.ts","../resolvers/src//queries/personExternalIds.ts","../resolvers/src//queries/personMovieCredits.ts","../resolvers/src//queries/personProfiles.ts","../resolvers/src//queries/personTranslations.ts","../resolvers/src//queries/personTvCredits.ts","../resolvers/src//queries/rated.ts","../resolvers/src//queries/review.ts","../resolvers/src//queries/search.ts","../resolvers/src//queries/season.ts","../resolvers/src//queries/seasonCredits.ts","../resolvers/src//queries/seasonExternalIds.ts","../resolvers/src//queries/seasonPosters.ts","../resolvers/src//queries/seasonTranslations.ts","../resolvers/src//queries/seasonVideos.ts","../resolvers/src//queries/trending.ts","../resolvers/src//queries/tv.ts","../resolvers/src//queries/tvAlternativeTitles.ts","../resolvers/src//queries/tvContentRatings.ts","../resolvers/src//queries/tvCredits.ts","../resolvers/src//queries/tvEpisodeGroups.ts","../resolvers/src//queries/tvExternalIds.ts","../resolvers/src//queries/tvImages.ts","../resolvers/src//queries/tvKeywords.ts","../resolvers/src//queries/tvRecommendations.ts","../resolvers/src//queries/tvReviews.ts","../resolvers/src//queries/tvSimilarTvShows.ts","../resolvers/src//queries/tvTranslations.ts","../resolvers/src//queries/tvVideos.ts","../resolvers/src//queries/tvWatchProviders.ts","../resolvers/src//main.ts","../resolvers/src//queries/seasonEpisodeCount.ts","../resolvers/src//queries/videoType.ts"],"sourcesContent":["import { type PlainObject } from '@graphql-box/core';\nimport { type GraphQLFieldResolver } from 'graphql';\nimport { snakeCase } from 'lodash-es';\n\nexport const createDefaultFieldResolver =\n <\n Source extends PlainObject = PlainObject,\n Context extends PlainObject = PlainObject,\n Args extends PlainObject = PlainObject\n >(): GraphQLFieldResolver<Source, Context, Args> =>\n (object, _arguments, _context, { fieldNodes }) => {\n const currentField = fieldNodes[0]!;\n const { value: name } = currentField.name;\n\n if (Object.prototype.hasOwnProperty.call(object, name)) {\n return object[name];\n }\n\n return object[snakeCase(name)];\n };\n","import { schema } from '@tmdb-graphql-api/schema';\nimport { type GraphQLObjectType, Kind } from 'graphql';\n\nconst typeMap = schema.getTypeMap();\n\nexport const typePropNames = Object.keys(typeMap).reduce<Record<string, string[]>>((acc, key) => {\n const type = typeMap[key];\n\n if (type?.astNode?.kind === Kind.OBJECT_TYPE_DEFINITION) {\n acc[key] = Object.keys((type as GraphQLObjectType).getFields());\n }\n\n return acc;\n}, {});\n","import { type FieldResolver } from '../types.ts';\nimport { typePropNames } from './typePropNames.ts';\n\nexport const makeFallbackFieldResolvers = (typeName: string, resolver: FieldResolver) => {\n const propNames = typePropNames[typeName]!;\n\n return propNames.reduce<Record<string, FieldResolver>>((acc, propName) => {\n acc[propName] = resolver;\n return acc;\n }, {});\n};\n","export const ALTERNATIVE_NAMES = 'alternativeNames' as const;\nexport const ALTERNATIVE_TITLES = 'alternativeTitles' as const;\n\nexport const BACKDROPS = 'backdrops' as const;\n\nexport const CAST = 'cast' as const;\nexport const CERTIFICATIONS = 'certifications' as const;\nexport const COLLECTION = 'collection' as const;\nexport const COMBINED_CREDITS = 'combinedCredits' as const;\nexport const COMPANY = 'company' as const;\nexport const CONFIGURATION = 'configuration' as const;\nexport const CONTENT_RATINGS = 'contentRatings' as const;\nexport const COUNTRIES = 'countries' as const;\nexport const CREDIT = 'credit' as const;\nexport const CREDITS = 'credits' as const;\nexport const CREW = 'crew' as const;\n\nexport const DISCOVER_MOVIES = 'discoverMovies' as const;\nexport const DISCOVER_TV = 'discoverTv' as const;\n\nexport const EPISODE = 'episode' as const;\nexport const EPISODE_GROUPS = 'episodeGroups' as const;\nexport const EXTERNAL_IDS = 'externalIds' as const;\n\nexport const FIND = 'find' as const;\n\nexport const GENRES = 'genres' as const;\nexport const GUEST_STARS = 'guestStars' as const;\n\nexport const IMAGES = 'images' as const;\n\nexport const JOBS = 'jobs' as const;\n\nexport const KEYWORD = 'keyword' as const;\nexport const KEYWORDS = 'keywords' as const;\n\nexport const LANGUAGES = 'languages' as const;\nexport const LOGOS = 'logos' as const;\n\nexport const MOVIE = 'movie' as const;\nexport const MOVIES = 'movies' as const;\nexport const MOVIE_CREDITS = 'movieCredits' as const;\n\nexport const NETWORK = 'network' as const;\n\nexport const PERSON = 'person' as const;\nexport const POSTERS = 'posters' as const;\nexport const PRIMARY_TRANSLATIONS = 'primaryTranslations' as const;\nexport const PROFILES = 'profiles' as const;\n\nexport const RATED = 'rated' as const;\nexport const RECOMMENDATIONS = 'recommendations' as const;\nexport const RELEASE_DATES = 'releaseDates' as const;\nexport const RESULTS = 'results' as const;\nexport const REVIEW = 'review' as const;\nexport const REVIEWS = 'reviews' as const;\n\nexport const SEARCH = 'search' as const;\nexport const SEASON = 'season' as const;\nexport const SIMILAR = 'similar' as const;\nexport const SIMILAR_MOVIES = 'similarMovies' as const;\nexport const SIMILAR_TV_SHOWS = 'similarTvShows' as const;\nexport const STILLS = 'stills' as const;\n\nexport const TIMEZONES = 'timezones' as const;\nexport const TRANSLATIONS = 'translations' as const;\nexport const TRENDING = 'trending' as const;\nexport const TV = 'tv' as const;\nexport const TV_CREDITS = 'tvCredits' as const;\n\nexport const VIDEOS = 'videos' as const;\n\nexport const WATCH_PROVIDERS = 'watchProviders' as const;\nexport const RAW_WATCH_PROVIDERS = 'watch/providers' as const;\n\nexport enum ResolverType {\n Args = 'ARGS',\n Obj = 'OBJ',\n ObjAndArgs = 'OBJ_AND_ARGS',\n OptsObjAndArgs = 'OPTS_OBJ_AND_ARGS',\n}\n\nexport enum Source {\n Api = 'api',\n Cache = 'cache',\n ParentNode = 'parentNode',\n}\n","import { GraphQLError, type GraphQLResolveInfo } from 'graphql';\nimport crypto from 'node:crypto';\nimport { ResolverType, type Source } from '../constants.ts';\nimport { type Context } from '../types.ts';\n\nexport const buildArgsResolver =\n <Args extends object, Data>(\n fieldName: string,\n callback: (\n args: Args,\n ctx: Context,\n info: GraphQLResolveInfo\n ) => Promise<{ data?: Data; errors?: Error[]; headers: Headers; source?: Source }>\n ) =>\n async (_obj: undefined, args: Args, ctx: Context, info: GraphQLResolveInfo) => {\n const { logger, setCacheMetadata } = ctx;\n const { fieldNodes } = info;\n\n const newCtx = {\n ...ctx,\n data: {\n ...ctx.data,\n args,\n fieldPath: fieldName,\n resolverRequestId: crypto.randomUUID(),\n resolverType: ResolverType.Args,\n },\n };\n\n const childLogger = logger.child(newCtx.data);\n\n childLogger.info(`Resolving ${fieldName} ${JSON.stringify(args)}`, { logEntryName: 'RESOLVER_START' });\n const { data, errors, headers } = await callback(args, newCtx, info);\n\n if (errors?.length) {\n const message = `Failed to resolve ${fieldName}`;\n childLogger.error(message, { errors: JSON.stringify(errors), logEntryName: 'RESOLVER_FAILED' });\n throw new GraphQLError(message, { nodes: fieldNodes, originalError: errors[0] });\n }\n\n setCacheMetadata(fieldName, headers);\n return data;\n };\n","import { type QueryCertificationsArgs } from '@tmdb-graphql-api/schema/types';\nimport { CERTIFICATIONS } from '../constants.ts';\nimport { buildArgsResolver } from '../helpers/buildArgsResolver.ts';\nimport { type RawCertifications } from '../types.ts';\n\nexport const resolveCertifications = buildArgsResolver<QueryCertificationsArgs, RawCertifications['certifications']>(\n CERTIFICATIONS,\n async (args, ctx) => {\n const { screenType } = args;\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors } = await restClient.certifications<RawCertifications>(\n {\n pathTemplateData: { type: screenType.toLowerCase() },\n },\n ctxData\n );\n\n return {\n data: data?.certifications,\n errors,\n headers: new Headers({ cacheControl: 'public, max-age=28800' }),\n };\n }\n);\n","import { GraphQLError, type GraphQLResolveInfo } from 'graphql';\nimport { isUndefined, snakeCase } from 'lodash-es';\nimport crypto from 'node:crypto';\nimport { ResolverType, type Source } from '../constants.ts';\nimport { type Context } from '../types.ts';\n\nexport const buildObjArgsResolver =\n <Obj extends object, Args extends object, Data>(\n parentFieldName: string,\n callback: (\n obj: Obj | undefined,\n args: Args,\n ctx: Context,\n info: GraphQLResolveInfo\n ) => Promise<{ data?: Data; errors?: Error[]; headers?: Headers; source?: Source }>\n ) =>\n async (obj: Obj | undefined, args: Args, ctx: Context, info: GraphQLResolveInfo) => {\n const { logger, setCacheMetadata } = ctx;\n const { fieldName, fieldNodes } = info;\n const fieldPath = obj ? `${parentFieldName}.${fieldName}` : parentFieldName;\n\n const newCtx = {\n ...ctx,\n data: {\n ...ctx.data,\n args,\n fieldPath: parentFieldName,\n resolverRequestId: crypto.randomUUID(),\n resolverType: ResolverType.ObjAndArgs,\n },\n };\n\n const childLogger = logger.child(newCtx.data);\n const id = obj && 'id' in obj && obj.id ? obj.id : 'id' in args ? args.id : undefined;\n\n const enrichLogMessage = (message: string) => {\n const enrichedMessage = `${message} ${parentFieldName}`;\n return id ? `${enrichedMessage} ${String(id)}` : enrichedMessage;\n };\n\n const typedFieldName = snakeCase(fieldName) as keyof Obj;\n const loggingEnabled = !(obj && !isUndefined(obj[typedFieldName]));\n\n if (loggingEnabled) {\n childLogger.info(enrichLogMessage('Resolving'), { logEntryName: 'RESOLVER_START' });\n }\n\n const { data, errors, headers } = await callback(obj, args, newCtx, info);\n\n if (errors?.length) {\n const message = enrichLogMessage('Failed to resolve');\n\n if (loggingEnabled) {\n childLogger.error(message, { errors: JSON.stringify(errors), logEntryName: 'RESOLVER_FAILED' });\n }\n\n throw new GraphQLError(message, { nodes: fieldNodes, originalError: errors[0] });\n }\n\n if (headers) {\n setCacheMetadata(fieldPath, headers);\n }\n\n return data;\n };\n","import { type QueryCollectionArgs } from '@tmdb-graphql-api/schema/types';\nimport { isUndefined, snakeCase } from 'lodash-es';\nimport { COLLECTION, Source } from '../constants.ts';\nimport { buildObjArgsResolver } from '../helpers/buildObjArgsResolver.ts';\nimport { type RawCollection } from '../types.ts';\n\nexport const resolveCollection = buildObjArgsResolver<\n RawCollection,\n QueryCollectionArgs,\n RawCollection | RawCollection[keyof RawCollection]\n>(COLLECTION, async (obj, args, ctx, info) => {\n const id = obj?.id ?? args.id;\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = snakeCase(fieldName) as keyof RawCollection;\n\n if (obj && !isUndefined(obj[typedFieldName])) {\n return {\n data: obj[typedFieldName],\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.collection<RawCollection>(\n {\n pathTemplateData: { id },\n },\n ctxData\n );\n\n return {\n data: obj ? data?.[typedFieldName] : data,\n errors,\n headers,\n };\n});\n","import { GraphQLError, type GraphQLResolveInfo } from 'graphql';\nimport crypto from 'node:crypto';\nimport { ResolverType, type Source } from '../constants.ts';\nimport { type Context } from '../types.ts';\n\nexport const buildObjResolver =\n <Obj extends { id: number | string }, Data>(\n parentFieldName: string,\n callback: (\n obj: Obj,\n ctx: Context,\n info: GraphQLResolveInfo\n ) => Promise<{ data?: Data; errors?: Error[]; headers?: Headers; source?: Source }>\n ) =>\n async (obj: Obj | undefined, _args: undefined, ctx: Context, info: GraphQLResolveInfo) => {\n const { logger, setCacheMetadata } = ctx;\n const { fieldName, fieldNodes } = info;\n const fieldPath = `${parentFieldName}.${fieldName}`;\n\n const newCtx = {\n ...ctx,\n data: {\n ...ctx.data,\n fieldPath,\n parentFieldId: obj?.id,\n resolverRequestId: crypto.randomUUID(),\n resolverType: ResolverType.Obj,\n },\n };\n\n const childLogger = logger.child(newCtx.data);\n\n if (!obj) {\n const message = `Required ${parentFieldName} node missing`;\n childLogger.error(message);\n throw new GraphQLError(message, { nodes: fieldNodes });\n }\n\n childLogger.info(`Resolving ${fieldPath}`, { logEntryName: 'RESOLVER_START' });\n const { data, errors, headers } = await callback(obj, newCtx, info);\n\n if (errors?.length) {\n const message = `Failed to resolve ${fieldPath}`;\n childLogger.error(message, { errors: JSON.stringify(errors), logEntryName: 'RESOLVER_FAILED' });\n throw new GraphQLError(message, { nodes: fieldNodes, originalError: errors[0] });\n }\n\n if (headers) {\n setCacheMetadata(fieldPath, headers);\n }\n\n return data;\n };\n","import { COLLECTION, IMAGES } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawCollection, type RawCollectionImages } from '../types.ts';\n\nexport const resolveCollectionImages = buildObjResolver<\n RawCollection,\n RawCollectionImages['backdrops'] | RawCollectionImages['posters']\n>(COLLECTION, async (obj, ctx, info) => {\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n\n const { data, errors, headers } = await restClient.collection<RawCollectionImages>(\n {\n pathTemplateData: { id: obj.id, type: IMAGES },\n },\n ctxData\n );\n\n const typedFieldName = fieldName as 'backdrops' | 'posters';\n\n return {\n data: data?.[typedFieldName],\n errors,\n headers,\n };\n});\n","import { COLLECTION, TRANSLATIONS } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawCollection, type RawCollectionTranslations } from '../types.ts';\n\nexport const resolveCollectionTranslations = buildObjResolver<RawCollection, RawCollectionTranslations['translations']>(\n COLLECTION,\n async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.collection<RawCollectionTranslations>(\n {\n pathTemplateData: { id: obj.id, type: TRANSLATIONS },\n },\n ctxData\n );\n\n return {\n data: data?.translations,\n errors,\n headers,\n };\n }\n);\n","import { type QueryCompanyArgs } from '@tmdb-graphql-api/schema/types';\nimport { isUndefined, snakeCase } from 'lodash-es';\nimport { COMPANY, Source } from '../constants.ts';\nimport { buildObjArgsResolver } from '../helpers/buildObjArgsResolver.ts';\nimport { type RawCompany } from '../types.ts';\n\nexport const resolveCompany = buildObjArgsResolver<\n RawCompany,\n QueryCompanyArgs,\n RawCompany | RawCompany[keyof RawCompany]\n>(COMPANY, async (obj, args, ctx, info) => {\n const id = obj?.id ?? args.id;\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = snakeCase(fieldName) as keyof RawCompany;\n\n if (obj && !isUndefined(obj[typedFieldName])) {\n return {\n data: obj[typedFieldName],\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.company<RawCompany>(\n {\n pathTemplateData: { id },\n },\n ctxData\n );\n\n return {\n data: obj ? data?.[typedFieldName] : data,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport { ALTERNATIVE_NAMES, COMPANY } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawCollection, type RawCompanyAlternativeNames } from '../types.ts';\n\nexport const resolveCompanyAlternativeNames = buildObjResolver<RawCollection, RawCompanyAlternativeNames['results']>(\n COMPANY,\n async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.company<RawCompanyAlternativeNames>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(ALTERNATIVE_NAMES) },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n }\n);\n","import { COMPANY, IMAGES } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport type { RawCompany, RawCompanyLogos } from '../types.ts';\n\nexport const resolveCompanyLogos = buildObjResolver<RawCompany, RawCompanyLogos['logos']>(COMPANY, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.company<RawCompanyLogos>(\n {\n pathTemplateData: { id: obj.id, type: IMAGES },\n },\n ctxData\n );\n\n return {\n data: data?.logos,\n errors,\n headers,\n };\n});\n","import { GraphQLError, type GraphQLResolveInfo } from 'graphql';\nimport crypto from 'node:crypto';\nimport { ResolverType, type Source } from '../constants.ts';\nimport type { Context } from '../types.ts';\n\nexport const buildNoObjArgsResolver =\n <Obj, Data>(\n parentFieldName: string,\n callback: (\n ctx: Context,\n info: GraphQLResolveInfo\n ) => Promise<{ data?: Data; errors?: Error[]; headers: Headers; source?: Source }>\n ) =>\n async (obj: Obj | undefined, _args: undefined, ctx: Context, info: GraphQLResolveInfo) => {\n const { logger, setCacheMetadata } = ctx;\n const { fieldName, fieldNodes } = info;\n const fieldPath = obj ? `${parentFieldName}.${fieldName}` : parentFieldName;\n\n const newCtx = {\n ...ctx,\n data: {\n ...ctx.data,\n fieldPath,\n resolverRequestId: crypto.randomUUID(),\n resolverType: ResolverType.OptsObjAndArgs,\n },\n };\n\n const childLogger = logger.child(newCtx.data);\n childLogger.info(`Resolving ${fieldPath}`, { logEntryName: 'RESOLVER_START' });\n const { data, errors, headers } = await callback(newCtx, info);\n\n if (errors?.length) {\n const message = `Failed to resolve ${fieldPath}`;\n childLogger.error(message, { errors: JSON.stringify(errors), logEntryName: 'RESOLVER_FAILED' });\n throw new GraphQLError(message, { nodes: fieldNodes, originalError: errors[0] });\n }\n\n setCacheMetadata(fieldPath, headers);\n return data;\n };\n","import { CONFIGURATION } from '../constants.ts';\nimport { buildNoObjArgsResolver } from '../helpers/buildNoObjArgsResolver.ts';\nimport { type RawConfiguration } from '../types.ts';\n\nexport const resolveConfiguration = buildNoObjArgsResolver<undefined, RawConfiguration>(CONFIGURATION, async ctx => {\n const { data: ctxData, restClient } = ctx;\n const { data, errors, headers } = await restClient.configuration<RawConfiguration>(undefined, ctxData);\n\n return {\n data,\n errors,\n headers,\n };\n});\n","import { CONFIGURATION, COUNTRIES } from '../constants.ts';\nimport { buildNoObjArgsResolver } from '../helpers/buildNoObjArgsResolver.ts';\nimport { type RawConfiguration, type RawConfigurationCountries } from '../types.ts';\n\nexport const resolveConfigurationCountries = buildNoObjArgsResolver<RawConfiguration, RawConfigurationCountries>(\n CONFIGURATION,\n async ctx => {\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.configuration<RawConfigurationCountries>(\n {\n pathTemplateData: { type: COUNTRIES },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n }\n);\n","import { CONFIGURATION, JOBS } from '../constants.ts';\nimport { buildNoObjArgsResolver } from '../helpers/buildNoObjArgsResolver.ts';\nimport { type RawConfiguration, type RawConfigurationJobs } from '../types.ts';\n\nexport const resolveConfigurationJobs = buildNoObjArgsResolver<RawConfiguration, RawConfigurationJobs>(\n CONFIGURATION,\n async ctx => {\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.configuration<RawConfigurationJobs>(\n {\n pathTemplateData: { type: JOBS },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n }\n);\n","import { CONFIGURATION, LANGUAGES } from '../constants.ts';\nimport { buildNoObjArgsResolver } from '../helpers/buildNoObjArgsResolver.ts';\nimport { type RawConfiguration, type RawConfigurationLanguages } from '../types.ts';\n\nexport const resolveConfigurationLanguages = buildNoObjArgsResolver<RawConfiguration, RawConfigurationLanguages>(\n CONFIGURATION,\n async ctx => {\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.configuration<RawConfigurationLanguages>(\n {\n pathTemplateData: { type: LANGUAGES },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n }\n);\n","import { snakeCase } from 'lodash-es';\nimport { CONFIGURATION, PRIMARY_TRANSLATIONS } from '../constants.ts';\nimport { buildNoObjArgsResolver } from '../helpers/buildNoObjArgsResolver.ts';\nimport { type RawConfiguration, type RawConfigurationPrimaryTranslations } from '../types.ts';\n\nexport const resolveConfigurationPrimaryTranslations = buildNoObjArgsResolver<\n RawConfiguration,\n RawConfigurationPrimaryTranslations\n>(CONFIGURATION, async ctx => {\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.configuration<RawConfigurationPrimaryTranslations>(\n {\n pathTemplateData: { type: snakeCase(PRIMARY_TRANSLATIONS) },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n});\n","import { CONFIGURATION, TIMEZONES } from '../constants.ts';\nimport { buildNoObjArgsResolver } from '../helpers/buildNoObjArgsResolver.ts';\nimport { type RawConfiguration, type RawConfigurationTimezones } from '../types.ts';\n\nexport const resolveConfigurationTimezones = buildNoObjArgsResolver<RawConfiguration, RawConfigurationTimezones>(\n CONFIGURATION,\n async ctx => {\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.configuration<RawConfigurationTimezones>(\n {\n pathTemplateData: { type: TIMEZONES },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n }\n);\n","import { type QueryCreditArgs } from '@tmdb-graphql-api/schema/types';\nimport { CREDIT } from '../constants.ts';\nimport { buildArgsResolver } from '../helpers/buildArgsResolver.ts';\nimport { type RawCredit } from '../types.ts';\n\nexport const resolveCredit = buildArgsResolver<QueryCreditArgs, RawCredit>(CREDIT, async (args, ctx) => {\n const { id } = args;\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.credit<RawCredit>(\n {\n pathTemplateData: { id },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n});\n","import { type PlainObject } from '@graphql-box/core';\n\nexport const removeNullValues = <P extends PlainObject>(props: P) =>\n Object.keys(props).reduce<PlainObject>((acc, propName) => {\n if (props[propName] === null) {\n return acc;\n }\n\n acc[propName] = props[propName];\n return acc;\n }, {}) as P;\n","import { type PlainObject } from '@graphql-box/core';\nimport { snakeCase } from 'lodash-es';\nimport { type SnakeCasedPropertiesDeep } from 'type-fest';\n\nexport const snakeCasePropNames = <P extends PlainObject>(props: P) =>\n Object.keys(props).reduce<PlainObject>((snakeCased, propName) => {\n snakeCased[snakeCase(propName)] = props[propName];\n return snakeCased;\n }, {}) as SnakeCasedPropertiesDeep<P>;\n","import { removeConnectionInputOptions } from '@graphql-box/connection-resolver';\nimport { type PlainObject } from '@graphql-box/core';\nimport { formatDirectionalSuffixes } from './formatDirectionalSuffixes.ts';\nimport { removeNullValues } from './removeNullValues.ts';\nimport { snakeCasePropNames } from './snakeCasePropNames.ts';\n\nexport const formatQueryParams = (args: PlainObject) =>\n formatDirectionalSuffixes(snakeCasePropNames(removeNullValues(removeConnectionInputOptions(args))));\n","import { type PlainObject } from '@graphql-box/core';\nimport { type ValueOf } from 'type-fest';\n\nexport const formatDirectionalSuffixes = <P extends PlainObject>(props: P) =>\n Object.keys(props).reduce<PlainObject>((accumulator, propertyName) => {\n if (propertyName === 'sort_by') {\n accumulator[propertyName] = (props[propertyName] as string).toLowerCase().replace(/_([a-z]+)$/, '.$1');\n } else if (propertyName.endsWith('_gte') || propertyName.endsWith('_lte')) {\n accumulator[propertyName.replace(/_([a-z]+)$/, '.$1')] = props[propertyName] as ValueOf<P>;\n } else {\n accumulator[propertyName] = props[propertyName] as ValueOf<P>;\n }\n\n return accumulator;\n }, {}) as P;\n","import { Core } from '@cachemap/core';\nimport { init as map } from '@cachemap/map';\nimport { init as reaper } from '@cachemap/reaper';\nimport {\n type CreateResourceResolver,\n type Getters,\n makeConnectionResolver,\n removeConnectionInputOptions,\n} from '@graphql-box/connection-resolver';\nimport { type QueryDiscoverMoviesArgs } from '@tmdb-graphql-api/schema/types';\nimport { encode } from 'js-base64';\nimport { DISCOVER_MOVIES, MOVIE } from '../constants.ts';\nimport { formatQueryParams } from '../helpers/formatQueryParams.ts';\nimport { removeNullValues } from '../helpers/removeNullValues.ts';\nimport { type Context, type RawDiscoverMovies, type RawMovie } from '../types.ts';\n\n/* eslint-disable camelcase */\n\nexport const createMakeCursors = (_obj: undefined, args: QueryDiscoverMoviesArgs) => {\n const groupCursor = `${JSON.stringify(removeNullValues(removeConnectionInputOptions(args)))}::${DISCOVER_MOVIES}`;\n\n return {\n makeGroupCursor: () => encode(groupCursor),\n makeIDCursor: (id: string | number) => encode(`${id}::${groupCursor}`),\n };\n};\n\nexport const createResourceResolver: CreateResourceResolver<\n undefined,\n QueryDiscoverMoviesArgs,\n Context,\n RawDiscoverMovies\n> =\n (_obj, args, { data: ctxData, restClient }) =>\n async ({ page }) =>\n restClient.discover<RawDiscoverMovies>(\n {\n pathTemplateData: { type: MOVIE },\n queryParams: { ...formatQueryParams(args), page },\n },\n ctxData\n );\n\nexport const cursorCache = new Core({\n name: 'DISCOVER_MOVIES_CONNECTION_RESOLVER',\n reaper: reaper({ interval: 300_000 }),\n store: map(),\n type: 'GRAPHQL',\n});\n\nexport const getters: Getters<RawDiscoverMovies, RawMovie> = {\n // @ts-expect-error nested identifier is optional when\n // it shouldn't be\n nodes: ({ results = [] }) => results,\n page: ({ page = 0 }) => page,\n totalPages: ({ total_pages = 0 }) => total_pages,\n totalResults: ({ total_results = 0 }) => total_results,\n};\n\nexport const resolveDiscoverMovies = makeConnectionResolver({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resultsPerPage: 20,\n});\n","import { Core } from '@cachemap/core';\nimport { init as map } from '@cachemap/map';\nimport { init as reaper } from '@cachemap/reaper';\nimport {\n type CreateResourceResolver,\n type Getters,\n makeConnectionResolver,\n removeConnectionInputOptions,\n} from '@graphql-box/connection-resolver';\nimport { type QueryDiscoverTvArgs } from '@tmdb-graphql-api/schema/types';\nimport { encode } from 'js-base64';\nimport { DISCOVER_TV, TV } from '../constants.ts';\nimport { formatQueryParams } from '../helpers/formatQueryParams.ts';\nimport { removeNullValues } from '../helpers/removeNullValues.ts';\nimport { type Context, type RawDiscoverTv, type RawTv } from '../types.ts';\n\n/* eslint-disable camelcase */\n\nexport const createMakeCursors = (_obj: undefined, args: QueryDiscoverTvArgs) => {\n const groupCursor = `${JSON.stringify(removeNullValues(removeConnectionInputOptions(args)))}::${DISCOVER_TV}`;\n\n return {\n makeGroupCursor: () => encode(groupCursor),\n makeIDCursor: (id: string | number) => encode(`${id}::${groupCursor}`),\n };\n};\n\nexport const createResourceResolver: CreateResourceResolver<undefined, QueryDiscoverTvArgs, Context, RawDiscoverTv> =\n (_obj, args, { data: ctxData, restClient }) =>\n async ({ page }) =>\n restClient.discover<RawDiscoverTv>(\n {\n pathTemplateData: { type: TV },\n queryParams: { ...formatQueryParams(args), page },\n },\n ctxData\n );\n\nexport const cursorCache = new Core({\n name: 'DISCOVER_TV_CONNECTION_RESOLVER',\n reaper: reaper({ interval: 300_000 }),\n store: map(),\n type: 'GRAPHQL',\n});\n\nexport const getters: Getters<RawDiscoverTv, RawTv> = {\n // @ts-expect-error nested identifier is optional when\n // it shouldn't be\n nodes: ({ results = [] }) => results,\n page: ({ page = 0 }) => page,\n totalPages: ({ total_pages = 0 }) => total_pages,\n totalResults: ({ total_results = 0 }) => total_results,\n};\n\nexport const resolveDiscoverTv = makeConnectionResolver({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resultsPerPage: 20,\n});\n","import { encode } from 'js-base64';\nimport { type JsonObject } from 'type-fest';\n\nexport const encodeId = <T extends JsonObject>(obj: T) => encodeURIComponent(encode(JSON.stringify(obj)));\n","import { type FragmentDefinitionNodeMap } from '@graphql-box/core';\nimport { getChildFields, getName } from '@graphql-box/helpers';\nimport { type FieldNode } from 'graphql';\n\nexport const getAppendToResponseKeys = (\n parentFieldNode: FieldNode,\n appendToResponse: Record<string, string>,\n fragmentDefinitions?: FragmentDefinitionNodeMap\n) =>\n (getChildFields(parentFieldNode, { fragmentDefinitions }) ?? []).reduce((acc: string[], { fieldNode }) => {\n const name = getName(fieldNode);\n\n if (!name) {\n return acc;\n }\n\n const key = appendToResponse[name];\n\n if (!key) {\n return acc;\n }\n\n if (!acc.includes(key)) {\n acc.push(key);\n }\n\n return acc;\n }, []);\n","import { type QueryEpisodeArgs, type QuerySeasonArgs } from '@tmdb-graphql-api/schema/types';\nimport { type EnrichedRawEpisode, type EnrichedRawSeason } from '../types.ts';\nimport { decodeId } from './decodeId.ts';\n\nexport const getTvIdSeasonAndEpisode = (\n obj: EnrichedRawEpisode | EnrichedRawSeason | undefined,\n args: QuerySeasonArgs | QueryEpisodeArgs\n) => {\n let id: string | number;\n let seasonNumber: number;\n let episodeNumber: number | undefined;\n\n if (obj) {\n id = obj.tv_show_id;\n seasonNumber = obj.season_number ?? 0;\n episodeNumber = 'episode_number' in obj ? obj.episode_number : undefined;\n } else {\n const parsed = decodeId<{ episodeNumber?: number; id: string; seasonNumber: number }>(args.id);\n id = parsed.id;\n seasonNumber = parsed.seasonNumber;\n episodeNumber = parsed.episodeNumber;\n }\n\n return { episodeNumber, id, seasonNumber };\n};\n","import { decode } from 'js-base64';\nimport { type JsonObject } from 'type-fest';\n\nexport const decodeId = <T extends JsonObject>(id: string) => JSON.parse(decode(decodeURIComponent(id))) as T;\n","import { IMAGES } from '../constants.ts';\n\nexport const setAppendToResponseSearchParams = (\n appendToResponseKeys: string[],\n languageCode?: string\n): Record<string, string> => {\n return {\n append_to_response: appendToResponseKeys.join(','),\n ...(languageCode && appendToResponseKeys.includes(IMAGES)\n ? { include_image_language: `${languageCode},null` }\n : {}),\n };\n};\n","import { type QueryEpisodeArgs } from '@tmdb-graphql-api/schema/types';\nimport { isUndefined, snakeCase } from 'lodash-es';\nimport { CREDITS, EPISODE, EXTERNAL_IDS, IMAGES, Source, TRANSLATIONS, VIDEOS } from '../constants.ts';\nimport { buildObjArgsResolver } from '../helpers/buildObjArgsResolver.ts';\nimport { encodeId } from '../helpers/encodeId.ts';\nimport { getAppendToResponseKeys } from '../helpers/getAppendToResponseKeys.ts';\nimport { getTvIdSeasonAndEpisode } from '../helpers/getTvIdSeasonAndEpisode.ts';\nimport { setAppendToResponseSearchParams } from '../helpers/setAppendToResponseSearchParams.ts';\nimport { type EnrichedRawEpisode, type EnrichedRawEpisodeWithAppendToResponse, type RawEpisode } from '../types.ts';\n\nconst appendToResponse = {\n [EXTERNAL_IDS]: snakeCase(EXTERNAL_IDS),\n [TRANSLATIONS]: TRANSLATIONS,\n [VIDEOS]: VIDEOS,\n cast: CREDITS,\n crew: CREDITS,\n guestStars: CREDITS,\n stills: IMAGES,\n};\n\nexport const resolveEpisode = buildObjArgsResolver<\n EnrichedRawEpisode,\n QueryEpisodeArgs,\n | (EnrichedRawEpisodeWithAppendToResponse & { __headers?: Headers })\n | EnrichedRawEpisodeWithAppendToResponse[keyof EnrichedRawEpisodeWithAppendToResponse]\n>(EPISODE, async (obj, args, ctx, info) => {\n const { data: ctxData, fragmentDefinitions, languageCode, restClient } = ctx;\n const { fieldName, fieldNodes } = info;\n const typedFieldName = snakeCase(fieldName) as keyof RawEpisode;\n const { episodeNumber, id, seasonNumber } = getTvIdSeasonAndEpisode(obj, args);\n\n if (obj && !isUndefined(obj[typedFieldName])) {\n return {\n data:\n typedFieldName === 'id'\n ? encodeId({ id, seasonNumber, ...(episodeNumber ? { episodeNumber } : {}) })\n : obj[typedFieldName],\n source: Source.ParentNode,\n };\n }\n\n const appendToResponseKeys = getAppendToResponseKeys(fieldNodes[0]!, appendToResponse, fragmentDefinitions);\n\n const { data, errors, headers } = await restClient.episode<EnrichedRawEpisodeWithAppendToResponse>(\n {\n pathTemplateData: { episodeNumber, id, seasonNumber },\n ...(appendToResponseKeys.length > 0\n ? {\n queryParams: {\n ...setAppendToResponseSearchParams(appendToResponseKeys, languageCode),\n },\n }\n : {}),\n },\n ctxData\n );\n\n const episodeData = {\n ...data,\n id: encodeId({ id, seasonNumber, ...(episodeNumber ? { episodeNumber } : {}) }),\n tv_show_id: Number(id),\n };\n\n return {\n data: obj\n ? episodeData[typedFieldName]\n : appendToResponseKeys.length > 0\n ? { ...episodeData, __headers: headers }\n : episodeData,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport { CREDITS, EPISODE, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport {\n type EnrichedRawEpisode,\n type EnrichedRawEpisodeWithAppendToResponse,\n type RawEpisodeCredits,\n} from '../types.ts';\n\nconst isEnrichedRawEpisodeWithCredits = (\n obj: EnrichedRawEpisode | (EnrichedRawEpisodeWithAppendToResponse & { __headers?: Headers })\n): obj is EnrichedRawEpisodeWithAppendToResponse & { __headers: Headers } => CREDITS in obj && '__headers' in obj;\n\nexport const resolveEpisodeCredits = buildObjResolver<\n EnrichedRawEpisode | (EnrichedRawEpisodeWithAppendToResponse & { __headers?: Headers }),\n RawEpisodeCredits['cast'] | RawEpisodeCredits['crew'] | RawEpisodeCredits['guest_stars']\n>(EPISODE, async (obj, ctx, info) => {\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = snakeCase(fieldName) as 'cast' | 'crew' | 'guest_stars';\n\n if (isEnrichedRawEpisodeWithCredits(obj)) {\n return {\n data: obj.credits?.[typedFieldName],\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.episode<RawEpisodeCredits>(\n {\n pathTemplateData: {\n episodeNumber: obj.episode_number,\n id: obj.tv_show_id,\n seasonNumber: obj.season_number,\n type: CREDITS,\n },\n },\n ctxData\n );\n\n return {\n data: data?.[typedFieldName],\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport type { Except } from 'type-fest';\nimport { EPISODE, EXTERNAL_IDS, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport {\n type EnrichedRawEpisode,\n type EnrichedRawEpisodeWithAppendToResponse,\n type RawEpisodeExternalIds,\n} from '../types.ts';\n\nconst isEnrichedRawEpisodeWithExternalIds = (\n obj: EnrichedRawEpisode | (EnrichedRawEpisodeWithAppendToResponse & { __headers?: Headers })\n): obj is EnrichedRawEpisodeWithAppendToResponse & { __headers: Headers } =>\n snakeCase(EXTERNAL_IDS) in obj && '__headers' in obj;\n\nexport const resolveEpisodeExternalIds = buildObjResolver<\n EnrichedRawEpisode | (EnrichedRawEpisodeWithAppendToResponse & { __headers?: Headers }),\n Except<RawEpisodeExternalIds, 'id'>\n>(EPISODE, async (obj, ctx, info) => {\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = snakeCase(fieldName) as 'external_ids';\n\n if (isEnrichedRawEpisodeWithExternalIds(obj)) {\n return {\n data: obj[typedFieldName],\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.episode<RawEpisodeExternalIds>(\n {\n pathTemplateData: {\n episodeNumber: obj.episode_number,\n id: obj.tv_show_id,\n seasonNumber: obj.season_number,\n type: typedFieldName,\n },\n },\n ctxData\n );\n\n const { id: movieId, ...rest } = data ?? {};\n\n return {\n data: rest,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport { EPISODE, IMAGES, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport {\n type EnrichedRawEpisode,\n type EnrichedRawEpisodeWithAppendToResponse,\n type RawEpisodeImages,\n} from '../types.ts';\n\nconst isEnrichedRawEpisodeWithImages = (\n obj: EnrichedRawEpisode | (EnrichedRawEpisodeWithAppendToResponse & { __headers?: Headers })\n): obj is EnrichedRawEpisodeWithAppendToResponse & { __headers: Headers } => IMAGES in obj && '__headers' in obj;\n\nexport const resolveEpisodeStills = buildObjResolver<\n EnrichedRawEpisode | (EnrichedRawEpisodeWithAppendToResponse & { __headers?: Headers }),\n RawEpisodeImages['stills']\n>(EPISODE, async (obj, ctx, info) => {\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = snakeCase(fieldName) as 'stills';\n\n if (isEnrichedRawEpisodeWithImages(obj)) {\n return {\n data: obj.images?.[typedFieldName],\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.episode<RawEpisodeImages>(\n {\n pathTemplateData: {\n episodeNumber: obj.episode_number,\n id: obj.tv_show_id,\n seasonNumber: obj.season_number,\n type: IMAGES,\n },\n },\n ctxData\n );\n\n return {\n data: data?.[typedFieldName],\n errors,\n headers,\n };\n});\n","import { EPISODE, Source, TRANSLATIONS } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport {\n type EnrichedRawEpisode,\n type EnrichedRawEpisodeWithAppendToResponse,\n type RawEpisodeTranslations,\n} from '../types.ts';\n\nconst isEnrichedRawEpisodeWithTranslations = (\n obj: EnrichedRawEpisode | (EnrichedRawEpisodeWithAppendToResponse & { __headers?: Headers })\n): obj is EnrichedRawEpisodeWithAppendToResponse & { __headers: Headers } => TRANSLATIONS in obj && '__headers' in obj;\n\nexport const resolveEpisodeTranslations = buildObjResolver<\n EnrichedRawEpisode | (EnrichedRawEpisodeWithAppendToResponse & { __headers?: Headers }),\n RawEpisodeTranslations['translations']\n>(EPISODE, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isEnrichedRawEpisodeWithTranslations(obj)) {\n return {\n data: obj.translations?.translations,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.episode<RawEpisodeTranslations>(\n {\n pathTemplateData: {\n episodeNumber: obj.episode_number,\n id: obj.tv_show_id,\n seasonNumber: obj.season_number,\n type: TRANSLATIONS,\n },\n },\n ctxData\n );\n\n return {\n data: data?.translations,\n errors,\n headers,\n };\n});\n","import { EPISODE, Source, VIDEOS } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport {\n type EnrichedRawEpisode,\n type EnrichedRawEpisodeWithAppendToResponse,\n type RawEpisodeVideos,\n} from '../types.ts';\n\nconst isEnrichedRawEpisodeWithVideos = (\n obj: EnrichedRawEpisode | (EnrichedRawEpisodeWithAppendToResponse & { __headers?: Headers })\n): obj is EnrichedRawEpisodeWithAppendToResponse & { __headers: Headers } => VIDEOS in obj && '__headers' in obj;\n\nexport const resolveEpisodeVideos = buildObjResolver<\n EnrichedRawEpisode | (EnrichedRawEpisodeWithAppendToResponse & { __headers?: Headers }),\n RawEpisodeVideos['results']\n>(EPISODE, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isEnrichedRawEpisodeWithVideos(obj)) {\n return {\n data: obj.videos?.results,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.episode<RawEpisodeVideos>(\n {\n pathTemplateData: {\n episodeNumber: obj.episode_number,\n id: obj.tv_show_id,\n seasonNumber: obj.season_number,\n type: VIDEOS,\n },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n});\n","import { type QueryFindArgs } from '@tmdb-graphql-api/schema/types';\nimport { FIND } from '../constants.ts';\nimport { buildArgsResolver } from '../helpers/buildArgsResolver.ts';\nimport { snakeCasePropNames } from '../helpers/snakeCasePropNames.ts';\nimport { type RawEpisode, type RawFind, type RawMovie, type RawPerson, type RawSeason, type RawTv } from '../types.ts';\n\ntype Data = {\n episodes?: RawEpisode[];\n movies?: RawMovie[];\n people?: RawPerson[];\n seasons?: RawSeason[];\n tv?: RawTv[];\n};\n\nexport const resolveFind = buildArgsResolver<QueryFindArgs, Data>(FIND, async (args, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.find<RawFind>(\n {\n pathTemplateData: { id: args.id },\n queryParams: { ...snakeCasePropNames({ externalSource: args.source }) },\n },\n ctxData\n );\n\n return {\n data: {\n episodes: data?.tv_episode_results,\n movies: data?.movie_results,\n people: data?.person_results,\n seasons: data?.tv_season_results,\n tv: data?.tv_results,\n },\n errors,\n headers,\n };\n});\n","import { type QueryGenresArgs } from '@tmdb-graphql-api/schema/types';\nimport { GENRES } from '../constants.ts';\nimport { buildArgsResolver } from '../helpers/buildArgsResolver.ts';\nimport { type RawGenres } from '../types.ts';\n\nexport const resolveGenres = buildArgsResolver<QueryGenresArgs, RawGenres['genres']>(GENRES, async (args, ctx) => {\n const { screenType } = args;\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.genres<RawGenres>(\n {\n pathTemplateData: { type: screenType.toLowerCase() },\n },\n ctxData\n );\n\n return {\n data: data?.genres,\n errors,\n headers,\n };\n});\n","import { type QueryKeywordArgs } from '@tmdb-graphql-api/schema/types';\nimport { KEYWORD } from '../constants.ts';\nimport { buildArgsResolver } from '../helpers/buildArgsResolver.ts';\nimport { snakeCasePropNames } from '../helpers/snakeCasePropNames.ts';\nimport { type RawKeyword } from '../types.ts';\n\nexport const resolveKeyword = buildArgsResolver<QueryKeywordArgs, RawKeyword>(KEYWORD, async (args, ctx) => {\n const { id, includeAdult } = args;\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.keyword<RawKeyword>(\n {\n pathTemplateData: { id },\n queryParams: { ...snakeCasePropNames({ includeAdult }) },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n});\n","import { type QueryMovieArgs } from '@tmdb-graphql-api/schema/types';\nimport { isUndefined, snakeCase } from 'lodash-es';\nimport {\n ALTERNATIVE_TITLES,\n BACKDROPS,\n CAST,\n CREDITS,\n CREW,\n EXTERNAL_IDS,\n IMAGES,\n KEYWORDS,\n LOGOS,\n MOVIE,\n POSTERS,\n RECOMMENDATIONS,\n RELEASE_DATES,\n REVIEWS,\n SIMILAR,\n SIMILAR_MOVIES,\n Source,\n TRANSLATIONS,\n VIDEOS,\n WATCH_PROVIDERS,\n} from '../constants.ts';\nimport { buildObjArgsResolver } from '../helpers/buildObjArgsResolver.ts';\nimport { getAppendToResponseKeys } from '../helpers/getAppendToResponseKeys.ts';\nimport { setAppendToResponseSearchParams } from '../helpers/setAppendToResponseSearchParams.ts';\nimport { type RawMovie, type RawMovieWithAppendToResponse } from '../types.ts';\n\nconst appendToResponse = {\n [ALTERNATIVE_TITLES]: snakeCase(ALTERNATIVE_TITLES),\n [BACKDROPS]: IMAGES,\n [CAST]: CREDITS,\n [CREW]: CREDITS,\n [EXTERNAL_IDS]: snakeCase(EXTERNAL_IDS),\n [KEYWORDS]: KEYWORDS,\n [LOGOS]: IMAGES,\n [POSTERS]: IMAGES,\n [RECOMMENDATIONS]: RECOMMENDATIONS,\n [RELEASE_DATES]: snakeCase(RELEASE_DATES),\n [REVIEWS]: REVIEWS,\n [SIMILAR_MOVIES]: SIMILAR,\n [TRANSLATIONS]: TRANSLATIONS,\n [VIDEOS]: VIDEOS,\n [WATCH_PROVIDERS]: 'watch/providers',\n};\n\nexport const resolveMovie = buildObjArgsResolver<\n RawMovie,\n QueryMovieArgs,\n | (RawMovieWithAppendToResponse & { __headers?: Headers })\n | RawMovieWithAppendToResponse[keyof RawMovieWithAppendToResponse]\n>(MOVIE, async (obj, args, ctx, info) => {\n const { data: ctxData, fragmentDefinitions, languageCode, restClient } = ctx;\n const { fieldName, fieldNodes } = info;\n const typedFieldName = snakeCase(fieldName) as keyof RawMovie;\n\n if (obj && !isUndefined(obj[typedFieldName])) {\n return {\n data: obj[typedFieldName],\n source: Source.ParentNode,\n };\n }\n\n const id = obj ? obj.id : args.id;\n const appendToResponseKeys = getAppendToResponseKeys(fieldNodes[0]!, appendToResponse, fragmentDefinitions);\n\n const { data, errors, headers } = await restClient.movie<RawMovieWithAppendToResponse>(\n {\n pathTemplateData: { id },\n ...(appendToResponseKeys.length > 0\n ? {\n queryParams: {\n ...setAppendToResponseSearchParams(appendToResponseKeys, languageCode),\n },\n }\n : {}),\n },\n ctxData\n );\n\n return {\n data: obj ? data?.[typedFieldName] : appendToResponseKeys.length > 0 ? { ...data, __headers: headers } : data,\n errors,\n headers,\n };\n});\n","import { type MovieAlternativeTitlesArgs } from '@tmdb-graphql-api/schema/types';\nimport { GraphQLError } from 'graphql';\nimport { snakeCase } from 'lodash-es';\nimport { ALTERNATIVE_TITLES, MOVIE, Source } from '../constants.ts';\nimport { buildObjArgsResolver } from '../helpers/buildObjArgsResolver.ts';\nimport { type RawMovie, type RawMovieAlternativeTitles, type RawMovieWithAppendToResponse } from '../types.ts';\n\nconst isRawMovieWithAlternativeTitles = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers })\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } =>\n snakeCase(ALTERNATIVE_TITLES) in obj && '__headers' in obj;\n\nexport const resolveMovieAlternativeTitles = buildObjArgsResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n MovieAlternativeTitlesArgs,\n RawMovieAlternativeTitles['titles']\n>(MOVIE, async (obj, args, ctx, info) => {\n const { country } = args;\n const { data: ctxData, logger, restClient } = ctx;\n const { fieldNodes } = info;\n\n if (!obj) {\n const message = `Required ${ALTERNATIVE_TITLES} node missing`;\n logger.error(message);\n throw new GraphQLError(message, { nodes: fieldNodes });\n }\n\n if (isRawMovieWithAlternativeTitles(obj)) {\n return {\n data: obj.alternative_titles?.titles,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.movie<RawMovieAlternativeTitles>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(ALTERNATIVE_TITLES) },\n queryParams: { country },\n },\n ctxData\n );\n\n return {\n data: data?.titles,\n errors,\n headers,\n };\n});\n","import { CREDITS, MOVIE, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawMovie, type RawMovieCredits, type RawMovieWithAppendToResponse } from '../types.ts';\n\nconst isRawMovieWithCredits = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers })\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } => CREDITS in obj && '__headers' in obj;\n\nexport const resolveMovieCredits = buildObjResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n RawMovieCredits['cast'] | RawMovieCredits['crew']\n>(MOVIE, async (obj, ctx, info) => {\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = fieldName as 'cast' | 'crew';\n\n if (isRawMovieWithCredits(obj)) {\n return {\n data: obj.credits?.[typedFieldName],\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.movie<RawMovieCredits>(\n {\n pathTemplateData: { id: obj.id, type: CREDITS },\n },\n ctxData\n );\n\n return {\n data: data?.[typedFieldName],\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport type { Except } from 'type-fest';\nimport { EXTERNAL_IDS, MOVIE, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawMovie, type RawMovieExternalIds, type RawMovieWithAppendToResponse } from '../types.ts';\n\nconst isRawMovieWithExternalIds = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers })\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } => snakeCase(EXTERNAL_IDS) in obj && '__headers' in obj;\n\nexport const resolveMovieExternalIds = buildObjResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n Except<RawMovieExternalIds, 'id'>\n>(MOVIE, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawMovieWithExternalIds(obj)) {\n return {\n data: obj.external_ids,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.movie<RawMovieExternalIds>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(EXTERNAL_IDS) },\n },\n ctxData\n );\n\n const { id: movieId, ...rest } = data!;\n\n return {\n data: rest,\n errors,\n headers,\n };\n});\n","import { IMAGES, MOVIE, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawMovie, type RawMovieImages, type RawMovieWithAppendToResponse } from '../types.ts';\n\nconst isRawMovieWithImages = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers })\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } => IMAGES in obj && '__headers' in obj;\n\nexport const resolveMovieImages = buildObjResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n RawMovieImages['backdrops'] | RawMovieImages['logos'] | RawMovieImages['posters']\n>(MOVIE, async (obj, ctx, info) => {\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = fieldName as 'backdrops' | 'logos' | 'posters';\n\n if (isRawMovieWithImages(obj)) {\n return {\n data: obj.images?.[typedFieldName],\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.movie<RawMovieImages>(\n {\n pathTemplateData: { id: obj.id, type: IMAGES },\n },\n ctxData\n );\n\n return {\n data: data?.[typedFieldName],\n errors,\n headers,\n };\n});\n","import { KEYWORDS, MOVIE, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawMovie, type RawMovieKeywords, type RawMovieWithAppendToResponse } from '../types.ts';\n\nconst isRawMovieWithKeywords = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers })\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } => KEYWORDS in obj && '__headers' in obj;\n\nexport const resolveMovieKeywords = buildObjResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n RawMovieKeywords['keywords']\n>(MOVIE, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawMovieWithKeywords(obj)) {\n return {\n data: obj.keywords?.keywords,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.movie<RawMovieKeywords>(\n {\n pathTemplateData: { id: obj.id, type: KEYWORDS },\n },\n ctxData\n );\n\n return {\n data: data?.keywords,\n errors,\n headers,\n };\n});\n","import { Core } from '@cachemap/core';\nimport { init as map } from '@cachemap/map';\nimport { init as reaper } from '@cachemap/reaper';\nimport { type CreateResourceResolver, type Getters, makeConnectionResolver } from '@graphql-box/connection-resolver';\nimport { type MovieRecommendationsArgs } from '@tmdb-graphql-api/schema/types';\nimport { encode } from 'js-base64';\nimport { MOVIE, RECOMMENDATIONS } from '../constants.ts';\nimport {\n type Context,\n type RawMovie,\n type RawMovieRecommendations,\n type RawMovieWithAppendToResponse,\n} from '../types.ts';\n\n/* eslint-disable camelcase */\n\nexport const createMakeCursors = (obj: RawMovie) => {\n const groupCursor = `${obj.id}::${MOVIE}::${RECOMMENDATIONS}`;\n\n return {\n makeGroupCursor: () => encode(groupCursor),\n makeIDCursor: (id: string | number) => encode(`${id}::${groupCursor}`),\n };\n};\n\nconst isRawMovieWithRecommendations = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n page: number\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } =>\n RECOMMENDATIONS in obj && obj.recommendations?.page === page && '__headers' in obj;\n\nexport const createResourceResolver: CreateResourceResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n MovieRecommendationsArgs,\n Context,\n RawMovieRecommendations\n> =\n (obj, _args, { data: ctxData, restClient }) =>\n async ({ page }) => {\n if (isRawMovieWithRecommendations(obj, page)) {\n return {\n data: obj.recommendations,\n headers: obj.__headers,\n };\n }\n\n const { data, errors, headers } = await restClient.movie<RawMovieRecommendations>(\n {\n pathTemplateData: { id: obj.id, type: RECOMMENDATIONS },\n queryParams: { page },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n };\n\nexport const cursorCache = new Core({\n name: 'MOVIE_RECOMMENDATIONS_CONNECTION_RESOLVER',\n reaper: reaper({ interval: 300_000 }),\n store: map(),\n type: 'GRAPHQL',\n});\n\nexport const getters: Getters<RawMovieRecommendations, RawMovie> = {\n // @ts-expect-error minor type mismatch\n nodes: ({ results = [] }) => results,\n page: ({ page = 0 }) => page,\n totalPages: ({ total_pages = 0 }) => total_pages,\n totalResults: ({ total_results = 0 }) => total_results,\n};\n\nexport const resolveMovieRecommendations = makeConnectionResolver({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resultsPerPage: 20,\n});\n","import { snakeCase } from 'lodash-es';\nimport { MOVIE, RELEASE_DATES, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawMovie, type RawMovieReleaseDates, type RawMovieWithAppendToResponse } from '../types.ts';\n\nconst isRawMovieWithReleaseDates = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers })\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } =>\n snakeCase(RELEASE_DATES) in obj && '__headers' in obj;\n\nexport const resolveMovieReleaseDates = buildObjResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n RawMovieReleaseDates['results']\n>(MOVIE, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawMovieWithReleaseDates(obj)) {\n return {\n data: obj.release_dates?.results,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.movie<RawMovieReleaseDates>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(RELEASE_DATES) },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n});\n","import { Core } from '@cachemap/core';\nimport { init as map } from '@cachemap/map';\nimport { init as reaper } from '@cachemap/reaper';\nimport { type CreateResourceResolver, type Getters, makeConnectionResolver } from '@graphql-box/connection-resolver';\nimport { type MovieReviewsArgs } from '@tmdb-graphql-api/schema/types';\nimport { encode } from 'js-base64';\nimport { MOVIE, REVIEWS, Source } from '../constants.ts';\nimport {\n type Context,\n type RawMovie,\n type RawMovieReviews,\n type RawMovieWithAppendToResponse,\n type RawReview,\n} from '../types.ts';\n\n/* eslint-disable camelcase */\n\nexport const createMakeCursors = (obj: RawMovie) => {\n const groupCursor = `${obj.id}::${MOVIE}::${REVIEWS}`;\n\n return {\n makeGroupCursor: () => encode(groupCursor),\n makeIDCursor: (id: string | number) => encode(`${id}::${groupCursor}`),\n };\n};\n\nconst isRawMovieWithReviews = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n page: number\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } =>\n REVIEWS in obj && obj.reviews?.page === page && '__headers' in obj;\n\nexport const createResourceResolver: CreateResourceResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n MovieReviewsArgs,\n Context,\n RawMovieReviews\n> =\n (obj, _args, { data: ctxData, restClient }: Context) =>\n async ({ page }: { page: number }) => {\n if (isRawMovieWithReviews(obj, page)) {\n return {\n data: obj.reviews,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.movie<RawMovieReviews>(\n {\n pathTemplateData: { id: obj.id, type: REVIEWS },\n queryParams: { page },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n };\n\nexport const cursorCache = new Core({\n name: 'MOVIE_REVIEWS_CONNECTION_RESOLVER',\n reaper: reaper({ interval: 300_000 }),\n store: map(),\n type: 'GRAPHQL',\n});\n\nexport const getters: Getters<RawMovieReviews, RawReview> = {\n // @ts-expect-error nested identifier is optional when\n // it shouldn't be\n nodes: ({ results = [] }) => results,\n page: ({ page = 0 }) => page,\n totalPages: ({ total_pages = 0 }) => total_pages,\n totalResults: ({ total_results = 0 }) => total_results,\n};\n\nexport const resolveMovieReviews = makeConnectionResolver({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resultsPerPage: 20,\n});\n","import { Core } from '@cachemap/core';\nimport { init as map } from '@cachemap/map';\nimport { init as reaper } from '@cachemap/reaper';\nimport { type CreateResourceResolver, type Getters, makeConnectionResolver } from '@graphql-box/connection-resolver';\nimport { type MovieSimilarMoviesArgs } from '@tmdb-graphql-api/schema/types';\nimport { encode } from 'js-base64';\nimport { MOVIE, SIMILAR } from '../constants.ts';\nimport {\n type Context,\n type RawMovie,\n type RawMovieSimilarMovies,\n type RawMovieWithAppendToResponse,\n} from '../types.ts';\n\n/* eslint-disable camelcase */\n\nexport const createMakeCursors = (obj: RawMovie) => {\n const groupCursor = `${obj.id}::${MOVIE}::${SIMILAR}`;\n\n return {\n makeGroupCursor: () => encode(groupCursor),\n makeIDCursor: (id: string | number) => encode(`${id}::${groupCursor}`),\n };\n};\n\nconst isRawMovieWithSimilarMovies = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n page: number\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } =>\n SIMILAR in obj && obj.similar?.page === page && '__headers' in obj;\n\nexport const createResourceResolver: CreateResourceResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n MovieSimilarMoviesArgs,\n Context,\n RawMovieSimilarMovies\n> =\n (obj, _args, { data: ctxData, restClient }) =>\n async ({ page }: { page: number }) => {\n if (isRawMovieWithSimilarMovies(obj, page)) {\n return {\n data: obj.similar,\n headers: obj.__headers,\n };\n }\n\n const { data, errors, headers } = await restClient.movie<RawMovieSimilarMovies>(\n {\n pathTemplateData: { id: obj.id, type: SIMILAR },\n queryParams: { page },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n };\n\nexport const cursorCache = new Core({\n name: 'MOVIE_SIMILAR_MOVIES_CONNECTION_RESOLVER',\n reaper: reaper({ interval: 300_000 }),\n store: map(),\n type: 'GRAPHQL',\n});\n\nexport const getters: Getters<RawMovieSimilarMovies, RawMovie> = {\n // @ts-expect-error minor type mismatch\n nodes: ({ results = [] }) => results,\n page: ({ page = 0 }) => page,\n totalPages: ({ total_pages = 0 }) => total_pages,\n totalResults: ({ total_results = 0 }) => total_results,\n};\n\nexport const resolveMovieSimilarMovies = makeConnectionResolver({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resultsPerPage: 20,\n});\n","import { MOVIE, Source, TRANSLATIONS } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawMovie, type RawMovieTranslations, type RawMovieWithAppendToResponse } from '../types.ts';\n\nconst isRawMovieWithTranslations = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers })\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } => TRANSLATIONS in obj && '__headers' in obj;\n\nexport const resolveMovieTranslations = buildObjResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n RawMovieTranslations['translations']\n>(MOVIE, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawMovieWithTranslations(obj)) {\n return {\n data: obj.translations?.translations,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.movie<RawMovieTranslations>(\n {\n pathTemplateData: { id: obj.id, type: TRANSLATIONS },\n },\n ctxData\n );\n\n return {\n data: data?.translations,\n errors,\n headers,\n };\n});\n","import { MOVIE, Source, VIDEOS } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawMovie, type RawMovieVideos, type RawMovieWithAppendToResponse } from '../types.ts';\n\nconst isRawMovieWithVideos = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers })\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } => VIDEOS in obj && '__headers' in obj;\n\nexport const resolveMovieVideos = buildObjResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n RawMovieVideos['results']\n>(MOVIE, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawMovieWithVideos(obj)) {\n return {\n data: obj.videos?.results,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.movie<RawMovieVideos>(\n {\n pathTemplateData: { id: obj.id, type: VIDEOS },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n});\n","import { MOVIE, RAW_WATCH_PROVIDERS, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawMovie, type RawMovieWatchProviders, type RawMovieWithAppendToResponse } from '../types.ts';\n\nconst isRawMovieWithWatchProviders = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers })\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } => RAW_WATCH_PROVIDERS in obj && '__headers' in obj;\n\nexport const resolveMovieWatchProviders = buildObjResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n RawMovieWatchProviders['results']\n>(MOVIE, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawMovieWithWatchProviders(obj)) {\n return {\n data: obj['watch/providers']?.results,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.watchProviders<RawMovieWatchProviders>(\n {\n pathTemplateData: { id: obj.id, type: MOVIE },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n});\n","import { type QueryNetworkArgs } from '@tmdb-graphql-api/schema/types';\nimport { isUndefined, snakeCase } from 'lodash-es';\nimport { NETWORK, Source } from '../constants.ts';\nimport { buildObjArgsResolver } from '../helpers/buildObjArgsResolver.ts';\nimport { type RawNetwork } from '../types.ts';\n\nexport const resolveNetwork = buildObjArgsResolver<\n RawNetwork,\n QueryNetworkArgs,\n RawNetwork | RawNetwork[keyof RawNetwork]\n>(NETWORK, async (obj, args, ctx, info) => {\n const id = obj ? obj.id : args.id;\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = snakeCase(fieldName) as keyof RawNetwork;\n\n if (obj && !isUndefined(obj[typedFieldName])) {\n return {\n data: obj[typedFieldName],\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.network<RawNetwork>(\n {\n pathTemplateData: { id },\n },\n ctxData\n );\n\n return {\n data: obj ? data?.[typedFieldName] : data,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport { ALTERNATIVE_NAMES, NETWORK } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawNetwork, type RawNetworkAlternativeNames } from '../types.ts';\n\nexport const resolveNetworkAlternativeNames = buildObjResolver<RawNetwork, RawNetworkAlternativeNames['results']>(\n NETWORK,\n async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.network<RawNetworkAlternativeNames>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(ALTERNATIVE_NAMES) },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n }\n);\n","import { IMAGES, NETWORK } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawNetwork, type RawNetworkLogos } from '../types.ts';\n\nexport const resolveNetworkLogos = buildObjResolver<RawNetwork, RawNetworkLogos['logos']>(NETWORK, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.network<RawNetworkLogos>(\n {\n pathTemplateData: { id: obj.id, type: IMAGES },\n },\n ctxData\n );\n\n return {\n data: data?.logos,\n errors,\n headers,\n };\n});\n","import { type QueryPersonArgs } from '@tmdb-graphql-api/schema/types';\nimport { isUndefined, snakeCase } from 'lodash-es';\nimport {\n COMBINED_CREDITS,\n EXTERNAL_IDS,\n IMAGES,\n MOVIE_CREDITS,\n PERSON,\n PROFILES,\n Source,\n TRANSLATIONS,\n TV_CREDITS,\n} from '../constants.ts';\nimport { buildObjArgsResolver } from '../helpers/buildObjArgsResolver.ts';\nimport { getAppendToResponseKeys } from '../helpers/getAppendToResponseKeys.ts';\nimport { setAppendToResponseSearchParams } from '../helpers/setAppendToResponseSearchParams.ts';\nimport { type RawPerson, type RawPersonWithAppendToResponse } from '../types.ts';\n\nconst appendToResponse = {\n [COMBINED_CREDITS]: snakeCase(COMBINED_CREDITS),\n [EXTERNAL_IDS]: snakeCase(EXTERNAL_IDS),\n [MOVIE_CREDITS]: snakeCase(MOVIE_CREDITS),\n [PROFILES]: IMAGES,\n [TRANSLATIONS]: TRANSLATIONS,\n [TV_CREDITS]: snakeCase(TV_CREDITS),\n};\n\nexport const resolvePerson = buildObjArgsResolver<\n RawPerson,\n QueryPersonArgs,\n | (RawPersonWithAppendToResponse & { __headers?: Headers })\n | RawPersonWithAppendToResponse[keyof RawPersonWithAppendToResponse]\n>(PERSON, async (obj, args, ctx, info) => {\n const { data: ctxData, fragmentDefinitions, languageCode, restClient } = ctx;\n const { fieldName, fieldNodes } = info;\n const typedFieldName = snakeCase(fieldName) as keyof RawPerson;\n\n if (obj && !isUndefined(obj[typedFieldName])) {\n return {\n data: obj[typedFieldName],\n source: Source.ParentNode,\n };\n }\n\n const id = obj ? obj.id : args.id;\n const appendToResponseKeys = getAppendToResponseKeys(fieldNodes[0]!, appendToResponse, fragmentDefinitions);\n\n const { data, errors, headers } = await restClient.person<RawPersonWithAppendToResponse>(\n {\n pathTemplateData: { id },\n ...(appendToResponseKeys.length > 0\n ? {\n queryParams: {\n ...setAppendToResponseSearchParams(appendToResponseKeys, languageCode),\n },\n }\n : {}),\n },\n ctxData\n );\n\n return {\n data: obj ? data?.[typedFieldName] : appendToResponseKeys.length > 0 ? { ...data, __headers: headers } : data,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport type { Except } from 'type-fest';\nimport { COMBINED_CREDITS, PERSON, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawPerson, type RawPersonCombinedCredits, type RawPersonWithAppendToResponse } from '../types.ts';\n\nconst isRawPersonWithCombinedCredits = (\n obj: RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers })\n): obj is RawPersonWithAppendToResponse & { __headers: Headers } =>\n snakeCase(COMBINED_CREDITS) in obj && '__headers' in obj;\n\nexport const resolvePersonCombinedCredits = buildObjResolver<\n RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers }),\n Except<RawPersonCombinedCredits, 'id'>\n>(PERSON, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawPersonWithCombinedCredits(obj)) {\n return {\n data: obj.combined_credits,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.person<RawPersonCombinedCredits>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(COMBINED_CREDITS) },\n },\n ctxData\n );\n\n const { id: personId, ...rest } = data ?? {};\n\n return {\n data: rest,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport type { Except } from 'type-fest';\nimport { EXTERNAL_IDS, PERSON, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawPerson, type RawPersonExternalIds, type RawPersonWithAppendToResponse } from '../types.ts';\n\nconst isRawPersonWithExternalIds = (\n obj: RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers })\n): obj is RawPersonWithAppendToResponse & { __headers: Headers } =>\n snakeCase(EXTERNAL_IDS) in obj && '__headers' in obj;\n\nexport const resolvePersonExternalIds = buildObjResolver<\n RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers }),\n Except<RawPersonExternalIds, 'id'>\n>(PERSON, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawPersonWithExternalIds(obj)) {\n return {\n data: obj.external_ids,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.person<RawPersonExternalIds>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(EXTERNAL_IDS) },\n },\n ctxData\n );\n\n const { id: personId, ...rest } = data ?? {};\n\n return {\n data: rest,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport type { Except } from 'type-fest';\nimport { MOVIE_CREDITS, PERSON, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawPerson, type RawPersonMovieCredits, type RawPersonWithAppendToResponse } from '../types.ts';\n\nconst isRawPersonWithMovieCredits = (\n obj: RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers })\n): obj is RawPersonWithAppendToResponse & { __headers: Headers } =>\n snakeCase(MOVIE_CREDITS) in obj && '__headers' in obj;\n\nexport const resolvePersonMovieCredits = buildObjResolver<\n RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers }),\n Except<RawPersonMovieCredits, 'id'>\n>(PERSON, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawPersonWithMovieCredits(obj)) {\n return {\n data: obj.movie_credits,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.person<RawPersonMovieCredits>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(MOVIE_CREDITS) },\n },\n ctxData\n );\n\n const { id: personId, ...rest } = data ?? {};\n\n return {\n data: rest,\n errors,\n headers,\n };\n});\n","import { IMAGES, PERSON, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawPerson, type RawPersonProfiles, type RawPersonWithAppendToResponse } from '../types.ts';\n\nconst isRawPersonWithProfiles = (\n obj: RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers })\n): obj is RawPersonWithAppendToResponse & { __headers: Headers } => IMAGES in obj && '__headers' in obj;\n\nexport const resolvePersonProfiles = buildObjResolver<\n RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers }),\n RawPersonProfiles['profiles']\n>(PERSON, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawPersonWithProfiles(obj)) {\n return {\n data: obj.images?.profiles,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.person<RawPersonProfiles>(\n {\n pathTemplateData: { id: obj.id, type: IMAGES },\n },\n ctxData\n );\n\n return {\n data: data?.profiles,\n errors,\n headers,\n };\n});\n","import { PERSON, Source, TRANSLATIONS } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawPerson, type RawPersonTranslations, type RawPersonWithAppendToResponse } from '../types.ts';\n\nconst isRawPersonWithTranslations = (\n obj: RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers })\n): obj is RawPersonWithAppendToResponse & { __headers: Headers } => TRANSLATIONS in obj && '__headers' in obj;\n\nexport const resolvePersonTranslations = buildObjResolver<\n RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers }),\n RawPersonTranslations['translations']\n>(PERSON, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawPersonWithTranslations(obj)) {\n return {\n data: obj.translations?.translations,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.person<RawPersonTranslations>(\n {\n pathTemplateData: { id: obj.id, type: TRANSLATIONS },\n },\n ctxData\n );\n\n return {\n data: data?.translations,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport type { Except } from 'type-fest';\nimport { PERSON, Source, TV_CREDITS } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawPerson, type RawPersonTvCredits, type RawPersonWithAppendToResponse } from '../types.ts';\n\nconst isRawPersonWithTvCredits = (\n obj: RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers })\n): obj is RawPersonWithAppendToResponse & { __headers: Headers } => snakeCase(TV_CREDITS) in obj && '__headers' in obj;\n\nexport const resolvePersonTvCredits = buildObjResolver<\n RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers }),\n Except<RawPersonTvCredits, 'id'>\n>(PERSON, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawPersonWithTvCredits(obj)) {\n return {\n data: obj.tv_credits,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.person<RawPersonTvCredits>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(TV_CREDITS) },\n },\n ctxData\n );\n\n const { id: personId, ...rest } = data ?? {};\n\n return {\n data: rest,\n errors,\n headers,\n };\n});\n","import { Core } from '@cachemap/core';\nimport { init as map } from '@cachemap/map';\nimport { init as reaper } from '@cachemap/reaper';\nimport {\n type CreateResourceResolver,\n type Getters,\n makeConnectionResolver,\n removeConnectionInputOptions,\n} from '@graphql-box/connection-resolver';\nimport { type QueryRatedArgs, type ScreenType } from '@tmdb-graphql-api/schema/types';\nimport { encode } from 'js-base64';\nimport { capitalize } from 'lodash-es';\nimport { RATED } from '../constants.ts';\nimport { type Context, type RawMovie, type RawRated, type RawTv } from '../types.ts';\n\n/* eslint-disable camelcase */\n\nexport const createMakeCursors = (_obj: undefined, args: QueryRatedArgs) => {\n const groupCursor = `${JSON.stringify(removeConnectionInputOptions(args))}::${RATED}`;\n\n return {\n makeGroupCursor: () => encode(groupCursor),\n makeIDCursor: (id: string | number) => encode(`${id}::${groupCursor}`),\n };\n};\n\nexport const createResourceResolver: CreateResourceResolver<undefined, QueryRatedArgs, Context, RawRated> =\n (_obj, { screenType }: QueryRatedArgs, { data: ctxData, restClient }: Context) =>\n async ({ page }: { page: number }) => {\n const { data, errors, headers } = await restClient.rated<RawRated>(\n {\n pathTemplateData: { id: ctxData.tmdbGuestSessionId, type: screenType.toLowerCase() },\n queryParams: { page },\n },\n ctxData\n );\n\n if (!data) {\n return {\n errors,\n headers,\n };\n }\n\n data.results = data.results?.map(entry => {\n // @ts-expect-error required for type resolver\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n entry.media_type = capitalize(entry.media_type ?? screenType.toLowerCase());\n return entry;\n });\n\n return {\n data,\n errors,\n headers,\n };\n };\n\nexport const cursorCache = new Core({\n name: 'RATED_CONNECTION_RESOLVER',\n reaper: reaper({ interval: 300_000 }),\n store: map(),\n type: 'GRAPHQL',\n});\n\nexport const getters: Getters<RawRated, (RawMovie | RawTv) & { media_type?: Capitalize<Lowercase<ScreenType>> }> = {\n // @ts-expect-error nested identifier is optional when\n // it shouldn't be\n nodes: ({ results = [] }) => results,\n page: ({ page = 0 }) => page,\n totalPages: ({ total_pages = 0 }) => total_pages,\n totalResults: ({ total_results = 0 }) => total_results,\n};\n\nexport const resolveRated = makeConnectionResolver({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resultsPerPage: 20,\n});\n","import { type QueryReviewArgs } from '@tmdb-graphql-api/schema/types';\nimport { isUndefined, snakeCase } from 'lodash-es';\nimport { REVIEW, Source } from '../constants.ts';\nimport { buildObjArgsResolver } from '../helpers/buildObjArgsResolver.ts';\nimport { type RawReview } from '../types.ts';\n\nexport const resolveReview = buildObjArgsResolver<RawReview, QueryReviewArgs, RawReview | RawReview[keyof RawReview]>(\n REVIEW,\n async (obj, args, ctx, info) => {\n const id = obj ? obj.id : args.id;\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = snakeCase(fieldName) as keyof RawReview;\n\n if (obj && !isUndefined(obj[typedFieldName])) {\n return {\n data: obj[typedFieldName],\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.review<RawReview>(\n {\n pathTemplateData: { id },\n },\n ctxData\n );\n\n return {\n data: obj ? data?.[typedFieldName] : data,\n errors,\n headers,\n };\n }\n);\n","import { Core } from '@cachemap/core';\nimport { init as map } from '@cachemap/map';\nimport { init as reaper } from '@cachemap/reaper';\nimport {\n type CreateResourceResolver,\n type Getters,\n makeConnectionResolver,\n removeConnectionInputOptions,\n} from '@graphql-box/connection-resolver';\nimport { type QuerySearchArgs, SearchType } from '@tmdb-graphql-api/schema/types';\nimport { encode } from 'js-base64';\nimport { capitalize } from 'lodash-es';\nimport { SEARCH } from '../constants.ts';\nimport { snakeCasePropNames } from '../helpers/snakeCasePropNames.ts';\nimport { type Context, type RawSearch, type RawSearchType } from '../types.ts';\n\n/* eslint-disable camelcase */\n\nexport const createMakeCursors = (_obj: undefined, args: QuerySearchArgs) => {\n const groupCursor = `${JSON.stringify(removeConnectionInputOptions(args))}::${SEARCH}`;\n\n return {\n makeGroupCursor: () => encode(groupCursor),\n makeIDCursor: (id: string | number) => encode(`${id}::${groupCursor}`),\n };\n};\n\nexport const createResourceResolver: CreateResourceResolver<undefined, QuerySearchArgs, Context, RawSearch> = (\n _obj,\n args,\n { data: ctxData, restClient }\n) => {\n const { searchType, ...rest } = removeConnectionInputOptions(args);\n\n return async ({ page }: { page: number }) => {\n const { data, errors, headers } = await restClient.search<RawSearch>(\n {\n pathTemplateData: { type: (searchType ?? SearchType.Multi).toLowerCase() },\n queryParams: { ...snakeCasePropNames(rest), page },\n },\n ctxData\n );\n\n if (!data) {\n return {\n errors,\n headers,\n };\n }\n\n data.results = data.results?.map(entry => {\n let mediaType = entry.media_type;\n\n if (!mediaType && searchType && searchType !== SearchType.Multi) {\n mediaType = searchType.toLowerCase();\n }\n\n if (mediaType) {\n entry.media_type = capitalize(mediaType);\n }\n\n return entry;\n });\n\n return {\n data,\n errors,\n headers,\n };\n };\n};\n\nexport const cursorCache = new Core({\n name: 'SEARCH_CONNECTION_RESOLVER',\n reaper: reaper({ interval: 300_000 }),\n store: map(),\n type: 'GRAPHQL',\n});\n\nexport const getters: Getters<RawSearch, RawSearchType & { media_type?: Capitalize<Lowercase<SearchType>> }> = {\n // @ts-expect-error nested identifier is optional when\n // it shouldn't be\n nodes: ({ results = [] }) => results,\n page: ({ page = 0 }) => page,\n totalPages: ({ total_pages = 0 }) => total_pages,\n totalResults: ({ total_results = 0 }) => total_results,\n};\n\nexport const resolveSearch = makeConnectionResolver({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resultsPerPage: 20,\n});\n","import { type QuerySeasonArgs } from '@tmdb-graphql-api/schema/types';\nimport { isUndefined, snakeCase } from 'lodash-es';\nimport {\n CAST,\n CREDITS,\n CREW,\n EXTERNAL_IDS,\n IMAGES,\n POSTERS,\n SEASON,\n Source,\n TRANSLATIONS,\n VIDEOS,\n} from '../constants.ts';\nimport { buildObjArgsResolver } from '../helpers/buildObjArgsResolver.ts';\nimport { encodeId } from '../helpers/encodeId.ts';\nimport { getAppendToResponseKeys } from '../helpers/getAppendToResponseKeys.ts';\nimport { getTvIdSeasonAndEpisode } from '../helpers/getTvIdSeasonAndEpisode.ts';\nimport { setAppendToResponseSearchParams } from '../helpers/setAppendToResponseSearchParams.ts';\nimport { type EnrichedRawSeason, type EnrichedRawSeasonWithAppendToResponse, type RawSeason } from '../types.ts';\n\nconst appendToResponse = {\n [CAST]: CREDITS,\n [CREW]: CREDITS,\n [EXTERNAL_IDS]: snakeCase(EXTERNAL_IDS),\n [POSTERS]: IMAGES,\n [TRANSLATIONS]: TRANSLATIONS,\n [VIDEOS]: VIDEOS,\n};\n\nexport const resolveSeason = buildObjArgsResolver<\n EnrichedRawSeason,\n QuerySeasonArgs,\n | (EnrichedRawSeasonWithAppendToResponse & { __headers?: Headers })\n | EnrichedRawSeasonWithAppendToResponse[keyof EnrichedRawSeasonWithAppendToResponse]\n>(SEASON, async (obj, args, ctx, info) => {\n const { data: ctxData, fragmentDefinitions, languageCode, restClient } = ctx;\n const { fieldName, fieldNodes } = info;\n const typedFieldName = snakeCase(fieldName) as keyof RawSeason;\n const { id, seasonNumber } = getTvIdSeasonAndEpisode(obj, args);\n\n if (obj && !isUndefined(obj[typedFieldName])) {\n return {\n data: typedFieldName === 'id' ? encodeId({ id, seasonNumber }) : obj[typedFieldName],\n source: Source.ParentNode,\n };\n }\n\n const appendToResponseKeys = getAppendToResponseKeys(fieldNodes[0]!, appendToResponse, fragmentDefinitions);\n\n const { data, errors, headers } = await restClient.season<EnrichedRawSeasonWithAppendToResponse>(\n {\n pathTemplateData: { id, number: seasonNumber },\n ...(appendToResponseKeys.length > 0\n ? {\n queryParams: {\n ...setAppendToResponseSearchParams(appendToResponseKeys, languageCode),\n },\n }\n : {}),\n },\n ctxData\n );\n\n const seasonData = {\n ...data,\n episodes: (data?.episodes ?? []).map(episode => ({ ...episode, tv_show_id: Number(id) })),\n id: encodeId({ id, seasonNumber }),\n tv_show_id: Number(id),\n };\n\n return {\n data: obj\n ? seasonData[typedFieldName]\n : appendToResponseKeys.length > 0\n ? { ...seasonData, __headers: headers }\n : seasonData,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport { CREDITS, SEASON, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type EnrichedRawSeason, type EnrichedRawSeasonWithAppendToResponse, type RawSeasonCredits } from '../types.ts';\n\nconst isEnrichedRawSeasonWithCredits = (\n obj: EnrichedRawSeason | (EnrichedRawSeasonWithAppendToResponse & { __headers?: Headers })\n): obj is EnrichedRawSeasonWithAppendToResponse & { __headers: Headers } => CREDITS in obj && '__headers' in obj;\n\nexport const resolveSeasonCredits = buildObjResolver<\n EnrichedRawSeason | (EnrichedRawSeasonWithAppendToResponse & { __headers?: Headers }),\n RawSeasonCredits['cast'] | RawSeasonCredits['crew']\n>(SEASON, async (obj, ctx, info) => {\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = snakeCase(fieldName) as 'cast' | 'crew';\n\n if (isEnrichedRawSeasonWithCredits(obj)) {\n return {\n data: obj.credits?.[typedFieldName],\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.season<RawSeasonCredits>(\n {\n pathTemplateData: { id: obj.tv_show_id, number: obj.season_number, type: CREDITS },\n },\n ctxData\n );\n\n return {\n data: data?.[typedFieldName],\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport type { Except } from 'type-fest';\nimport { EXTERNAL_IDS, SEASON, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport {\n type EnrichedRawSeason,\n type EnrichedRawSeasonWithAppendToResponse,\n type RawSeasonExternalIds,\n} from '../types.ts';\n\nconst isEnrichedRawSeasonWithExternalIds = (\n obj: EnrichedRawSeason | (EnrichedRawSeasonWithAppendToResponse & { __headers?: Headers })\n): obj is EnrichedRawSeasonWithAppendToResponse & { __headers: Headers } =>\n snakeCase(EXTERNAL_IDS) in obj && '__headers' in obj;\n\nexport const resolveSeasonExternalIds = buildObjResolver<\n EnrichedRawSeason | (EnrichedRawSeasonWithAppendToResponse & { __headers?: Headers }),\n Except<RawSeasonExternalIds, 'id'>\n>(SEASON, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isEnrichedRawSeasonWithExternalIds(obj)) {\n return {\n data: obj.external_ids,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.season<RawSeasonExternalIds>(\n {\n pathTemplateData: { id: obj.tv_show_id, number: obj.season_number, type: snakeCase(EXTERNAL_IDS) },\n },\n ctxData\n );\n\n const { id: movieId, ...rest } = data ?? {};\n\n return {\n data: rest,\n errors,\n headers,\n };\n});\n","import { IMAGES, SEASON, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type EnrichedRawSeason, type EnrichedRawSeasonWithAppendToResponse, type RawSeasonPosters } from '../types.ts';\n\nconst isEnrichedRawSeasonWithPosters = (\n obj: EnrichedRawSeason | (EnrichedRawSeasonWithAppendToResponse & { __headers?: Headers })\n): obj is EnrichedRawSeasonWithAppendToResponse & { __headers: Headers } => IMAGES in obj && '__headers' in obj;\n\nexport const resolveSeasonPosters = buildObjResolver<\n EnrichedRawSeason | (EnrichedRawSeasonWithAppendToResponse & { __headers?: Headers }),\n RawSeasonPosters['posters']\n>(SEASON, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isEnrichedRawSeasonWithPosters(obj)) {\n return {\n data: obj.images?.posters,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.season<RawSeasonPosters>(\n {\n pathTemplateData: { id: obj.tv_show_id, number: obj.season_number, type: IMAGES },\n },\n ctxData\n );\n\n return {\n data: data?.posters,\n errors,\n headers,\n };\n});\n","import { SEASON, Source, TRANSLATIONS } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport {\n type EnrichedRawSeason,\n type EnrichedRawSeasonWithAppendToResponse,\n type RawSeasonTranslations,\n} from '../types.ts';\n\nconst isEnrichedRawSeasonWithTranslations = (\n obj: EnrichedRawSeason | (EnrichedRawSeasonWithAppendToResponse & { __headers?: Headers })\n): obj is EnrichedRawSeasonWithAppendToResponse & { __headers: Headers } => TRANSLATIONS in obj && '__headers' in obj;\n\nexport const resolveSeasonTranslations = buildObjResolver<\n EnrichedRawSeason | (EnrichedRawSeasonWithAppendToResponse & { __headers?: Headers }),\n RawSeasonTranslations['translations']\n>(SEASON, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isEnrichedRawSeasonWithTranslations(obj)) {\n return {\n data: obj.translations?.translations,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.season<RawSeasonTranslations>(\n {\n pathTemplateData: { id: obj.tv_show_id, number: obj.season_number, type: TRANSLATIONS },\n },\n ctxData\n );\n\n return {\n data: data?.translations,\n errors,\n headers,\n };\n});\n","import { SEASON, Source, VIDEOS } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type EnrichedRawSeason, type EnrichedRawSeasonWithAppendToResponse, type RawSeasonVideos } from '../types.ts';\n\nconst isEnrichedRawSeasonWithVideos = (\n obj: EnrichedRawSeason | (EnrichedRawSeasonWithAppendToResponse & { __headers?: Headers })\n): obj is EnrichedRawSeasonWithAppendToResponse & { __headers: Headers } => VIDEOS in obj && '__headers' in obj;\n\nexport const resolveSeasonVideos = buildObjResolver<\n EnrichedRawSeason | (EnrichedRawSeasonWithAppendToResponse & { __headers?: Headers }),\n RawSeasonVideos['results']\n>(SEASON, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isEnrichedRawSeasonWithVideos(obj)) {\n return {\n data: obj.videos?.results,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.season<RawSeasonVideos>(\n {\n pathTemplateData: { id: obj.tv_show_id, number: obj.season_number, type: VIDEOS },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n});\n","import { Core } from '@cachemap/core';\nimport { init as map } from '@cachemap/map';\nimport { init as reaper } from '@cachemap/reaper';\nimport {\n type CreateResourceResolver,\n type Getters,\n makeConnectionResolver,\n removeConnectionInputOptions,\n} from '@graphql-box/connection-resolver';\nimport { type MediaType, type QueryTrendingArgs } from '@tmdb-graphql-api/schema/types';\nimport { TrendingMediaType } from '@tmdb-graphql-api/schema/types';\nimport { encode } from 'js-base64';\nimport { capitalize } from 'lodash-es';\nimport { TRENDING } from '../constants.ts';\nimport { type Context, type RawMediaType, type RawTrending } from '../types.ts';\n\n/* eslint-disable camelcase */\n\nexport const createMakeCursors = (_obj: undefined, args: QueryTrendingArgs) => {\n const groupCursor = `${JSON.stringify(removeConnectionInputOptions(args))}::${TRENDING}`;\n\n return {\n makeGroupCursor: () => encode(groupCursor),\n makeIDCursor: (id: string | number) => encode(`${id}::${groupCursor}`),\n };\n};\n\nexport const createResourceResolver: CreateResourceResolver<undefined, QueryTrendingArgs, Context, RawTrending> =\n (_obj, args, ctx) =>\n async ({ page }: { page: number }) => {\n const { mediaType, timeWindow } = args;\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.trending<RawTrending>(\n {\n pathTemplateData: { subType: timeWindow.toLowerCase(), type: mediaType.toLowerCase() },\n queryParams: { page },\n },\n ctxData\n );\n\n if (!data) {\n return {\n errors,\n headers,\n };\n }\n\n data.results = data.results?.map(entry => {\n let type = entry.media_type;\n\n if (!type && mediaType !== TrendingMediaType.All) {\n type = mediaType.toLowerCase();\n }\n\n if (type) {\n entry.media_type = capitalize(type);\n }\n\n return entry;\n });\n\n return {\n data,\n errors,\n headers,\n };\n };\n\nexport const cursorCache = new Core({\n name: 'TRENDING_CONNECTION_RESOLVER',\n reaper: reaper({ interval: 300_000 }),\n store: map(),\n type: 'GRAPHQL',\n});\n\nexport const getters: Getters<RawTrending, RawMediaType & { media_type?: Capitalize<Lowercase<MediaType>> }> = {\n // @ts-expect-error nested identifier is optional when\n // it shouldn't be\n nodes: ({ results = [] }) => results,\n page: ({ page = 0 }) => page,\n totalPages: ({ total_pages = 0 }) => total_pages,\n totalResults: ({ total_results = 0 }) => total_results,\n};\n\nexport const resolveTrending = makeConnectionResolver({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resultsPerPage: 20,\n});\n","import { type QueryTvArgs } from '@tmdb-graphql-api/schema/types';\nimport { isUndefined, snakeCase } from 'lodash-es';\nimport {\n ALTERNATIVE_TITLES,\n BACKDROPS,\n CAST,\n CONTENT_RATINGS,\n CREDITS,\n CREW,\n EPISODE_GROUPS,\n EXTERNAL_IDS,\n IMAGES,\n KEYWORDS,\n LOGOS,\n POSTERS,\n RECOMMENDATIONS,\n REVIEWS,\n SIMILAR,\n SIMILAR_TV_SHOWS,\n Source,\n TRANSLATIONS,\n TV,\n VIDEOS,\n WATCH_PROVIDERS,\n} from '../constants.ts';\nimport { buildObjArgsResolver } from '../helpers/buildObjArgsResolver.ts';\nimport { getAppendToResponseKeys } from '../helpers/getAppendToResponseKeys.ts';\nimport { setAppendToResponseSearchParams } from '../helpers/setAppendToResponseSearchParams.ts';\nimport { type RawTv, type RawTvWithAppendToResponse } from '../types.ts';\n\nconst appendToResponse = {\n [ALTERNATIVE_TITLES]: snakeCase(ALTERNATIVE_TITLES),\n [BACKDROPS]: IMAGES,\n [CAST]: CREDITS,\n [CONTENT_RATINGS]: snakeCase(CONTENT_RATINGS),\n [CREW]: CREDITS,\n [EPISODE_GROUPS]: snakeCase(EPISODE_GROUPS),\n [EXTERNAL_IDS]: snakeCase(EXTERNAL_IDS),\n [KEYWORDS]: KEYWORDS,\n [LOGOS]: IMAGES,\n [POSTERS]: IMAGES,\n [RECOMMENDATIONS]: RECOMMENDATIONS,\n [REVIEWS]: REVIEWS,\n [SIMILAR_TV_SHOWS]: SIMILAR,\n [TRANSLATIONS]: TRANSLATIONS,\n [VIDEOS]: VIDEOS,\n [WATCH_PROVIDERS]: 'watch/providers',\n};\n\nexport const resolveTv = buildObjArgsResolver<\n RawTv,\n QueryTvArgs,\n (RawTvWithAppendToResponse & { __headers?: Headers }) | RawTvWithAppendToResponse[keyof RawTvWithAppendToResponse]\n>(TV, async (obj, args, ctx, info) => {\n const { data: ctxData, fragmentDefinitions, languageCode, restClient } = ctx;\n const { fieldName, fieldNodes } = info;\n const typedFieldName = snakeCase(fieldName) as keyof RawTv;\n\n if (obj && !isUndefined(obj[typedFieldName])) {\n return {\n data: obj[typedFieldName],\n source: Source.ParentNode,\n };\n }\n\n const id = obj ? obj.id : args.id;\n const appendToResponseKeys = getAppendToResponseKeys(fieldNodes[0]!, appendToResponse, fragmentDefinitions);\n\n const { data, errors, headers } = await restClient.tv<RawTvWithAppendToResponse>(\n {\n pathTemplateData: { id },\n ...(appendToResponseKeys.length > 0\n ? {\n queryParams: {\n ...setAppendToResponseSearchParams(appendToResponseKeys, languageCode),\n },\n }\n : {}),\n },\n ctxData\n );\n\n const tvData = {\n ...data,\n seasons: (data?.seasons ?? []).map(season => ({\n ...season,\n tv_show_id: Number(id),\n })),\n };\n\n return {\n data: obj ? tvData[typedFieldName] : appendToResponseKeys.length > 0 ? { ...tvData, __headers: headers } : tvData,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport { ALTERNATIVE_TITLES, Source, TV } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawTv, type RawTvAlternativeTitles, type RawTvWithAppendToResponse } from '../types.ts';\n\nconst isRawTvWithAlternativeTitles = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers })\n): obj is RawTvWithAppendToResponse & { __headers: Headers } =>\n snakeCase(ALTERNATIVE_TITLES) in obj && '__headers' in obj;\n\nexport const resolveTvAlternativeTitles = buildObjResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n RawTvAlternativeTitles['results']\n>(TV, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawTvWithAlternativeTitles(obj)) {\n return {\n data: obj.alternative_titles.results,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvAlternativeTitles>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(ALTERNATIVE_TITLES) },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport { CONTENT_RATINGS, Source, TV } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawTv, type RawTvContentRatings, type RawTvWithAppendToResponse } from '../types.ts';\n\nconst isRawTvWithContentRatings = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers })\n): obj is RawTvWithAppendToResponse & { __headers: Headers } => snakeCase(CONTENT_RATINGS) in obj && '__headers' in obj;\n\nexport const resolveTvContentRatings = buildObjResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n RawTvContentRatings['results']\n>(TV, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawTvWithContentRatings(obj)) {\n return {\n data: obj.content_ratings.results,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvContentRatings>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(CONTENT_RATINGS) },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n});\n","import { CREDITS, Source, TV } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawTv, type RawTvCredits, type RawTvWithAppendToResponse } from '../types.ts';\n\nconst isRawTvWithCredits = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers })\n): obj is RawTvWithAppendToResponse & { __headers: Headers } => CREDITS in obj && '__headers' in obj;\n\nexport const resolveTvCredits = buildObjResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n RawTvCredits['cast'] | RawTvCredits['crew']\n>(TV, async (obj, ctx, info) => {\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = fieldName as 'cast' | 'crew';\n\n if (isRawTvWithCredits(obj)) {\n return {\n data: obj.credits?.[typedFieldName],\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvCredits>(\n {\n pathTemplateData: { id: obj.id, type: CREDITS },\n },\n ctxData\n );\n\n return {\n data: data?.[typedFieldName],\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport { EPISODE_GROUPS, Source, TV } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawTv, type RawTvEpisodeGroups, type RawTvWithAppendToResponse } from '../types.ts';\n\nconst isRawTvWithEpisodeGroups = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers })\n): obj is RawTvWithAppendToResponse & { __headers: Headers } => snakeCase(EPISODE_GROUPS) in obj && '__headers' in obj;\n\nexport const resolveTvEpisodeGroups = buildObjResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n RawTvEpisodeGroups['results']\n>(TV, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawTvWithEpisodeGroups(obj)) {\n return {\n data: obj.episode_groups?.results,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvEpisodeGroups>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(EPISODE_GROUPS) },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport type { Except } from 'type-fest';\nimport { EXTERNAL_IDS, Source, TV } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawTv, type RawTvExternalIds, type RawTvWithAppendToResponse } from '../types.ts';\n\nconst isRawTvWithExternalIds = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers })\n): obj is RawTvWithAppendToResponse & { __headers: Headers } => snakeCase(EXTERNAL_IDS) in obj && '__headers' in obj;\n\nexport const resolveTvExternalIds = buildObjResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n Except<RawTvExternalIds, 'id'>\n>(TV, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawTvWithExternalIds(obj)) {\n return {\n data: obj.external_ids,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvExternalIds>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(EXTERNAL_IDS) },\n },\n ctxData\n );\n\n const { id: tvId, ...rest } = data ?? {};\n\n return {\n data: rest,\n errors,\n headers,\n };\n});\n","import { IMAGES, Source, TV } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawTv, type RawTvImages, type RawTvWithAppendToResponse } from '../types.ts';\n\nconst isRawTvWithImages = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers })\n): obj is RawTvWithAppendToResponse & { __headers: Headers } => IMAGES in obj && '__headers' in obj;\n\nexport const resolveTvImages = buildObjResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n RawTvImages['posters'] | RawTvImages['logos'] | RawTvImages['backdrops']\n>(TV, async (obj, ctx, info) => {\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = fieldName as 'backdrops' | 'logos' | 'posters';\n\n if (isRawTvWithImages(obj)) {\n return {\n data: obj.images?.[typedFieldName],\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvImages>(\n {\n pathTemplateData: { id: obj.id, type: IMAGES },\n },\n ctxData\n );\n\n return {\n data: data?.[typedFieldName],\n errors,\n headers,\n };\n});\n","import { KEYWORDS, Source, TV } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawTv, type RawTvKeywords, type RawTvWithAppendToResponse } from '../types.ts';\n\nconst isRawTvWithKeywords = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers })\n): obj is RawTvWithAppendToResponse & { __headers: Headers } => KEYWORDS in obj && '__headers' in obj;\n\nexport const resolveTvKeywords = buildObjResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n RawTvKeywords['results']\n>(TV, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawTvWithKeywords(obj)) {\n return {\n data: obj.keywords?.results,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvKeywords>(\n {\n pathTemplateData: { id: obj.id, type: KEYWORDS },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n});\n","import { Core } from '@cachemap/core';\nimport { init as map } from '@cachemap/map';\nimport { init as reaper } from '@cachemap/reaper';\nimport { type CreateResourceResolver, type Getters, makeConnectionResolver } from '@graphql-box/connection-resolver';\nimport { type TvRecommendationsArgs } from '@tmdb-graphql-api/schema/types';\nimport { encode } from 'js-base64';\nimport { RECOMMENDATIONS, TV } from '../constants.ts';\nimport { type Context, type RawTv, type RawTvRecommendations, type RawTvWithAppendToResponse } from '../types.ts';\n\n/* eslint-disable camelcase */\n\nexport const createMakeCursors = (obj: RawTv) => {\n const groupCursor = `${obj.id}::${TV}::${RECOMMENDATIONS}`;\n\n return {\n makeGroupCursor: () => encode(groupCursor),\n makeIDCursor: (id: string | number) => encode(`${id}::${groupCursor}`),\n };\n};\n\nconst isRawTvWithRecommendations = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n page: number\n): obj is RawTvWithAppendToResponse & { __headers: Headers } =>\n RECOMMENDATIONS in obj && obj.recommendations?.page === page && '__headers' in obj;\n\nexport const createResourceResolver: CreateResourceResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n TvRecommendationsArgs,\n Context,\n RawTvRecommendations\n> =\n (obj, _args, ctx) =>\n async ({ page }: { page: number }) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawTvWithRecommendations(obj, page)) {\n return {\n data: obj.recommendations,\n headers: obj.__headers,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvRecommendations>(\n {\n pathTemplateData: { id: obj.id, type: RECOMMENDATIONS },\n queryParams: { page },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n };\n\nexport const cursorCache = new Core({\n name: 'TV_RECOMMENDATIONS_CONNECTION_RESOLVER',\n reaper: reaper({ interval: 300_000 }),\n store: map(),\n type: 'GRAPHQL',\n});\n\nexport const getters: Getters<RawTvRecommendations, RawTv> = {\n // @ts-expect-error minor type mismatch\n nodes: ({ results = [] }) => results,\n page: ({ page = 0 }) => page,\n totalPages: ({ total_pages = 0 }) => total_pages,\n totalResults: ({ total_results = 0 }) => total_results,\n};\n\nexport const resolveTvRecommendations = makeConnectionResolver({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resultsPerPage: 20,\n});\n","import { Core } from '@cachemap/core';\nimport { init as map } from '@cachemap/map';\nimport { init as reaper } from '@cachemap/reaper';\nimport { type CreateResourceResolver, type Getters, makeConnectionResolver } from '@graphql-box/connection-resolver';\nimport { type TvReviewsArgs } from '@tmdb-graphql-api/schema/types';\nimport { encode } from 'js-base64';\nimport { REVIEWS, TV } from '../constants.ts';\nimport {\n type Context,\n type RawReview,\n type RawTv,\n type RawTvReviews,\n type RawTvWithAppendToResponse,\n} from '../types.ts';\n\n/* eslint-disable camelcase */\n\nexport const createMakeCursors = (obj: RawTv) => {\n const groupCursor = `${obj.id}::${TV}::${REVIEWS}`;\n\n return {\n makeGroupCursor: () => encode(groupCursor),\n makeIDCursor: (id: string | number) => encode(`${id}::${groupCursor}`),\n };\n};\n\nconst isRawTvWithReviews = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n page: number\n): obj is RawTvWithAppendToResponse & { __headers: Headers } =>\n REVIEWS in obj && obj.reviews?.page === page && '__headers' in obj;\n\nexport const createResourceResolver: CreateResourceResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n TvReviewsArgs,\n Context,\n RawTvReviews\n> =\n (obj, _args, { data: ctxData, restClient }) =>\n async ({ page }: { page: number }) => {\n if (isRawTvWithReviews(obj, page)) {\n return {\n data: obj.reviews,\n headers: obj.__headers,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvReviews>(\n {\n pathTemplateData: { id: obj.id, type: REVIEWS },\n queryParams: { page },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n };\n\nexport const cursorCache = new Core({\n name: 'TV_REVIEWS_CONNECTION_RESOLVER',\n reaper: reaper({ interval: 300_000 }),\n store: map(),\n type: 'GRAPHQL',\n});\n\nexport const getters: Getters<RawTvReviews, RawReview> = {\n // @ts-expect-error minor type mismatch\n nodes: ({ results = [] }: RawTvReviews) => results,\n page: ({ page = 0 }: RawTvReviews) => page,\n totalPages: ({ total_pages = 0 }: RawTvReviews) => total_pages,\n totalResults: ({ total_results = 0 }: RawTvReviews) => total_results,\n};\n\nexport const resolveTvReviews = makeConnectionResolver({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resultsPerPage: 20,\n});\n","import { Core } from '@cachemap/core';\nimport { init as map } from '@cachemap/map';\nimport { init as reaper } from '@cachemap/reaper';\nimport { type CreateResourceResolver, type Getters, makeConnectionResolver } from '@graphql-box/connection-resolver';\nimport { type TvSimilarTvShowsArgs } from '@tmdb-graphql-api/schema/types';\nimport { encode } from 'js-base64';\nimport { SIMILAR, TV } from '../constants.ts';\nimport { type Context, type RawTv, type RawTvSimilarTvShows, type RawTvWithAppendToResponse } from '../types.ts';\n\n/* eslint-disable camelcase */\n\nexport const createMakeCursors = (obj: RawTv) => {\n const groupCursor = `${obj.id}::${TV}::${SIMILAR}`;\n\n return {\n makeGroupCursor: () => encode(groupCursor),\n makeIDCursor: (id: string | number) => encode(`${id}::${groupCursor}`),\n };\n};\n\nconst isRawTvWithSimilarShows = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n page: number\n): obj is RawTvWithAppendToResponse & { __headers: Headers } =>\n SIMILAR in obj && obj.similar?.page === page && '__headers' in obj;\n\nexport const createResourceResolver: CreateResourceResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n TvSimilarTvShowsArgs,\n Context,\n RawTvSimilarTvShows\n> =\n (obj, _args, { data: ctxData, restClient }) =>\n async ({ page }: { page: number }) => {\n if (isRawTvWithSimilarShows(obj, page)) {\n return {\n data: obj.similar,\n headers: obj.__headers,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvSimilarTvShows>(\n {\n pathTemplateData: { id: obj.id, type: SIMILAR },\n queryParams: { page },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n };\n\nexport const cursorCache = new Core({\n name: 'TV_SIMILAR_TV_SHOWS_CONNECTION_RESOLVER',\n reaper: reaper({ interval: 300_000 }),\n store: map(),\n type: 'GRAPHQL',\n});\n\nexport const getters: Getters<RawTvSimilarTvShows, RawTv> = {\n // @ts-expect-error minor type mismatch\n nodes: ({ results = [] }) => results,\n page: ({ page = 0 }) => page,\n totalPages: ({ total_pages = 0 }) => total_pages,\n totalResults: ({ total_results = 0 }) => total_results,\n};\n\nexport const resolveTvSimilarTvShows = makeConnectionResolver({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resultsPerPage: 20,\n});\n","import { Source, TRANSLATIONS, TV } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawTv, type RawTvTranslations, type RawTvWithAppendToResponse } from '../types.ts';\n\nconst isRawTvWithTranslations = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers })\n): obj is RawTvWithAppendToResponse & { __headers: Headers } => TRANSLATIONS in obj && '__headers' in obj;\n\nexport const resolveTvTranslations = buildObjResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n RawTvTranslations['translations']\n>(TV, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawTvWithTranslations(obj)) {\n return {\n data: obj.translations?.translations,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvTranslations>(\n {\n pathTemplateData: { id: obj.id, type: TRANSLATIONS },\n },\n ctxData\n );\n\n return {\n data: data?.translations,\n errors,\n headers,\n };\n});\n","import { Source, TV, VIDEOS } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawTv, type RawTvVideos, type RawTvWithAppendToResponse } from '../types.ts';\n\nconst isRawTvWithVideos = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers })\n): obj is RawTvWithAppendToResponse & { __headers: Headers } => VIDEOS in obj && '__headers' in obj;\n\nexport const resolveTvVideos = buildObjResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n RawTvVideos['results']\n>(TV, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawTvWithVideos(obj)) {\n return {\n data: obj.videos?.results,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvVideos>(\n {\n pathTemplateData: { id: obj.id, type: VIDEOS },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n});\n","import { RAW_WATCH_PROVIDERS, Source, TV } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawTv, type RawTvWatchProviders, type RawTvWithAppendToResponse } from '../types.ts';\n\nconst isRawTvWithWatchProviders = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers })\n): obj is RawTvWithAppendToResponse & { __headers: Headers } => RAW_WATCH_PROVIDERS in obj && '__headers' in obj;\n\nexport const resolveTvWatchProviders = buildObjResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n RawTvWatchProviders['results']\n>(TV, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawTvWithWatchProviders(obj)) {\n return {\n data: obj[RAW_WATCH_PROVIDERS]?.results,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.watchProviders<RawTvWatchProviders>(\n {\n pathTemplateData: { id: obj.id, type: TV },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n});\n","import { type Certifications, type MediaType, type ScreenType, type SearchType } from '@tmdb-graphql-api/schema/types';\nimport { makeFallbackFieldResolvers } from './helpers/makeFallbackFieldResolvers.ts';\nimport { resolveCertifications } from './queries/certifications.ts';\nimport { resolveCollection } from './queries/collection.ts';\nimport { resolveCollectionImages } from './queries/collectionImages.ts';\nimport { resolveCollectionTranslations } from './queries/collectionTranslations.ts';\nimport { resolveCompany } from './queries/company.ts';\nimport { resolveCompanyAlternativeNames } from './queries/companyAlternativeNames.ts';\nimport { resolveCompanyLogos } from './queries/companyLogos.ts';\nimport { resolveConfiguration } from './queries/configuration.ts';\nimport { resolveConfigurationCountries } from './queries/configurationCountries.ts';\nimport { resolveConfigurationJobs } from './queries/configurationJobs.ts';\nimport { resolveConfigurationLanguages } from './queries/configurationLanguages.ts';\nimport { resolveConfigurationPrimaryTranslations } from './queries/configurationPrimaryTranslations.ts';\nimport { resolveConfigurationTimezones } from './queries/configurationTimezones.ts';\nimport { resolveCredit } from './queries/credit.ts';\nimport { resolveDiscoverMovies } from './queries/discoverMovies.ts';\nimport { resolveDiscoverTv } from './queries/discoverTv.ts';\nimport { resolveEpisode } from './queries/episode.ts';\nimport { resolveEpisodeCredits } from './queries/episodeCredits.ts';\nimport { resolveEpisodeExternalIds } from './queries/episodeExternalIds.ts';\nimport { resolveEpisodeStills } from './queries/episodeStills.ts';\nimport { resolveEpisodeTranslations } from './queries/episodeTranslations.ts';\nimport { resolveEpisodeVideos } from './queries/episodeVideos.ts';\nimport { resolveFind } from './queries/find.ts';\nimport { resolveGenres } from './queries/genres.ts';\nimport { resolveKeyword } from './queries/keyword.ts';\nimport { resolveMovie } from './queries/movie.ts';\nimport { resolveMovieAlternativeTitles } from './queries/movieAlternativeTitles.ts';\nimport { resolveMovieCredits } from './queries/movieCredits.ts';\nimport { resolveMovieExternalIds } from './queries/movieExternalIds.ts';\nimport { resolveMovieImages } from './queries/movieImages.ts';\nimport { resolveMovieKeywords } from './queries/movieKeywords.ts';\nimport { resolveMovieRecommendations } from './queries/movieRecommendations.ts';\nimport { resolveMovieReleaseDates } from './queries/movieReleaseDates.ts';\nimport { resolveMovieReviews } from './queries/movieReviews.ts';\nimport { resolveMovieSimilarMovies } from './queries/movieSimilarMovies.ts';\nimport { resolveMovieTranslations } from './queries/movieTranslations.ts';\nimport { resolveMovieVideos } from './queries/movieVideos.ts';\nimport { resolveMovieWatchProviders } from './queries/movieWatchProviders.ts';\nimport { resolveNetwork } from './queries/network.ts';\nimport { resolveNetworkAlternativeNames } from './queries/networkAlternativeNames.ts';\nimport { resolveNetworkLogos } from './queries/networkLogos.ts';\nimport { resolvePerson } from './queries/person.ts';\nimport { resolvePersonCombinedCredits } from './queries/personCombinedCredits.ts';\nimport { resolvePersonExternalIds } from './queries/personExternalIds.ts';\nimport { resolvePersonMovieCredits } from './queries/personMovieCredits.ts';\nimport { resolvePersonProfiles } from './queries/personProfiles.ts';\nimport { resolvePersonTranslations } from './queries/personTranslations.ts';\nimport { resolvePersonTvCredits } from './queries/personTvCredits.ts';\nimport { resolveRated } from './queries/rated.ts';\nimport { resolveReview } from './queries/review.ts';\nimport { resolveSearch } from './queries/search.ts';\nimport { resolveSeason } from './queries/season.ts';\nimport { resolveSeasonCredits } from './queries/seasonCredits.ts';\nimport { resolveSeasonEpisodeCount } from './queries/seasonEpisodeCount.ts';\nimport { resolveSeasonExternalIds } from './queries/seasonExternalIds.ts';\nimport { resolveSeasonPosters } from './queries/seasonPosters.ts';\nimport { resolveSeasonTranslations } from './queries/seasonTranslations.ts';\nimport { resolveSeasonVideos } from './queries/seasonVideos.ts';\nimport { resolveTrending } from './queries/trending.ts';\nimport { resolveTv } from './queries/tv.ts';\nimport { resolveTvAlternativeTitles } from './queries/tvAlternativeTitles.ts';\nimport { resolveTvContentRatings } from './queries/tvContentRatings.ts';\nimport { resolveTvCredits } from './queries/tvCredits.ts';\nimport { resolveTvEpisodeGroups } from './queries/tvEpisodeGroups.ts';\nimport { resolveTvExternalIds } from './queries/tvExternalIds.ts';\nimport { resolveTvImages } from './queries/tvImages.ts';\nimport { resolveTvKeywords } from './queries/tvKeywords.ts';\nimport { resolveTvRecommendations } from './queries/tvRecommendations.ts';\nimport { resolveTvReviews } from './queries/tvReviews.ts';\nimport { resolveTvSimilarTvShows } from './queries/tvSimilarTvShows.ts';\nimport { resolveTvTranslations } from './queries/tvTranslations.ts';\nimport { resolveTvVideos } from './queries/tvVideos.ts';\nimport { resolveTvWatchProviders } from './queries/tvWatchProviders.ts';\nimport { resolveVideoType } from './queries/videoType.ts';\nimport { type FieldResolver, type RawMediaType, type RawMovie, type RawSearchType, type RawTv } from './types.ts';\n\nexport const resolvers: Record<string, Record<string, string | number | FieldResolver>> = {\n Certifications: {\n CA_QC: (obj: Certifications) => obj['CA-QC' as keyof Certifications],\n },\n Collection: {\n ...makeFallbackFieldResolvers('Collection', resolveCollection),\n backdrops: resolveCollectionImages,\n posters: resolveCollectionImages,\n translations: resolveCollectionTranslations,\n },\n Company: {\n ...makeFallbackFieldResolvers('Company', resolveCompany),\n alternativeNames: resolveCompanyAlternativeNames,\n logos: resolveCompanyLogos,\n },\n Configuration: {\n countries: resolveConfigurationCountries,\n jobs: resolveConfigurationJobs,\n languages: resolveConfigurationLanguages,\n primaryTranslations: resolveConfigurationPrimaryTranslations,\n timezones: resolveConfigurationTimezones,\n },\n Episode: {\n ...makeFallbackFieldResolvers('Episode', resolveEpisode),\n cast: resolveEpisodeCredits,\n crew: resolveEpisodeCredits,\n externalIds: resolveEpisodeExternalIds,\n stills: resolveEpisodeStills,\n translations: resolveEpisodeTranslations,\n videos: resolveEpisodeVideos,\n },\n Media: {\n // eslint-disable-next-line camelcase\n __resolveType: (obj: RawMediaType & { media_type: Capitalize<Lowercase<MediaType>> }) => {\n return obj.media_type;\n },\n },\n Movie: {\n ...makeFallbackFieldResolvers('Movie', resolveMovie),\n alternativeTitles: resolveMovieAlternativeTitles,\n backdrops: resolveMovieImages,\n cast: resolveMovieCredits,\n crew: resolveMovieCredits,\n externalIds: resolveMovieExternalIds,\n keywords: resolveMovieKeywords,\n logos: resolveMovieImages,\n posters: resolveMovieImages,\n recommendations: resolveMovieRecommendations,\n releaseDates: resolveMovieReleaseDates,\n reviews: resolveMovieReviews,\n similarMovies: resolveMovieSimilarMovies,\n translations: resolveMovieTranslations,\n videos: resolveMovieVideos,\n watchProviders: resolveMovieWatchProviders,\n },\n MovieReleaseType: {\n DIGITAL: 4,\n PHYSICAL: 5,\n PREMIER: 1,\n THEATRICAL: 3,\n THEATRICAL_LIMITED: 2,\n TV: 6,\n },\n MovieStatus: {\n CANCELED: 'Canceled',\n IN_PRODUCTION: 'In Production',\n PLANNED: 'Planned',\n POST_PRODUCTION: 'Post Production',\n RELEASED: 'Released',\n RUMORED: 'Rumored',\n },\n Network: {\n ...makeFallbackFieldResolvers('Network', resolveNetwork),\n alternativeNames: resolveNetworkAlternativeNames,\n logos: resolveNetworkLogos,\n },\n Person: {\n ...makeFallbackFieldResolvers('Person', resolvePerson),\n combinedCredits: resolvePersonCombinedCredits,\n externalIds: resolvePersonExternalIds,\n movieCredits: resolvePersonMovieCredits,\n profiles: resolvePersonProfiles,\n translations: resolvePersonTranslations,\n tvCredits: resolvePersonTvCredits,\n },\n Query: {\n certifications: resolveCertifications,\n collection: resolveCollection,\n company: resolveCompany,\n configuration: resolveConfiguration,\n credit: resolveCredit,\n discoverMovies: resolveDiscoverMovies,\n discoverTv: resolveDiscoverTv,\n episode: resolveEpisode,\n find: resolveFind,\n genres: resolveGenres,\n keyword: resolveKeyword,\n movie: resolveMovie,\n network: resolveNetwork,\n person: resolvePerson,\n // popular: null,\n rated: resolveRated,\n review: resolveReview,\n search: resolveSearch,\n season: resolveSeason,\n trending: resolveTrending,\n tv: resolveTv,\n },\n RatedScreen: {\n // eslint-disable-next-line camelcase\n __resolveType: (obj: (RawMovie | RawTv) & { media_type: Capitalize<Lowercase<ScreenType>> }) => {\n return obj.media_type;\n },\n },\n Search: {\n // eslint-disable-next-line camelcase\n __resolveType: (obj: RawSearchType & { media_type: Capitalize<Lowercase<SearchType>> }) => {\n return obj.media_type;\n },\n },\n Season: {\n ...makeFallbackFieldResolvers('Season', resolveSeason),\n cast: resolveSeasonCredits,\n crew: resolveSeasonCredits,\n episodeCount: resolveSeasonEpisodeCount,\n externalIds: resolveSeasonExternalIds,\n posters: resolveSeasonPosters,\n translations: resolveSeasonTranslations,\n videos: resolveSeasonVideos,\n },\n Tv: {\n ...makeFallbackFieldResolvers('Tv', resolveTv),\n alternativeTitles: resolveTvAlternativeTitles,\n backdrops: resolveTvImages,\n cast: resolveTvCredits,\n contentRatings: resolveTvContentRatings,\n crew: resolveTvCredits,\n episodeGroups: resolveTvEpisodeGroups,\n externalIds: resolveTvExternalIds,\n keywords: resolveTvKeywords,\n logos: resolveTvImages,\n posters: resolveTvImages,\n recommendations: resolveTvRecommendations,\n reviews: resolveTvReviews,\n similarTvShows: resolveTvSimilarTvShows,\n translations: resolveTvTranslations,\n videos: resolveTvVideos,\n watchProviders: resolveTvWatchProviders,\n },\n TvStatus: {\n CANCELED: 'Canceled',\n ENDED: 'Ended',\n IN_PRODUCTION: 'In Production',\n PILOT: 'Pilot',\n PLANNED: 'Planned',\n RETURNING_SERIES: 'Returning Series',\n },\n TvType: {\n DOCUMENTARY: 'Documentary',\n MINISERIES: 'Miniseries',\n NEWS: 'News',\n REALITY: 'Reality',\n SCRIPTED: 'Scripted',\n TALK_SHOW: 'Talk Show',\n VIDEO: 'Video',\n },\n Video: {\n type: resolveVideoType,\n },\n};\n","import { type RawSeason } from '../types.ts';\n\nexport const resolveSeasonEpisodeCount = (obj: RawSeason) => {\n return obj.episodes?.length ?? 0;\n};\n","import { type Video } from '@tmdb-graphql-api/schema/types';\nimport { snakeCase } from 'lodash-es';\n\nexport const resolveVideoType = ({ type }: Video) => snakeCase(type).toUpperCase();\n"],"names":["createDefaultFieldResolver","object","_arguments","_context","fieldNodes","currentField","value","name","Object","prototype","hasOwnProperty","call","snakeCase","typeMap","schema","getTypeMap","typePropNames","keys","reduce","acc","key","type","astNode","kind","Kind","OBJECT_TYPE_DEFINITION","getFields","makeFallbackFieldResolvers","typeName","resolver","propName","ALTERNATIVE_NAMES","ALTERNATIVE_TITLES","BACKDROPS","CAST","COLLECTION","COMBINED_CREDITS","COMPANY","CONFIGURATION","CONTENT_RATINGS","CREDITS","CREW","EPISODE","EPISODE_GROUPS","EXTERNAL_IDS","IMAGES","KEYWORDS","LOGOS","MOVIE","MOVIE_CREDITS","NETWORK","PERSON","POSTERS","RECOMMENDATIONS","RELEASE_DATES","REVIEWS","SEASON","SIMILAR","TRANSLATIONS","TV","TV_CREDITS","VIDEOS","WATCH_PROVIDERS","RAW_WATCH_PROVIDERS","ResolverType","Source","buildArgsResolver","fieldName","callback","async","_obj","args","ctx","info","logger","setCacheMetadata","newCtx","data","fieldPath","resolverRequestId","crypto","randomUUID","resolverType","Args","childLogger","child","JSON","stringify","logEntryName","errors","headers","length","message","error","GraphQLError","nodes","originalError","resolveCertifications","screenType","ctxData","restClient","certifications","pathTemplateData","toLowerCase","Headers","cacheControl","buildObjArgsResolver","parentFieldName","obj","ObjAndArgs","id","undefined","enrichLogMessage","enrichedMessage","String","typedFieldName","loggingEnabled","isUndefined","resolveCollection","source","ParentNode","collection","buildObjResolver","_args","parentFieldId","Obj","resolveCollectionImages","resolveCollectionTranslations","translations","resolveCompany","company","resolveCompanyAlternativeNames","results","resolveCompanyLogos","logos","buildNoObjArgsResolver","OptsObjAndArgs","resolveConfiguration","configuration","resolveConfigurationCountries","resolveConfigurationJobs","resolveConfigurationLanguages","resolveConfigurationPrimaryTranslations","resolveConfigurationTimezones","resolveCredit","credit","removeNullValues","props","snakeCasePropNames","snakeCased","formatQueryParams","formatDirectionalSuffixes","removeConnectionInputOptions","accumulator","propertyName","replace","endsWith","resolveDiscoverMovies","makeConnectionResolver","createMakeCursors","groupCursor","makeGroupCursor","encode","makeIDCursor","createResourceResolver","page","discover","queryParams","Core","reaper","interval","store","map","totalPages","total_pages","totalResults","total_results","resultsPerPage","resolveDiscoverTv","encodeId","encodeURIComponent","getAppendToResponseKeys","parentFieldNode","appendToResponse","fragmentDefinitions","getChildFields","fieldNode","getName","includes","push","getTvIdSeasonAndEpisode","seasonNumber","episodeNumber","tv_show_id","season_number","episode_number","parsed","parse","decode","decodeURIComponent","decodeId","setAppendToResponseSearchParams","appendToResponseKeys","languageCode","append_to_response","join","include_image_language","cast","crew","guestStars","stills","resolveEpisode","episode","episodeData","Number","__headers","resolveEpisodeCredits","isEnrichedRawEpisodeWithCredits","credits","resolveEpisodeExternalIds","isEnrichedRawEpisodeWithExternalIds","movieId","rest","resolveEpisodeStills","isEnrichedRawEpisodeWithImages","images","resolveEpisodeTranslations","isEnrichedRawEpisodeWithTranslations","resolveEpisodeVideos","isEnrichedRawEpisodeWithVideos","videos","resolveFind","find","externalSource","episodes","tv_episode_results","movies","movie_results","people","person_results","seasons","tv_season_results","tv","tv_results","resolveGenres","genres","resolveKeyword","includeAdult","keyword","similarMovies","resolveMovie","movie","resolveMovieAlternativeTitles","country","isRawMovieWithAlternativeTitles","alternative_titles","titles","resolveMovieCredits","isRawMovieWithCredits","resolveMovieExternalIds","isRawMovieWithExternalIds","external_ids","resolveMovieImages","isRawMovieWithImages","resolveMovieKeywords","isRawMovieWithKeywords","keywords","resolveMovieRecommendations","isRawMovieWithRecommendations","recommendations","resolveMovieReleaseDates","isRawMovieWithReleaseDates","release_dates","resolveMovieReviews","isRawMovieWithReviews","reviews","resolveMovieSimilarMovies","isRawMovieWithSimilarMovies","similar","resolveMovieTranslations","isRawMovieWithTranslations","resolveMovieVideos","isRawMovieWithVideos","resolveMovieWatchProviders","isRawMovieWithWatchProviders","watchProviders","resolveNetwork","network","resolveNetworkAlternativeNames","resolveNetworkLogos","profiles","resolvePerson","person","resolvePersonCombinedCredits","isRawPersonWithCombinedCredits","combined_credits","personId","resolvePersonExternalIds","isRawPersonWithExternalIds","resolvePersonMovieCredits","isRawPersonWithMovieCredits","movie_credits","resolvePersonProfiles","isRawPersonWithProfiles","resolvePersonTranslations","isRawPersonWithTranslations","resolvePersonTvCredits","isRawPersonWithTvCredits","tv_credits","resolveRated","rated","tmdbGuestSessionId","entry","media_type","capitalize","resolveReview","review","resolveSearch","searchType","search","SearchType","Multi","mediaType","resolveSeason","season","number","seasonData","resolveSeasonCredits","isEnrichedRawSeasonWithCredits","resolveSeasonExternalIds","isEnrichedRawSeasonWithExternalIds","resolveSeasonPosters","isEnrichedRawSeasonWithPosters","posters","resolveSeasonTranslations","isEnrichedRawSeasonWithTranslations","resolveSeasonVideos","isEnrichedRawSeasonWithVideos","resolveTrending","timeWindow","trending","subType","TrendingMediaType","All","similarTvShows","resolveTv","tvData","resolveTvAlternativeTitles","isRawTvWithAlternativeTitles","resolveTvContentRatings","isRawTvWithContentRatings","content_ratings","resolveTvCredits","isRawTvWithCredits","resolveTvEpisodeGroups","isRawTvWithEpisodeGroups","episode_groups","resolveTvExternalIds","isRawTvWithExternalIds","tvId","resolveTvImages","isRawTvWithImages","resolveTvKeywords","isRawTvWithKeywords","resolveTvRecommendations","isRawTvWithRecommendations","resolveTvReviews","isRawTvWithReviews","resolveTvSimilarTvShows","isRawTvWithSimilarShows","cursorCache","getters","resolveTvTranslations","isRawTvWithTranslations","resolveTvVideos","isRawTvWithVideos","resolveTvWatchProviders","isRawTvWithWatchProviders","resolvers","Certifications","CA_QC","Collection","backdrops","Company","alternativeNames","Configuration","countries","jobs","languages","primaryTranslations","timezones","Episode","externalIds","Media","__resolveType","Movie","alternativeTitles","releaseDates","MovieReleaseType","DIGITAL","PHYSICAL","PREMIER","THEATRICAL","THEATRICAL_LIMITED","MovieStatus","CANCELED","IN_PRODUCTION","PLANNED","POST_PRODUCTION","RELEASED","RUMORED","Network","Person","combinedCredits","movieCredits","tvCredits","Query","discoverMovies","discoverTv","RatedScreen","Search","Season","episodeCount","Tv","contentRatings","episodeGroups","TvStatus","ENDED","PILOT","RETURNING_SERIES","TvType","DOCUMENTARY","MINISERIES","NEWS","REALITY","SCRIPTED","TALK_SHOW","VIDEO","Video","resolveVideoType","toUpperCase"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../resolvers/src//helpers/createDefaultFieldResolver.ts","../resolvers/src//helpers/typePropNames.ts","../resolvers/src//helpers/makeFallbackFieldResolvers.ts","../resolvers/src//constants.ts","../resolvers/src//helpers/buildArgsResolver.ts","../resolvers/src//queries/certifications.ts","../resolvers/src//helpers/buildObjArgsResolver.ts","../resolvers/src//queries/collection.ts","../resolvers/src//helpers/buildObjResolver.ts","../resolvers/src//queries/collectionImages.ts","../resolvers/src//queries/collectionTranslations.ts","../resolvers/src//queries/company.ts","../resolvers/src//queries/companyAlternativeNames.ts","../resolvers/src//queries/companyLogos.ts","../resolvers/src//helpers/buildNoObjArgsResolver.ts","../resolvers/src//queries/configuration.ts","../resolvers/src//queries/configurationCountries.ts","../resolvers/src//queries/configurationJobs.ts","../resolvers/src//queries/configurationLanguages.ts","../resolvers/src//queries/configurationPrimaryTranslations.ts","../resolvers/src//queries/configurationTimezones.ts","../resolvers/src//queries/credit.ts","../resolvers/src//helpers/removeNullValues.ts","../resolvers/src//helpers/snakeCasePropNames.ts","../resolvers/src//helpers/formatQueryParams.ts","../resolvers/src//helpers/formatDirectionalSuffixes.ts","../resolvers/src//queries/discoverMovies.ts","../resolvers/src//queries/discoverTv.ts","../resolvers/src//helpers/encodeId.ts","../resolvers/src//helpers/getAppendToResponseKeys.ts","../resolvers/src//helpers/getTvIdSeasonAndEpisode.ts","../resolvers/src//helpers/decodeId.ts","../resolvers/src//helpers/setAppendToResponseSearchParams.ts","../resolvers/src//queries/episode.ts","../resolvers/src//queries/episodeCredits.ts","../resolvers/src//queries/episodeExternalIds.ts","../resolvers/src//queries/episodeStills.ts","../resolvers/src//queries/episodeTranslations.ts","../resolvers/src//queries/episodeVideos.ts","../resolvers/src//queries/find.ts","../resolvers/src//queries/genres.ts","../resolvers/src//queries/keyword.ts","../resolvers/src//queries/movie.ts","../resolvers/src//queries/movieAlternativeTitles.ts","../resolvers/src//queries/movieCredits.ts","../resolvers/src//queries/movieExternalIds.ts","../resolvers/src//queries/movieImages.ts","../resolvers/src//queries/movieKeywords.ts","../resolvers/src//queries/movieRecommendations.ts","../resolvers/src//queries/movieReleaseDates.ts","../resolvers/src//queries/movieReviews.ts","../resolvers/src//queries/movieSimilarMovies.ts","../resolvers/src//queries/movieTranslations.ts","../resolvers/src//queries/movieVideos.ts","../resolvers/src//queries/movieWatchProviders.ts","../resolvers/src//queries/network.ts","../resolvers/src//queries/networkAlternativeNames.ts","../resolvers/src//queries/networkLogos.ts","../resolvers/src//queries/person.ts","../resolvers/src//queries/personCombinedCredits.ts","../resolvers/src//queries/personExternalIds.ts","../resolvers/src//queries/personMovieCredits.ts","../resolvers/src//queries/personProfiles.ts","../resolvers/src//queries/personTranslations.ts","../resolvers/src//queries/personTvCredits.ts","../resolvers/src//queries/rated.ts","../resolvers/src//queries/review.ts","../resolvers/src//queries/search.ts","../resolvers/src//queries/season.ts","../resolvers/src//queries/seasonCredits.ts","../resolvers/src//queries/seasonExternalIds.ts","../resolvers/src//queries/seasonPosters.ts","../resolvers/src//queries/seasonTranslations.ts","../resolvers/src//queries/seasonVideos.ts","../resolvers/src//queries/trending.ts","../resolvers/src//queries/tv.ts","../resolvers/src//queries/tvAlternativeTitles.ts","../resolvers/src//queries/tvContentRatings.ts","../resolvers/src//queries/tvCredits.ts","../resolvers/src//queries/tvEpisodeGroups.ts","../resolvers/src//queries/tvExternalIds.ts","../resolvers/src//queries/tvImages.ts","../resolvers/src//queries/tvKeywords.ts","../resolvers/src//queries/tvRecommendations.ts","../resolvers/src//queries/tvReviews.ts","../resolvers/src//queries/tvSimilarTvShows.ts","../resolvers/src//queries/tvTranslations.ts","../resolvers/src//queries/tvVideos.ts","../resolvers/src//queries/tvWatchProviders.ts","../resolvers/src//main.ts","../resolvers/src//queries/seasonEpisodeCount.ts","../resolvers/src//queries/videoType.ts"],"sourcesContent":["import { type PlainObject } from '@graphql-box/core';\nimport { type GraphQLFieldResolver } from 'graphql';\nimport { snakeCase } from 'lodash-es';\n\nexport const createDefaultFieldResolver =\n <\n Source extends PlainObject = PlainObject,\n Context extends PlainObject = PlainObject,\n Args extends PlainObject = PlainObject\n >(): GraphQLFieldResolver<Source, Context, Args> =>\n (object, _arguments, _context, { fieldNodes }) => {\n const currentField = fieldNodes[0]!;\n const { value: name } = currentField.name;\n\n if (Object.prototype.hasOwnProperty.call(object, name)) {\n return object[name];\n }\n\n return object[snakeCase(name)];\n };\n","import { schema } from '@tmdb-graphql-api/schema';\nimport { type GraphQLObjectType, Kind } from 'graphql';\n\nconst typeMap = schema.getTypeMap();\n\nexport const typePropNames = Object.keys(typeMap).reduce<Record<string, string[]>>((acc, key) => {\n const type = typeMap[key];\n\n if (type?.astNode?.kind === Kind.OBJECT_TYPE_DEFINITION) {\n acc[key] = Object.keys((type as GraphQLObjectType).getFields());\n }\n\n return acc;\n}, {});\n","import { type FieldResolver } from '../types.ts';\nimport { typePropNames } from './typePropNames.ts';\n\nexport const makeFallbackFieldResolvers = (typeName: string, resolver: FieldResolver) => {\n const propNames = typePropNames[typeName]!;\n\n return propNames.reduce<Record<string, FieldResolver>>((acc, propName) => {\n acc[propName] = resolver;\n return acc;\n }, {});\n};\n","export const ALTERNATIVE_NAMES = 'alternativeNames' as const;\nexport const ALTERNATIVE_TITLES = 'alternativeTitles' as const;\n\nexport const BACKDROPS = 'backdrops' as const;\n\nexport const CAST = 'cast' as const;\nexport const CERTIFICATIONS = 'certifications' as const;\nexport const COLLECTION = 'collection' as const;\nexport const COMBINED_CREDITS = 'combinedCredits' as const;\nexport const COMPANY = 'company' as const;\nexport const CONFIGURATION = 'configuration' as const;\nexport const CONTENT_RATINGS = 'contentRatings' as const;\nexport const COUNTRIES = 'countries' as const;\nexport const CREDIT = 'credit' as const;\nexport const CREDITS = 'credits' as const;\nexport const CREW = 'crew' as const;\n\nexport const DISCOVER_MOVIES = 'discoverMovies' as const;\nexport const DISCOVER_TV = 'discoverTv' as const;\n\nexport const EPISODE = 'episode' as const;\nexport const EPISODE_GROUPS = 'episodeGroups' as const;\nexport const EXTERNAL_IDS = 'externalIds' as const;\n\nexport const FIND = 'find' as const;\n\nexport const GENRES = 'genres' as const;\nexport const GUEST_STARS = 'guestStars' as const;\n\nexport const IMAGES = 'images' as const;\n\nexport const JOBS = 'jobs' as const;\n\nexport const KEYWORD = 'keyword' as const;\nexport const KEYWORDS = 'keywords' as const;\n\nexport const LANGUAGES = 'languages' as const;\nexport const LOGOS = 'logos' as const;\n\nexport const MOVIE = 'movie' as const;\nexport const MOVIES = 'movies' as const;\nexport const MOVIE_CREDITS = 'movieCredits' as const;\n\nexport const NETWORK = 'network' as const;\n\nexport const PERSON = 'person' as const;\nexport const POSTERS = 'posters' as const;\nexport const PRIMARY_TRANSLATIONS = 'primaryTranslations' as const;\nexport const PROFILES = 'profiles' as const;\n\nexport const RATED = 'rated' as const;\nexport const RECOMMENDATIONS = 'recommendations' as const;\nexport const RELEASE_DATES = 'releaseDates' as const;\nexport const RESULTS = 'results' as const;\nexport const REVIEW = 'review' as const;\nexport const REVIEWS = 'reviews' as const;\n\nexport const SEARCH = 'search' as const;\nexport const SEASON = 'season' as const;\nexport const SIMILAR = 'similar' as const;\nexport const SIMILAR_MOVIES = 'similarMovies' as const;\nexport const SIMILAR_TV_SHOWS = 'similarTvShows' as const;\nexport const STILLS = 'stills' as const;\n\nexport const TIMEZONES = 'timezones' as const;\nexport const TRANSLATIONS = 'translations' as const;\nexport const TRENDING = 'trending' as const;\nexport const TV = 'tv' as const;\nexport const TV_CREDITS = 'tvCredits' as const;\n\nexport const VIDEOS = 'videos' as const;\n\nexport const WATCH_PROVIDERS = 'watchProviders' as const;\nexport const RAW_WATCH_PROVIDERS = 'watch/providers' as const;\n\nexport enum ResolverType {\n Args = 'ARGS',\n Obj = 'OBJ',\n ObjAndArgs = 'OBJ_AND_ARGS',\n OptsObjAndArgs = 'OPTS_OBJ_AND_ARGS',\n}\n\nexport enum Source {\n Api = 'api',\n Cache = 'cache',\n ParentNode = 'parentNode',\n}\n","import { GraphQLError, type GraphQLResolveInfo } from 'graphql';\nimport crypto from 'node:crypto';\nimport { ResolverType, type Source } from '../constants.ts';\nimport { type Context } from '../types.ts';\n\nexport const buildArgsResolver =\n <Args extends object, Data>(\n fieldName: string,\n callback: (\n args: Args,\n ctx: Context,\n info: GraphQLResolveInfo\n ) => Promise<{ data?: Data; errors?: Error[]; headers: Headers; source?: Source }>\n ) =>\n async (_obj: undefined, args: Args, ctx: Context, info: GraphQLResolveInfo) => {\n const { logger, setCacheMetadata } = ctx;\n const { fieldNodes } = info;\n\n const newCtx = {\n ...ctx,\n data: {\n ...ctx.data,\n args,\n fieldPath: fieldName,\n resolverRequestId: crypto.randomUUID(),\n resolverType: ResolverType.Args,\n },\n };\n\n const childLogger = logger.child(newCtx.data);\n\n childLogger.info(`Resolving ${fieldName} ${JSON.stringify(args)}`, { logEntryName: 'RESOLVER_START' });\n const { data, errors, headers } = await callback(args, newCtx, info);\n\n if (errors?.length) {\n const message = `Failed to resolve ${fieldName}`;\n childLogger.error(message, { errors: JSON.stringify(errors), logEntryName: 'RESOLVER_FAILED' });\n throw new GraphQLError(message, { nodes: fieldNodes, originalError: errors[0] });\n }\n\n setCacheMetadata(fieldName, headers);\n return data;\n };\n","import { type QueryCertificationsArgs } from '@tmdb-graphql-api/schema/types';\nimport { CERTIFICATIONS } from '../constants.ts';\nimport { buildArgsResolver } from '../helpers/buildArgsResolver.ts';\nimport { type RawCertifications } from '../types.ts';\n\nexport const resolveCertifications = buildArgsResolver<QueryCertificationsArgs, RawCertifications['certifications']>(\n CERTIFICATIONS,\n async (args, ctx) => {\n const { screenType } = args;\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors } = await restClient.certifications<RawCertifications>(\n {\n pathTemplateData: { type: screenType.toLowerCase() },\n },\n ctxData\n );\n\n return {\n data: data?.certifications,\n errors,\n headers: new Headers({ cacheControl: 'public, max-age=28800' }),\n };\n }\n);\n","import { GraphQLError, type GraphQLResolveInfo } from 'graphql';\nimport { isUndefined, snakeCase } from 'lodash-es';\nimport crypto from 'node:crypto';\nimport { ResolverType, type Source } from '../constants.ts';\nimport { type Context } from '../types.ts';\n\nexport const buildObjArgsResolver =\n <Obj extends object, Args extends object, Data>(\n parentFieldName: string,\n callback: (\n obj: Obj | undefined,\n args: Args,\n ctx: Context,\n info: GraphQLResolveInfo\n ) => Promise<{ data?: Data; errors?: Error[]; headers?: Headers; source?: Source }>\n ) =>\n async (obj: Obj | undefined, args: Args, ctx: Context, info: GraphQLResolveInfo) => {\n const { logger, setCacheMetadata } = ctx;\n const { fieldName, fieldNodes } = info;\n const fieldPath = obj ? `${parentFieldName}.${fieldName}` : parentFieldName;\n const id = obj && 'id' in obj && obj.id ? obj.id : 'id' in args ? args.id : undefined;\n\n const newCtx = {\n ...ctx,\n data: {\n ...ctx.data,\n args: { ...args, id },\n fieldPath: parentFieldName,\n resolverRequestId: crypto.randomUUID(),\n resolverType: ResolverType.ObjAndArgs,\n },\n };\n\n const childLogger = logger.child(newCtx.data);\n\n const enrichLogMessage = (message: string) => {\n const enrichedMessage = `${message} ${parentFieldName}`;\n return id ? `${enrichedMessage} ${String(id)}` : enrichedMessage;\n };\n\n const typedFieldName = snakeCase(fieldName) as keyof Obj;\n const loggingEnabled = !(obj && !isUndefined(obj[typedFieldName]));\n\n if (loggingEnabled) {\n childLogger.info(enrichLogMessage('Resolving'), { logEntryName: 'RESOLVER_START' });\n }\n\n const { data, errors, headers } = await callback(obj, args, newCtx, info);\n\n if (errors?.length) {\n const message = enrichLogMessage('Failed to resolve');\n\n if (loggingEnabled) {\n childLogger.error(message, { errors: JSON.stringify(errors), logEntryName: 'RESOLVER_FAILED' });\n }\n\n throw new GraphQLError(message, { nodes: fieldNodes, originalError: errors[0] });\n }\n\n if (headers) {\n setCacheMetadata(fieldPath, headers);\n }\n\n return data;\n };\n","import { type QueryCollectionArgs } from '@tmdb-graphql-api/schema/types';\nimport { isUndefined, snakeCase } from 'lodash-es';\nimport { COLLECTION, Source } from '../constants.ts';\nimport { buildObjArgsResolver } from '../helpers/buildObjArgsResolver.ts';\nimport { type RawCollection } from '../types.ts';\n\nexport const resolveCollection = buildObjArgsResolver<\n RawCollection,\n QueryCollectionArgs,\n RawCollection | RawCollection[keyof RawCollection]\n>(COLLECTION, async (obj, args, ctx, info) => {\n const id = obj?.id ?? args.id;\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = snakeCase(fieldName) as keyof RawCollection;\n\n if (obj && !isUndefined(obj[typedFieldName])) {\n return {\n data: obj[typedFieldName],\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.collection<RawCollection>(\n {\n pathTemplateData: { id },\n },\n ctxData\n );\n\n return {\n data: obj ? data?.[typedFieldName] : data,\n errors,\n headers,\n };\n});\n","import { GraphQLError, type GraphQLResolveInfo } from 'graphql';\nimport crypto from 'node:crypto';\nimport { ResolverType, type Source } from '../constants.ts';\nimport { type Context } from '../types.ts';\n\nexport const buildObjResolver =\n <Obj extends { id: number | string }, Data>(\n parentFieldName: string,\n callback: (\n obj: Obj,\n ctx: Context,\n info: GraphQLResolveInfo\n ) => Promise<{ data?: Data; errors?: Error[]; headers?: Headers; source?: Source }>\n ) =>\n async (obj: Obj | undefined, _args: undefined, ctx: Context, info: GraphQLResolveInfo) => {\n const { logger, setCacheMetadata } = ctx;\n const { fieldName, fieldNodes } = info;\n const fieldPath = `${parentFieldName}.${fieldName}`;\n\n const newCtx = {\n ...ctx,\n data: {\n ...ctx.data,\n args: obj?.id ? { id: obj.id } : undefined,\n fieldPath,\n resolverRequestId: crypto.randomUUID(),\n resolverType: ResolverType.Obj,\n },\n };\n\n const childLogger = logger.child(newCtx.data);\n\n if (!obj) {\n const message = `Required ${parentFieldName} node missing`;\n childLogger.error(message);\n throw new GraphQLError(message, { nodes: fieldNodes });\n }\n\n childLogger.info(`Resolving ${fieldPath}`, { logEntryName: 'RESOLVER_START' });\n const { data, errors, headers } = await callback(obj, newCtx, info);\n\n if (errors?.length) {\n const message = `Failed to resolve ${fieldPath}`;\n childLogger.error(message, { errors: JSON.stringify(errors), logEntryName: 'RESOLVER_FAILED' });\n throw new GraphQLError(message, { nodes: fieldNodes, originalError: errors[0] });\n }\n\n if (headers) {\n setCacheMetadata(fieldPath, headers);\n }\n\n return data;\n };\n","import { COLLECTION, IMAGES } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawCollection, type RawCollectionImages } from '../types.ts';\n\nexport const resolveCollectionImages = buildObjResolver<\n RawCollection,\n RawCollectionImages['backdrops'] | RawCollectionImages['posters']\n>(COLLECTION, async (obj, ctx, info) => {\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n\n const { data, errors, headers } = await restClient.collection<RawCollectionImages>(\n {\n pathTemplateData: { id: obj.id, type: IMAGES },\n },\n ctxData\n );\n\n const typedFieldName = fieldName as 'backdrops' | 'posters';\n\n return {\n data: data?.[typedFieldName],\n errors,\n headers,\n };\n});\n","import { COLLECTION, TRANSLATIONS } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawCollection, type RawCollectionTranslations } from '../types.ts';\n\nexport const resolveCollectionTranslations = buildObjResolver<RawCollection, RawCollectionTranslations['translations']>(\n COLLECTION,\n async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.collection<RawCollectionTranslations>(\n {\n pathTemplateData: { id: obj.id, type: TRANSLATIONS },\n },\n ctxData\n );\n\n return {\n data: data?.translations,\n errors,\n headers,\n };\n }\n);\n","import { type QueryCompanyArgs } from '@tmdb-graphql-api/schema/types';\nimport { isUndefined, snakeCase } from 'lodash-es';\nimport { COMPANY, Source } from '../constants.ts';\nimport { buildObjArgsResolver } from '../helpers/buildObjArgsResolver.ts';\nimport { type RawCompany } from '../types.ts';\n\nexport const resolveCompany = buildObjArgsResolver<\n RawCompany,\n QueryCompanyArgs,\n RawCompany | RawCompany[keyof RawCompany]\n>(COMPANY, async (obj, args, ctx, info) => {\n const id = obj?.id ?? args.id;\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = snakeCase(fieldName) as keyof RawCompany;\n\n if (obj && !isUndefined(obj[typedFieldName])) {\n return {\n data: obj[typedFieldName],\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.company<RawCompany>(\n {\n pathTemplateData: { id },\n },\n ctxData\n );\n\n return {\n data: obj ? data?.[typedFieldName] : data,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport { ALTERNATIVE_NAMES, COMPANY } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawCollection, type RawCompanyAlternativeNames } from '../types.ts';\n\nexport const resolveCompanyAlternativeNames = buildObjResolver<RawCollection, RawCompanyAlternativeNames['results']>(\n COMPANY,\n async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.company<RawCompanyAlternativeNames>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(ALTERNATIVE_NAMES) },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n }\n);\n","import { COMPANY, IMAGES } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport type { RawCompany, RawCompanyLogos } from '../types.ts';\n\nexport const resolveCompanyLogos = buildObjResolver<RawCompany, RawCompanyLogos['logos']>(COMPANY, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.company<RawCompanyLogos>(\n {\n pathTemplateData: { id: obj.id, type: IMAGES },\n },\n ctxData\n );\n\n return {\n data: data?.logos,\n errors,\n headers,\n };\n});\n","import { GraphQLError, type GraphQLResolveInfo } from 'graphql';\nimport crypto from 'node:crypto';\nimport { ResolverType, type Source } from '../constants.ts';\nimport type { Context } from '../types.ts';\n\nexport const buildNoObjArgsResolver =\n <Obj, Data>(\n parentFieldName: string,\n callback: (\n ctx: Context,\n info: GraphQLResolveInfo\n ) => Promise<{ data?: Data; errors?: Error[]; headers: Headers; source?: Source }>\n ) =>\n async (obj: Obj | undefined, _args: undefined, ctx: Context, info: GraphQLResolveInfo) => {\n const { logger, setCacheMetadata } = ctx;\n const { fieldName, fieldNodes } = info;\n const fieldPath = obj ? `${parentFieldName}.${fieldName}` : parentFieldName;\n\n const newCtx = {\n ...ctx,\n data: {\n ...ctx.data,\n args: undefined,\n fieldPath,\n resolverRequestId: crypto.randomUUID(),\n resolverType: ResolverType.OptsObjAndArgs,\n },\n };\n\n const childLogger = logger.child(newCtx.data);\n childLogger.info(`Resolving ${fieldPath}`, { logEntryName: 'RESOLVER_START' });\n const { data, errors, headers } = await callback(newCtx, info);\n\n if (errors?.length) {\n const message = `Failed to resolve ${fieldPath}`;\n childLogger.error(message, { errors: JSON.stringify(errors), logEntryName: 'RESOLVER_FAILED' });\n throw new GraphQLError(message, { nodes: fieldNodes, originalError: errors[0] });\n }\n\n setCacheMetadata(fieldPath, headers);\n return data;\n };\n","import { CONFIGURATION } from '../constants.ts';\nimport { buildNoObjArgsResolver } from '../helpers/buildNoObjArgsResolver.ts';\nimport { type RawConfiguration } from '../types.ts';\n\nexport const resolveConfiguration = buildNoObjArgsResolver<undefined, RawConfiguration>(CONFIGURATION, async ctx => {\n const { data: ctxData, restClient } = ctx;\n const { data, errors, headers } = await restClient.configuration<RawConfiguration>(undefined, ctxData);\n\n return {\n data,\n errors,\n headers,\n };\n});\n","import { CONFIGURATION, COUNTRIES } from '../constants.ts';\nimport { buildNoObjArgsResolver } from '../helpers/buildNoObjArgsResolver.ts';\nimport { type RawConfiguration, type RawConfigurationCountries } from '../types.ts';\n\nexport const resolveConfigurationCountries = buildNoObjArgsResolver<RawConfiguration, RawConfigurationCountries>(\n CONFIGURATION,\n async ctx => {\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.configuration<RawConfigurationCountries>(\n {\n pathTemplateData: { type: COUNTRIES },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n }\n);\n","import { CONFIGURATION, JOBS } from '../constants.ts';\nimport { buildNoObjArgsResolver } from '../helpers/buildNoObjArgsResolver.ts';\nimport { type RawConfiguration, type RawConfigurationJobs } from '../types.ts';\n\nexport const resolveConfigurationJobs = buildNoObjArgsResolver<RawConfiguration, RawConfigurationJobs>(\n CONFIGURATION,\n async ctx => {\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.configuration<RawConfigurationJobs>(\n {\n pathTemplateData: { type: JOBS },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n }\n);\n","import { CONFIGURATION, LANGUAGES } from '../constants.ts';\nimport { buildNoObjArgsResolver } from '../helpers/buildNoObjArgsResolver.ts';\nimport { type RawConfiguration, type RawConfigurationLanguages } from '../types.ts';\n\nexport const resolveConfigurationLanguages = buildNoObjArgsResolver<RawConfiguration, RawConfigurationLanguages>(\n CONFIGURATION,\n async ctx => {\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.configuration<RawConfigurationLanguages>(\n {\n pathTemplateData: { type: LANGUAGES },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n }\n);\n","import { snakeCase } from 'lodash-es';\nimport { CONFIGURATION, PRIMARY_TRANSLATIONS } from '../constants.ts';\nimport { buildNoObjArgsResolver } from '../helpers/buildNoObjArgsResolver.ts';\nimport { type RawConfiguration, type RawConfigurationPrimaryTranslations } from '../types.ts';\n\nexport const resolveConfigurationPrimaryTranslations = buildNoObjArgsResolver<\n RawConfiguration,\n RawConfigurationPrimaryTranslations\n>(CONFIGURATION, async ctx => {\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.configuration<RawConfigurationPrimaryTranslations>(\n {\n pathTemplateData: { type: snakeCase(PRIMARY_TRANSLATIONS) },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n});\n","import { CONFIGURATION, TIMEZONES } from '../constants.ts';\nimport { buildNoObjArgsResolver } from '../helpers/buildNoObjArgsResolver.ts';\nimport { type RawConfiguration, type RawConfigurationTimezones } from '../types.ts';\n\nexport const resolveConfigurationTimezones = buildNoObjArgsResolver<RawConfiguration, RawConfigurationTimezones>(\n CONFIGURATION,\n async ctx => {\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.configuration<RawConfigurationTimezones>(\n {\n pathTemplateData: { type: TIMEZONES },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n }\n);\n","import { type QueryCreditArgs } from '@tmdb-graphql-api/schema/types';\nimport { CREDIT } from '../constants.ts';\nimport { buildArgsResolver } from '../helpers/buildArgsResolver.ts';\nimport { type RawCredit } from '../types.ts';\n\nexport const resolveCredit = buildArgsResolver<QueryCreditArgs, RawCredit>(CREDIT, async (args, ctx) => {\n const { id } = args;\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.credit<RawCredit>(\n {\n pathTemplateData: { id },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n});\n","import { type PlainObject } from '@graphql-box/core';\n\nexport const removeNullValues = <P extends PlainObject>(props: P) =>\n Object.keys(props).reduce<PlainObject>((acc, propName) => {\n if (props[propName] === null) {\n return acc;\n }\n\n acc[propName] = props[propName];\n return acc;\n }, {}) as P;\n","import { type PlainObject } from '@graphql-box/core';\nimport { snakeCase } from 'lodash-es';\nimport { type SnakeCasedPropertiesDeep } from 'type-fest';\n\nexport const snakeCasePropNames = <P extends PlainObject>(props: P) =>\n Object.keys(props).reduce<PlainObject>((snakeCased, propName) => {\n snakeCased[snakeCase(propName)] = props[propName];\n return snakeCased;\n }, {}) as SnakeCasedPropertiesDeep<P>;\n","import { removeConnectionInputOptions } from '@graphql-box/connection-resolver';\nimport { type PlainObject } from '@graphql-box/core';\nimport { formatDirectionalSuffixes } from './formatDirectionalSuffixes.ts';\nimport { removeNullValues } from './removeNullValues.ts';\nimport { snakeCasePropNames } from './snakeCasePropNames.ts';\n\nexport const formatQueryParams = (args: PlainObject) =>\n formatDirectionalSuffixes(snakeCasePropNames(removeNullValues(removeConnectionInputOptions(args))));\n","import { type PlainObject } from '@graphql-box/core';\nimport { type ValueOf } from 'type-fest';\n\nexport const formatDirectionalSuffixes = <P extends PlainObject>(props: P) =>\n Object.keys(props).reduce<PlainObject>((accumulator, propertyName) => {\n if (propertyName === 'sort_by') {\n accumulator[propertyName] = (props[propertyName] as string).toLowerCase().replace(/_([a-z]+)$/, '.$1');\n } else if (propertyName.endsWith('_gte') || propertyName.endsWith('_lte')) {\n accumulator[propertyName.replace(/_([a-z]+)$/, '.$1')] = props[propertyName] as ValueOf<P>;\n } else {\n accumulator[propertyName] = props[propertyName] as ValueOf<P>;\n }\n\n return accumulator;\n }, {}) as P;\n","import { Core } from '@cachemap/core';\nimport { init as map } from '@cachemap/map';\nimport { init as reaper } from '@cachemap/reaper';\nimport {\n type CreateResourceResolver,\n type Getters,\n makeConnectionResolver,\n removeConnectionInputOptions,\n} from '@graphql-box/connection-resolver';\nimport { type QueryDiscoverMoviesArgs } from '@tmdb-graphql-api/schema/types';\nimport { encode } from 'js-base64';\nimport { DISCOVER_MOVIES, MOVIE } from '../constants.ts';\nimport { formatQueryParams } from '../helpers/formatQueryParams.ts';\nimport { removeNullValues } from '../helpers/removeNullValues.ts';\nimport { type Context, type RawDiscoverMovies, type RawMovie } from '../types.ts';\n\n/* eslint-disable camelcase */\n\nexport const createMakeCursors = (_obj: undefined, args: QueryDiscoverMoviesArgs) => {\n const groupCursor = `${JSON.stringify(removeNullValues(removeConnectionInputOptions(args)))}::${DISCOVER_MOVIES}`;\n\n return {\n makeGroupCursor: () => encode(groupCursor),\n makeIDCursor: (id: string | number) => encode(`${id}::${groupCursor}`),\n };\n};\n\nexport const createResourceResolver: CreateResourceResolver<\n undefined,\n QueryDiscoverMoviesArgs,\n Context,\n RawDiscoverMovies\n> =\n (_obj, args, { data: ctxData, restClient }) =>\n async ({ page }) =>\n restClient.discover<RawDiscoverMovies>(\n {\n pathTemplateData: { type: MOVIE },\n queryParams: { ...formatQueryParams(args), page },\n },\n ctxData\n );\n\nexport const cursorCache = new Core({\n name: 'DISCOVER_MOVIES_CONNECTION_RESOLVER',\n reaper: reaper({ interval: 300_000 }),\n store: map(),\n type: 'GRAPHQL',\n});\n\nexport const getters: Getters<RawDiscoverMovies, RawMovie> = {\n // @ts-expect-error nested identifier is optional when\n // it shouldn't be\n nodes: ({ results = [] }) => results,\n page: ({ page = 0 }) => page,\n totalPages: ({ total_pages = 0 }) => total_pages,\n totalResults: ({ total_results = 0 }) => total_results,\n};\n\nexport const resolveDiscoverMovies = makeConnectionResolver({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resultsPerPage: 20,\n});\n","import { Core } from '@cachemap/core';\nimport { init as map } from '@cachemap/map';\nimport { init as reaper } from '@cachemap/reaper';\nimport {\n type CreateResourceResolver,\n type Getters,\n makeConnectionResolver,\n removeConnectionInputOptions,\n} from '@graphql-box/connection-resolver';\nimport { type QueryDiscoverTvArgs } from '@tmdb-graphql-api/schema/types';\nimport { encode } from 'js-base64';\nimport { DISCOVER_TV, TV } from '../constants.ts';\nimport { formatQueryParams } from '../helpers/formatQueryParams.ts';\nimport { removeNullValues } from '../helpers/removeNullValues.ts';\nimport { type Context, type RawDiscoverTv, type RawTv } from '../types.ts';\n\n/* eslint-disable camelcase */\n\nexport const createMakeCursors = (_obj: undefined, args: QueryDiscoverTvArgs) => {\n const groupCursor = `${JSON.stringify(removeNullValues(removeConnectionInputOptions(args)))}::${DISCOVER_TV}`;\n\n return {\n makeGroupCursor: () => encode(groupCursor),\n makeIDCursor: (id: string | number) => encode(`${id}::${groupCursor}`),\n };\n};\n\nexport const createResourceResolver: CreateResourceResolver<undefined, QueryDiscoverTvArgs, Context, RawDiscoverTv> =\n (_obj, args, { data: ctxData, restClient }) =>\n async ({ page }) =>\n restClient.discover<RawDiscoverTv>(\n {\n pathTemplateData: { type: TV },\n queryParams: { ...formatQueryParams(args), page },\n },\n ctxData\n );\n\nexport const cursorCache = new Core({\n name: 'DISCOVER_TV_CONNECTION_RESOLVER',\n reaper: reaper({ interval: 300_000 }),\n store: map(),\n type: 'GRAPHQL',\n});\n\nexport const getters: Getters<RawDiscoverTv, RawTv> = {\n // @ts-expect-error nested identifier is optional when\n // it shouldn't be\n nodes: ({ results = [] }) => results,\n page: ({ page = 0 }) => page,\n totalPages: ({ total_pages = 0 }) => total_pages,\n totalResults: ({ total_results = 0 }) => total_results,\n};\n\nexport const resolveDiscoverTv = makeConnectionResolver({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resultsPerPage: 20,\n});\n","import { encode } from 'js-base64';\nimport { type JsonObject } from 'type-fest';\n\nexport const encodeId = <T extends JsonObject>(obj: T) => encodeURIComponent(encode(JSON.stringify(obj)));\n","import { type FragmentDefinitionNodeMap } from '@graphql-box/core';\nimport { getChildFields, getName } from '@graphql-box/helpers';\nimport { type FieldNode } from 'graphql';\n\nexport const getAppendToResponseKeys = (\n parentFieldNode: FieldNode,\n appendToResponse: Record<string, string>,\n fragmentDefinitions?: FragmentDefinitionNodeMap\n) =>\n (getChildFields(parentFieldNode, { fragmentDefinitions }) ?? []).reduce((acc: string[], { fieldNode }) => {\n const name = getName(fieldNode);\n\n if (!name) {\n return acc;\n }\n\n const key = appendToResponse[name];\n\n if (!key) {\n return acc;\n }\n\n if (!acc.includes(key)) {\n acc.push(key);\n }\n\n return acc;\n }, []);\n","import { type QueryEpisodeArgs, type QuerySeasonArgs } from '@tmdb-graphql-api/schema/types';\nimport { type EnrichedRawEpisode, type EnrichedRawSeason } from '../types.ts';\nimport { decodeId } from './decodeId.ts';\n\nexport const getTvIdSeasonAndEpisode = (\n obj: EnrichedRawEpisode | EnrichedRawSeason | undefined,\n args: QuerySeasonArgs | QueryEpisodeArgs\n) => {\n let id: string | number;\n let seasonNumber: number;\n let episodeNumber: number | undefined;\n\n if (obj) {\n id = obj.tv_show_id;\n seasonNumber = obj.season_number ?? 0;\n episodeNumber = 'episode_number' in obj ? obj.episode_number : undefined;\n } else {\n const parsed = decodeId<{ episodeNumber?: number; id: string; seasonNumber: number }>(args.id);\n id = parsed.id;\n seasonNumber = parsed.seasonNumber;\n episodeNumber = parsed.episodeNumber;\n }\n\n return { episodeNumber, id, seasonNumber };\n};\n","import { decode } from 'js-base64';\nimport { type JsonObject } from 'type-fest';\n\nexport const decodeId = <T extends JsonObject>(id: string) => JSON.parse(decode(decodeURIComponent(id))) as T;\n","import { IMAGES } from '../constants.ts';\n\nexport const setAppendToResponseSearchParams = (\n appendToResponseKeys: string[],\n languageCode?: string\n): Record<string, string> => {\n return {\n append_to_response: appendToResponseKeys.join(','),\n ...(languageCode && appendToResponseKeys.includes(IMAGES)\n ? { include_image_language: `${languageCode},null` }\n : {}),\n };\n};\n","import { type QueryEpisodeArgs } from '@tmdb-graphql-api/schema/types';\nimport { isUndefined, snakeCase } from 'lodash-es';\nimport { CREDITS, EPISODE, EXTERNAL_IDS, IMAGES, Source, TRANSLATIONS, VIDEOS } from '../constants.ts';\nimport { buildObjArgsResolver } from '../helpers/buildObjArgsResolver.ts';\nimport { encodeId } from '../helpers/encodeId.ts';\nimport { getAppendToResponseKeys } from '../helpers/getAppendToResponseKeys.ts';\nimport { getTvIdSeasonAndEpisode } from '../helpers/getTvIdSeasonAndEpisode.ts';\nimport { setAppendToResponseSearchParams } from '../helpers/setAppendToResponseSearchParams.ts';\nimport { type EnrichedRawEpisode, type EnrichedRawEpisodeWithAppendToResponse, type RawEpisode } from '../types.ts';\n\nconst appendToResponse = {\n [EXTERNAL_IDS]: snakeCase(EXTERNAL_IDS),\n [TRANSLATIONS]: TRANSLATIONS,\n [VIDEOS]: VIDEOS,\n cast: CREDITS,\n crew: CREDITS,\n guestStars: CREDITS,\n stills: IMAGES,\n};\n\nexport const resolveEpisode = buildObjArgsResolver<\n EnrichedRawEpisode,\n QueryEpisodeArgs,\n | (EnrichedRawEpisodeWithAppendToResponse & { __headers?: Headers })\n | EnrichedRawEpisodeWithAppendToResponse[keyof EnrichedRawEpisodeWithAppendToResponse]\n>(EPISODE, async (obj, args, ctx, info) => {\n const { data: ctxData, fragmentDefinitions, languageCode, restClient } = ctx;\n const { fieldName, fieldNodes } = info;\n const typedFieldName = snakeCase(fieldName) as keyof RawEpisode;\n const { episodeNumber, id, seasonNumber } = getTvIdSeasonAndEpisode(obj, args);\n\n if (obj && !isUndefined(obj[typedFieldName])) {\n return {\n data:\n typedFieldName === 'id'\n ? encodeId({ id, seasonNumber, ...(episodeNumber ? { episodeNumber } : {}) })\n : obj[typedFieldName],\n source: Source.ParentNode,\n };\n }\n\n const appendToResponseKeys = getAppendToResponseKeys(fieldNodes[0]!, appendToResponse, fragmentDefinitions);\n\n const { data, errors, headers } = await restClient.episode<EnrichedRawEpisodeWithAppendToResponse>(\n {\n pathTemplateData: { episodeNumber, id, seasonNumber },\n ...(appendToResponseKeys.length > 0\n ? {\n queryParams: {\n ...setAppendToResponseSearchParams(appendToResponseKeys, languageCode),\n },\n }\n : {}),\n },\n ctxData\n );\n\n const episodeData = {\n ...data,\n id: encodeId({ id, seasonNumber, ...(episodeNumber ? { episodeNumber } : {}) }),\n tv_show_id: Number(id),\n };\n\n return {\n data: obj\n ? episodeData[typedFieldName]\n : appendToResponseKeys.length > 0\n ? { ...episodeData, __headers: headers }\n : episodeData,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport { CREDITS, EPISODE, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport {\n type EnrichedRawEpisode,\n type EnrichedRawEpisodeWithAppendToResponse,\n type RawEpisodeCredits,\n} from '../types.ts';\n\nconst isEnrichedRawEpisodeWithCredits = (\n obj: EnrichedRawEpisode | (EnrichedRawEpisodeWithAppendToResponse & { __headers?: Headers })\n): obj is EnrichedRawEpisodeWithAppendToResponse & { __headers: Headers } => CREDITS in obj && '__headers' in obj;\n\nexport const resolveEpisodeCredits = buildObjResolver<\n EnrichedRawEpisode | (EnrichedRawEpisodeWithAppendToResponse & { __headers?: Headers }),\n RawEpisodeCredits['cast'] | RawEpisodeCredits['crew'] | RawEpisodeCredits['guest_stars']\n>(EPISODE, async (obj, ctx, info) => {\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = snakeCase(fieldName) as 'cast' | 'crew' | 'guest_stars';\n\n if (isEnrichedRawEpisodeWithCredits(obj)) {\n return {\n data: obj.credits?.[typedFieldName],\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.episode<RawEpisodeCredits>(\n {\n pathTemplateData: {\n episodeNumber: obj.episode_number,\n id: obj.tv_show_id,\n seasonNumber: obj.season_number,\n type: CREDITS,\n },\n },\n ctxData\n );\n\n return {\n data: data?.[typedFieldName],\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport type { Except } from 'type-fest';\nimport { EPISODE, EXTERNAL_IDS, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport {\n type EnrichedRawEpisode,\n type EnrichedRawEpisodeWithAppendToResponse,\n type RawEpisodeExternalIds,\n} from '../types.ts';\n\nconst isEnrichedRawEpisodeWithExternalIds = (\n obj: EnrichedRawEpisode | (EnrichedRawEpisodeWithAppendToResponse & { __headers?: Headers })\n): obj is EnrichedRawEpisodeWithAppendToResponse & { __headers: Headers } =>\n snakeCase(EXTERNAL_IDS) in obj && '__headers' in obj;\n\nexport const resolveEpisodeExternalIds = buildObjResolver<\n EnrichedRawEpisode | (EnrichedRawEpisodeWithAppendToResponse & { __headers?: Headers }),\n Except<RawEpisodeExternalIds, 'id'>\n>(EPISODE, async (obj, ctx, info) => {\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = snakeCase(fieldName) as 'external_ids';\n\n if (isEnrichedRawEpisodeWithExternalIds(obj)) {\n return {\n data: obj[typedFieldName],\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.episode<RawEpisodeExternalIds>(\n {\n pathTemplateData: {\n episodeNumber: obj.episode_number,\n id: obj.tv_show_id,\n seasonNumber: obj.season_number,\n type: typedFieldName,\n },\n },\n ctxData\n );\n\n const { id: movieId, ...rest } = data ?? {};\n\n return {\n data: rest,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport { EPISODE, IMAGES, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport {\n type EnrichedRawEpisode,\n type EnrichedRawEpisodeWithAppendToResponse,\n type RawEpisodeImages,\n} from '../types.ts';\n\nconst isEnrichedRawEpisodeWithImages = (\n obj: EnrichedRawEpisode | (EnrichedRawEpisodeWithAppendToResponse & { __headers?: Headers })\n): obj is EnrichedRawEpisodeWithAppendToResponse & { __headers: Headers } => IMAGES in obj && '__headers' in obj;\n\nexport const resolveEpisodeStills = buildObjResolver<\n EnrichedRawEpisode | (EnrichedRawEpisodeWithAppendToResponse & { __headers?: Headers }),\n RawEpisodeImages['stills']\n>(EPISODE, async (obj, ctx, info) => {\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = snakeCase(fieldName) as 'stills';\n\n if (isEnrichedRawEpisodeWithImages(obj)) {\n return {\n data: obj.images?.[typedFieldName],\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.episode<RawEpisodeImages>(\n {\n pathTemplateData: {\n episodeNumber: obj.episode_number,\n id: obj.tv_show_id,\n seasonNumber: obj.season_number,\n type: IMAGES,\n },\n },\n ctxData\n );\n\n return {\n data: data?.[typedFieldName],\n errors,\n headers,\n };\n});\n","import { EPISODE, Source, TRANSLATIONS } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport {\n type EnrichedRawEpisode,\n type EnrichedRawEpisodeWithAppendToResponse,\n type RawEpisodeTranslations,\n} from '../types.ts';\n\nconst isEnrichedRawEpisodeWithTranslations = (\n obj: EnrichedRawEpisode | (EnrichedRawEpisodeWithAppendToResponse & { __headers?: Headers })\n): obj is EnrichedRawEpisodeWithAppendToResponse & { __headers: Headers } => TRANSLATIONS in obj && '__headers' in obj;\n\nexport const resolveEpisodeTranslations = buildObjResolver<\n EnrichedRawEpisode | (EnrichedRawEpisodeWithAppendToResponse & { __headers?: Headers }),\n RawEpisodeTranslations['translations']\n>(EPISODE, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isEnrichedRawEpisodeWithTranslations(obj)) {\n return {\n data: obj.translations?.translations,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.episode<RawEpisodeTranslations>(\n {\n pathTemplateData: {\n episodeNumber: obj.episode_number,\n id: obj.tv_show_id,\n seasonNumber: obj.season_number,\n type: TRANSLATIONS,\n },\n },\n ctxData\n );\n\n return {\n data: data?.translations,\n errors,\n headers,\n };\n});\n","import { EPISODE, Source, VIDEOS } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport {\n type EnrichedRawEpisode,\n type EnrichedRawEpisodeWithAppendToResponse,\n type RawEpisodeVideos,\n} from '../types.ts';\n\nconst isEnrichedRawEpisodeWithVideos = (\n obj: EnrichedRawEpisode | (EnrichedRawEpisodeWithAppendToResponse & { __headers?: Headers })\n): obj is EnrichedRawEpisodeWithAppendToResponse & { __headers: Headers } => VIDEOS in obj && '__headers' in obj;\n\nexport const resolveEpisodeVideos = buildObjResolver<\n EnrichedRawEpisode | (EnrichedRawEpisodeWithAppendToResponse & { __headers?: Headers }),\n RawEpisodeVideos['results']\n>(EPISODE, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isEnrichedRawEpisodeWithVideos(obj)) {\n return {\n data: obj.videos?.results,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.episode<RawEpisodeVideos>(\n {\n pathTemplateData: {\n episodeNumber: obj.episode_number,\n id: obj.tv_show_id,\n seasonNumber: obj.season_number,\n type: VIDEOS,\n },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n});\n","import { type QueryFindArgs } from '@tmdb-graphql-api/schema/types';\nimport { FIND } from '../constants.ts';\nimport { buildArgsResolver } from '../helpers/buildArgsResolver.ts';\nimport { snakeCasePropNames } from '../helpers/snakeCasePropNames.ts';\nimport { type RawEpisode, type RawFind, type RawMovie, type RawPerson, type RawSeason, type RawTv } from '../types.ts';\n\ntype Data = {\n episodes?: RawEpisode[];\n movies?: RawMovie[];\n people?: RawPerson[];\n seasons?: RawSeason[];\n tv?: RawTv[];\n};\n\nexport const resolveFind = buildArgsResolver<QueryFindArgs, Data>(FIND, async (args, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.find<RawFind>(\n {\n pathTemplateData: { id: args.id },\n queryParams: { ...snakeCasePropNames({ externalSource: args.source }) },\n },\n ctxData\n );\n\n return {\n data: {\n episodes: data?.tv_episode_results,\n movies: data?.movie_results,\n people: data?.person_results,\n seasons: data?.tv_season_results,\n tv: data?.tv_results,\n },\n errors,\n headers,\n };\n});\n","import { type QueryGenresArgs } from '@tmdb-graphql-api/schema/types';\nimport { GENRES } from '../constants.ts';\nimport { buildArgsResolver } from '../helpers/buildArgsResolver.ts';\nimport { type RawGenres } from '../types.ts';\n\nexport const resolveGenres = buildArgsResolver<QueryGenresArgs, RawGenres['genres']>(GENRES, async (args, ctx) => {\n const { screenType } = args;\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.genres<RawGenres>(\n {\n pathTemplateData: { type: screenType.toLowerCase() },\n },\n ctxData\n );\n\n return {\n data: data?.genres,\n errors,\n headers,\n };\n});\n","import { type QueryKeywordArgs } from '@tmdb-graphql-api/schema/types';\nimport { KEYWORD } from '../constants.ts';\nimport { buildArgsResolver } from '../helpers/buildArgsResolver.ts';\nimport { snakeCasePropNames } from '../helpers/snakeCasePropNames.ts';\nimport { type RawKeyword } from '../types.ts';\n\nexport const resolveKeyword = buildArgsResolver<QueryKeywordArgs, RawKeyword>(KEYWORD, async (args, ctx) => {\n const { id, includeAdult } = args;\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.keyword<RawKeyword>(\n {\n pathTemplateData: { id },\n queryParams: { ...snakeCasePropNames({ includeAdult }) },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n});\n","import { type QueryMovieArgs } from '@tmdb-graphql-api/schema/types';\nimport { isUndefined, snakeCase } from 'lodash-es';\nimport {\n ALTERNATIVE_TITLES,\n BACKDROPS,\n CAST,\n CREDITS,\n CREW,\n EXTERNAL_IDS,\n IMAGES,\n KEYWORDS,\n LOGOS,\n MOVIE,\n POSTERS,\n RECOMMENDATIONS,\n RELEASE_DATES,\n REVIEWS,\n SIMILAR,\n SIMILAR_MOVIES,\n Source,\n TRANSLATIONS,\n VIDEOS,\n WATCH_PROVIDERS,\n} from '../constants.ts';\nimport { buildObjArgsResolver } from '../helpers/buildObjArgsResolver.ts';\nimport { getAppendToResponseKeys } from '../helpers/getAppendToResponseKeys.ts';\nimport { setAppendToResponseSearchParams } from '../helpers/setAppendToResponseSearchParams.ts';\nimport { type RawMovie, type RawMovieWithAppendToResponse } from '../types.ts';\n\nconst appendToResponse = {\n [ALTERNATIVE_TITLES]: snakeCase(ALTERNATIVE_TITLES),\n [BACKDROPS]: IMAGES,\n [CAST]: CREDITS,\n [CREW]: CREDITS,\n [EXTERNAL_IDS]: snakeCase(EXTERNAL_IDS),\n [KEYWORDS]: KEYWORDS,\n [LOGOS]: IMAGES,\n [POSTERS]: IMAGES,\n [RECOMMENDATIONS]: RECOMMENDATIONS,\n [RELEASE_DATES]: snakeCase(RELEASE_DATES),\n [REVIEWS]: REVIEWS,\n [SIMILAR_MOVIES]: SIMILAR,\n [TRANSLATIONS]: TRANSLATIONS,\n [VIDEOS]: VIDEOS,\n [WATCH_PROVIDERS]: 'watch/providers',\n};\n\nexport const resolveMovie = buildObjArgsResolver<\n RawMovie,\n QueryMovieArgs,\n | (RawMovieWithAppendToResponse & { __headers?: Headers })\n | RawMovieWithAppendToResponse[keyof RawMovieWithAppendToResponse]\n>(MOVIE, async (obj, args, ctx, info) => {\n const { data: ctxData, fragmentDefinitions, languageCode, restClient } = ctx;\n const { fieldName, fieldNodes } = info;\n const typedFieldName = snakeCase(fieldName) as keyof RawMovie;\n\n if (obj && !isUndefined(obj[typedFieldName])) {\n return {\n data: obj[typedFieldName],\n source: Source.ParentNode,\n };\n }\n\n const id = obj ? obj.id : args.id;\n const appendToResponseKeys = getAppendToResponseKeys(fieldNodes[0]!, appendToResponse, fragmentDefinitions);\n\n const { data, errors, headers } = await restClient.movie<RawMovieWithAppendToResponse>(\n {\n pathTemplateData: { id },\n ...(appendToResponseKeys.length > 0\n ? {\n queryParams: {\n ...setAppendToResponseSearchParams(appendToResponseKeys, languageCode),\n },\n }\n : {}),\n },\n ctxData\n );\n\n return {\n data: obj ? data?.[typedFieldName] : appendToResponseKeys.length > 0 ? { ...data, __headers: headers } : data,\n errors,\n headers,\n };\n});\n","import { type MovieAlternativeTitlesArgs } from '@tmdb-graphql-api/schema/types';\nimport { GraphQLError } from 'graphql';\nimport { snakeCase } from 'lodash-es';\nimport { ALTERNATIVE_TITLES, MOVIE, Source } from '../constants.ts';\nimport { buildObjArgsResolver } from '../helpers/buildObjArgsResolver.ts';\nimport { type RawMovie, type RawMovieAlternativeTitles, type RawMovieWithAppendToResponse } from '../types.ts';\n\nconst isRawMovieWithAlternativeTitles = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers })\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } =>\n snakeCase(ALTERNATIVE_TITLES) in obj && '__headers' in obj;\n\nexport const resolveMovieAlternativeTitles = buildObjArgsResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n MovieAlternativeTitlesArgs,\n RawMovieAlternativeTitles['titles']\n>(MOVIE, async (obj, args, ctx, info) => {\n const { country } = args;\n const { data: ctxData, logger, restClient } = ctx;\n const { fieldNodes } = info;\n\n if (!obj) {\n const message = `Required ${ALTERNATIVE_TITLES} node missing`;\n logger.error(message);\n throw new GraphQLError(message, { nodes: fieldNodes });\n }\n\n if (isRawMovieWithAlternativeTitles(obj)) {\n return {\n data: obj.alternative_titles?.titles,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.movie<RawMovieAlternativeTitles>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(ALTERNATIVE_TITLES) },\n queryParams: { country },\n },\n ctxData\n );\n\n return {\n data: data?.titles,\n errors,\n headers,\n };\n});\n","import { CREDITS, MOVIE, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawMovie, type RawMovieCredits, type RawMovieWithAppendToResponse } from '../types.ts';\n\nconst isRawMovieWithCredits = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers })\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } => CREDITS in obj && '__headers' in obj;\n\nexport const resolveMovieCredits = buildObjResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n RawMovieCredits['cast'] | RawMovieCredits['crew']\n>(MOVIE, async (obj, ctx, info) => {\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = fieldName as 'cast' | 'crew';\n\n if (isRawMovieWithCredits(obj)) {\n return {\n data: obj.credits?.[typedFieldName],\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.movie<RawMovieCredits>(\n {\n pathTemplateData: { id: obj.id, type: CREDITS },\n },\n ctxData\n );\n\n return {\n data: data?.[typedFieldName],\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport type { Except } from 'type-fest';\nimport { EXTERNAL_IDS, MOVIE, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawMovie, type RawMovieExternalIds, type RawMovieWithAppendToResponse } from '../types.ts';\n\nconst isRawMovieWithExternalIds = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers })\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } => snakeCase(EXTERNAL_IDS) in obj && '__headers' in obj;\n\nexport const resolveMovieExternalIds = buildObjResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n Except<RawMovieExternalIds, 'id'>\n>(MOVIE, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawMovieWithExternalIds(obj)) {\n return {\n data: obj.external_ids,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.movie<RawMovieExternalIds>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(EXTERNAL_IDS) },\n },\n ctxData\n );\n\n const { id: movieId, ...rest } = data!;\n\n return {\n data: rest,\n errors,\n headers,\n };\n});\n","import { IMAGES, MOVIE, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawMovie, type RawMovieImages, type RawMovieWithAppendToResponse } from '../types.ts';\n\nconst isRawMovieWithImages = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers })\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } => IMAGES in obj && '__headers' in obj;\n\nexport const resolveMovieImages = buildObjResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n RawMovieImages['backdrops'] | RawMovieImages['logos'] | RawMovieImages['posters']\n>(MOVIE, async (obj, ctx, info) => {\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = fieldName as 'backdrops' | 'logos' | 'posters';\n\n if (isRawMovieWithImages(obj)) {\n return {\n data: obj.images?.[typedFieldName],\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.movie<RawMovieImages>(\n {\n pathTemplateData: { id: obj.id, type: IMAGES },\n },\n ctxData\n );\n\n return {\n data: data?.[typedFieldName],\n errors,\n headers,\n };\n});\n","import { KEYWORDS, MOVIE, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawMovie, type RawMovieKeywords, type RawMovieWithAppendToResponse } from '../types.ts';\n\nconst isRawMovieWithKeywords = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers })\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } => KEYWORDS in obj && '__headers' in obj;\n\nexport const resolveMovieKeywords = buildObjResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n RawMovieKeywords['keywords']\n>(MOVIE, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawMovieWithKeywords(obj)) {\n return {\n data: obj.keywords?.keywords,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.movie<RawMovieKeywords>(\n {\n pathTemplateData: { id: obj.id, type: KEYWORDS },\n },\n ctxData\n );\n\n return {\n data: data?.keywords,\n errors,\n headers,\n };\n});\n","import { Core } from '@cachemap/core';\nimport { init as map } from '@cachemap/map';\nimport { init as reaper } from '@cachemap/reaper';\nimport { type CreateResourceResolver, type Getters, makeConnectionResolver } from '@graphql-box/connection-resolver';\nimport { type MovieRecommendationsArgs } from '@tmdb-graphql-api/schema/types';\nimport { encode } from 'js-base64';\nimport { MOVIE, RECOMMENDATIONS } from '../constants.ts';\nimport {\n type Context,\n type RawMovie,\n type RawMovieRecommendations,\n type RawMovieWithAppendToResponse,\n} from '../types.ts';\n\n/* eslint-disable camelcase */\n\nexport const createMakeCursors = (obj: RawMovie) => {\n const groupCursor = `${obj.id}::${MOVIE}::${RECOMMENDATIONS}`;\n\n return {\n makeGroupCursor: () => encode(groupCursor),\n makeIDCursor: (id: string | number) => encode(`${id}::${groupCursor}`),\n };\n};\n\nconst isRawMovieWithRecommendations = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n page: number\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } =>\n RECOMMENDATIONS in obj && obj.recommendations?.page === page && '__headers' in obj;\n\nexport const createResourceResolver: CreateResourceResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n MovieRecommendationsArgs,\n Context,\n RawMovieRecommendations\n> =\n (obj, _args, { data: ctxData, restClient }) =>\n async ({ page }) => {\n if (isRawMovieWithRecommendations(obj, page)) {\n return {\n data: obj.recommendations,\n headers: obj.__headers,\n };\n }\n\n const { data, errors, headers } = await restClient.movie<RawMovieRecommendations>(\n {\n pathTemplateData: { id: obj.id, type: RECOMMENDATIONS },\n queryParams: { page },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n };\n\nexport const cursorCache = new Core({\n name: 'MOVIE_RECOMMENDATIONS_CONNECTION_RESOLVER',\n reaper: reaper({ interval: 300_000 }),\n store: map(),\n type: 'GRAPHQL',\n});\n\nexport const getters: Getters<RawMovieRecommendations, RawMovie> = {\n // @ts-expect-error minor type mismatch\n nodes: ({ results = [] }) => results,\n page: ({ page = 0 }) => page,\n totalPages: ({ total_pages = 0 }) => total_pages,\n totalResults: ({ total_results = 0 }) => total_results,\n};\n\nexport const resolveMovieRecommendations = makeConnectionResolver({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resultsPerPage: 20,\n});\n","import { snakeCase } from 'lodash-es';\nimport { MOVIE, RELEASE_DATES, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawMovie, type RawMovieReleaseDates, type RawMovieWithAppendToResponse } from '../types.ts';\n\nconst isRawMovieWithReleaseDates = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers })\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } =>\n snakeCase(RELEASE_DATES) in obj && '__headers' in obj;\n\nexport const resolveMovieReleaseDates = buildObjResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n RawMovieReleaseDates['results']\n>(MOVIE, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawMovieWithReleaseDates(obj)) {\n return {\n data: obj.release_dates?.results,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.movie<RawMovieReleaseDates>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(RELEASE_DATES) },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n});\n","import { Core } from '@cachemap/core';\nimport { init as map } from '@cachemap/map';\nimport { init as reaper } from '@cachemap/reaper';\nimport { type CreateResourceResolver, type Getters, makeConnectionResolver } from '@graphql-box/connection-resolver';\nimport { type MovieReviewsArgs } from '@tmdb-graphql-api/schema/types';\nimport { encode } from 'js-base64';\nimport { MOVIE, REVIEWS, Source } from '../constants.ts';\nimport {\n type Context,\n type RawMovie,\n type RawMovieReviews,\n type RawMovieWithAppendToResponse,\n type RawReview,\n} from '../types.ts';\n\n/* eslint-disable camelcase */\n\nexport const createMakeCursors = (obj: RawMovie) => {\n const groupCursor = `${obj.id}::${MOVIE}::${REVIEWS}`;\n\n return {\n makeGroupCursor: () => encode(groupCursor),\n makeIDCursor: (id: string | number) => encode(`${id}::${groupCursor}`),\n };\n};\n\nconst isRawMovieWithReviews = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n page: number\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } =>\n REVIEWS in obj && obj.reviews?.page === page && '__headers' in obj;\n\nexport const createResourceResolver: CreateResourceResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n MovieReviewsArgs,\n Context,\n RawMovieReviews\n> =\n (obj, _args, { data: ctxData, restClient }: Context) =>\n async ({ page }: { page: number }) => {\n if (isRawMovieWithReviews(obj, page)) {\n return {\n data: obj.reviews,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.movie<RawMovieReviews>(\n {\n pathTemplateData: { id: obj.id, type: REVIEWS },\n queryParams: { page },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n };\n\nexport const cursorCache = new Core({\n name: 'MOVIE_REVIEWS_CONNECTION_RESOLVER',\n reaper: reaper({ interval: 300_000 }),\n store: map(),\n type: 'GRAPHQL',\n});\n\nexport const getters: Getters<RawMovieReviews, RawReview> = {\n // @ts-expect-error nested identifier is optional when\n // it shouldn't be\n nodes: ({ results = [] }) => results,\n page: ({ page = 0 }) => page,\n totalPages: ({ total_pages = 0 }) => total_pages,\n totalResults: ({ total_results = 0 }) => total_results,\n};\n\nexport const resolveMovieReviews = makeConnectionResolver({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resultsPerPage: 20,\n});\n","import { Core } from '@cachemap/core';\nimport { init as map } from '@cachemap/map';\nimport { init as reaper } from '@cachemap/reaper';\nimport { type CreateResourceResolver, type Getters, makeConnectionResolver } from '@graphql-box/connection-resolver';\nimport { type MovieSimilarMoviesArgs } from '@tmdb-graphql-api/schema/types';\nimport { encode } from 'js-base64';\nimport { MOVIE, SIMILAR } from '../constants.ts';\nimport {\n type Context,\n type RawMovie,\n type RawMovieSimilarMovies,\n type RawMovieWithAppendToResponse,\n} from '../types.ts';\n\n/* eslint-disable camelcase */\n\nexport const createMakeCursors = (obj: RawMovie) => {\n const groupCursor = `${obj.id}::${MOVIE}::${SIMILAR}`;\n\n return {\n makeGroupCursor: () => encode(groupCursor),\n makeIDCursor: (id: string | number) => encode(`${id}::${groupCursor}`),\n };\n};\n\nconst isRawMovieWithSimilarMovies = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n page: number\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } =>\n SIMILAR in obj && obj.similar?.page === page && '__headers' in obj;\n\nexport const createResourceResolver: CreateResourceResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n MovieSimilarMoviesArgs,\n Context,\n RawMovieSimilarMovies\n> =\n (obj, _args, { data: ctxData, restClient }) =>\n async ({ page }: { page: number }) => {\n if (isRawMovieWithSimilarMovies(obj, page)) {\n return {\n data: obj.similar,\n headers: obj.__headers,\n };\n }\n\n const { data, errors, headers } = await restClient.movie<RawMovieSimilarMovies>(\n {\n pathTemplateData: { id: obj.id, type: SIMILAR },\n queryParams: { page },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n };\n\nexport const cursorCache = new Core({\n name: 'MOVIE_SIMILAR_MOVIES_CONNECTION_RESOLVER',\n reaper: reaper({ interval: 300_000 }),\n store: map(),\n type: 'GRAPHQL',\n});\n\nexport const getters: Getters<RawMovieSimilarMovies, RawMovie> = {\n // @ts-expect-error minor type mismatch\n nodes: ({ results = [] }) => results,\n page: ({ page = 0 }) => page,\n totalPages: ({ total_pages = 0 }) => total_pages,\n totalResults: ({ total_results = 0 }) => total_results,\n};\n\nexport const resolveMovieSimilarMovies = makeConnectionResolver({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resultsPerPage: 20,\n});\n","import { MOVIE, Source, TRANSLATIONS } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawMovie, type RawMovieTranslations, type RawMovieWithAppendToResponse } from '../types.ts';\n\nconst isRawMovieWithTranslations = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers })\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } => TRANSLATIONS in obj && '__headers' in obj;\n\nexport const resolveMovieTranslations = buildObjResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n RawMovieTranslations['translations']\n>(MOVIE, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawMovieWithTranslations(obj)) {\n return {\n data: obj.translations?.translations,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.movie<RawMovieTranslations>(\n {\n pathTemplateData: { id: obj.id, type: TRANSLATIONS },\n },\n ctxData\n );\n\n return {\n data: data?.translations,\n errors,\n headers,\n };\n});\n","import { MOVIE, Source, VIDEOS } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawMovie, type RawMovieVideos, type RawMovieWithAppendToResponse } from '../types.ts';\n\nconst isRawMovieWithVideos = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers })\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } => VIDEOS in obj && '__headers' in obj;\n\nexport const resolveMovieVideos = buildObjResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n RawMovieVideos['results']\n>(MOVIE, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawMovieWithVideos(obj)) {\n return {\n data: obj.videos?.results,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.movie<RawMovieVideos>(\n {\n pathTemplateData: { id: obj.id, type: VIDEOS },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n});\n","import { MOVIE, RAW_WATCH_PROVIDERS, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawMovie, type RawMovieWatchProviders, type RawMovieWithAppendToResponse } from '../types.ts';\n\nconst isRawMovieWithWatchProviders = (\n obj: RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers })\n): obj is RawMovieWithAppendToResponse & { __headers: Headers } => RAW_WATCH_PROVIDERS in obj && '__headers' in obj;\n\nexport const resolveMovieWatchProviders = buildObjResolver<\n RawMovie | (RawMovieWithAppendToResponse & { __headers?: Headers }),\n RawMovieWatchProviders['results']\n>(MOVIE, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawMovieWithWatchProviders(obj)) {\n return {\n data: obj['watch/providers']?.results,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.watchProviders<RawMovieWatchProviders>(\n {\n pathTemplateData: { id: obj.id, type: MOVIE },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n});\n","import { type QueryNetworkArgs } from '@tmdb-graphql-api/schema/types';\nimport { isUndefined, snakeCase } from 'lodash-es';\nimport { NETWORK, Source } from '../constants.ts';\nimport { buildObjArgsResolver } from '../helpers/buildObjArgsResolver.ts';\nimport { type RawNetwork } from '../types.ts';\n\nexport const resolveNetwork = buildObjArgsResolver<\n RawNetwork,\n QueryNetworkArgs,\n RawNetwork | RawNetwork[keyof RawNetwork]\n>(NETWORK, async (obj, args, ctx, info) => {\n const id = obj ? obj.id : args.id;\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = snakeCase(fieldName) as keyof RawNetwork;\n\n if (obj && !isUndefined(obj[typedFieldName])) {\n return {\n data: obj[typedFieldName],\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.network<RawNetwork>(\n {\n pathTemplateData: { id },\n },\n ctxData\n );\n\n return {\n data: obj ? data?.[typedFieldName] : data,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport { ALTERNATIVE_NAMES, NETWORK } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawNetwork, type RawNetworkAlternativeNames } from '../types.ts';\n\nexport const resolveNetworkAlternativeNames = buildObjResolver<RawNetwork, RawNetworkAlternativeNames['results']>(\n NETWORK,\n async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.network<RawNetworkAlternativeNames>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(ALTERNATIVE_NAMES) },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n }\n);\n","import { IMAGES, NETWORK } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawNetwork, type RawNetworkLogos } from '../types.ts';\n\nexport const resolveNetworkLogos = buildObjResolver<RawNetwork, RawNetworkLogos['logos']>(NETWORK, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.network<RawNetworkLogos>(\n {\n pathTemplateData: { id: obj.id, type: IMAGES },\n },\n ctxData\n );\n\n return {\n data: data?.logos,\n errors,\n headers,\n };\n});\n","import { type QueryPersonArgs } from '@tmdb-graphql-api/schema/types';\nimport { isUndefined, snakeCase } from 'lodash-es';\nimport {\n COMBINED_CREDITS,\n EXTERNAL_IDS,\n IMAGES,\n MOVIE_CREDITS,\n PERSON,\n PROFILES,\n Source,\n TRANSLATIONS,\n TV_CREDITS,\n} from '../constants.ts';\nimport { buildObjArgsResolver } from '../helpers/buildObjArgsResolver.ts';\nimport { getAppendToResponseKeys } from '../helpers/getAppendToResponseKeys.ts';\nimport { setAppendToResponseSearchParams } from '../helpers/setAppendToResponseSearchParams.ts';\nimport { type RawPerson, type RawPersonWithAppendToResponse } from '../types.ts';\n\nconst appendToResponse = {\n [COMBINED_CREDITS]: snakeCase(COMBINED_CREDITS),\n [EXTERNAL_IDS]: snakeCase(EXTERNAL_IDS),\n [MOVIE_CREDITS]: snakeCase(MOVIE_CREDITS),\n [PROFILES]: IMAGES,\n [TRANSLATIONS]: TRANSLATIONS,\n [TV_CREDITS]: snakeCase(TV_CREDITS),\n};\n\nexport const resolvePerson = buildObjArgsResolver<\n RawPerson,\n QueryPersonArgs,\n | (RawPersonWithAppendToResponse & { __headers?: Headers })\n | RawPersonWithAppendToResponse[keyof RawPersonWithAppendToResponse]\n>(PERSON, async (obj, args, ctx, info) => {\n const { data: ctxData, fragmentDefinitions, languageCode, restClient } = ctx;\n const { fieldName, fieldNodes } = info;\n const typedFieldName = snakeCase(fieldName) as keyof RawPerson;\n\n if (obj && !isUndefined(obj[typedFieldName])) {\n return {\n data: obj[typedFieldName],\n source: Source.ParentNode,\n };\n }\n\n const id = obj ? obj.id : args.id;\n const appendToResponseKeys = getAppendToResponseKeys(fieldNodes[0]!, appendToResponse, fragmentDefinitions);\n\n const { data, errors, headers } = await restClient.person<RawPersonWithAppendToResponse>(\n {\n pathTemplateData: { id },\n ...(appendToResponseKeys.length > 0\n ? {\n queryParams: {\n ...setAppendToResponseSearchParams(appendToResponseKeys, languageCode),\n },\n }\n : {}),\n },\n ctxData\n );\n\n return {\n data: obj ? data?.[typedFieldName] : appendToResponseKeys.length > 0 ? { ...data, __headers: headers } : data,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport type { Except } from 'type-fest';\nimport { COMBINED_CREDITS, PERSON, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawPerson, type RawPersonCombinedCredits, type RawPersonWithAppendToResponse } from '../types.ts';\n\nconst isRawPersonWithCombinedCredits = (\n obj: RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers })\n): obj is RawPersonWithAppendToResponse & { __headers: Headers } =>\n snakeCase(COMBINED_CREDITS) in obj && '__headers' in obj;\n\nexport const resolvePersonCombinedCredits = buildObjResolver<\n RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers }),\n Except<RawPersonCombinedCredits, 'id'>\n>(PERSON, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawPersonWithCombinedCredits(obj)) {\n return {\n data: obj.combined_credits,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.person<RawPersonCombinedCredits>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(COMBINED_CREDITS) },\n },\n ctxData\n );\n\n const { id: personId, ...rest } = data ?? {};\n\n return {\n data: rest,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport type { Except } from 'type-fest';\nimport { EXTERNAL_IDS, PERSON, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawPerson, type RawPersonExternalIds, type RawPersonWithAppendToResponse } from '../types.ts';\n\nconst isRawPersonWithExternalIds = (\n obj: RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers })\n): obj is RawPersonWithAppendToResponse & { __headers: Headers } =>\n snakeCase(EXTERNAL_IDS) in obj && '__headers' in obj;\n\nexport const resolvePersonExternalIds = buildObjResolver<\n RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers }),\n Except<RawPersonExternalIds, 'id'>\n>(PERSON, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawPersonWithExternalIds(obj)) {\n return {\n data: obj.external_ids,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.person<RawPersonExternalIds>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(EXTERNAL_IDS) },\n },\n ctxData\n );\n\n const { id: personId, ...rest } = data ?? {};\n\n return {\n data: rest,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport type { Except } from 'type-fest';\nimport { MOVIE_CREDITS, PERSON, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawPerson, type RawPersonMovieCredits, type RawPersonWithAppendToResponse } from '../types.ts';\n\nconst isRawPersonWithMovieCredits = (\n obj: RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers })\n): obj is RawPersonWithAppendToResponse & { __headers: Headers } =>\n snakeCase(MOVIE_CREDITS) in obj && '__headers' in obj;\n\nexport const resolvePersonMovieCredits = buildObjResolver<\n RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers }),\n Except<RawPersonMovieCredits, 'id'>\n>(PERSON, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawPersonWithMovieCredits(obj)) {\n return {\n data: obj.movie_credits,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.person<RawPersonMovieCredits>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(MOVIE_CREDITS) },\n },\n ctxData\n );\n\n const { id: personId, ...rest } = data ?? {};\n\n return {\n data: rest,\n errors,\n headers,\n };\n});\n","import { IMAGES, PERSON, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawPerson, type RawPersonProfiles, type RawPersonWithAppendToResponse } from '../types.ts';\n\nconst isRawPersonWithProfiles = (\n obj: RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers })\n): obj is RawPersonWithAppendToResponse & { __headers: Headers } => IMAGES in obj && '__headers' in obj;\n\nexport const resolvePersonProfiles = buildObjResolver<\n RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers }),\n RawPersonProfiles['profiles']\n>(PERSON, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawPersonWithProfiles(obj)) {\n return {\n data: obj.images?.profiles,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.person<RawPersonProfiles>(\n {\n pathTemplateData: { id: obj.id, type: IMAGES },\n },\n ctxData\n );\n\n return {\n data: data?.profiles,\n errors,\n headers,\n };\n});\n","import { PERSON, Source, TRANSLATIONS } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawPerson, type RawPersonTranslations, type RawPersonWithAppendToResponse } from '../types.ts';\n\nconst isRawPersonWithTranslations = (\n obj: RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers })\n): obj is RawPersonWithAppendToResponse & { __headers: Headers } => TRANSLATIONS in obj && '__headers' in obj;\n\nexport const resolvePersonTranslations = buildObjResolver<\n RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers }),\n RawPersonTranslations['translations']\n>(PERSON, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawPersonWithTranslations(obj)) {\n return {\n data: obj.translations?.translations,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.person<RawPersonTranslations>(\n {\n pathTemplateData: { id: obj.id, type: TRANSLATIONS },\n },\n ctxData\n );\n\n return {\n data: data?.translations,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport type { Except } from 'type-fest';\nimport { PERSON, Source, TV_CREDITS } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawPerson, type RawPersonTvCredits, type RawPersonWithAppendToResponse } from '../types.ts';\n\nconst isRawPersonWithTvCredits = (\n obj: RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers })\n): obj is RawPersonWithAppendToResponse & { __headers: Headers } => snakeCase(TV_CREDITS) in obj && '__headers' in obj;\n\nexport const resolvePersonTvCredits = buildObjResolver<\n RawPerson | (RawPersonWithAppendToResponse & { __headers?: Headers }),\n Except<RawPersonTvCredits, 'id'>\n>(PERSON, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawPersonWithTvCredits(obj)) {\n return {\n data: obj.tv_credits,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.person<RawPersonTvCredits>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(TV_CREDITS) },\n },\n ctxData\n );\n\n const { id: personId, ...rest } = data ?? {};\n\n return {\n data: rest,\n errors,\n headers,\n };\n});\n","import { Core } from '@cachemap/core';\nimport { init as map } from '@cachemap/map';\nimport { init as reaper } from '@cachemap/reaper';\nimport {\n type CreateResourceResolver,\n type Getters,\n makeConnectionResolver,\n removeConnectionInputOptions,\n} from '@graphql-box/connection-resolver';\nimport { type QueryRatedArgs, type ScreenType } from '@tmdb-graphql-api/schema/types';\nimport { encode } from 'js-base64';\nimport { capitalize } from 'lodash-es';\nimport { RATED } from '../constants.ts';\nimport { type Context, type RawMovie, type RawRated, type RawTv } from '../types.ts';\n\n/* eslint-disable camelcase */\n\nexport const createMakeCursors = (_obj: undefined, args: QueryRatedArgs) => {\n const groupCursor = `${JSON.stringify(removeConnectionInputOptions(args))}::${RATED}`;\n\n return {\n makeGroupCursor: () => encode(groupCursor),\n makeIDCursor: (id: string | number) => encode(`${id}::${groupCursor}`),\n };\n};\n\nexport const createResourceResolver: CreateResourceResolver<undefined, QueryRatedArgs, Context, RawRated> =\n (_obj, { screenType }: QueryRatedArgs, { data: ctxData, restClient }: Context) =>\n async ({ page }: { page: number }) => {\n const { data, errors, headers } = await restClient.rated<RawRated>(\n {\n pathTemplateData: { id: ctxData.tmdbGuestSessionId, type: screenType.toLowerCase() },\n queryParams: { page },\n },\n ctxData\n );\n\n if (!data) {\n return {\n errors,\n headers,\n };\n }\n\n data.results = data.results?.map(entry => {\n // @ts-expect-error required for type resolver\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n entry.media_type = capitalize(entry.media_type ?? screenType.toLowerCase());\n return entry;\n });\n\n return {\n data,\n errors,\n headers,\n };\n };\n\nexport const cursorCache = new Core({\n name: 'RATED_CONNECTION_RESOLVER',\n reaper: reaper({ interval: 300_000 }),\n store: map(),\n type: 'GRAPHQL',\n});\n\nexport const getters: Getters<RawRated, (RawMovie | RawTv) & { media_type?: Capitalize<Lowercase<ScreenType>> }> = {\n // @ts-expect-error nested identifier is optional when\n // it shouldn't be\n nodes: ({ results = [] }) => results,\n page: ({ page = 0 }) => page,\n totalPages: ({ total_pages = 0 }) => total_pages,\n totalResults: ({ total_results = 0 }) => total_results,\n};\n\nexport const resolveRated = makeConnectionResolver({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resultsPerPage: 20,\n});\n","import { type QueryReviewArgs } from '@tmdb-graphql-api/schema/types';\nimport { isUndefined, snakeCase } from 'lodash-es';\nimport { REVIEW, Source } from '../constants.ts';\nimport { buildObjArgsResolver } from '../helpers/buildObjArgsResolver.ts';\nimport { type RawReview } from '../types.ts';\n\nexport const resolveReview = buildObjArgsResolver<RawReview, QueryReviewArgs, RawReview | RawReview[keyof RawReview]>(\n REVIEW,\n async (obj, args, ctx, info) => {\n const id = obj ? obj.id : args.id;\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = snakeCase(fieldName) as keyof RawReview;\n\n if (obj && !isUndefined(obj[typedFieldName])) {\n return {\n data: obj[typedFieldName],\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.review<RawReview>(\n {\n pathTemplateData: { id },\n },\n ctxData\n );\n\n return {\n data: obj ? data?.[typedFieldName] : data,\n errors,\n headers,\n };\n }\n);\n","import { Core } from '@cachemap/core';\nimport { init as map } from '@cachemap/map';\nimport { init as reaper } from '@cachemap/reaper';\nimport {\n type CreateResourceResolver,\n type Getters,\n makeConnectionResolver,\n removeConnectionInputOptions,\n} from '@graphql-box/connection-resolver';\nimport { type QuerySearchArgs, SearchType } from '@tmdb-graphql-api/schema/types';\nimport { encode } from 'js-base64';\nimport { capitalize } from 'lodash-es';\nimport { SEARCH } from '../constants.ts';\nimport { snakeCasePropNames } from '../helpers/snakeCasePropNames.ts';\nimport { type Context, type RawSearch, type RawSearchType } from '../types.ts';\n\n/* eslint-disable camelcase */\n\nexport const createMakeCursors = (_obj: undefined, args: QuerySearchArgs) => {\n const groupCursor = `${JSON.stringify(removeConnectionInputOptions(args))}::${SEARCH}`;\n\n return {\n makeGroupCursor: () => encode(groupCursor),\n makeIDCursor: (id: string | number) => encode(`${id}::${groupCursor}`),\n };\n};\n\nexport const createResourceResolver: CreateResourceResolver<undefined, QuerySearchArgs, Context, RawSearch> = (\n _obj,\n args,\n { data: ctxData, restClient }\n) => {\n const { searchType, ...rest } = removeConnectionInputOptions(args);\n\n return async ({ page }: { page: number }) => {\n const { data, errors, headers } = await restClient.search<RawSearch>(\n {\n pathTemplateData: { type: (searchType ?? SearchType.Multi).toLowerCase() },\n queryParams: { ...snakeCasePropNames(rest), page },\n },\n ctxData\n );\n\n if (!data) {\n return {\n errors,\n headers,\n };\n }\n\n data.results = data.results?.map(entry => {\n let mediaType = entry.media_type;\n\n if (!mediaType && searchType && searchType !== SearchType.Multi) {\n mediaType = searchType.toLowerCase();\n }\n\n if (mediaType) {\n entry.media_type = capitalize(mediaType);\n }\n\n return entry;\n });\n\n return {\n data,\n errors,\n headers,\n };\n };\n};\n\nexport const cursorCache = new Core({\n name: 'SEARCH_CONNECTION_RESOLVER',\n reaper: reaper({ interval: 300_000 }),\n store: map(),\n type: 'GRAPHQL',\n});\n\nexport const getters: Getters<RawSearch, RawSearchType & { media_type?: Capitalize<Lowercase<SearchType>> }> = {\n // @ts-expect-error nested identifier is optional when\n // it shouldn't be\n nodes: ({ results = [] }) => results,\n page: ({ page = 0 }) => page,\n totalPages: ({ total_pages = 0 }) => total_pages,\n totalResults: ({ total_results = 0 }) => total_results,\n};\n\nexport const resolveSearch = makeConnectionResolver({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resultsPerPage: 20,\n});\n","import { type QuerySeasonArgs } from '@tmdb-graphql-api/schema/types';\nimport { isUndefined, snakeCase } from 'lodash-es';\nimport {\n CAST,\n CREDITS,\n CREW,\n EXTERNAL_IDS,\n IMAGES,\n POSTERS,\n SEASON,\n Source,\n TRANSLATIONS,\n VIDEOS,\n} from '../constants.ts';\nimport { buildObjArgsResolver } from '../helpers/buildObjArgsResolver.ts';\nimport { encodeId } from '../helpers/encodeId.ts';\nimport { getAppendToResponseKeys } from '../helpers/getAppendToResponseKeys.ts';\nimport { getTvIdSeasonAndEpisode } from '../helpers/getTvIdSeasonAndEpisode.ts';\nimport { setAppendToResponseSearchParams } from '../helpers/setAppendToResponseSearchParams.ts';\nimport { type EnrichedRawSeason, type EnrichedRawSeasonWithAppendToResponse, type RawSeason } from '../types.ts';\n\nconst appendToResponse = {\n [CAST]: CREDITS,\n [CREW]: CREDITS,\n [EXTERNAL_IDS]: snakeCase(EXTERNAL_IDS),\n [POSTERS]: IMAGES,\n [TRANSLATIONS]: TRANSLATIONS,\n [VIDEOS]: VIDEOS,\n};\n\nexport const resolveSeason = buildObjArgsResolver<\n EnrichedRawSeason,\n QuerySeasonArgs,\n | (EnrichedRawSeasonWithAppendToResponse & { __headers?: Headers })\n | EnrichedRawSeasonWithAppendToResponse[keyof EnrichedRawSeasonWithAppendToResponse]\n>(SEASON, async (obj, args, ctx, info) => {\n const { data: ctxData, fragmentDefinitions, languageCode, restClient } = ctx;\n const { fieldName, fieldNodes } = info;\n const typedFieldName = snakeCase(fieldName) as keyof RawSeason;\n const { id, seasonNumber } = getTvIdSeasonAndEpisode(obj, args);\n\n if (obj && !isUndefined(obj[typedFieldName])) {\n return {\n data: typedFieldName === 'id' ? encodeId({ id, seasonNumber }) : obj[typedFieldName],\n source: Source.ParentNode,\n };\n }\n\n const appendToResponseKeys = getAppendToResponseKeys(fieldNodes[0]!, appendToResponse, fragmentDefinitions);\n\n const { data, errors, headers } = await restClient.season<EnrichedRawSeasonWithAppendToResponse>(\n {\n pathTemplateData: { id, number: seasonNumber },\n ...(appendToResponseKeys.length > 0\n ? {\n queryParams: {\n ...setAppendToResponseSearchParams(appendToResponseKeys, languageCode),\n },\n }\n : {}),\n },\n ctxData\n );\n\n const seasonData = {\n ...data,\n episodes: (data?.episodes ?? []).map(episode => ({ ...episode, tv_show_id: Number(id) })),\n id: encodeId({ id, seasonNumber }),\n tv_show_id: Number(id),\n };\n\n return {\n data: obj\n ? seasonData[typedFieldName]\n : appendToResponseKeys.length > 0\n ? { ...seasonData, __headers: headers }\n : seasonData,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport { CREDITS, SEASON, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type EnrichedRawSeason, type EnrichedRawSeasonWithAppendToResponse, type RawSeasonCredits } from '../types.ts';\n\nconst isEnrichedRawSeasonWithCredits = (\n obj: EnrichedRawSeason | (EnrichedRawSeasonWithAppendToResponse & { __headers?: Headers })\n): obj is EnrichedRawSeasonWithAppendToResponse & { __headers: Headers } => CREDITS in obj && '__headers' in obj;\n\nexport const resolveSeasonCredits = buildObjResolver<\n EnrichedRawSeason | (EnrichedRawSeasonWithAppendToResponse & { __headers?: Headers }),\n RawSeasonCredits['cast'] | RawSeasonCredits['crew']\n>(SEASON, async (obj, ctx, info) => {\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = snakeCase(fieldName) as 'cast' | 'crew';\n\n if (isEnrichedRawSeasonWithCredits(obj)) {\n return {\n data: obj.credits?.[typedFieldName],\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.season<RawSeasonCredits>(\n {\n pathTemplateData: { id: obj.tv_show_id, number: obj.season_number, type: CREDITS },\n },\n ctxData\n );\n\n return {\n data: data?.[typedFieldName],\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport type { Except } from 'type-fest';\nimport { EXTERNAL_IDS, SEASON, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport {\n type EnrichedRawSeason,\n type EnrichedRawSeasonWithAppendToResponse,\n type RawSeasonExternalIds,\n} from '../types.ts';\n\nconst isEnrichedRawSeasonWithExternalIds = (\n obj: EnrichedRawSeason | (EnrichedRawSeasonWithAppendToResponse & { __headers?: Headers })\n): obj is EnrichedRawSeasonWithAppendToResponse & { __headers: Headers } =>\n snakeCase(EXTERNAL_IDS) in obj && '__headers' in obj;\n\nexport const resolveSeasonExternalIds = buildObjResolver<\n EnrichedRawSeason | (EnrichedRawSeasonWithAppendToResponse & { __headers?: Headers }),\n Except<RawSeasonExternalIds, 'id'>\n>(SEASON, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isEnrichedRawSeasonWithExternalIds(obj)) {\n return {\n data: obj.external_ids,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.season<RawSeasonExternalIds>(\n {\n pathTemplateData: { id: obj.tv_show_id, number: obj.season_number, type: snakeCase(EXTERNAL_IDS) },\n },\n ctxData\n );\n\n const { id: movieId, ...rest } = data ?? {};\n\n return {\n data: rest,\n errors,\n headers,\n };\n});\n","import { IMAGES, SEASON, Source } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type EnrichedRawSeason, type EnrichedRawSeasonWithAppendToResponse, type RawSeasonPosters } from '../types.ts';\n\nconst isEnrichedRawSeasonWithPosters = (\n obj: EnrichedRawSeason | (EnrichedRawSeasonWithAppendToResponse & { __headers?: Headers })\n): obj is EnrichedRawSeasonWithAppendToResponse & { __headers: Headers } => IMAGES in obj && '__headers' in obj;\n\nexport const resolveSeasonPosters = buildObjResolver<\n EnrichedRawSeason | (EnrichedRawSeasonWithAppendToResponse & { __headers?: Headers }),\n RawSeasonPosters['posters']\n>(SEASON, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isEnrichedRawSeasonWithPosters(obj)) {\n return {\n data: obj.images?.posters,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.season<RawSeasonPosters>(\n {\n pathTemplateData: { id: obj.tv_show_id, number: obj.season_number, type: IMAGES },\n },\n ctxData\n );\n\n return {\n data: data?.posters,\n errors,\n headers,\n };\n});\n","import { SEASON, Source, TRANSLATIONS } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport {\n type EnrichedRawSeason,\n type EnrichedRawSeasonWithAppendToResponse,\n type RawSeasonTranslations,\n} from '../types.ts';\n\nconst isEnrichedRawSeasonWithTranslations = (\n obj: EnrichedRawSeason | (EnrichedRawSeasonWithAppendToResponse & { __headers?: Headers })\n): obj is EnrichedRawSeasonWithAppendToResponse & { __headers: Headers } => TRANSLATIONS in obj && '__headers' in obj;\n\nexport const resolveSeasonTranslations = buildObjResolver<\n EnrichedRawSeason | (EnrichedRawSeasonWithAppendToResponse & { __headers?: Headers }),\n RawSeasonTranslations['translations']\n>(SEASON, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isEnrichedRawSeasonWithTranslations(obj)) {\n return {\n data: obj.translations?.translations,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.season<RawSeasonTranslations>(\n {\n pathTemplateData: { id: obj.tv_show_id, number: obj.season_number, type: TRANSLATIONS },\n },\n ctxData\n );\n\n return {\n data: data?.translations,\n errors,\n headers,\n };\n});\n","import { SEASON, Source, VIDEOS } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type EnrichedRawSeason, type EnrichedRawSeasonWithAppendToResponse, type RawSeasonVideos } from '../types.ts';\n\nconst isEnrichedRawSeasonWithVideos = (\n obj: EnrichedRawSeason | (EnrichedRawSeasonWithAppendToResponse & { __headers?: Headers })\n): obj is EnrichedRawSeasonWithAppendToResponse & { __headers: Headers } => VIDEOS in obj && '__headers' in obj;\n\nexport const resolveSeasonVideos = buildObjResolver<\n EnrichedRawSeason | (EnrichedRawSeasonWithAppendToResponse & { __headers?: Headers }),\n RawSeasonVideos['results']\n>(SEASON, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isEnrichedRawSeasonWithVideos(obj)) {\n return {\n data: obj.videos?.results,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.season<RawSeasonVideos>(\n {\n pathTemplateData: { id: obj.tv_show_id, number: obj.season_number, type: VIDEOS },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n});\n","import { Core } from '@cachemap/core';\nimport { init as map } from '@cachemap/map';\nimport { init as reaper } from '@cachemap/reaper';\nimport {\n type CreateResourceResolver,\n type Getters,\n makeConnectionResolver,\n removeConnectionInputOptions,\n} from '@graphql-box/connection-resolver';\nimport { type MediaType, type QueryTrendingArgs } from '@tmdb-graphql-api/schema/types';\nimport { TrendingMediaType } from '@tmdb-graphql-api/schema/types';\nimport { encode } from 'js-base64';\nimport { capitalize } from 'lodash-es';\nimport { TRENDING } from '../constants.ts';\nimport { type Context, type RawMediaType, type RawTrending } from '../types.ts';\n\n/* eslint-disable camelcase */\n\nexport const createMakeCursors = (_obj: undefined, args: QueryTrendingArgs) => {\n const groupCursor = `${JSON.stringify(removeConnectionInputOptions(args))}::${TRENDING}`;\n\n return {\n makeGroupCursor: () => encode(groupCursor),\n makeIDCursor: (id: string | number) => encode(`${id}::${groupCursor}`),\n };\n};\n\nexport const createResourceResolver: CreateResourceResolver<undefined, QueryTrendingArgs, Context, RawTrending> =\n (_obj, args, ctx) =>\n async ({ page }: { page: number }) => {\n const { mediaType, timeWindow } = args;\n const { data: ctxData, restClient } = ctx;\n\n const { data, errors, headers } = await restClient.trending<RawTrending>(\n {\n pathTemplateData: { subType: timeWindow.toLowerCase(), type: mediaType.toLowerCase() },\n queryParams: { page },\n },\n ctxData\n );\n\n if (!data) {\n return {\n errors,\n headers,\n };\n }\n\n data.results = data.results?.map(entry => {\n let type = entry.media_type;\n\n if (!type && mediaType !== TrendingMediaType.All) {\n type = mediaType.toLowerCase();\n }\n\n if (type) {\n entry.media_type = capitalize(type);\n }\n\n return entry;\n });\n\n return {\n data,\n errors,\n headers,\n };\n };\n\nexport const cursorCache = new Core({\n name: 'TRENDING_CONNECTION_RESOLVER',\n reaper: reaper({ interval: 300_000 }),\n store: map(),\n type: 'GRAPHQL',\n});\n\nexport const getters: Getters<RawTrending, RawMediaType & { media_type?: Capitalize<Lowercase<MediaType>> }> = {\n // @ts-expect-error nested identifier is optional when\n // it shouldn't be\n nodes: ({ results = [] }) => results,\n page: ({ page = 0 }) => page,\n totalPages: ({ total_pages = 0 }) => total_pages,\n totalResults: ({ total_results = 0 }) => total_results,\n};\n\nexport const resolveTrending = makeConnectionResolver({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resultsPerPage: 20,\n});\n","import { type QueryTvArgs } from '@tmdb-graphql-api/schema/types';\nimport { isUndefined, snakeCase } from 'lodash-es';\nimport {\n ALTERNATIVE_TITLES,\n BACKDROPS,\n CAST,\n CONTENT_RATINGS,\n CREDITS,\n CREW,\n EPISODE_GROUPS,\n EXTERNAL_IDS,\n IMAGES,\n KEYWORDS,\n LOGOS,\n POSTERS,\n RECOMMENDATIONS,\n REVIEWS,\n SIMILAR,\n SIMILAR_TV_SHOWS,\n Source,\n TRANSLATIONS,\n TV,\n VIDEOS,\n WATCH_PROVIDERS,\n} from '../constants.ts';\nimport { buildObjArgsResolver } from '../helpers/buildObjArgsResolver.ts';\nimport { getAppendToResponseKeys } from '../helpers/getAppendToResponseKeys.ts';\nimport { setAppendToResponseSearchParams } from '../helpers/setAppendToResponseSearchParams.ts';\nimport { type RawTv, type RawTvWithAppendToResponse } from '../types.ts';\n\nconst appendToResponse = {\n [ALTERNATIVE_TITLES]: snakeCase(ALTERNATIVE_TITLES),\n [BACKDROPS]: IMAGES,\n [CAST]: CREDITS,\n [CONTENT_RATINGS]: snakeCase(CONTENT_RATINGS),\n [CREW]: CREDITS,\n [EPISODE_GROUPS]: snakeCase(EPISODE_GROUPS),\n [EXTERNAL_IDS]: snakeCase(EXTERNAL_IDS),\n [KEYWORDS]: KEYWORDS,\n [LOGOS]: IMAGES,\n [POSTERS]: IMAGES,\n [RECOMMENDATIONS]: RECOMMENDATIONS,\n [REVIEWS]: REVIEWS,\n [SIMILAR_TV_SHOWS]: SIMILAR,\n [TRANSLATIONS]: TRANSLATIONS,\n [VIDEOS]: VIDEOS,\n [WATCH_PROVIDERS]: 'watch/providers',\n};\n\nexport const resolveTv = buildObjArgsResolver<\n RawTv,\n QueryTvArgs,\n (RawTvWithAppendToResponse & { __headers?: Headers }) | RawTvWithAppendToResponse[keyof RawTvWithAppendToResponse]\n>(TV, async (obj, args, ctx, info) => {\n const { data: ctxData, fragmentDefinitions, languageCode, restClient } = ctx;\n const { fieldName, fieldNodes } = info;\n const typedFieldName = snakeCase(fieldName) as keyof RawTv;\n\n if (obj && !isUndefined(obj[typedFieldName])) {\n return {\n data: obj[typedFieldName],\n source: Source.ParentNode,\n };\n }\n\n const id = obj ? obj.id : args.id;\n const appendToResponseKeys = getAppendToResponseKeys(fieldNodes[0]!, appendToResponse, fragmentDefinitions);\n\n const { data, errors, headers } = await restClient.tv<RawTvWithAppendToResponse>(\n {\n pathTemplateData: { id },\n ...(appendToResponseKeys.length > 0\n ? {\n queryParams: {\n ...setAppendToResponseSearchParams(appendToResponseKeys, languageCode),\n },\n }\n : {}),\n },\n ctxData\n );\n\n const tvData = {\n ...data,\n seasons: (data?.seasons ?? []).map(season => ({\n ...season,\n tv_show_id: Number(id),\n })),\n };\n\n return {\n data: obj ? tvData[typedFieldName] : appendToResponseKeys.length > 0 ? { ...tvData, __headers: headers } : tvData,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport { ALTERNATIVE_TITLES, Source, TV } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawTv, type RawTvAlternativeTitles, type RawTvWithAppendToResponse } from '../types.ts';\n\nconst isRawTvWithAlternativeTitles = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers })\n): obj is RawTvWithAppendToResponse & { __headers: Headers } =>\n snakeCase(ALTERNATIVE_TITLES) in obj && '__headers' in obj;\n\nexport const resolveTvAlternativeTitles = buildObjResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n RawTvAlternativeTitles['results']\n>(TV, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawTvWithAlternativeTitles(obj)) {\n return {\n data: obj.alternative_titles.results,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvAlternativeTitles>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(ALTERNATIVE_TITLES) },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport { CONTENT_RATINGS, Source, TV } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawTv, type RawTvContentRatings, type RawTvWithAppendToResponse } from '../types.ts';\n\nconst isRawTvWithContentRatings = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers })\n): obj is RawTvWithAppendToResponse & { __headers: Headers } => snakeCase(CONTENT_RATINGS) in obj && '__headers' in obj;\n\nexport const resolveTvContentRatings = buildObjResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n RawTvContentRatings['results']\n>(TV, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawTvWithContentRatings(obj)) {\n return {\n data: obj.content_ratings.results,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvContentRatings>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(CONTENT_RATINGS) },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n});\n","import { CREDITS, Source, TV } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawTv, type RawTvCredits, type RawTvWithAppendToResponse } from '../types.ts';\n\nconst isRawTvWithCredits = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers })\n): obj is RawTvWithAppendToResponse & { __headers: Headers } => CREDITS in obj && '__headers' in obj;\n\nexport const resolveTvCredits = buildObjResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n RawTvCredits['cast'] | RawTvCredits['crew']\n>(TV, async (obj, ctx, info) => {\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = fieldName as 'cast' | 'crew';\n\n if (isRawTvWithCredits(obj)) {\n return {\n data: obj.credits?.[typedFieldName],\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvCredits>(\n {\n pathTemplateData: { id: obj.id, type: CREDITS },\n },\n ctxData\n );\n\n return {\n data: data?.[typedFieldName],\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport { EPISODE_GROUPS, Source, TV } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawTv, type RawTvEpisodeGroups, type RawTvWithAppendToResponse } from '../types.ts';\n\nconst isRawTvWithEpisodeGroups = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers })\n): obj is RawTvWithAppendToResponse & { __headers: Headers } => snakeCase(EPISODE_GROUPS) in obj && '__headers' in obj;\n\nexport const resolveTvEpisodeGroups = buildObjResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n RawTvEpisodeGroups['results']\n>(TV, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawTvWithEpisodeGroups(obj)) {\n return {\n data: obj.episode_groups?.results,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvEpisodeGroups>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(EPISODE_GROUPS) },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n});\n","import { snakeCase } from 'lodash-es';\nimport type { Except } from 'type-fest';\nimport { EXTERNAL_IDS, Source, TV } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawTv, type RawTvExternalIds, type RawTvWithAppendToResponse } from '../types.ts';\n\nconst isRawTvWithExternalIds = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers })\n): obj is RawTvWithAppendToResponse & { __headers: Headers } => snakeCase(EXTERNAL_IDS) in obj && '__headers' in obj;\n\nexport const resolveTvExternalIds = buildObjResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n Except<RawTvExternalIds, 'id'>\n>(TV, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawTvWithExternalIds(obj)) {\n return {\n data: obj.external_ids,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvExternalIds>(\n {\n pathTemplateData: { id: obj.id, type: snakeCase(EXTERNAL_IDS) },\n },\n ctxData\n );\n\n const { id: tvId, ...rest } = data ?? {};\n\n return {\n data: rest,\n errors,\n headers,\n };\n});\n","import { IMAGES, Source, TV } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawTv, type RawTvImages, type RawTvWithAppendToResponse } from '../types.ts';\n\nconst isRawTvWithImages = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers })\n): obj is RawTvWithAppendToResponse & { __headers: Headers } => IMAGES in obj && '__headers' in obj;\n\nexport const resolveTvImages = buildObjResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n RawTvImages['posters'] | RawTvImages['logos'] | RawTvImages['backdrops']\n>(TV, async (obj, ctx, info) => {\n const { data: ctxData, restClient } = ctx;\n const { fieldName } = info;\n const typedFieldName = fieldName as 'backdrops' | 'logos' | 'posters';\n\n if (isRawTvWithImages(obj)) {\n return {\n data: obj.images?.[typedFieldName],\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvImages>(\n {\n pathTemplateData: { id: obj.id, type: IMAGES },\n },\n ctxData\n );\n\n return {\n data: data?.[typedFieldName],\n errors,\n headers,\n };\n});\n","import { KEYWORDS, Source, TV } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawTv, type RawTvKeywords, type RawTvWithAppendToResponse } from '../types.ts';\n\nconst isRawTvWithKeywords = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers })\n): obj is RawTvWithAppendToResponse & { __headers: Headers } => KEYWORDS in obj && '__headers' in obj;\n\nexport const resolveTvKeywords = buildObjResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n RawTvKeywords['results']\n>(TV, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawTvWithKeywords(obj)) {\n return {\n data: obj.keywords?.results,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvKeywords>(\n {\n pathTemplateData: { id: obj.id, type: KEYWORDS },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n});\n","import { Core } from '@cachemap/core';\nimport { init as map } from '@cachemap/map';\nimport { init as reaper } from '@cachemap/reaper';\nimport { type CreateResourceResolver, type Getters, makeConnectionResolver } from '@graphql-box/connection-resolver';\nimport { type TvRecommendationsArgs } from '@tmdb-graphql-api/schema/types';\nimport { encode } from 'js-base64';\nimport { RECOMMENDATIONS, TV } from '../constants.ts';\nimport { type Context, type RawTv, type RawTvRecommendations, type RawTvWithAppendToResponse } from '../types.ts';\n\n/* eslint-disable camelcase */\n\nexport const createMakeCursors = (obj: RawTv) => {\n const groupCursor = `${obj.id}::${TV}::${RECOMMENDATIONS}`;\n\n return {\n makeGroupCursor: () => encode(groupCursor),\n makeIDCursor: (id: string | number) => encode(`${id}::${groupCursor}`),\n };\n};\n\nconst isRawTvWithRecommendations = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n page: number\n): obj is RawTvWithAppendToResponse & { __headers: Headers } =>\n RECOMMENDATIONS in obj && obj.recommendations?.page === page && '__headers' in obj;\n\nexport const createResourceResolver: CreateResourceResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n TvRecommendationsArgs,\n Context,\n RawTvRecommendations\n> =\n (obj, _args, ctx) =>\n async ({ page }: { page: number }) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawTvWithRecommendations(obj, page)) {\n return {\n data: obj.recommendations,\n headers: obj.__headers,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvRecommendations>(\n {\n pathTemplateData: { id: obj.id, type: RECOMMENDATIONS },\n queryParams: { page },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n };\n\nexport const cursorCache = new Core({\n name: 'TV_RECOMMENDATIONS_CONNECTION_RESOLVER',\n reaper: reaper({ interval: 300_000 }),\n store: map(),\n type: 'GRAPHQL',\n});\n\nexport const getters: Getters<RawTvRecommendations, RawTv> = {\n // @ts-expect-error minor type mismatch\n nodes: ({ results = [] }) => results,\n page: ({ page = 0 }) => page,\n totalPages: ({ total_pages = 0 }) => total_pages,\n totalResults: ({ total_results = 0 }) => total_results,\n};\n\nexport const resolveTvRecommendations = makeConnectionResolver({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resultsPerPage: 20,\n});\n","import { Core } from '@cachemap/core';\nimport { init as map } from '@cachemap/map';\nimport { init as reaper } from '@cachemap/reaper';\nimport { type CreateResourceResolver, type Getters, makeConnectionResolver } from '@graphql-box/connection-resolver';\nimport { type TvReviewsArgs } from '@tmdb-graphql-api/schema/types';\nimport { encode } from 'js-base64';\nimport { REVIEWS, TV } from '../constants.ts';\nimport {\n type Context,\n type RawReview,\n type RawTv,\n type RawTvReviews,\n type RawTvWithAppendToResponse,\n} from '../types.ts';\n\n/* eslint-disable camelcase */\n\nexport const createMakeCursors = (obj: RawTv) => {\n const groupCursor = `${obj.id}::${TV}::${REVIEWS}`;\n\n return {\n makeGroupCursor: () => encode(groupCursor),\n makeIDCursor: (id: string | number) => encode(`${id}::${groupCursor}`),\n };\n};\n\nconst isRawTvWithReviews = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n page: number\n): obj is RawTvWithAppendToResponse & { __headers: Headers } =>\n REVIEWS in obj && obj.reviews?.page === page && '__headers' in obj;\n\nexport const createResourceResolver: CreateResourceResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n TvReviewsArgs,\n Context,\n RawTvReviews\n> =\n (obj, _args, { data: ctxData, restClient }) =>\n async ({ page }: { page: number }) => {\n if (isRawTvWithReviews(obj, page)) {\n return {\n data: obj.reviews,\n headers: obj.__headers,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvReviews>(\n {\n pathTemplateData: { id: obj.id, type: REVIEWS },\n queryParams: { page },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n };\n\nexport const cursorCache = new Core({\n name: 'TV_REVIEWS_CONNECTION_RESOLVER',\n reaper: reaper({ interval: 300_000 }),\n store: map(),\n type: 'GRAPHQL',\n});\n\nexport const getters: Getters<RawTvReviews, RawReview> = {\n // @ts-expect-error minor type mismatch\n nodes: ({ results = [] }: RawTvReviews) => results,\n page: ({ page = 0 }: RawTvReviews) => page,\n totalPages: ({ total_pages = 0 }: RawTvReviews) => total_pages,\n totalResults: ({ total_results = 0 }: RawTvReviews) => total_results,\n};\n\nexport const resolveTvReviews = makeConnectionResolver({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resultsPerPage: 20,\n});\n","import { Core } from '@cachemap/core';\nimport { init as map } from '@cachemap/map';\nimport { init as reaper } from '@cachemap/reaper';\nimport { type CreateResourceResolver, type Getters, makeConnectionResolver } from '@graphql-box/connection-resolver';\nimport { type TvSimilarTvShowsArgs } from '@tmdb-graphql-api/schema/types';\nimport { encode } from 'js-base64';\nimport { SIMILAR, TV } from '../constants.ts';\nimport { type Context, type RawTv, type RawTvSimilarTvShows, type RawTvWithAppendToResponse } from '../types.ts';\n\n/* eslint-disable camelcase */\n\nexport const createMakeCursors = (obj: RawTv) => {\n const groupCursor = `${obj.id}::${TV}::${SIMILAR}`;\n\n return {\n makeGroupCursor: () => encode(groupCursor),\n makeIDCursor: (id: string | number) => encode(`${id}::${groupCursor}`),\n };\n};\n\nconst isRawTvWithSimilarShows = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n page: number\n): obj is RawTvWithAppendToResponse & { __headers: Headers } =>\n SIMILAR in obj && obj.similar?.page === page && '__headers' in obj;\n\nexport const createResourceResolver: CreateResourceResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n TvSimilarTvShowsArgs,\n Context,\n RawTvSimilarTvShows\n> =\n (obj, _args, { data: ctxData, restClient }) =>\n async ({ page }: { page: number }) => {\n if (isRawTvWithSimilarShows(obj, page)) {\n return {\n data: obj.similar,\n headers: obj.__headers,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvSimilarTvShows>(\n {\n pathTemplateData: { id: obj.id, type: SIMILAR },\n queryParams: { page },\n },\n ctxData\n );\n\n return {\n data,\n errors,\n headers,\n };\n };\n\nexport const cursorCache = new Core({\n name: 'TV_SIMILAR_TV_SHOWS_CONNECTION_RESOLVER',\n reaper: reaper({ interval: 300_000 }),\n store: map(),\n type: 'GRAPHQL',\n});\n\nexport const getters: Getters<RawTvSimilarTvShows, RawTv> = {\n // @ts-expect-error minor type mismatch\n nodes: ({ results = [] }) => results,\n page: ({ page = 0 }) => page,\n totalPages: ({ total_pages = 0 }) => total_pages,\n totalResults: ({ total_results = 0 }) => total_results,\n};\n\nexport const resolveTvSimilarTvShows = makeConnectionResolver({\n createMakeCursors,\n createResourceResolver,\n cursorCache,\n getters,\n resultsPerPage: 20,\n});\n","import { Source, TRANSLATIONS, TV } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawTv, type RawTvTranslations, type RawTvWithAppendToResponse } from '../types.ts';\n\nconst isRawTvWithTranslations = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers })\n): obj is RawTvWithAppendToResponse & { __headers: Headers } => TRANSLATIONS in obj && '__headers' in obj;\n\nexport const resolveTvTranslations = buildObjResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n RawTvTranslations['translations']\n>(TV, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawTvWithTranslations(obj)) {\n return {\n data: obj.translations?.translations,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvTranslations>(\n {\n pathTemplateData: { id: obj.id, type: TRANSLATIONS },\n },\n ctxData\n );\n\n return {\n data: data?.translations,\n errors,\n headers,\n };\n});\n","import { Source, TV, VIDEOS } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawTv, type RawTvVideos, type RawTvWithAppendToResponse } from '../types.ts';\n\nconst isRawTvWithVideos = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers })\n): obj is RawTvWithAppendToResponse & { __headers: Headers } => VIDEOS in obj && '__headers' in obj;\n\nexport const resolveTvVideos = buildObjResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n RawTvVideos['results']\n>(TV, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawTvWithVideos(obj)) {\n return {\n data: obj.videos?.results,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.tv<RawTvVideos>(\n {\n pathTemplateData: { id: obj.id, type: VIDEOS },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n});\n","import { RAW_WATCH_PROVIDERS, Source, TV } from '../constants.ts';\nimport { buildObjResolver } from '../helpers/buildObjResolver.ts';\nimport { type RawTv, type RawTvWatchProviders, type RawTvWithAppendToResponse } from '../types.ts';\n\nconst isRawTvWithWatchProviders = (\n obj: RawTv | (RawTvWithAppendToResponse & { __headers?: Headers })\n): obj is RawTvWithAppendToResponse & { __headers: Headers } => RAW_WATCH_PROVIDERS in obj && '__headers' in obj;\n\nexport const resolveTvWatchProviders = buildObjResolver<\n RawTv | (RawTvWithAppendToResponse & { __headers?: Headers }),\n RawTvWatchProviders['results']\n>(TV, async (obj, ctx) => {\n const { data: ctxData, restClient } = ctx;\n\n if (isRawTvWithWatchProviders(obj)) {\n return {\n data: obj[RAW_WATCH_PROVIDERS]?.results,\n headers: obj.__headers,\n source: Source.ParentNode,\n };\n }\n\n const { data, errors, headers } = await restClient.watchProviders<RawTvWatchProviders>(\n {\n pathTemplateData: { id: obj.id, type: TV },\n },\n ctxData\n );\n\n return {\n data: data?.results,\n errors,\n headers,\n };\n});\n","import { type Certifications, type MediaType, type ScreenType, type SearchType } from '@tmdb-graphql-api/schema/types';\nimport { makeFallbackFieldResolvers } from './helpers/makeFallbackFieldResolvers.ts';\nimport { resolveCertifications } from './queries/certifications.ts';\nimport { resolveCollection } from './queries/collection.ts';\nimport { resolveCollectionImages } from './queries/collectionImages.ts';\nimport { resolveCollectionTranslations } from './queries/collectionTranslations.ts';\nimport { resolveCompany } from './queries/company.ts';\nimport { resolveCompanyAlternativeNames } from './queries/companyAlternativeNames.ts';\nimport { resolveCompanyLogos } from './queries/companyLogos.ts';\nimport { resolveConfiguration } from './queries/configuration.ts';\nimport { resolveConfigurationCountries } from './queries/configurationCountries.ts';\nimport { resolveConfigurationJobs } from './queries/configurationJobs.ts';\nimport { resolveConfigurationLanguages } from './queries/configurationLanguages.ts';\nimport { resolveConfigurationPrimaryTranslations } from './queries/configurationPrimaryTranslations.ts';\nimport { resolveConfigurationTimezones } from './queries/configurationTimezones.ts';\nimport { resolveCredit } from './queries/credit.ts';\nimport { resolveDiscoverMovies } from './queries/discoverMovies.ts';\nimport { resolveDiscoverTv } from './queries/discoverTv.ts';\nimport { resolveEpisode } from './queries/episode.ts';\nimport { resolveEpisodeCredits } from './queries/episodeCredits.ts';\nimport { resolveEpisodeExternalIds } from './queries/episodeExternalIds.ts';\nimport { resolveEpisodeStills } from './queries/episodeStills.ts';\nimport { resolveEpisodeTranslations } from './queries/episodeTranslations.ts';\nimport { resolveEpisodeVideos } from './queries/episodeVideos.ts';\nimport { resolveFind } from './queries/find.ts';\nimport { resolveGenres } from './queries/genres.ts';\nimport { resolveKeyword } from './queries/keyword.ts';\nimport { resolveMovie } from './queries/movie.ts';\nimport { resolveMovieAlternativeTitles } from './queries/movieAlternativeTitles.ts';\nimport { resolveMovieCredits } from './queries/movieCredits.ts';\nimport { resolveMovieExternalIds } from './queries/movieExternalIds.ts';\nimport { resolveMovieImages } from './queries/movieImages.ts';\nimport { resolveMovieKeywords } from './queries/movieKeywords.ts';\nimport { resolveMovieRecommendations } from './queries/movieRecommendations.ts';\nimport { resolveMovieReleaseDates } from './queries/movieReleaseDates.ts';\nimport { resolveMovieReviews } from './queries/movieReviews.ts';\nimport { resolveMovieSimilarMovies } from './queries/movieSimilarMovies.ts';\nimport { resolveMovieTranslations } from './queries/movieTranslations.ts';\nimport { resolveMovieVideos } from './queries/movieVideos.ts';\nimport { resolveMovieWatchProviders } from './queries/movieWatchProviders.ts';\nimport { resolveNetwork } from './queries/network.ts';\nimport { resolveNetworkAlternativeNames } from './queries/networkAlternativeNames.ts';\nimport { resolveNetworkLogos } from './queries/networkLogos.ts';\nimport { resolvePerson } from './queries/person.ts';\nimport { resolvePersonCombinedCredits } from './queries/personCombinedCredits.ts';\nimport { resolvePersonExternalIds } from './queries/personExternalIds.ts';\nimport { resolvePersonMovieCredits } from './queries/personMovieCredits.ts';\nimport { resolvePersonProfiles } from './queries/personProfiles.ts';\nimport { resolvePersonTranslations } from './queries/personTranslations.ts';\nimport { resolvePersonTvCredits } from './queries/personTvCredits.ts';\nimport { resolveRated } from './queries/rated.ts';\nimport { resolveReview } from './queries/review.ts';\nimport { resolveSearch } from './queries/search.ts';\nimport { resolveSeason } from './queries/season.ts';\nimport { resolveSeasonCredits } from './queries/seasonCredits.ts';\nimport { resolveSeasonEpisodeCount } from './queries/seasonEpisodeCount.ts';\nimport { resolveSeasonExternalIds } from './queries/seasonExternalIds.ts';\nimport { resolveSeasonPosters } from './queries/seasonPosters.ts';\nimport { resolveSeasonTranslations } from './queries/seasonTranslations.ts';\nimport { resolveSeasonVideos } from './queries/seasonVideos.ts';\nimport { resolveTrending } from './queries/trending.ts';\nimport { resolveTv } from './queries/tv.ts';\nimport { resolveTvAlternativeTitles } from './queries/tvAlternativeTitles.ts';\nimport { resolveTvContentRatings } from './queries/tvContentRatings.ts';\nimport { resolveTvCredits } from './queries/tvCredits.ts';\nimport { resolveTvEpisodeGroups } from './queries/tvEpisodeGroups.ts';\nimport { resolveTvExternalIds } from './queries/tvExternalIds.ts';\nimport { resolveTvImages } from './queries/tvImages.ts';\nimport { resolveTvKeywords } from './queries/tvKeywords.ts';\nimport { resolveTvRecommendations } from './queries/tvRecommendations.ts';\nimport { resolveTvReviews } from './queries/tvReviews.ts';\nimport { resolveTvSimilarTvShows } from './queries/tvSimilarTvShows.ts';\nimport { resolveTvTranslations } from './queries/tvTranslations.ts';\nimport { resolveTvVideos } from './queries/tvVideos.ts';\nimport { resolveTvWatchProviders } from './queries/tvWatchProviders.ts';\nimport { resolveVideoType } from './queries/videoType.ts';\nimport { type FieldResolver, type RawMediaType, type RawMovie, type RawSearchType, type RawTv } from './types.ts';\n\nexport const resolvers: Record<string, Record<string, string | number | FieldResolver>> = {\n Certifications: {\n CA_QC: (obj: Certifications) => obj['CA-QC' as keyof Certifications],\n },\n Collection: {\n ...makeFallbackFieldResolvers('Collection', resolveCollection),\n backdrops: resolveCollectionImages,\n posters: resolveCollectionImages,\n translations: resolveCollectionTranslations,\n },\n Company: {\n ...makeFallbackFieldResolvers('Company', resolveCompany),\n alternativeNames: resolveCompanyAlternativeNames,\n logos: resolveCompanyLogos,\n },\n Configuration: {\n countries: resolveConfigurationCountries,\n jobs: resolveConfigurationJobs,\n languages: resolveConfigurationLanguages,\n primaryTranslations: resolveConfigurationPrimaryTranslations,\n timezones: resolveConfigurationTimezones,\n },\n Episode: {\n ...makeFallbackFieldResolvers('Episode', resolveEpisode),\n cast: resolveEpisodeCredits,\n crew: resolveEpisodeCredits,\n externalIds: resolveEpisodeExternalIds,\n stills: resolveEpisodeStills,\n translations: resolveEpisodeTranslations,\n videos: resolveEpisodeVideos,\n },\n Media: {\n // eslint-disable-next-line camelcase\n __resolveType: (obj: RawMediaType & { media_type: Capitalize<Lowercase<MediaType>> }) => {\n return obj.media_type;\n },\n },\n Movie: {\n ...makeFallbackFieldResolvers('Movie', resolveMovie),\n alternativeTitles: resolveMovieAlternativeTitles,\n backdrops: resolveMovieImages,\n cast: resolveMovieCredits,\n crew: resolveMovieCredits,\n externalIds: resolveMovieExternalIds,\n keywords: resolveMovieKeywords,\n logos: resolveMovieImages,\n posters: resolveMovieImages,\n recommendations: resolveMovieRecommendations,\n releaseDates: resolveMovieReleaseDates,\n reviews: resolveMovieReviews,\n similarMovies: resolveMovieSimilarMovies,\n translations: resolveMovieTranslations,\n videos: resolveMovieVideos,\n watchProviders: resolveMovieWatchProviders,\n },\n MovieReleaseType: {\n DIGITAL: 4,\n PHYSICAL: 5,\n PREMIER: 1,\n THEATRICAL: 3,\n THEATRICAL_LIMITED: 2,\n TV: 6,\n },\n MovieStatus: {\n CANCELED: 'Canceled',\n IN_PRODUCTION: 'In Production',\n PLANNED: 'Planned',\n POST_PRODUCTION: 'Post Production',\n RELEASED: 'Released',\n RUMORED: 'Rumored',\n },\n Network: {\n ...makeFallbackFieldResolvers('Network', resolveNetwork),\n alternativeNames: resolveNetworkAlternativeNames,\n logos: resolveNetworkLogos,\n },\n Person: {\n ...makeFallbackFieldResolvers('Person', resolvePerson),\n combinedCredits: resolvePersonCombinedCredits,\n externalIds: resolvePersonExternalIds,\n movieCredits: resolvePersonMovieCredits,\n profiles: resolvePersonProfiles,\n translations: resolvePersonTranslations,\n tvCredits: resolvePersonTvCredits,\n },\n Query: {\n certifications: resolveCertifications,\n collection: resolveCollection,\n company: resolveCompany,\n configuration: resolveConfiguration,\n credit: resolveCredit,\n discoverMovies: resolveDiscoverMovies,\n discoverTv: resolveDiscoverTv,\n episode: resolveEpisode,\n find: resolveFind,\n genres: resolveGenres,\n keyword: resolveKeyword,\n movie: resolveMovie,\n network: resolveNetwork,\n person: resolvePerson,\n // popular: null,\n rated: resolveRated,\n review: resolveReview,\n search: resolveSearch,\n season: resolveSeason,\n trending: resolveTrending,\n tv: resolveTv,\n },\n RatedScreen: {\n // eslint-disable-next-line camelcase\n __resolveType: (obj: (RawMovie | RawTv) & { media_type: Capitalize<Lowercase<ScreenType>> }) => {\n return obj.media_type;\n },\n },\n Search: {\n // eslint-disable-next-line camelcase\n __resolveType: (obj: RawSearchType & { media_type: Capitalize<Lowercase<SearchType>> }) => {\n return obj.media_type;\n },\n },\n Season: {\n ...makeFallbackFieldResolvers('Season', resolveSeason),\n cast: resolveSeasonCredits,\n crew: resolveSeasonCredits,\n episodeCount: resolveSeasonEpisodeCount,\n externalIds: resolveSeasonExternalIds,\n posters: resolveSeasonPosters,\n translations: resolveSeasonTranslations,\n videos: resolveSeasonVideos,\n },\n Tv: {\n ...makeFallbackFieldResolvers('Tv', resolveTv),\n alternativeTitles: resolveTvAlternativeTitles,\n backdrops: resolveTvImages,\n cast: resolveTvCredits,\n contentRatings: resolveTvContentRatings,\n crew: resolveTvCredits,\n episodeGroups: resolveTvEpisodeGroups,\n externalIds: resolveTvExternalIds,\n keywords: resolveTvKeywords,\n logos: resolveTvImages,\n posters: resolveTvImages,\n recommendations: resolveTvRecommendations,\n reviews: resolveTvReviews,\n similarTvShows: resolveTvSimilarTvShows,\n translations: resolveTvTranslations,\n videos: resolveTvVideos,\n watchProviders: resolveTvWatchProviders,\n },\n TvStatus: {\n CANCELED: 'Canceled',\n ENDED: 'Ended',\n IN_PRODUCTION: 'In Production',\n PILOT: 'Pilot',\n PLANNED: 'Planned',\n RETURNING_SERIES: 'Returning Series',\n },\n TvType: {\n DOCUMENTARY: 'Documentary',\n MINISERIES: 'Miniseries',\n NEWS: 'News',\n REALITY: 'Reality',\n SCRIPTED: 'Scripted',\n TALK_SHOW: 'Talk Show',\n VIDEO: 'Video',\n },\n Video: {\n type: resolveVideoType,\n },\n};\n","import { type RawSeason } from '../types.ts';\n\nexport const resolveSeasonEpisodeCount = (obj: RawSeason) => {\n return obj.episodes?.length ?? 0;\n};\n","import { type Video } from '@tmdb-graphql-api/schema/types';\nimport { snakeCase } from 'lodash-es';\n\nexport const resolveVideoType = ({ type }: Video) => snakeCase(type).toUpperCase();\n"],"names":["createDefaultFieldResolver","object","_arguments","_context","fieldNodes","currentField","value","name","Object","prototype","hasOwnProperty","call","snakeCase","typeMap","schema","getTypeMap","typePropNames","keys","reduce","acc","key","type","astNode","kind","Kind","OBJECT_TYPE_DEFINITION","getFields","makeFallbackFieldResolvers","typeName","resolver","propName","ALTERNATIVE_NAMES","ALTERNATIVE_TITLES","BACKDROPS","CAST","COLLECTION","COMBINED_CREDITS","COMPANY","CONFIGURATION","CONTENT_RATINGS","CREDITS","CREW","EPISODE","EPISODE_GROUPS","EXTERNAL_IDS","IMAGES","KEYWORDS","LOGOS","MOVIE","MOVIE_CREDITS","NETWORK","PERSON","POSTERS","RECOMMENDATIONS","RELEASE_DATES","REVIEWS","SEASON","SIMILAR","TRANSLATIONS","TV","TV_CREDITS","VIDEOS","WATCH_PROVIDERS","RAW_WATCH_PROVIDERS","ResolverType","Source","buildArgsResolver","fieldName","callback","async","_obj","args","ctx","info","logger","setCacheMetadata","newCtx","data","fieldPath","resolverRequestId","crypto","randomUUID","resolverType","Args","childLogger","child","JSON","stringify","logEntryName","errors","headers","length","message","error","GraphQLError","nodes","originalError","resolveCertifications","screenType","ctxData","restClient","certifications","pathTemplateData","toLowerCase","Headers","cacheControl","buildObjArgsResolver","parentFieldName","obj","id","undefined","ObjAndArgs","enrichLogMessage","enrichedMessage","String","typedFieldName","loggingEnabled","isUndefined","resolveCollection","source","ParentNode","collection","buildObjResolver","_args","Obj","resolveCollectionImages","resolveCollectionTranslations","translations","resolveCompany","company","resolveCompanyAlternativeNames","results","resolveCompanyLogos","logos","buildNoObjArgsResolver","OptsObjAndArgs","resolveConfiguration","configuration","resolveConfigurationCountries","resolveConfigurationJobs","resolveConfigurationLanguages","resolveConfigurationPrimaryTranslations","resolveConfigurationTimezones","resolveCredit","credit","removeNullValues","props","snakeCasePropNames","snakeCased","formatQueryParams","formatDirectionalSuffixes","removeConnectionInputOptions","accumulator","propertyName","replace","endsWith","resolveDiscoverMovies","makeConnectionResolver","createMakeCursors","groupCursor","makeGroupCursor","encode","makeIDCursor","createResourceResolver","page","discover","queryParams","Core","reaper","interval","store","map","totalPages","total_pages","totalResults","total_results","resultsPerPage","resolveDiscoverTv","encodeId","encodeURIComponent","getAppendToResponseKeys","parentFieldNode","appendToResponse","fragmentDefinitions","getChildFields","fieldNode","getName","includes","push","getTvIdSeasonAndEpisode","seasonNumber","episodeNumber","tv_show_id","season_number","episode_number","parsed","parse","decode","decodeURIComponent","decodeId","setAppendToResponseSearchParams","appendToResponseKeys","languageCode","append_to_response","join","include_image_language","cast","crew","guestStars","stills","resolveEpisode","episode","episodeData","Number","__headers","resolveEpisodeCredits","isEnrichedRawEpisodeWithCredits","credits","resolveEpisodeExternalIds","isEnrichedRawEpisodeWithExternalIds","movieId","rest","resolveEpisodeStills","isEnrichedRawEpisodeWithImages","images","resolveEpisodeTranslations","isEnrichedRawEpisodeWithTranslations","resolveEpisodeVideos","isEnrichedRawEpisodeWithVideos","videos","resolveFind","find","externalSource","episodes","tv_episode_results","movies","movie_results","people","person_results","seasons","tv_season_results","tv","tv_results","resolveGenres","genres","resolveKeyword","includeAdult","keyword","similarMovies","resolveMovie","movie","resolveMovieAlternativeTitles","country","isRawMovieWithAlternativeTitles","alternative_titles","titles","resolveMovieCredits","isRawMovieWithCredits","resolveMovieExternalIds","isRawMovieWithExternalIds","external_ids","resolveMovieImages","isRawMovieWithImages","resolveMovieKeywords","isRawMovieWithKeywords","keywords","resolveMovieRecommendations","isRawMovieWithRecommendations","recommendations","resolveMovieReleaseDates","isRawMovieWithReleaseDates","release_dates","resolveMovieReviews","isRawMovieWithReviews","reviews","resolveMovieSimilarMovies","isRawMovieWithSimilarMovies","similar","resolveMovieTranslations","isRawMovieWithTranslations","resolveMovieVideos","isRawMovieWithVideos","resolveMovieWatchProviders","isRawMovieWithWatchProviders","watchProviders","resolveNetwork","network","resolveNetworkAlternativeNames","resolveNetworkLogos","profiles","resolvePerson","person","resolvePersonCombinedCredits","isRawPersonWithCombinedCredits","combined_credits","personId","resolvePersonExternalIds","isRawPersonWithExternalIds","resolvePersonMovieCredits","isRawPersonWithMovieCredits","movie_credits","resolvePersonProfiles","isRawPersonWithProfiles","resolvePersonTranslations","isRawPersonWithTranslations","resolvePersonTvCredits","isRawPersonWithTvCredits","tv_credits","resolveRated","rated","tmdbGuestSessionId","entry","media_type","capitalize","resolveReview","review","resolveSearch","searchType","search","SearchType","Multi","mediaType","resolveSeason","season","number","seasonData","resolveSeasonCredits","isEnrichedRawSeasonWithCredits","resolveSeasonExternalIds","isEnrichedRawSeasonWithExternalIds","resolveSeasonPosters","isEnrichedRawSeasonWithPosters","posters","resolveSeasonTranslations","isEnrichedRawSeasonWithTranslations","resolveSeasonVideos","isEnrichedRawSeasonWithVideos","resolveTrending","timeWindow","trending","subType","TrendingMediaType","All","similarTvShows","resolveTv","tvData","resolveTvAlternativeTitles","isRawTvWithAlternativeTitles","resolveTvContentRatings","isRawTvWithContentRatings","content_ratings","resolveTvCredits","isRawTvWithCredits","resolveTvEpisodeGroups","isRawTvWithEpisodeGroups","episode_groups","resolveTvExternalIds","isRawTvWithExternalIds","tvId","resolveTvImages","isRawTvWithImages","resolveTvKeywords","isRawTvWithKeywords","resolveTvRecommendations","isRawTvWithRecommendations","resolveTvReviews","isRawTvWithReviews","resolveTvSimilarTvShows","isRawTvWithSimilarShows","cursorCache","getters","resolveTvTranslations","isRawTvWithTranslations","resolveTvVideos","isRawTvWithVideos","resolveTvWatchProviders","isRawTvWithWatchProviders","resolvers","Certifications","CA_QC","Collection","backdrops","Company","alternativeNames","Configuration","countries","jobs","languages","primaryTranslations","timezones","Episode","externalIds","Media","__resolveType","Movie","alternativeTitles","releaseDates","MovieReleaseType","DIGITAL","PHYSICAL","PREMIER","THEATRICAL","THEATRICAL_LIMITED","MovieStatus","CANCELED","IN_PRODUCTION","PLANNED","POST_PRODUCTION","RELEASED","RUMORED","Network","Person","combinedCredits","movieCredits","tvCredits","Query","discoverMovies","discoverTv","RatedScreen","Search","Season","episodeCount","Tv","contentRatings","episodeGroups","TvStatus","ENDED","PILOT","RETURNING_SERIES","TvType","DOCUMENTARY","MINISERIES","NEWS","REALITY","SCRIPTED","TALK_SHOW","VIDEO","Video","resolveVideoType","toUpperCase"],"mappings":"kpBAIO,MAAMA,EACXA,IAKA,CAACC,EAAQC,EAAYC,GAAYC,iBAC/B,MAAMC,EAAeD,EAAW,IACxBE,MAAOC,GAASF,EAAaE,KAErC,OAAIC,OAAOC,UAAUC,eAAeC,KAAKV,EAAQM,GACxCN,EAAOM,GAGTN,EAAOW,EAAUL,GAAM,ECf5BM,EAAUC,EAAOC,aAEVC,EAAgBR,OAAOS,KAAKJ,GAASK,QAAiC,CAACC,EAAKC,KACvF,MAAMC,EAAOR,EAAQO,GAMrB,OAJIC,GAAMC,SAASC,OAASC,EAAKC,yBAC/BN,EAAIC,GAAOZ,OAAOS,KAAMI,EAA2BK,cAG9CP,CAAG,GACT,ICVUQ,EAA6BA,CAACC,EAAkBC,IACzCb,EAAcY,GAEfV,QAAsC,CAACC,EAAKW,KAC3DX,EAAIW,GAAYD,EACTV,IACN,CAAE,GCTMY,EAAoB,mBACpBC,EAAqB,oBAErBC,EAAY,YAEZC,EAAO,OAEPC,EAAa,aACbC,EAAmB,kBACnBC,EAAU,UACVC,EAAgB,gBAChBC,EAAkB,iBAGlBC,EAAU,UACVC,EAAO,OAKPC,EAAU,UACVC,EAAiB,gBACjBC,EAAe,cAOfC,EAAS,SAKTC,EAAW,WAGXC,EAAQ,QAERC,EAAQ,QAERC,EAAgB,eAEhBC,EAAU,UAEVC,EAAS,SACTC,EAAU,UAKVC,EAAkB,kBAClBC,EAAgB,eAGhBC,EAAU,UAGVC,EAAS,SACTC,EAAU,UAMVC,EAAe,eAEfC,EAAK,KACLC,EAAa,YAEbC,EAAS,SAETC,EAAkB,iBAClBC,GAAsB,kBAEvBC,IAAAA,YAAAA,GAAY,OAAZA,EAAY,KAAA,OAAZA,EAAY,IAAA,MAAZA,EAAY,WAAA,eAAZA,EAAY,eAAA,oBAAZA,CAAY,EAAA,CAAA,GAOZC,YAAAA,GAAM,OAANA,EAAM,IAAA,MAANA,EAAM,MAAA,QAANA,EAAM,WAAA,aAANA,CAAM,EAAA,IC7EX,MAAMC,GACXA,CACEC,EACAC,IAMFC,MAAOC,EAAiBC,EAAYC,EAAcC,KAChD,MAAMC,OAAEA,EAAMC,iBAAEA,GAAqBH,GAC/BpE,WAAEA,GAAeqE,EAEjBG,EAAS,IACVJ,EACHK,KAAM,IACDL,EAAIK,KACPN,OACAO,UAAWX,EACXY,kBAAmBC,EAAOC,aAC1BC,aAAclB,GAAamB,OAIzBC,EAAcV,EAAOW,MAAMT,EAAOC,MAExCO,EAAYX,KAAM,aAAYN,KAAamB,KAAKC,UAAUhB,KAAS,CAAEiB,aAAc,mBACnF,MAAMX,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBtB,EAASG,EAAMK,EAAQH,GAE/D,GAAIgB,GAAQE,OAAQ,CAClB,MAAMC,EAAW,qBAAoBzB,IAErC,MADAiB,EAAYS,MAAMD,EAAS,CAAEH,OAAQH,KAAKC,UAAUE,GAASD,aAAc,oBACrE,IAAIM,EAAaF,EAAS,CAAEG,MAAO3F,EAAY4F,cAAeP,EAAO,IAC7E,CAGA,OADAd,EAAiBR,EAAWuB,GACrBb,CAAI,ECpCFoB,GAAwB/B,GFCP,kBEC5BG,MAAOE,EAAMC,KACX,MAAM0B,WAAEA,GAAe3B,GACfM,KAAMsB,EAAOC,WAAEA,GAAe5B,GAEhCK,KAAEA,EAAIY,OAAEA,SAAiBW,EAAWC,eACxC,CACEC,iBAAkB,CAAEjF,KAAM6E,EAAWK,gBAEvCJ,GAGF,MAAO,CACLtB,KAAMA,GAAMwB,eACZZ,SACAC,QAAS,IAAIc,QAAQ,CAAEC,aAAc,0BACtC,IChBQC,GACXA,CACEC,EACAvC,IAOFC,MAAOuC,EAAsBrC,EAAYC,EAAcC,KACrD,MAAMC,OAAEA,EAAMC,iBAAEA,GAAqBH,GAC/BL,UAAEA,EAAS/D,WAAEA,GAAeqE,EAC5BK,EAAY8B,EAAO,GAAED,KAAmBxC,IAAcwC,EACtDE,EAAKD,GAAO,OAAQA,GAAOA,EAAIC,GAAKD,EAAIC,GAAK,OAAQtC,EAAOA,EAAKsC,QAAKC,EAEtElC,EAAS,IACVJ,EACHK,KAAM,IACDL,EAAIK,KACPN,KAAM,IAAKA,EAAMsC,MACjB/B,UAAW6B,EACX5B,kBAAmBC,EAAOC,aAC1BC,aAAclB,GAAa+C,aAIzB3B,EAAcV,EAAOW,MAAMT,EAAOC,MAElCmC,EAAoBpB,IACxB,MAAMqB,EAAmB,GAAErB,KAAWe,IACtC,OAAOE,EAAM,GAAEI,KAAmBC,OAAOL,KAAQI,CAAe,EAG5DE,EAAiBvG,EAAUuD,GAC3BiD,IAAmBR,IAAQS,EAAYT,EAAIO,KAE7CC,GACFhC,EAAYX,KAAKuC,EAAiB,aAAc,CAAExB,aAAc,mBAGlE,MAAMX,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBtB,EAASwC,EAAKrC,EAAMK,EAAQH,GAEpE,GAAIgB,GAAQE,OAAQ,CAClB,MAAMC,EAAUoB,EAAiB,qBAMjC,MAJII,GACFhC,EAAYS,MAAMD,EAAS,CAAEH,OAAQH,KAAKC,UAAUE,GAASD,aAAc,oBAGvE,IAAIM,EAAaF,EAAS,CAAEG,MAAO3F,EAAY4F,cAAeP,EAAO,IAC7E,CAMA,OAJIC,GACFf,EAAiBG,EAAWY,GAGvBb,CAAI,ECzDFyC,GAAoBZ,GAI/BvE,GAAYkC,MAAOuC,EAAKrC,EAAMC,EAAKC,KACnC,MAAMoC,EAAKD,GAAKC,IAAMtC,EAAKsC,IACnBhC,KAAMsB,EAAOC,WAAEA,GAAe5B,GAChCL,UAAEA,GAAcM,EAChB0C,EAAiBvG,EAAUuD,GAEjC,GAAIyC,IAAQS,EAAYT,EAAIO,IAC1B,MAAO,CACLtC,KAAM+B,EAAIO,GACVI,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWqB,WACjD,CACEnB,iBAAkB,CAAEO,OAEtBV,GAGF,MAAO,CACLtB,KAAM+B,EAAM/B,IAAOsC,GAAkBtC,EACrCY,SACAC,UACD,IC7BUgC,GACXA,CACEf,EACAvC,IAMFC,MAAOuC,EAAsBe,EAAkBnD,EAAcC,KAC3D,MAAMC,OAAEA,EAAMC,iBAAEA,GAAqBH,GAC/BL,UAAEA,EAAS/D,WAAEA,GAAeqE,EAC5BK,EAAa,GAAE6B,KAAmBxC,IAElCS,EAAS,IACVJ,EACHK,KAAM,IACDL,EAAIK,KACPN,KAAMqC,GAAKC,GAAK,CAAEA,GAAID,EAAIC,SAAOC,EACjChC,YACAC,kBAAmBC,EAAOC,aAC1BC,aAAclB,GAAa4D,MAIzBxC,EAAcV,EAAOW,MAAMT,EAAOC,MAExC,IAAK+B,EAAK,CACR,MAAMhB,EAAW,YAAWe,iBAE5B,MADAvB,EAAYS,MAAMD,GACZ,IAAIE,EAAaF,EAAS,CAAEG,MAAO3F,GAC3C,CAEAgF,EAAYX,KAAM,aAAYK,IAAa,CAAEU,aAAc,mBAC3D,MAAMX,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBtB,EAASwC,EAAKhC,EAAQH,GAE9D,GAAIgB,GAAQE,OAAQ,CAClB,MAAMC,EAAW,qBAAoBd,IAErC,MADAM,EAAYS,MAAMD,EAAS,CAAEH,OAAQH,KAAKC,UAAUE,GAASD,aAAc,oBACrE,IAAIM,EAAaF,EAAS,CAAEG,MAAO3F,EAAY4F,cAAeP,EAAO,IAC7E,CAMA,OAJIC,GACFf,EAAiBG,EAAWY,GAGvBb,CAAI,EC/CFgD,GAA0BH,GAGrCvF,GAAYkC,MAAOuC,EAAKpC,EAAKC,KAC7B,MAAQI,KAAMsB,EAAOC,WAAEA,GAAe5B,GAChCL,UAAEA,GAAcM,GAEhBI,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWqB,WACjD,CACEnB,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMwB,IAExCsD,GAGIgB,EAAiBhD,EAEvB,MAAO,CACLU,KAAMA,IAAOsC,GACb1B,SACAC,UACD,ICpBUoC,GAAgCJ,GAC3CvF,GACAkC,MAAOuC,EAAKpC,KACV,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,GAEhCK,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWqB,WACjD,CACEnB,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMqC,IAExCyC,GAGF,MAAO,CACLtB,KAAMA,GAAMkD,aACZtC,SACAC,UACD,ICdQsC,GAAiBtB,GAI5BrE,GAASgC,MAAOuC,EAAKrC,EAAMC,EAAKC,KAChC,MAAMoC,EAAKD,GAAKC,IAAMtC,EAAKsC,IACnBhC,KAAMsB,EAAOC,WAAEA,GAAe5B,GAChCL,UAAEA,GAAcM,EAChB0C,EAAiBvG,EAAUuD,GAEjC,GAAIyC,IAAQS,EAAYT,EAAIO,IAC1B,MAAO,CACLtC,KAAM+B,EAAIO,GACVI,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW6B,QACjD,CACE3B,iBAAkB,CAAEO,OAEtBV,GAGF,MAAO,CACLtB,KAAM+B,EAAM/B,IAAOsC,GAAkBtC,EACrCY,SACAC,UACD,IC7BUwC,GAAiCR,GAC5CrF,GACAgC,MAAOuC,EAAKpC,KACV,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,GAEhCK,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW6B,QACjD,CACE3B,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMT,EAAUmB,KAElDoE,GAGF,MAAO,CACLtB,KAAMA,GAAMsD,QACZ1C,SACAC,UACD,ICjBQ0C,GAAsBV,GAAuDrF,GAASgC,MAAOuC,EAAKpC,KAC7G,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,GAEhCK,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW6B,QACjD,CACE3B,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMwB,IAExCsD,GAGF,MAAO,CACLtB,KAAMA,GAAMwD,MACZ5C,SACAC,UACD,ICbU4C,GACXA,CACE3B,EACAvC,IAKFC,MAAOuC,EAAsBe,EAAkBnD,EAAcC,KAC3D,MAAMC,OAAEA,EAAMC,iBAAEA,GAAqBH,GAC/BL,UAAEA,EAAS/D,WAAEA,GAAeqE,EAC5BK,EAAY8B,EAAO,GAAED,KAAmBxC,IAAcwC,EAEtD/B,EAAS,IACVJ,EACHK,KAAM,IACDL,EAAIK,KACPN,UAAMuC,EACNhC,YACAC,kBAAmBC,EAAOC,aAC1BC,aAAclB,GAAauE,iBAIzBnD,EAAcV,EAAOW,MAAMT,EAAOC,MACxCO,EAAYX,KAAM,aAAYK,IAAa,CAAEU,aAAc,mBAC3D,MAAMX,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBtB,EAASQ,EAAQH,GAEzD,GAAIgB,GAAQE,OAAQ,CAClB,MAAMC,EAAW,qBAAoBd,IAErC,MADAM,EAAYS,MAAMD,EAAS,CAAEH,OAAQH,KAAKC,UAAUE,GAASD,aAAc,oBACrE,IAAIM,EAAaF,EAAS,CAAEG,MAAO3F,EAAY4F,cAAeP,EAAO,IAC7E,CAGA,OADAd,EAAiBG,EAAWY,GACrBb,CAAI,ECpCF2D,GAAuBF,GAAoDhG,GAAe+B,UACrG,MAAQQ,KAAMsB,EAAOC,WAAEA,GAAe5B,GAChCK,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWqC,mBAAgC3B,EAAWX,GAE9F,MAAO,CACLtB,OACAY,SACAC,UACD,ICRUgD,GAAgCJ,GAC3ChG,GACA+B,UACE,MAAQQ,KAAMsB,EAAOC,WAAEA,GAAe5B,GAEhCK,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWqC,cACjD,CACEnC,iBAAkB,CAAEjF,KbCH,caCnB8E,GAGF,MAAO,CACLtB,OACAY,SACAC,UACD,IChBQiD,GAA2BL,GACtChG,GACA+B,UACE,MAAQQ,KAAMsB,EAAOC,WAAEA,GAAe5B,GAEhCK,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWqC,cACjD,CACEnC,iBAAkB,CAAEjF,KdoBR,SclBd8E,GAGF,MAAO,CACLtB,OACAY,SACAC,UACD,IChBQkD,GAAgCN,GAC3ChG,GACA+B,UACE,MAAQQ,KAAMsB,EAAOC,WAAEA,GAAe5B,GAEhCK,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWqC,cACjD,CACEnC,iBAAkB,CAAEjF,KfyBH,cevBnB8E,GAGF,MAAO,CACLtB,OACAY,SACAC,UACD,ICfQmD,GAA0CP,GAGrDhG,GAAe+B,UACf,MAAQQ,KAAMsB,EAAOC,WAAEA,GAAe5B,GAEhCK,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWqC,cACjD,CACEnC,iBAAkB,CAAEjF,KAAMT,EhBkCI,yBgBhChCuF,GAGF,MAAO,CACLtB,OACAY,SACAC,UACD,IClBUoD,GAAgCR,GAC3ChG,GACA+B,UACE,MAAQQ,KAAMsB,EAAOC,WAAEA,GAAe5B,GAEhCK,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWqC,cACjD,CACEnC,iBAAkB,CAAEjF,KjBqDH,ciBnDnB8E,GAGF,MAAO,CACLtB,OACAY,SACAC,UACD,ICfQqD,GAAgB7E,GlBQP,UkBR6DG,MAAOE,EAAMC,KAC9F,MAAMqC,GAAEA,GAAOtC,GACPM,KAAMsB,EAAOC,WAAEA,GAAe5B,GAEhCK,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW4C,OACjD,CACE1C,iBAAkB,CAAEO,OAEtBV,GAGF,MAAO,CACLtB,OACAY,SACAC,UACD,IClBUuD,GAA2CC,GACtD1I,OAAOS,KAAKiI,GAAOhI,QAAoB,CAACC,EAAKW,KACnB,OAApBoH,EAAMpH,KAIVX,EAAIW,GAAYoH,EAAMpH,IAHbX,IAKR,ICNQgI,GAA6CD,GACxD1I,OAAOS,KAAKiI,GAAOhI,QAAoB,CAACkI,EAAYtH,KAClDsH,EAAWxI,EAAUkB,IAAaoH,EAAMpH,GACjCsH,IACN,ICFQC,GAAqB9E,IAChC+E,OCJ+DJ,EDIrCC,GAAmBF,GAAiBM,EAA6BhF,KCH3F/D,OAAOS,KAAKiI,GAAOhI,QAAoB,CAACsI,EAAaC,KAC9B,YAAjBA,EACFD,EAAYC,GAAiBP,EAAMO,GAAyBlD,cAAcmD,QAAQ,aAAc,OACvFD,EAAaE,SAAS,SAAWF,EAAaE,SAAS,QAChEH,EAAYC,EAAaC,QAAQ,aAAc,QAAUR,EAAMO,GAE/DD,EAAYC,GAAgBP,EAAMO,GAG7BD,IACN,IAX4DN,KDIoC,EEoDxFU,GAAwBC,EAAuB,mBAzC3BC,CAACxF,EAAiBC,KACjD,MAAMwF,EAAe,GAAEzE,KAAKC,UAAU0D,GAAiBM,EAA6BhF,uBAEpF,MAAO,CACLyF,gBAAiBA,IAAMC,EAAOF,GAC9BG,aAAerD,GAAwBoD,EAAQ,GAAEpD,MAAOkD,KACzD,yBASDI,CAAC7F,EAAMC,GAAQM,KAAMsB,EAASC,gBAC9B/B,OAAS+F,UACPhE,EAAWiE,SACT,CACE/D,iBAAkB,CAAEjF,KAAM2B,GAC1BsH,YAAa,IAAKjB,GAAkB9E,GAAO6F,SAE7CjE,eAGqB,IAAIoE,EAAK,CAClChK,KAAM,sCACNiK,OAAQA,EAAO,CAAEC,SAAU,MAC3BC,MAAOC,IACPtJ,KAAM,oBAGqD,CAG3D0E,MAAOA,EAAGoC,UAAU,MAASA,EAC7BiC,KAAMA,EAAGA,OAAO,KAAQA,EACxBQ,WAAYA,EAAGC,cAAc,KAAQA,EACrCC,aAAcA,EAAGC,gBAAgB,KAAQA,GAQzCC,eAAgB,KCVLC,GAAoBpB,EAAuB,mBApCvBC,CAACxF,EAAiBC,KACjD,MAAMwF,EAAe,GAAEzE,KAAKC,UAAU0D,GAAiBM,EAA6BhF,mBAEpF,MAAO,CACLyF,gBAAiBA,IAAMC,EAAOF,GAC9BG,aAAerD,GAAwBoD,EAAQ,GAAEpD,MAAOkD,KACzD,yBAIDI,CAAC7F,EAAMC,GAAQM,KAAMsB,EAASC,gBAC9B/B,OAAS+F,UACPhE,EAAWiE,SACT,CACE/D,iBAAkB,CAAEjF,KAAMsC,GAC1B2G,YAAa,IAAKjB,GAAkB9E,GAAO6F,SAE7CjE,eAGqB,IAAIoE,EAAK,CAClChK,KAAM,kCACNiK,OAAQA,EAAO,CAAEC,SAAU,MAC3BC,MAAOC,IACPtJ,KAAM,oBAG8C,CAGpD0E,MAAOA,EAAGoC,UAAU,MAASA,EAC7BiC,KAAMA,EAAGA,OAAO,KAAQA,EACxBQ,WAAYA,EAAGC,cAAc,KAAQA,EACrCC,aAAcA,EAAGC,gBAAgB,KAAQA,GAQzCC,eAAgB,KCxDLE,GAAkCtE,GAAWuE,mBAAmBlB,EAAO3E,KAAKC,UAAUqB,KCCtFwE,GAA0BA,CACrCC,EACAC,EACAC,KAECC,EAAeH,EAAiB,CAAEE,yBAA0B,IAAIrK,QAAO,CAACC,GAAiBsK,gBACxF,MAAMlL,EAAOmL,EAAQD,GAErB,IAAKlL,EACH,OAAOY,EAGT,MAAMC,EAAMkK,EAAiB/K,GAE7B,OAAKa,GAIAD,EAAIwK,SAASvK,IAChBD,EAAIyK,KAAKxK,GAGJD,GAPEA,CAOC,GACT,ICvBQ0K,GAA0BA,CACrCjF,EACArC,KAEA,IAAIsC,EACAiF,EACAC,EAEJ,GAAInF,EACFC,EAAKD,EAAIoF,WACTF,EAAelF,EAAIqF,eAAiB,EACpCF,EAAgB,mBAAoBnF,EAAMA,EAAIsF,oBAAiBpF,MAC1D,CACL,MAAMqF,ECdqCtF,IAAevB,KAAK8G,MAAMC,EAAOC,mBAAmBzF,KDchF0F,CAAuEhI,EAAKsC,IAC3FA,EAAKsF,EAAOtF,GACZiF,EAAeK,EAAOL,aACtBC,EAAgBI,EAAOJ,aACzB,CAEA,MAAO,CAAEA,gBAAelF,KAAIiF,eAAc,EErB/BU,GAAkCA,CAC7CC,EACAC,KAEO,CACLC,mBAAoBF,EAAqBG,KAAK,QAC1CF,GAAgBD,EAAqBd,SAAS9I,GAC9C,CAAEgK,uBAAyB,GAAEH,UAC7B,KCAFpB,GAAmB,CACvB1I,CAACA,GAAehC,EAAUgC,GAC1Bc,CAACA,GAAeA,EAChBG,CAACA,GAASA,EACViJ,KAAMtK,EACNuK,KAAMvK,EACNwK,WAAYxK,EACZyK,OAAQpK,GAGGqK,GAAiBxG,GAK5BhE,GAAS2B,MAAOuC,EAAKrC,EAAMC,EAAKC,KAChC,MAAQI,KAAMsB,EAAOoF,oBAAEA,EAAmBmB,aAAEA,EAAYtG,WAAEA,GAAe5B,GACnEL,UAAEA,EAAS/D,WAAEA,GAAeqE,EAC5B0C,EAAiBvG,EAAUuD,IAC3B4H,cAAEA,EAAalF,GAAEA,EAAEiF,aAAEA,GAAiBD,GAAwBjF,EAAKrC,GAEzE,GAAIqC,IAAQS,EAAYT,EAAIO,IAC1B,MAAO,CACLtC,KACqB,OAAnBsC,EACI+D,GAAS,CAAErE,KAAIiF,kBAAkBC,EAAgB,CAAEA,iBAAkB,KACrEnF,EAAIO,GACVI,OAAQtD,GAAOuD,YAInB,MAAMiF,EAAuBrB,GAAwBhL,EAAW,GAAKkL,GAAkBC,IAEjF1G,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW+G,QACjD,CACE7G,iBAAkB,CAAEyF,gBAAelF,KAAIiF,mBACnCW,EAAqB9G,OAAS,EAC9B,CACE2E,YAAa,IACRkC,GAAgCC,EAAsBC,KAG7D,IAENvG,GAGIiH,EAAc,IACfvI,EACHgC,GAAIqE,GAAS,CAAErE,KAAIiF,kBAAkBC,EAAgB,CAAEA,iBAAkB,KACzEC,WAAYqB,OAAOxG,IAGrB,MAAO,CACLhC,KAAM+B,EACFwG,EAAYjG,GACZsF,EAAqB9G,OAAS,EAC9B,IAAKyH,EAAaE,UAAW5H,GAC7B0H,EACJ3H,SACAC,UACD,IC1DU6H,GAAwB7F,GAGnChF,GAAS2B,MAAOuC,EAAKpC,EAAKC,KAC1B,MAAQI,KAAMsB,EAAOC,WAAEA,GAAe5B,GAChCL,UAAEA,GAAcM,EAChB0C,EAAiBvG,EAAUuD,GAEjC,GAXAyC,IAC2EpE,KAAWoE,GAAO,cAAeA,EAUxG4G,CAAgC5G,GAClC,MAAO,CACL/B,KAAM+B,EAAI6G,UAAUtG,GACpBzB,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW+G,QACjD,CACE7G,iBAAkB,CAChByF,cAAenF,EAAIsF,eACnBrF,GAAID,EAAIoF,WACRF,aAAclF,EAAIqF,cAClB5K,KAAMmB,IAGV2D,GAGF,MAAO,CACLtB,KAAMA,IAAOsC,GACb1B,SACAC,UACD,IC9BUgI,GAA4BhG,GAGvChF,GAAS2B,MAAOuC,EAAKpC,EAAKC,KAC1B,MAAQI,KAAMsB,EAAOC,WAAEA,GAAe5B,GAChCL,UAAEA,GAAcM,EAChB0C,EAAiBvG,EAAUuD,GAEjC,GAZAyC,IAEAhG,EAAUgC,KAAiBgE,GAAO,cAAeA,EAU7C+G,CAAoC/G,GACtC,MAAO,CACL/B,KAAM+B,EAAIO,GACVzB,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW+G,QACjD,CACE7G,iBAAkB,CAChByF,cAAenF,EAAIsF,eACnBrF,GAAID,EAAIoF,WACRF,aAAclF,EAAIqF,cAClB5K,KAAM8F,IAGVhB,IAGMU,GAAI+G,KAAYC,GAAShJ,GAAQ,CAAA,EAEzC,MAAO,CACLA,KAAMgJ,EACNpI,SACAC,UACD,ICpCUoI,GAAuBpG,GAGlChF,GAAS2B,MAAOuC,EAAKpC,EAAKC,KAC1B,MAAQI,KAAMsB,EAAOC,WAAEA,GAAe5B,GAChCL,UAAEA,GAAcM,EAChB0C,EAAiBvG,EAAUuD,GAEjC,GAXAyC,IAC2E/D,KAAU+D,GAAO,cAAeA,EAUvGmH,CAA+BnH,GACjC,MAAO,CACL/B,KAAM+B,EAAIoH,SAAS7G,GACnBzB,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW+G,QACjD,CACE7G,iBAAkB,CAChByF,cAAenF,EAAIsF,eACnBrF,GAAID,EAAIoF,WACRF,aAAclF,EAAIqF,cAClB5K,KAAMwB,IAGVsD,GAGF,MAAO,CACLtB,KAAMA,IAAOsC,GACb1B,SACAC,UACD,ICjCUuI,GAA6BvG,GAGxChF,GAAS2B,MAAOuC,EAAKpC,KACrB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GATAoC,IAC2ElD,KAAgBkD,GAAO,cAAeA,EAQ7GsH,CAAqCtH,GACvC,MAAO,CACL/B,KAAM+B,EAAImB,cAAcA,aACxBrC,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW+G,QACjD,CACE7G,iBAAkB,CAChByF,cAAenF,EAAIsF,eACnBrF,GAAID,EAAIoF,WACRF,aAAclF,EAAIqF,cAClB5K,KAAMqC,IAGVyC,GAGF,MAAO,CACLtB,KAAMA,GAAMkD,aACZtC,SACAC,UACD,IC9BUyI,GAAuBzG,GAGlChF,GAAS2B,MAAOuC,EAAKpC,KACrB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GATAoC,IAC2E/C,KAAU+C,GAAO,cAAeA,EAQvGwH,CAA+BxH,GACjC,MAAO,CACL/B,KAAM+B,EAAIyH,QAAQlG,QAClBzC,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW+G,QACjD,CACE7G,iBAAkB,CAChByF,cAAenF,EAAIsF,eACnBrF,GAAID,EAAIoF,WACRF,aAAclF,EAAIqF,cAClB5K,KAAMwC,IAGVsC,GAGF,MAAO,CACLtB,KAAMA,GAAMsD,QACZ1C,SACAC,UACD,IC5BU4I,GAAcpK,GpCUP,QoCVoDG,MAAOE,EAAMC,KACnF,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,GAEhCK,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWmI,KACjD,CACEjI,iBAAkB,CAAEO,GAAItC,EAAKsC,IAC7ByD,YAAa,IAAKnB,GAAmB,CAAEqF,eAAgBjK,EAAKgD,WAE9DpB,GAGF,MAAO,CACLtB,KAAM,CACJ4J,SAAU5J,GAAM6J,mBAChBC,OAAQ9J,GAAM+J,cACdC,OAAQhK,GAAMiK,eACdC,QAASlK,GAAMmK,kBACfC,GAAIpK,GAAMqK,YAEZzJ,SACAC,UACD,IC9BUyJ,GAAgBjL,GrCqBP,UqCrBuEG,MAAOE,EAAMC,KACxG,MAAM0B,WAAEA,GAAe3B,GACfM,KAAMsB,EAAOC,WAAEA,GAAe5B,GAEhCK,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWgJ,OACjD,CACE9I,iBAAkB,CAAEjF,KAAM6E,EAAWK,gBAEvCJ,GAGF,MAAO,CACLtB,KAAMA,GAAMuK,OACZ3J,SACAC,UACD,ICdU2J,GAAiBnL,GtC2BP,WsC3BgEG,MAAOE,EAAMC,KAClG,MAAMqC,GAAEA,EAAEyI,aAAEA,GAAiB/K,GACrBM,KAAMsB,EAAOC,WAAEA,GAAe5B,GAEhCK,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWmJ,QACjD,CACEjJ,iBAAkB,CAAEO,MACpByD,YAAa,IAAKnB,GAAmB,CAAEmG,mBAEzCnJ,GAGF,MAAO,CACLtB,OACAY,SACAC,UACD,ICOG4F,GAAmB,CACvBtJ,CAACA,GAAqBpB,EAAUoB,GAChCC,CAACA,GAAYY,EACbX,CAACA,GAAOM,EACRC,CAACA,GAAOD,EACRI,CAACA,GAAehC,EAAUgC,GAC1BE,CAACA,GAAWA,EACZC,CAACA,GAAQF,EACTO,CAACA,GAAUP,EACXQ,CAACA,GAAkBA,EACnBC,CAACA,GAAgB1C,EAAU0C,GAC3BC,CAACA,GAAUA,EACXiM,cAAkB/L,EAClBC,CAACA,GAAeA,EAChBG,CAACA,GAASA,EACVC,CAACA,GAAkB,mBAGR2L,GAAe/I,GAK1B1D,GAAOqB,MAAOuC,EAAKrC,EAAMC,EAAKC,KAC9B,MAAQI,KAAMsB,EAAOoF,oBAAEA,EAAmBmB,aAAEA,EAAYtG,WAAEA,GAAe5B,GACnEL,UAAEA,EAAS/D,WAAEA,GAAeqE,EAC5B0C,EAAiBvG,EAAUuD,GAEjC,GAAIyC,IAAQS,EAAYT,EAAIO,IAC1B,MAAO,CACLtC,KAAM+B,EAAIO,GACVI,OAAQtD,GAAOuD,YAInB,MAAMX,EAAKD,EAAMA,EAAIC,GAAKtC,EAAKsC,GACzB4F,EAAuBrB,GAAwBhL,EAAW,GAAKkL,GAAkBC,IAEjF1G,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWsJ,MACjD,CACEpJ,iBAAkB,CAAEO,SAChB4F,EAAqB9G,OAAS,EAC9B,CACE2E,YAAa,IACRkC,GAAgCC,EAAsBC,KAG7D,IAENvG,GAGF,MAAO,CACLtB,KAAM+B,EAAM/B,IAAOsC,GAAkBsF,EAAqB9G,OAAS,EAAI,IAAKd,EAAMyI,UAAW5H,GAAYb,EACzGY,SACAC,UACD,ICzEUiK,GAAgCjJ,GAI3C1D,GAAOqB,MAAOuC,EAAKrC,EAAMC,EAAKC,KAC9B,MAAMmL,QAAEA,GAAYrL,GACZM,KAAMsB,EAAOzB,OAAEA,EAAM0B,WAAEA,GAAe5B,GACxCpE,WAAEA,GAAeqE,EAEvB,IAAKmC,EAAK,CACR,MAAMhB,EAAW,YAAW5D,iBAE5B,MADA0C,EAAOmB,MAAMD,GACP,IAAIE,EAAaF,EAAS,CAAEG,MAAO3F,GAC3C,CAEA,GAnBAwG,IAEAhG,EAAUoB,KAAuB4E,GAAO,cAAeA,EAiBnDiJ,CAAgCjJ,GAClC,MAAO,CACL/B,KAAM+B,EAAIkJ,oBAAoBC,OAC9BrK,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWsJ,MACjD,CACEpJ,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMT,EAAUoB,IAChDsI,YAAa,CAAEsF,YAEjBzJ,GAGF,MAAO,CACLtB,KAAMA,GAAMkL,OACZtK,SACAC,UACD,ICvCUsK,GAAsBtI,GAGjC1E,GAAOqB,MAAOuC,EAAKpC,EAAKC,KACxB,MAAQI,KAAMsB,EAAOC,WAAEA,GAAe5B,GAChCL,UAAEA,GAAcM,EAChB0C,EAAiBhD,EAEvB,GAXAyC,IACiEpE,KAAWoE,GAAO,cAAeA,EAU9FqJ,CAAsBrJ,GACxB,MAAO,CACL/B,KAAM+B,EAAI6G,UAAUtG,GACpBzB,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWsJ,MACjD,CACEpJ,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMmB,IAExC2D,GAGF,MAAO,CACLtB,KAAMA,IAAOsC,GACb1B,SACAC,UACD,ICzBUwK,GAA0BxI,GAGrC1E,GAAOqB,MAAOuC,EAAKpC,KACnB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GATAoC,IACiEhG,EAAUgC,KAAiBgE,GAAO,cAAeA,EAQ9GuJ,CAA0BvJ,GAC5B,MAAO,CACL/B,KAAM+B,EAAIwJ,aACV1K,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWsJ,MACjD,CACEpJ,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMT,EAAUgC,KAElDuD,IAGMU,GAAI+G,KAAYC,GAAShJ,EAEjC,MAAO,CACLA,KAAMgJ,EACNpI,SACAC,UACD,IC7BU2K,GAAqB3I,GAGhC1E,GAAOqB,MAAOuC,EAAKpC,EAAKC,KACxB,MAAQI,KAAMsB,EAAOC,WAAEA,GAAe5B,GAChCL,UAAEA,GAAcM,EAChB0C,EAAiBhD,EAEvB,GAXAyC,IACiE/D,KAAU+D,GAAO,cAAeA,EAU7F0J,CAAqB1J,GACvB,MAAO,CACL/B,KAAM+B,EAAIoH,SAAS7G,GACnBzB,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWsJ,MACjD,CACEpJ,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMwB,IAExCsD,GAGF,MAAO,CACLtB,KAAMA,IAAOsC,GACb1B,SACAC,UACD,IC3BU6K,GAAuB7I,GAGlC1E,GAAOqB,MAAOuC,EAAKpC,KACnB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GATAoC,IACiE9D,KAAY8D,GAAO,cAAeA,EAQ/F4J,CAAuB5J,GACzB,MAAO,CACL/B,KAAM+B,EAAI6J,UAAUA,SACpB/K,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWsJ,MACjD,CACEpJ,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMyB,IAExCqD,GAGF,MAAO,CACLtB,KAAMA,GAAM4L,SACZhL,SACAC,UACD,IC2CUgL,GAA8B7G,EAAuB,mBA5DhCjD,IAChC,MAAMmD,EAAe,GAAEnD,EAAIC,OAAO7D,MAAUK,IAE5C,MAAO,CACL2G,gBAAiBA,IAAMC,EAAOF,GAC9BG,aAAerD,GAAwBoD,EAAQ,GAAEpD,MAAOkD,KACzD,yBAeDI,CAACvD,EAAKe,GAAS9C,KAAMsB,EAASC,gBAC9B/B,OAAS+F,WACP,GAdkCuG,EACpC/J,EACAwD,IAEA/G,KAAmBuD,GAAOA,EAAIgK,iBAAiBxG,OAASA,GAAQ,cAAexD,EAUzE+J,CAA8B/J,EAAKwD,GACrC,MAAO,CACLvF,KAAM+B,EAAIgK,gBACVlL,QAASkB,EAAI0G,WAIjB,MAAMzI,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWsJ,MACjD,CACEpJ,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMgC,GACtCiH,YAAa,CAAEF,SAEjBjE,GAGF,MAAO,CACLtB,OACAY,SACAC,UACD,cAGsB,IAAI6E,EAAK,CAClChK,KAAM,4CACNiK,OAAQA,EAAO,CAAEC,SAAU,MAC3BC,MAAOC,IACPtJ,KAAM,oBAG2D,CAEjE0E,MAAOA,EAAGoC,UAAU,MAASA,EAC7BiC,KAAMA,EAAGA,OAAO,KAAQA,EACxBQ,WAAYA,EAAGC,cAAc,KAAQA,EACrCC,aAAcA,EAAGC,gBAAgB,KAAQA,GAQzCC,eAAgB,KCvEL6F,GAA2BnJ,GAGtC1E,GAAOqB,MAAOuC,EAAKpC,KACnB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GAVAoC,IAEAhG,EAAU0C,KAAkBsD,GAAO,cAAeA,EAQ9CkK,CAA2BlK,GAC7B,MAAO,CACL/B,KAAM+B,EAAImK,eAAe5I,QACzBzC,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWsJ,MACjD,CACEpJ,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMT,EAAU0C,KAElD6C,GAGF,MAAO,CACLtB,KAAMA,GAAMsD,QACZ1C,SACAC,UACD,IC4CUsL,GAAsBnH,EAAuB,mBA9DxBjD,IAChC,MAAMmD,EAAe,GAAEnD,EAAIC,OAAO7D,MAAUO,IAE5C,MAAO,CACLyG,gBAAiBA,IAAMC,EAAOF,GAC9BG,aAAerD,GAAwBoD,EAAQ,GAAEpD,MAAOkD,KACzD,yBAeDI,CAACvD,EAAKe,GAAS9C,KAAMsB,EAASC,gBAC9B/B,OAAS+F,WACP,GAd0B6G,EAC5BrK,EACAwD,IAEA7G,KAAWqD,GAAOA,EAAIsK,SAAS9G,OAASA,GAAQ,cAAexD,EAUzDqK,CAAsBrK,EAAKwD,GAC7B,MAAO,CACLvF,KAAM+B,EAAIsK,QACVxL,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWsJ,MACjD,CACEpJ,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMkC,GACtC+G,YAAa,CAAEF,SAEjBjE,GAGF,MAAO,CACLtB,OACAY,SACAC,UACD,cAGsB,IAAI6E,EAAK,CAClChK,KAAM,oCACNiK,OAAQA,EAAO,CAAEC,SAAU,MAC3BC,MAAOC,IACPtJ,KAAM,oBAGoD,CAG1D0E,MAAOA,EAAGoC,UAAU,MAASA,EAC7BiC,KAAMA,EAAGA,OAAO,KAAQA,EACxBQ,WAAYA,EAAGC,cAAc,KAAQA,EACrCC,aAAcA,EAAGC,gBAAgB,KAAQA,GAQzCC,eAAgB,KCRLmG,GAA4BtH,EAAuB,mBA5D9BjD,IAChC,MAAMmD,EAAe,GAAEnD,EAAIC,OAAO7D,MAAUS,IAE5C,MAAO,CACLuG,gBAAiBA,IAAMC,EAAOF,GAC9BG,aAAerD,GAAwBoD,EAAQ,GAAEpD,MAAOkD,KACzD,yBAeDI,CAACvD,EAAKe,GAAS9C,KAAMsB,EAASC,gBAC9B/B,OAAS+F,WACP,GAdgCgH,EAClCxK,EACAwD,IAEA3G,KAAWmD,GAAOA,EAAIyK,SAASjH,OAASA,GAAQ,cAAexD,EAUzDwK,CAA4BxK,EAAKwD,GACnC,MAAO,CACLvF,KAAM+B,EAAIyK,QACV3L,QAASkB,EAAI0G,WAIjB,MAAMzI,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWsJ,MACjD,CACEpJ,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMoC,GACtC6G,YAAa,CAAEF,SAEjBjE,GAGF,MAAO,CACLtB,OACAY,SACAC,UACD,cAGsB,IAAI6E,EAAK,CAClChK,KAAM,2CACNiK,OAAQA,EAAO,CAAEC,SAAU,MAC3BC,MAAOC,IACPtJ,KAAM,oBAGyD,CAE/D0E,MAAOA,EAAGoC,UAAU,MAASA,EAC7BiC,KAAMA,EAAGA,OAAO,KAAQA,EACxBQ,WAAYA,EAAGC,cAAc,KAAQA,EACrCC,aAAcA,EAAGC,gBAAgB,KAAQA,GAQzCC,eAAgB,KCzELsG,GAA2B5J,GAGtC1E,GAAOqB,MAAOuC,EAAKpC,KACnB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GATAoC,IACiElD,KAAgBkD,GAAO,cAAeA,EAQnG2K,CAA2B3K,GAC7B,MAAO,CACL/B,KAAM+B,EAAImB,cAAcA,aACxBrC,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWsJ,MACjD,CACEpJ,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMqC,IAExCyC,GAGF,MAAO,CACLtB,KAAMA,GAAMkD,aACZtC,SACAC,UACD,ICzBU8L,GAAqB9J,GAGhC1E,GAAOqB,MAAOuC,EAAKpC,KACnB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GATAoC,IACiE/C,KAAU+C,GAAO,cAAeA,EAQ7F6K,CAAqB7K,GACvB,MAAO,CACL/B,KAAM+B,EAAIyH,QAAQlG,QAClBzC,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWsJ,MACjD,CACEpJ,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMwC,IAExCsC,GAGF,MAAO,CACLtB,KAAMA,GAAMsD,QACZ1C,SACAC,UACD,ICzBUgM,GAA6BhK,GAGxC1E,GAAOqB,MAAOuC,EAAKpC,KACnB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GATAoC,IACiE7C,MAAuB6C,GAAO,cAAeA,EAQ1G+K,CAA6B/K,GAC/B,MAAO,CACL/B,KAAM+B,EAAI,oBAAoBuB,QAC9BzC,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWwL,eACjD,CACEtL,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAM2B,IAExCmD,GAGF,MAAO,CACLtB,KAAMA,GAAMsD,QACZ1C,SACAC,UACD,IC3BUmM,GAAiBnL,GAI5BxD,GAASmB,MAAOuC,EAAKrC,EAAMC,EAAKC,KAChC,MAAMoC,EAAKD,EAAMA,EAAIC,GAAKtC,EAAKsC,IACvBhC,KAAMsB,EAAOC,WAAEA,GAAe5B,GAChCL,UAAEA,GAAcM,EAChB0C,EAAiBvG,EAAUuD,GAEjC,GAAIyC,IAAQS,EAAYT,EAAIO,IAC1B,MAAO,CACLtC,KAAM+B,EAAIO,GACVI,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW0L,QACjD,CACExL,iBAAkB,CAAEO,OAEtBV,GAGF,MAAO,CACLtB,KAAM+B,EAAM/B,IAAOsC,GAAkBtC,EACrCY,SACAC,UACD,IC7BUqM,GAAiCrK,GAC5CxE,GACAmB,MAAOuC,EAAKpC,KACV,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,GAEhCK,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW0L,QACjD,CACExL,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMT,EAAUmB,KAElDoE,GAGF,MAAO,CACLtB,KAAMA,GAAMsD,QACZ1C,SACAC,UACD,ICjBQsM,GAAsBtK,GAAuDxE,GAASmB,MAAOuC,EAAKpC,KAC7G,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,GAEhCK,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW0L,QACjD,CACExL,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMwB,IAExCsD,GAGF,MAAO,CACLtB,KAAMA,GAAMwD,MACZ5C,SACAC,UACD,ICAG4F,GAAmB,CACvBlJ,CAACA,GAAmBxB,EAAUwB,GAC9BQ,CAACA,GAAehC,EAAUgC,GAC1BK,CAACA,GAAgBrC,EAAUqC,GAC3BgP,SAAYpP,EACZa,CAACA,GAAeA,EAChBE,CAACA,GAAahD,EAAUgD,IAGbsO,GAAgBxL,GAK3BvD,GAAQkB,MAAOuC,EAAKrC,EAAMC,EAAKC,KAC/B,MAAQI,KAAMsB,EAAOoF,oBAAEA,EAAmBmB,aAAEA,EAAYtG,WAAEA,GAAe5B,GACnEL,UAAEA,EAAS/D,WAAEA,GAAeqE,EAC5B0C,EAAiBvG,EAAUuD,GAEjC,GAAIyC,IAAQS,EAAYT,EAAIO,IAC1B,MAAO,CACLtC,KAAM+B,EAAIO,GACVI,OAAQtD,GAAOuD,YAInB,MAAMX,EAAKD,EAAMA,EAAIC,GAAKtC,EAAKsC,GACzB4F,EAAuBrB,GAAwBhL,EAAW,GAAKkL,GAAkBC,IAEjF1G,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW+L,OACjD,CACE7L,iBAAkB,CAAEO,SAChB4F,EAAqB9G,OAAS,EAC9B,CACE2E,YAAa,IACRkC,GAAgCC,EAAsBC,KAG7D,IAENvG,GAGF,MAAO,CACLtB,KAAM+B,EAAM/B,IAAOsC,GAAkBsF,EAAqB9G,OAAS,EAAI,IAAKd,EAAMyI,UAAW5H,GAAYb,EACzGY,SACAC,UACD,ICtDU0M,GAA+B1K,GAG1CvE,GAAQkB,MAAOuC,EAAKpC,KACpB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GAVAoC,IAEAhG,EAAUwB,KAAqBwE,GAAO,cAAeA,EAQjDyL,CAA+BzL,GACjC,MAAO,CACL/B,KAAM+B,EAAI0L,iBACV5M,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW+L,OACjD,CACE7L,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMT,EAAUwB,KAElD+D,IAGMU,GAAI0L,KAAa1E,GAAShJ,GAAQ,CAAA,EAE1C,MAAO,CACLA,KAAMgJ,EACNpI,SACAC,UACD,IC3BU8M,GAA2B9K,GAGtCvE,GAAQkB,MAAOuC,EAAKpC,KACpB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GAVAoC,IAEAhG,EAAUgC,KAAiBgE,GAAO,cAAeA,EAQ7C6L,CAA2B7L,GAC7B,MAAO,CACL/B,KAAM+B,EAAIwJ,aACV1K,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW+L,OACjD,CACE7L,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMT,EAAUgC,KAElDuD,IAGMU,GAAI0L,KAAa1E,GAAShJ,GAAQ,CAAA,EAE1C,MAAO,CACLA,KAAMgJ,EACNpI,SACAC,UACD,IC3BUgN,GAA4BhL,GAGvCvE,GAAQkB,MAAOuC,EAAKpC,KACpB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GAVAoC,IAEAhG,EAAUqC,KAAkB2D,GAAO,cAAeA,EAQ9C+L,CAA4B/L,GAC9B,MAAO,CACL/B,KAAM+B,EAAIgM,cACVlN,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW+L,OACjD,CACE7L,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMT,EAAUqC,KAElDkD,IAGMU,GAAI0L,KAAa1E,GAAShJ,GAAQ,CAAA,EAE1C,MAAO,CACLA,KAAMgJ,EACNpI,SACAC,UACD,IC9BUmN,GAAwBnL,GAGnCvE,GAAQkB,MAAOuC,EAAKpC,KACpB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GATAoC,IACkE/D,KAAU+D,GAAO,cAAeA,EAQ9FkM,CAAwBlM,GAC1B,MAAO,CACL/B,KAAM+B,EAAIoH,QAAQiE,SAClBvM,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW+L,OACjD,CACE7L,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMwB,IAExCsD,GAGF,MAAO,CACLtB,KAAMA,GAAMoN,SACZxM,SACAC,UACD,ICzBUqN,GAA4BrL,GAGvCvE,GAAQkB,MAAOuC,EAAKpC,KACpB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GATAoC,IACkElD,KAAgBkD,GAAO,cAAeA,EAQpGoM,CAA4BpM,GAC9B,MAAO,CACL/B,KAAM+B,EAAImB,cAAcA,aACxBrC,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW+L,OACjD,CACE7L,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMqC,IAExCyC,GAGF,MAAO,CACLtB,KAAMA,GAAMkD,aACZtC,SACAC,UACD,ICvBUuN,GAAyBvL,GAGpCvE,GAAQkB,MAAOuC,EAAKpC,KACpB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GATAoC,IACkEhG,EAAUgD,KAAegD,GAAO,cAAeA,EAQ7GsM,CAAyBtM,GAC3B,MAAO,CACL/B,KAAM+B,EAAIuM,WACVzN,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW+L,OACjD,CACE7L,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMT,EAAUgD,KAElDuC,IAGMU,GAAI0L,KAAa1E,GAAShJ,GAAQ,CAAA,EAE1C,MAAO,CACLA,KAAMgJ,EACNpI,SACAC,UACD,ICqCU0N,GAAevJ,EAAuB,mBAzDlBC,CAACxF,EAAiBC,KACjD,MAAMwF,EAAe,GAAEzE,KAAKC,UAAUgE,EAA6BhF,aAEnE,MAAO,CACLyF,gBAAiBA,IAAMC,EAAOF,GAC9BG,aAAerD,GAAwBoD,EAAQ,GAAEpD,MAAOkD,KACzD,yBAIDI,CAAC7F,GAAQ4B,eAAgCrB,KAAMsB,EAASC,gBACxD/B,OAAS+F,WACP,MAAMvF,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWiN,MACjD,CACE/M,iBAAkB,CAAEO,GAAIV,EAAQmN,mBAAoBjS,KAAM6E,EAAWK,eACrE+D,YAAa,CAAEF,SAEjBjE,GAGF,OAAKtB,GAOLA,EAAKsD,QAAUtD,EAAKsD,SAASwC,KAAI4I,IAG/BA,EAAMC,WAAaC,EAAWF,EAAMC,YAActN,EAAWK,eACtDgN,KAGF,CACL1O,OACAY,SACAC,YAhBO,CACLD,SACAC,UAeH,cAGsB,IAAI6E,EAAK,CAClChK,KAAM,4BACNiK,OAAQA,EAAO,CAAEC,SAAU,MAC3BC,MAAOC,IACPtJ,KAAM,oBAG2G,CAGjH0E,MAAOA,EAAGoC,UAAU,MAASA,EAC7BiC,KAAMA,EAAGA,OAAO,KAAQA,EACxBQ,WAAYA,EAAGC,cAAc,KAAQA,EACrCC,aAAcA,EAAGC,gBAAgB,KAAQA,GAQzCC,eAAgB,KCzEL0I,GAAgBhN,G/DgDP,U+D9CpBrC,MAAOuC,EAAKrC,EAAMC,EAAKC,KACrB,MAAMoC,EAAKD,EAAMA,EAAIC,GAAKtC,EAAKsC,IACvBhC,KAAMsB,EAAOC,WAAEA,GAAe5B,GAChCL,UAAEA,GAAcM,EAChB0C,EAAiBvG,EAAUuD,GAEjC,GAAIyC,IAAQS,EAAYT,EAAIO,IAC1B,MAAO,CACLtC,KAAM+B,EAAIO,GACVI,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWuN,OACjD,CACErN,iBAAkB,CAAEO,OAEtBV,GAGF,MAAO,CACLtB,KAAM+B,EAAM/B,IAAOsC,GAAkBtC,EACrCY,SACAC,UACD,ICwDQkO,GAAgB/J,EAAuB,mBAtEnBC,CAACxF,EAAiBC,KACjD,MAAMwF,EAAe,GAAEzE,KAAKC,UAAUgE,EAA6BhF,cAEnE,MAAO,CACLyF,gBAAiBA,IAAMC,EAAOF,GAC9BG,aAAerD,GAAwBoD,EAAQ,GAAEpD,MAAOkD,KACzD,yBAG2GI,CAC5G7F,EACAC,GACEM,KAAMsB,EAASC,iBAEjB,MAAMyN,WAAEA,KAAehG,GAAStE,EAA6BhF,GAE7D,OAAOF,OAAS+F,WACd,MAAMvF,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW0N,OACjD,CACExN,iBAAkB,CAAEjF,MAAOwS,GAAcE,EAAWC,OAAOzN,eAC3D+D,YAAa,IAAKnB,GAAmB0E,GAAOzD,SAE9CjE,GAGF,OAAKtB,GAOLA,EAAKsD,QAAUtD,EAAKsD,SAASwC,KAAI4I,IAC/B,IAAIU,EAAYV,EAAMC,WAUtB,OARKS,GAAaJ,GAAcA,IAAeE,EAAWC,QACxDC,EAAYJ,EAAWtN,eAGrB0N,IACFV,EAAMC,WAAaC,EAAWQ,IAGzBV,CAAK,IAGP,CACL1O,OACAY,SACAC,YAvBO,CACLD,SACAC,UAsBH,CACF,cAGwB,IAAI6E,EAAK,CAClChK,KAAM,6BACNiK,OAAQA,EAAO,CAAEC,SAAU,MAC3BC,MAAOC,IACPtJ,KAAM,oBAGuG,CAG7G0E,MAAOA,EAAGoC,UAAU,MAASA,EAC7BiC,KAAMA,EAAGA,OAAO,KAAQA,EACxBQ,WAAYA,EAAGC,cAAc,KAAQA,EACrCC,aAAcA,EAAGC,gBAAgB,KAAQA,GAQzCC,eAAgB,KCxEZM,GAAmB,CACvBpJ,CAACA,GAAOM,EACRC,CAACA,GAAOD,EACRI,CAACA,GAAehC,EAAUgC,GAC1BQ,CAACA,GAAUP,EACXa,CAACA,GAAeA,EAChBG,CAACA,GAASA,GAGCqQ,GAAgBxN,GAK3BlD,GAAQa,MAAOuC,EAAKrC,EAAMC,EAAKC,KAC/B,MAAQI,KAAMsB,EAAOoF,oBAAEA,EAAmBmB,aAAEA,EAAYtG,WAAEA,GAAe5B,GACnEL,UAAEA,EAAS/D,WAAEA,GAAeqE,EAC5B0C,EAAiBvG,EAAUuD,IAC3B0C,GAAEA,EAAEiF,aAAEA,GAAiBD,GAAwBjF,EAAKrC,GAE1D,GAAIqC,IAAQS,EAAYT,EAAIO,IAC1B,MAAO,CACLtC,KAAyB,OAAnBsC,EAA0B+D,GAAS,CAAErE,KAAIiF,iBAAkBlF,EAAIO,GACrEI,OAAQtD,GAAOuD,YAInB,MAAMiF,EAAuBrB,GAAwBhL,EAAW,GAAKkL,GAAkBC,IAEjF1G,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW+N,OACjD,CACE7N,iBAAkB,CAAEO,KAAIuN,OAAQtI,MAC5BW,EAAqB9G,OAAS,EAC9B,CACE2E,YAAa,IACRkC,GAAgCC,EAAsBC,KAG7D,IAENvG,GAGIkO,EAAa,IACdxP,EACH4J,UAAW5J,GAAM4J,UAAY,IAAI9D,KAAIwC,IAAY,IAAKA,EAASnB,WAAYqB,OAAOxG,OAClFA,GAAIqE,GAAS,CAAErE,KAAIiF,iBACnBE,WAAYqB,OAAOxG,IAGrB,MAAO,CACLhC,KAAM+B,EACFyN,EAAWlN,GACXsF,EAAqB9G,OAAS,EAC9B,IAAK0O,EAAY/G,UAAW5H,GAC5B2O,EACJ5O,SACAC,UACD,ICtEU4O,GAAuB5M,GAGlClE,GAAQa,MAAOuC,EAAKpC,EAAKC,KACzB,MAAQI,KAAMsB,EAAOC,WAAEA,GAAe5B,GAChCL,UAAEA,GAAcM,EAChB0C,EAAiBvG,EAAUuD,GAEjC,GAXAyC,IAC0EpE,KAAWoE,GAAO,cAAeA,EAUvG2N,CAA+B3N,GACjC,MAAO,CACL/B,KAAM+B,EAAI6G,UAAUtG,GACpBzB,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW+N,OACjD,CACE7N,iBAAkB,CAAEO,GAAID,EAAIoF,WAAYoI,OAAQxN,EAAIqF,cAAe5K,KAAMmB,IAE3E2D,GAGF,MAAO,CACLtB,KAAMA,IAAOsC,GACb1B,SACAC,UACD,ICrBU8O,GAA2B9M,GAGtClE,GAAQa,MAAOuC,EAAKpC,KACpB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GAVAoC,IAEAhG,EAAUgC,KAAiBgE,GAAO,cAAeA,EAQ7C6N,CAAmC7N,GACrC,MAAO,CACL/B,KAAM+B,EAAIwJ,aACV1K,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW+N,OACjD,CACE7N,iBAAkB,CAAEO,GAAID,EAAIoF,WAAYoI,OAAQxN,EAAIqF,cAAe5K,KAAMT,EAAUgC,KAErFuD,IAGMU,GAAI+G,KAAYC,GAAShJ,GAAQ,CAAA,EAEzC,MAAO,CACLA,KAAMgJ,EACNpI,SACAC,UACD,IClCUgP,GAAuBhN,GAGlClE,GAAQa,MAAOuC,EAAKpC,KACpB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GATAoC,IAC0E/D,KAAU+D,GAAO,cAAeA,EAQtG+N,CAA+B/N,GACjC,MAAO,CACL/B,KAAM+B,EAAIoH,QAAQ4G,QAClBlP,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW+N,OACjD,CACE7N,iBAAkB,CAAEO,GAAID,EAAIoF,WAAYoI,OAAQxN,EAAIqF,cAAe5K,KAAMwB,IAE3EsD,GAGF,MAAO,CACLtB,KAAMA,GAAM+P,QACZnP,SACAC,UACD,ICrBUmP,GAA4BnN,GAGvClE,GAAQa,MAAOuC,EAAKpC,KACpB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GATAoC,IAC0ElD,KAAgBkD,GAAO,cAAeA,EAQ5GkO,CAAoClO,GACtC,MAAO,CACL/B,KAAM+B,EAAImB,cAAcA,aACxBrC,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW+N,OACjD,CACE7N,iBAAkB,CAAEO,GAAID,EAAIoF,WAAYoI,OAAQxN,EAAIqF,cAAe5K,KAAMqC,IAE3EyC,GAGF,MAAO,CACLtB,KAAMA,GAAMkD,aACZtC,SACAC,UACD,IC7BUqP,GAAsBrN,GAGjClE,GAAQa,MAAOuC,EAAKpC,KACpB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GATAoC,IAC0E/C,KAAU+C,GAAO,cAAeA,EAQtGoO,CAA8BpO,GAChC,MAAO,CACL/B,KAAM+B,EAAIyH,QAAQlG,QAClBzC,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW+N,OACjD,CACE7N,iBAAkB,CAAEO,GAAID,EAAIoF,WAAYoI,OAAQxN,EAAIqF,cAAe5K,KAAMwC,IAE3EsC,GAGF,MAAO,CACLtB,KAAMA,GAAMsD,QACZ1C,SACAC,UACD,ICoDUuP,GAAkBpL,EAAuB,mBAnErBC,CAACxF,EAAiBC,KACjD,MAAMwF,EAAe,GAAEzE,KAAKC,UAAUgE,EAA6BhF,gBAEnE,MAAO,CACLyF,gBAAiBA,IAAMC,EAAOF,GAC9BG,aAAerD,GAAwBoD,EAAQ,GAAEpD,MAAOkD,KACzD,yBAIDI,CAAC7F,EAAMC,EAAMC,IACbH,OAAS+F,WACP,MAAM6J,UAAEA,EAASiB,WAAEA,GAAe3Q,GAC1BM,KAAMsB,EAAOC,WAAEA,GAAe5B,GAEhCK,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW+O,SACjD,CACE7O,iBAAkB,CAAE8O,QAASF,EAAW3O,cAAelF,KAAM4S,EAAU1N,eACvE+D,YAAa,CAAEF,SAEjBjE,GAGF,OAAKtB,GAOLA,EAAKsD,QAAUtD,EAAKsD,SAASwC,KAAI4I,IAC/B,IAAIlS,EAAOkS,EAAMC,WAUjB,OARKnS,GAAQ4S,IAAcoB,EAAkBC,MAC3CjU,EAAO4S,EAAU1N,eAGflF,IACFkS,EAAMC,WAAaC,EAAWpS,IAGzBkS,CAAK,IAGP,CACL1O,OACAY,SACAC,YAvBO,CACLD,SACAC,UAsBH,cAGsB,IAAI6E,EAAK,CAClChK,KAAM,+BACNiK,OAAQA,EAAO,CAAEC,SAAU,MAC3BC,MAAOC,IACPtJ,KAAM,oBAGuG,CAG7G0E,MAAOA,EAAGoC,UAAU,MAASA,EAC7BiC,KAAMA,EAAGA,OAAO,KAAQA,EACxBQ,WAAYA,EAAGC,cAAc,KAAQA,EACrCC,aAAcA,EAAGC,gBAAgB,KAAQA,GAQzCC,eAAgB,KC5DZM,GAAmB,CACvBtJ,CAACA,GAAqBpB,EAAUoB,GAChCC,CAACA,GAAYY,EACbX,CAACA,GAAOM,EACRD,CAACA,GAAkB3B,EAAU2B,GAC7BE,CAACA,GAAOD,EACRG,CAACA,GAAiB/B,EAAU+B,GAC5BC,CAACA,GAAehC,EAAUgC,GAC1BE,CAACA,GAAWA,EACZC,CAACA,GAAQF,EACTO,CAACA,GAAUP,EACXQ,CAACA,GAAkBA,EACnBE,CAACA,GAAUA,EACXgS,eAAoB9R,EACpBC,CAACA,GAAeA,EAChBG,CAACA,GAASA,EACVC,CAACA,GAAkB,mBAGR0R,GAAY9O,GAIvB/C,GAAIU,MAAOuC,EAAKrC,EAAMC,EAAKC,KAC3B,MAAQI,KAAMsB,EAAOoF,oBAAEA,EAAmBmB,aAAEA,EAAYtG,WAAEA,GAAe5B,GACnEL,UAAEA,EAAS/D,WAAEA,GAAeqE,EAC5B0C,EAAiBvG,EAAUuD,GAEjC,GAAIyC,IAAQS,EAAYT,EAAIO,IAC1B,MAAO,CACLtC,KAAM+B,EAAIO,GACVI,OAAQtD,GAAOuD,YAInB,MAAMX,EAAKD,EAAMA,EAAIC,GAAKtC,EAAKsC,GACzB4F,EAAuBrB,GAAwBhL,EAAW,GAAKkL,GAAkBC,IAEjF1G,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW6I,GACjD,CACE3I,iBAAkB,CAAEO,SAChB4F,EAAqB9G,OAAS,EAC9B,CACE2E,YAAa,IACRkC,GAAgCC,EAAsBC,KAG7D,IAENvG,GAGIsP,EAAS,IACV5Q,EACHkK,SAAUlK,GAAMkK,SAAW,IAAIpE,KAAIwJ,IAAW,IACzCA,EACHnI,WAAYqB,OAAOxG,QAIvB,MAAO,CACLhC,KAAM+B,EAAM6O,EAAOtO,GAAkBsF,EAAqB9G,OAAS,EAAI,IAAK8P,EAAQnI,UAAW5H,GAAY+P,EAC3GhQ,SACAC,UACD,ICpFUgQ,GAA6BhO,GAGxC/D,GAAIU,MAAOuC,EAAKpC,KAChB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GAVAoC,IAEAhG,EAAUoB,KAAuB4E,GAAO,cAAeA,EAQnD+O,CAA6B/O,GAC/B,MAAO,CACL/B,KAAM+B,EAAIkJ,mBAAmB3H,QAC7BzC,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW6I,GACjD,CACE3I,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMT,EAAUoB,KAElDmE,GAGF,MAAO,CACLtB,KAAMA,GAAMsD,QACZ1C,SACAC,UACD,IC1BUkQ,GAA0BlO,GAGrC/D,GAAIU,MAAOuC,EAAKpC,KAChB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GATAoC,IAC8DhG,EAAU2B,KAAoBqE,GAAO,cAAeA,EAQ9GiP,CAA0BjP,GAC5B,MAAO,CACL/B,KAAM+B,EAAIkP,gBAAgB3N,QAC1BzC,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW6I,GACjD,CACE3I,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMT,EAAU2B,KAElD4D,GAGF,MAAO,CACLtB,KAAMA,GAAMsD,QACZ1C,SACAC,UACD,IC1BUqQ,GAAmBrO,GAG9B/D,GAAIU,MAAOuC,EAAKpC,EAAKC,KACrB,MAAQI,KAAMsB,EAAOC,WAAEA,GAAe5B,GAChCL,UAAEA,GAAcM,EAChB0C,EAAiBhD,EAEvB,GAXAyC,IAC8DpE,KAAWoE,GAAO,cAAeA,EAU3FoP,CAAmBpP,GACrB,MAAO,CACL/B,KAAM+B,EAAI6G,UAAUtG,GACpBzB,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW6I,GACjD,CACE3I,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMmB,IAExC2D,GAGF,MAAO,CACLtB,KAAMA,IAAOsC,GACb1B,SACAC,UACD,IC1BUuQ,GAAyBvO,GAGpC/D,GAAIU,MAAOuC,EAAKpC,KAChB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GATAoC,IAC8DhG,EAAU+B,KAAmBiE,GAAO,cAAeA,EAQ7GsP,CAAyBtP,GAC3B,MAAO,CACL/B,KAAM+B,EAAIuP,gBAAgBhO,QAC1BzC,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW6I,GACjD,CACE3I,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMT,EAAU+B,KAElDwD,GAGF,MAAO,CACLtB,KAAMA,GAAMsD,QACZ1C,SACAC,UACD,ICxBU0Q,GAAuB1O,GAGlC/D,GAAIU,MAAOuC,EAAKpC,KAChB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GATAoC,IAC8DhG,EAAUgC,KAAiBgE,GAAO,cAAeA,EAQ3GyP,CAAuBzP,GACzB,MAAO,CACL/B,KAAM+B,EAAIwJ,aACV1K,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW6I,GACjD,CACE3I,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMT,EAAUgC,KAElDuD,IAGMU,GAAIyP,KAASzI,GAAShJ,GAAQ,CAAA,EAEtC,MAAO,CACLA,KAAMgJ,EACNpI,SACAC,UACD,IC7BU6Q,GAAkB7O,GAG7B/D,GAAIU,MAAOuC,EAAKpC,EAAKC,KACrB,MAAQI,KAAMsB,EAAOC,WAAEA,GAAe5B,GAChCL,UAAEA,GAAcM,EAChB0C,EAAiBhD,EAEvB,GAXAyC,IAC8D/D,KAAU+D,GAAO,cAAeA,EAU1F4P,CAAkB5P,GACpB,MAAO,CACL/B,KAAM+B,EAAIoH,SAAS7G,GACnBzB,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW6I,GACjD,CACE3I,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMwB,IAExCsD,GAGF,MAAO,CACLtB,KAAMA,IAAOsC,GACb1B,SACAC,UACD,IC3BU+Q,GAAoB/O,GAG/B/D,GAAIU,MAAOuC,EAAKpC,KAChB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GATAoC,IAC8D9D,KAAY8D,GAAO,cAAeA,EAQ5F8P,CAAoB9P,GACtB,MAAO,CACL/B,KAAM+B,EAAI6J,UAAUtI,QACpBzC,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW6I,GACjD,CACE3I,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMyB,IAExCqD,GAGF,MAAO,CACLtB,KAAMA,GAAMsD,QACZ1C,SACAC,UACD,ICwCUiR,GAA2B9M,EAAuB,mBA9D7BjD,IAChC,MAAMmD,EAAe,GAAEnD,EAAIC,OAAOlD,MAAON,IAEzC,MAAO,CACL2G,gBAAiBA,IAAMC,EAAOF,GAC9BG,aAAerD,GAAwBoD,EAAQ,GAAEpD,MAAOkD,KACzD,yBAeDI,CAACvD,EAAKe,EAAOnD,IACbH,OAAS+F,WACP,MAAQvF,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GAhB+BoS,EACjChQ,EACAwD,IAEA/G,KAAmBuD,GAAOA,EAAIgK,iBAAiBxG,OAASA,GAAQ,cAAexD,EAYzEgQ,CAA2BhQ,EAAKwD,GAClC,MAAO,CACLvF,KAAM+B,EAAIgK,gBACVlL,QAASkB,EAAI0G,WAIjB,MAAMzI,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW6I,GACjD,CACE3I,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMgC,GACtCiH,YAAa,CAAEF,SAEjBjE,GAGF,MAAO,CACLtB,OACAY,SACAC,UACD,cAGsB,IAAI6E,EAAK,CAClChK,KAAM,yCACNiK,OAAQA,EAAO,CAAEC,SAAU,MAC3BC,MAAOC,IACPtJ,KAAM,oBAGqD,CAE3D0E,MAAOA,EAAGoC,UAAU,MAASA,EAC7BiC,KAAMA,EAAGA,OAAO,KAAQA,EACxBQ,WAAYA,EAAGC,cAAc,KAAQA,EACrCC,aAAcA,EAAGC,gBAAgB,KAAQA,GAQzCC,eAAgB,KCDL6L,GAAmBhN,EAAuB,mBA5DrBjD,IAChC,MAAMmD,EAAe,GAAEnD,EAAIC,OAAOlD,MAAOJ,IAEzC,MAAO,CACLyG,gBAAiBA,IAAMC,EAAOF,GAC9BG,aAAerD,GAAwBoD,EAAQ,GAAEpD,MAAOkD,KACzD,yBAeDI,CAACvD,EAAKe,GAAS9C,KAAMsB,EAASC,gBAC9B/B,OAAS+F,WACP,GAduB0M,EACzBlQ,EACAwD,IAEA7G,KAAWqD,GAAOA,EAAIsK,SAAS9G,OAASA,GAAQ,cAAexD,EAUzDkQ,CAAmBlQ,EAAKwD,GAC1B,MAAO,CACLvF,KAAM+B,EAAIsK,QACVxL,QAASkB,EAAI0G,WAIjB,MAAMzI,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW6I,GACjD,CACE3I,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMkC,GACtC+G,YAAa,CAAEF,SAEjBjE,GAGF,MAAO,CACLtB,OACAY,SACAC,UACD,cAGsB,IAAI6E,EAAK,CAClChK,KAAM,iCACNiK,OAAQA,EAAO,CAAEC,SAAU,MAC3BC,MAAOC,IACPtJ,KAAM,oBAGiD,CAEvD0E,MAAOA,EAAGoC,UAAU,MAAuBA,EAC3CiC,KAAMA,EAAGA,OAAO,KAAsBA,EACtCQ,WAAYA,EAAGC,cAAc,KAAsBA,EACnDC,aAAcA,EAAGC,gBAAgB,KAAsBA,GAQvDC,eAAgB,KCXL+L,GAA0BlN,EAAuB,CAC5DC,kBA7DgClD,IAChC,MAAMmD,EAAe,GAAEnD,EAAIC,OAAOlD,MAAOF,IAEzC,MAAO,CACLuG,gBAAiBA,IAAMC,EAAOF,GAC9BG,aAAerD,GAAwBoD,EAAQ,GAAEpD,MAAOkD,KACzD,EAwDDI,uBAzCAA,CAACvD,EAAKe,GAAS9C,KAAMsB,EAASC,gBAC9B/B,OAAS+F,WACP,GAd4B4M,EAC9BpQ,EACAwD,IAEA3G,KAAWmD,GAAOA,EAAIyK,SAASjH,OAASA,GAAQ,cAAexD,EAUzDoQ,CAAwBpQ,EAAKwD,GAC/B,MAAO,CACLvF,KAAM+B,EAAIyK,QACV3L,QAASkB,EAAI0G,WAIjB,MAAMzI,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW6I,GACjD,CACE3I,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMoC,GACtC6G,YAAa,CAAEF,SAEjBjE,GAGF,MAAO,CACLtB,OACAY,SACAC,UACD,EAqBHuR,YAlByB,IAAI1M,EAAK,CAClChK,KAAM,0CACNiK,OAAQA,EAAO,CAAEC,SAAU,MAC3BC,MAAOC,IACPtJ,KAAM,YAeN6V,QAZ0D,CAE1DnR,MAAOA,EAAGoC,UAAU,MAASA,EAC7BiC,KAAMA,EAAGA,OAAO,KAAQA,EACxBQ,WAAYA,EAAGC,cAAc,KAAQA,EACrCC,aAAcA,EAAGC,gBAAgB,KAAQA,GAQzCC,eAAgB,KCpELmM,GAAwBzP,GAGnC/D,GAAIU,MAAOuC,EAAKpC,KAChB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GATAoC,IAC8DlD,KAAgBkD,GAAO,cAAeA,EAQhGwQ,CAAwBxQ,GAC1B,MAAO,CACL/B,KAAM+B,EAAImB,cAAcA,aACxBrC,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW6I,GACjD,CACE3I,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMqC,IAExCyC,GAGF,MAAO,CACLtB,KAAMA,GAAMkD,aACZtC,SACAC,UACD,ICzBU2R,GAAkB3P,GAG7B/D,GAAIU,MAAOuC,EAAKpC,KAChB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GATAoC,IAC8D/C,KAAU+C,GAAO,cAAeA,EAQ1F0Q,CAAkB1Q,GACpB,MAAO,CACL/B,KAAM+B,EAAIyH,QAAQlG,QAClBzC,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAW6I,GACjD,CACE3I,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMwC,IAExCsC,GAGF,MAAO,CACLtB,KAAMA,GAAMsD,QACZ1C,SACAC,UACD,ICzBU6R,GAA0B7P,GAGrC/D,GAAIU,MAAOuC,EAAKpC,KAChB,MAAQK,KAAMsB,EAAOC,WAAEA,GAAe5B,EAEtC,GATAoC,IAC8D7C,MAAuB6C,GAAO,cAAeA,EAQvG4Q,CAA0B5Q,GAC5B,MAAO,CACL/B,KAAM+B,EAAI7C,KAAsBoE,QAChCzC,QAASkB,EAAI0G,UACb/F,OAAQtD,GAAOuD,YAInB,MAAM3C,KAAEA,EAAIY,OAAEA,EAAMC,QAAEA,SAAkBU,EAAWwL,eACjD,CACEtL,iBAAkB,CAAEO,GAAID,EAAIC,GAAIxF,KAAMsC,IAExCwC,GAGF,MAAO,CACLtB,KAAMA,GAAMsD,QACZ1C,SACAC,UACD,IC6CU+R,GAA6E,CACxFC,eAAgB,CACdC,MAAQ/Q,GAAwBA,EAAI,UAEtCgR,WAAY,IACPjW,EAA2B,aAAc2F,IAC5CuQ,UAAWhQ,GACX+M,QAAS/M,GACTE,aAAcD,IAEhBgQ,QAAS,IACJnW,EAA2B,UAAWqG,IACzC+P,iBAAkB7P,GAClBG,MAAOD,IAET4P,cAAe,CACbC,UAAWvP,GACXwP,KAAMvP,GACNwP,UAAWvP,GACXwP,oBAAqBvP,GACrBwP,UAAWvP,IAEbwP,QAAS,IACJ3W,EAA2B,UAAWuL,IACzCJ,KAAMS,GACNR,KAAMQ,GACNgL,YAAa7K,GACbT,OAAQa,GACR/F,aAAckG,GACdI,OAAQF,IAEVqK,MAAO,CAELC,cAAgB7R,GACPA,EAAI4M,YAGfkF,MAAO,IACF/W,EAA2B,QAAS8N,IACvCkJ,kBAAmBhJ,GACnBkI,UAAWxH,GACXvD,KAAMkD,GACNjD,KAAMiD,GACNuI,YAAarI,GACbO,SAAUF,GACVlI,MAAOgI,GACPuE,QAASvE,GACTO,gBAAiBF,GACjBkI,aAAc/H,GACdK,QAASF,GACTxB,cAAe2B,GACfpJ,aAAcuJ,GACdjD,OAAQmD,GACRI,eAAgBF,IAElBmH,iBAAkB,CAChBC,QAAS,EACTC,SAAU,EACVC,QAAS,EACTC,WAAY,EACZC,mBAAoB,EACpBvV,GAAI,GAENwV,YAAa,CACXC,SAAU,WACVC,cAAe,gBACfC,QAAS,UACTC,gBAAiB,kBACjBC,SAAU,WACVC,QAAS,WAEXC,QAAS,IACJ/X,EAA2B,UAAWkQ,IACzCkG,iBAAkBhG,GAClB1J,MAAO2J,IAET2H,OAAQ,IACHhY,EAA2B,SAAUuQ,IACxC0H,gBAAiBxH,GACjBmG,YAAa/F,GACbqH,aAAcnH,GACdT,SAAUY,GACV9K,aAAcgL,GACd+G,UAAW7G,IAEb8G,MAAO,CACL1T,eAAgBJ,GAChBwB,WAAYH,GACZW,QAASD,GACTS,cAAeD,GACfQ,OAAQD,GACRiR,eAAgBpQ,GAChBqQ,WAAYhP,GACZkC,QAASD,GACTqB,KAAMD,GACNc,OAAQD,GACRI,QAASF,GACTK,MAAOD,GACPqC,QAASD,GACTM,OAAQD,GAERmB,MAAOD,GACPO,OAAQD,GACRI,OAAQF,GACRO,OAAQD,GACRiB,SAAUF,GACVhG,GAAIuG,IAEN0E,YAAa,CAEXzB,cAAgB7R,GACPA,EAAI4M,YAGf2G,OAAQ,CAEN1B,cAAgB7R,GACPA,EAAI4M,YAGf4G,OAAQ,IACHzY,EAA2B,SAAUuS,IACxCpH,KAAMwH,GACNvH,KAAMuH,GACN+F,aCxMsCzT,GACjCA,EAAI6H,UAAU9I,QAAU,EDwM7B4S,YAAa/D,GACbI,QAASF,GACT3M,aAAc8M,GACdxG,OAAQ0G,IAEVuF,GAAI,IACC3Y,EAA2B,KAAM6T,IACpCmD,kBAAmBjD,GACnBmC,UAAWtB,GACXzJ,KAAMiJ,GACNwE,eAAgB3E,GAChB7I,KAAMgJ,GACNyE,cAAevE,GACfsC,YAAanC,GACb3F,SAAUgG,GACVpO,MAAOkO,GACP3B,QAAS2B,GACT3F,gBAAiB+F,GACjBzF,QAAS2F,GACTtB,eAAgBwB,GAChBhP,aAAcoP,GACd9I,OAAQgJ,GACRzF,eAAgB2F,IAElBkD,SAAU,CACRrB,SAAU,WACVsB,MAAO,QACPrB,cAAe,gBACfsB,MAAO,QACPrB,QAAS,UACTsB,iBAAkB,oBAEpBC,OAAQ,CACNC,YAAa,cACbC,WAAY,aACZC,KAAM,OACNC,QAAS,UACTC,SAAU,WACVC,UAAW,YACXC,MAAO,SAETC,MAAO,CACLha,KElP4Bia,EAAGja,UAAkBT,EAAUS,GAAMka"}
|