@carddb/browser 0.1.5 → 0.2.0
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/README.md +15 -1
- package/dist/browser/index.js +678 -81
- package/dist/browser/index.js.map +1 -1
- package/dist/index.cjs +19 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +45 -2
- package/dist/index.d.ts +45 -2
- package/dist/index.js +20 -1
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cache.ts","../../../core/src/errors.ts","../../../core/src/operators.ts","../../../core/src/filter-builder.ts","../../../core/src/query-builder.ts","../../../core/src/collection.ts","../../../client/src/configuration.ts","../../../client/src/user-agent.ts","../../../client/src/connection.ts","../../../client/src/cache.ts","../../../client/src/resources/base.ts","../../../client/src/resources/publishers.ts","../../../client/src/resources/games.ts","../../../client/src/resources/datasets.ts","../../../client/src/resources/decks.ts","../../../client/src/resources/records.ts","../../../client/src/resources/rules.ts","../../../client/src/client.ts"],"names":["BrowserCache","options","storageType","key","raw","entry","value","ttl","e","keysToRemove","i","count","now","fullKey","CardDBError","_CardDBError","message","response","AuthenticationError","RateLimitError","NotFoundError","ValidationError","RestrictedError","GraphQLError","ConnectionError","TimeoutError","ServerError","LinkResolutionError","field","f","eq","neq","gt","gte","lt","lte","within","values","notWithin","contains","like","pattern","ilike","isNull","isNotNull","FilterBuilder","_FilterBuilder","fieldOrConditions","val","callback","orBuilder","orConditions","conditions","linkFilter","anyFilter","allConditions","resolveFilter","input","builder","result","PUBLISHER_FIELDS","GAME_FIELDS","DATASET_FIELDS","SCHEMA_NESTED_FIELDS_DEPTH","fieldInfoFields","depth","SCHEMA_FIELDS","TCGPLAYER_PRICING_FIELDS","recordFields","RECORD_FIELDS","DECK_VERSION_FIELDS","DECK_COLLABORATOR_FIELDS","DECK_PREVIEW_TOKEN_FIELDS","DECK_FIELDS","RESOLVED_LINKS_FIELDS","connectionFields","nodeFields","QueryBuilder","params","variables","args","defs","defStr","argStr","includeResolvedLinks","selectedRecordFields","id","deckId","accountId","role","Collection","data","edge","current","item","index","results","predicate","n","DEFAULT_ENDPOINT","DEFAULT_TIMEOUT","DEFAULT_OPEN_TIMEOUT","DEFAULT_CACHE_TTL","DEFAULT_MAX_RETRIES","DEFAULT_MAX_NETWORK_RETRIES","DEFAULT_RETRY_BASE_DELAY","DEFAULT_RETRY_MAX_DELAY","Configuration","_Configuration","config","attempt","exponentialDelay","cappedDelay","jitter","resource","publisherSlug","gameKey","allowedForPublisher","level","levels","overrides","SDK_VERSION","detectRuntime","bunVersion","denoVersion","detectBrowser","userAgent","edgeMatch","chromeMatch","firefoxMatch","safariMatch","getUserAgent","runtime","getSDKVersion","lastRateLimitInfo","getRateLimitInfo","Connection","query","operationName","rateLimitRetries","networkRetries","startTime","duration","error","sleepTime","delay","controller","timeoutId","body","errors","firstError","retryAfter","limit","remaining","reset","resetAt","match","ms","resolve","retry","errorType","cacheKey","method","sortedParams","v","a","b","k","readCache","cache","writeCache","BaseResource","connection","resolved","fn","useCache","cached","PublishersResource","cursor","slugOrId","isUUID","slugs","GamesResource","idOrPublisherSlug","gameKeyOrOptions","opts","ids","DatasetsResource","datasetKey","DecksResource","slug","externalRef","pageVariables","token","identifiers","records","recordsByIdentifier","recordsByDeckIdentifier","identifierField","record","identifier","RecordsResource","filter","RulesResource","defaultDatasetKey","CardDBClient","_CardDBClient","mergedConfig"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Browser-based cache implementations using localStorage/sessionStorage\n */\n\nimport type { Cache } from '@carddb/core'\n\ninterface CacheEntry<T> {\n value: T\n expiresAt: number | null\n}\n\ntype StorageType = 'localStorage' | 'sessionStorage'\n\n/**\n * Browser cache using localStorage or sessionStorage.\n *\n * Uses localStorage by default for persistent caching across sessions.\n * Use sessionStorage for per-session caching that clears when the tab is closed.\n *\n * @example localStorage (default, persistent)\n * import { CardDBClient, BrowserCache } from '@carddb/browser'\n *\n * const client = new CardDBClient({\n * cache: new BrowserCache(),\n * cacheTtl: 300 // 5 minutes\n * })\n *\n * @example sessionStorage (per-session)\n * import { CardDBClient, BrowserCache } from '@carddb/browser'\n *\n * const client = new CardDBClient({\n * cache: new BrowserCache({ storage: 'sessionStorage' }),\n * cacheTtl: 300\n * })\n *\n * @example Custom prefix\n * const cache = new BrowserCache({ prefix: 'myapp:carddb:' })\n */\nexport class BrowserCache implements Cache {\n private storage: Storage\n private prefix: string\n\n constructor(options: { storage?: StorageType; prefix?: string } = {}) {\n const storageType = options.storage ?? 'localStorage'\n this.storage =\n storageType === 'sessionStorage' ? globalThis.sessionStorage : globalThis.localStorage\n this.prefix = options.prefix ?? 'carddb:'\n }\n\n /**\n * Get a value from the cache\n */\n get<T>(key: string): T | null {\n try {\n const raw = this.storage.getItem(this.prefix + key)\n if (!raw) return null\n\n const entry = JSON.parse(raw) as CacheEntry<T>\n\n // Check if expired\n if (entry.expiresAt !== null && Date.now() > entry.expiresAt) {\n this.storage.removeItem(this.prefix + key)\n return null\n }\n\n return entry.value\n } catch {\n // If parsing fails, remove the invalid entry\n this.storage.removeItem(this.prefix + key)\n return null\n }\n }\n\n /**\n * Set a value in the cache\n *\n * @param key - The cache key\n * @param value - The value to cache (must be JSON-serializable)\n * @param ttl - Time to live in seconds (optional, undefined = no expiry)\n */\n set<T>(key: string, value: T, ttl?: number): void {\n try {\n const entry: CacheEntry<T> = {\n value,\n expiresAt: ttl !== undefined ? Date.now() + ttl * 1000 : null,\n }\n this.storage.setItem(this.prefix + key, JSON.stringify(entry))\n } catch (e) {\n // Storage might be full or disabled - silently fail\n // In the future, we could implement LRU eviction here\n console.warn('[CardDB] Failed to write to cache:', e)\n }\n }\n\n /**\n * Delete a value from the cache\n */\n delete(key: string): void {\n this.storage.removeItem(this.prefix + key)\n }\n\n /**\n * Clear all CardDB cached values (only keys with our prefix)\n */\n clear(): void {\n const keysToRemove: string[] = []\n for (let i = 0; i < this.storage.length; i++) {\n const key = this.storage.key(i)\n if (key && key.startsWith(this.prefix)) {\n keysToRemove.push(key)\n }\n }\n for (const key of keysToRemove) {\n this.storage.removeItem(key)\n }\n }\n\n /**\n * Check if a key exists and is not expired\n */\n has(key: string): boolean {\n return this.get(key) !== null\n }\n\n /**\n * Get approximate number of cached entries (only counts our prefixed keys)\n */\n get size(): number {\n let count = 0\n for (let i = 0; i < this.storage.length; i++) {\n const key = this.storage.key(i)\n if (key && key.startsWith(this.prefix)) {\n count++\n }\n }\n return count\n }\n\n /**\n * Clean up expired entries\n * Call this periodically if you want to reclaim storage space from expired entries\n */\n cleanup(): void {\n const now = Date.now()\n const keysToRemove: string[] = []\n\n for (let i = 0; i < this.storage.length; i++) {\n const fullKey = this.storage.key(i)\n if (fullKey && fullKey.startsWith(this.prefix)) {\n try {\n const raw = this.storage.getItem(fullKey)\n if (raw) {\n const entry = JSON.parse(raw) as CacheEntry<unknown>\n if (entry.expiresAt !== null && now > entry.expiresAt) {\n keysToRemove.push(fullKey)\n }\n }\n } catch {\n // Invalid entry, remove it\n keysToRemove.push(fullKey)\n }\n }\n }\n\n for (const key of keysToRemove) {\n this.storage.removeItem(key)\n }\n }\n}\n","/**\n * Error classes for CardDB clients\n */\n\nexport interface GraphQLErrorInfo {\n message: string\n path?: string[]\n extensions?: Record<string, unknown>\n}\n\n/**\n * Base error class for all CardDB errors\n */\nexport class CardDBError extends Error {\n /** The full response body if available */\n readonly response?: unknown\n\n constructor(message: string, response?: unknown) {\n super(message)\n this.name = 'CardDBError'\n this.response = response\n // Maintains proper stack trace for where error was thrown (V8 only)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, CardDBError)\n }\n }\n}\n\n/**\n * Raised when authentication fails (invalid API key or token)\n */\nexport class AuthenticationError extends CardDBError {\n constructor(message = 'Invalid or missing API key', response?: unknown) {\n super(message, response)\n this.name = 'AuthenticationError'\n }\n}\n\n/**\n * Raised when rate limits are exceeded\n */\nexport class RateLimitError extends CardDBError {\n /** Seconds until rate limit resets */\n readonly retryAfter: number | null\n\n /** Maximum requests allowed */\n readonly limit: number | null\n\n /** Remaining requests in window */\n readonly remaining: number | null\n\n /** Time when the rate limit resets */\n readonly resetAt: Date | null\n\n constructor(\n message = 'Rate limit exceeded',\n options: {\n retryAfter?: number | null\n limit?: number | null\n remaining?: number | null\n resetAt?: Date | null\n response?: unknown\n } = {}\n ) {\n super(message, options.response)\n this.name = 'RateLimitError'\n this.retryAfter = options.retryAfter ?? null\n this.limit = options.limit ?? null\n this.remaining = options.remaining ?? null\n this.resetAt = options.resetAt ?? null\n }\n}\n\n/**\n * Raised when a requested resource is not found\n */\nexport class NotFoundError extends CardDBError {\n constructor(message = 'Resource not found', response?: unknown) {\n super(message, response)\n this.name = 'NotFoundError'\n }\n}\n\n/**\n * Raised when request validation fails\n */\nexport class ValidationError extends CardDBError {\n /** List of validation errors */\n readonly errors: GraphQLErrorInfo[]\n\n constructor(\n message = 'Validation error',\n options: {\n errors?: GraphQLErrorInfo[]\n response?: unknown\n } = {}\n ) {\n super(message, options.response)\n this.name = 'ValidationError'\n this.errors = options.errors ?? []\n }\n}\n\n/**\n * Raised when accessing a restricted publisher or game\n */\nexport class RestrictedError extends CardDBError {\n constructor(message: string, response?: unknown) {\n super(message, response)\n this.name = 'RestrictedError'\n }\n}\n\n/**\n * Raised for GraphQL-level errors\n */\nexport class GraphQLError extends CardDBError {\n /** List of GraphQL errors */\n readonly errors: GraphQLErrorInfo[]\n\n constructor(\n message = 'GraphQL error',\n options: {\n errors?: GraphQLErrorInfo[]\n response?: unknown\n } = {}\n ) {\n super(message, options.response)\n this.name = 'GraphQLError'\n this.errors = options.errors ?? []\n }\n}\n\n/**\n * Raised for network/connection issues\n */\nexport class ConnectionError extends CardDBError {\n constructor(message = 'Connection error', response?: unknown) {\n super(message, response)\n this.name = 'ConnectionError'\n }\n}\n\n/**\n * Raised when request times out\n */\nexport class TimeoutError extends ConnectionError {\n constructor(message = 'Request timed out', response?: unknown) {\n super(message, response)\n this.name = 'TimeoutError'\n }\n}\n\n/**\n * Raised when the server returns an unexpected response\n */\nexport class ServerError extends CardDBError {\n /** HTTP status code */\n readonly status: number | null\n\n constructor(\n message = 'Server error',\n options: {\n status?: number | null\n response?: unknown\n } = {}\n ) {\n super(message, options.response)\n this.name = 'ServerError'\n this.status = options.status ?? null\n }\n}\n\n/**\n * Information about a failed link resolution\n */\nexport interface LinkResolutionFailure {\n /** The link field key that failed */\n field: string\n /** The value that couldn't be resolved */\n value: string | null\n /** The reason for the failure */\n reason: 'not_found' | 'invalid' | 'permission_denied' | 'unknown'\n /** Optional error message from the server */\n message?: string\n}\n\n/**\n * Raised when link resolution fails for one or more links\n *\n * This is a warning-level error that contains the partial results along with\n * information about which links failed to resolve. The application can choose\n * to handle this gracefully or treat it as a fatal error.\n */\nexport class LinkResolutionError extends CardDBError {\n /** List of link resolution failures */\n readonly failures: LinkResolutionFailure[]\n\n /** Partial results that were successfully resolved */\n readonly partialResults?: unknown\n\n constructor(\n message = 'Some links could not be resolved',\n options: {\n failures?: LinkResolutionFailure[]\n partialResults?: unknown\n response?: unknown\n } = {}\n ) {\n super(message, options.response)\n this.name = 'LinkResolutionError'\n this.failures = options.failures ?? []\n this.partialResults = options.partialResults\n }\n\n /**\n * Get failures for a specific field\n */\n getFailuresForField(field: string): LinkResolutionFailure[] {\n return this.failures.filter((f) => f.field === field)\n }\n\n /**\n * Check if a specific field had resolution failures\n */\n hasFailuresForField(field: string): boolean {\n return this.failures.some((f) => f.field === field)\n }\n}\n","/**\n * Filter operator helper functions\n *\n * These functions create operator objects that can be used in filters.\n *\n * @example\n * // With filter builder\n * filter: (f) => f\n * .where('hp', gte(100))\n * .where('types', contains('Pokemon'))\n *\n * @example\n * // With object literal\n * filter: {\n * hp: gte(100),\n * types: contains('Pokemon')\n * }\n */\n\nimport type { FilterOperatorValue } from './types.js'\n\n/** Equality operator */\nexport function eq(value: unknown): FilterOperatorValue {\n return { eq: value }\n}\n\n/** Not equal operator */\nexport function neq(value: unknown): FilterOperatorValue {\n return { neq: value }\n}\n\n/** Greater than operator */\nexport function gt(value: number): FilterOperatorValue {\n return { gt: value }\n}\n\n/** Greater than or equal operator */\nexport function gte(value: number): FilterOperatorValue {\n return { gte: value }\n}\n\n/** Less than operator */\nexport function lt(value: number): FilterOperatorValue {\n return { lt: value }\n}\n\n/** Less than or equal operator */\nexport function lte(value: number): FilterOperatorValue {\n return { lte: value }\n}\n\n/** Value in array operator */\nexport function within(values: unknown[]): FilterOperatorValue {\n return { in: values }\n}\n\n/** Value not in array operator */\nexport function notWithin(values: unknown[]): FilterOperatorValue {\n return { nin: values }\n}\n\n/** Array contains value operator */\nexport function contains(value: unknown): FilterOperatorValue {\n return { contains: value }\n}\n\n/** Case-sensitive pattern match (SQL LIKE) */\nexport function like(pattern: string): FilterOperatorValue {\n return { like: pattern }\n}\n\n/** Case-insensitive pattern match (SQL ILIKE) */\nexport function ilike(pattern: string): FilterOperatorValue {\n return { ilike: pattern }\n}\n\n/** Is null operator */\nexport function isNull(): FilterOperatorValue {\n return { is_null: true }\n}\n\n/** Is not null operator */\nexport function isNotNull(): FilterOperatorValue {\n return { is_null: false }\n}\n","/**\n * Filter builder for constructing complex filter queries\n *\n * Supports both builder pattern and object literal styles:\n *\n * @example Builder pattern\n * filter: (f) => f\n * .where('hp', gte(100))\n * .where('types', contains('Pokemon'))\n * .any(or => or\n * .where('rarity', 'rare')\n * .where('rarity', 'mythic')\n * )\n *\n * @example Object literal\n * filter: {\n * hp: { gte: 100 },\n * types: { contains: 'Pokemon' },\n * $or: [\n * { rarity: 'rare' },\n * { rarity: 'mythic' }\n * ]\n * }\n */\n\nimport type { FilterCondition, FilterValue, FilterInput } from './types.js'\n\nexport class FilterBuilder {\n private conditions: FilterCondition[] = []\n private orGroups: FilterCondition[] = []\n\n /**\n * Add a condition to the filter\n *\n * @example Single field\n * .where('name', 'Pikachu')\n * .where('hp', gte(100))\n *\n * @example Multiple fields (object)\n * .where({ name: 'Pikachu', hp: gte(100) })\n */\n where(field: string, value: FilterValue): this\n where(conditions: Record<string, FilterValue>): this\n where(fieldOrConditions: string | Record<string, FilterValue>, value?: FilterValue): this {\n if (typeof fieldOrConditions === 'string') {\n this.conditions.push({ [fieldOrConditions]: value })\n } else {\n for (const [field, val] of Object.entries(fieldOrConditions)) {\n this.conditions.push({ [field]: val })\n }\n }\n return this\n }\n\n /**\n * Add an OR group (any of the conditions must match)\n *\n * @example\n * .where('type', 'creature')\n * .any(or => or\n * .where('color', 'red')\n * .where('color', 'blue')\n * )\n */\n any(callback: (builder: FilterBuilder) => void): this {\n const orBuilder = new FilterBuilder()\n callback(orBuilder)\n const orConditions = orBuilder.getConditions()\n if (orConditions.length > 0) {\n this.orGroups.push({ $or: orConditions })\n }\n return this\n }\n\n /**\n * Add a link filter condition (filter on linked records)\n *\n * @example\n * .whereLink('set_id', { code: 'DMU' })\n * .whereLink('set_id', { name: ilike('%dominaria%') })\n */\n whereLink(field: string, conditions: Record<string, FilterValue>): this {\n const linkFilter: Record<string, FilterValue> = {}\n for (const [key, val] of Object.entries(conditions)) {\n linkFilter[key] = val\n }\n this.conditions.push({ [`${field}._link`]: linkFilter })\n return this\n }\n\n /**\n * Add an array element filter (for ARRAY of HASH fields)\n * Matches if any element in the array matches all conditions\n *\n * @example\n * .whereAny('attacks', { damage: gte(50) })\n * .whereAny('attacks', { name: ilike('%thunder%') })\n */\n whereAny(field: string, conditions: Record<string, FilterValue>): this {\n const anyFilter: Record<string, FilterValue> = {}\n for (const [key, val] of Object.entries(conditions)) {\n anyFilter[key] = val\n }\n this.conditions.push({ [`${field}._any`]: anyFilter })\n return this\n }\n\n /**\n * Get the conditions array (used internally for OR groups)\n */\n getConditions(): FilterCondition[] {\n return this.conditions\n }\n\n /**\n * Build the final filter object\n */\n build(): FilterCondition {\n const allConditions = [...this.conditions, ...this.orGroups]\n\n if (allConditions.length === 0) {\n return {}\n }\n\n if (allConditions.length === 1) {\n return allConditions[0]!\n }\n\n return { $and: allConditions }\n }\n}\n\n/**\n * Resolve a filter input to a filter condition object\n *\n * Handles both builder functions and object literals\n */\nexport function resolveFilter(input: FilterInput | undefined): FilterCondition | undefined {\n if (input === undefined) {\n return undefined\n }\n\n if (typeof input === 'function') {\n const builder = new FilterBuilder()\n input(builder)\n const result = builder.build()\n return Object.keys(result).length > 0 ? result : undefined\n }\n\n return Object.keys(input).length > 0 ? input : undefined\n}\n","/**\n * GraphQL query builder for CardDB API\n */\n\nimport type {\n DeckCollaboratorRole,\n DeckCreateInput,\n DeckPreviewTokenCreateInput,\n DeckPublishInput,\n DeckUpdateInput,\n FilterCondition,\n} from './types.js'\n\n// ============================================================================\n// Field Definitions\n// ============================================================================\n\nconst PUBLISHER_FIELDS = `\n id\n name\n slug\n status\n description\n website\n createdAt\n updatedAt\n logoFile {\n id\n url\n }\n bannerFile {\n id\n url\n }\n`\n\nconst GAME_FIELDS = `\n id\n publisherId\n key\n name\n description\n website\n visibility\n isArchived\n createdAt\n updatedAt\n publisher {\n id\n name\n slug\n }\n logoFile {\n id\n url\n }\n coverFile {\n id\n url\n }\n`\n\nconst DATASET_FIELDS = `\n id\n publisherId\n gameId\n key\n name\n description\n purpose\n tcgplayerProductIdFieldKey\n visibility\n isArchived\n createdAt\n updatedAt\n publisher {\n id\n name\n slug\n }\n game {\n id\n key\n name\n }\n`\n\nconst SCHEMA_NESTED_FIELDS_DEPTH = 4\n\nfunction fieldInfoFields(depth: number): string {\n const nestedFields =\n depth > 0\n ? `\n nestedFields {\n ${fieldInfoFields(depth - 1)}\n }`\n : ''\n\n return `\n key\n label\n description\n type\n isRequired\n filterable\n searchable\n isIdentifier\n itemType\n displayFormat\n semanticType\n allowedValues\n ${nestedFields}\n `\n}\n\nconst SCHEMA_FIELDS = `\n schema {\n fields {\n ${fieldInfoFields(SCHEMA_NESTED_FIELDS_DEPTH)}\n }\n filterableFields\n searchableFields\n linkFields {\n key\n label\n targetDatasetKey\n targetDatasetName\n targetDatasetId\n }\n }\n`\n\ninterface RecordFieldOptions {\n includePricing?: boolean\n}\n\nconst TCGPLAYER_PRICING_FIELDS = `\n pricing {\n productId\n prices {\n subTypeName\n lowPrice\n midPrice\n highPrice\n marketPrice\n directLowPrice\n }\n }\n`\n\nfunction recordFields(options: RecordFieldOptions = {}): string {\n return `\n id\n datasetId\n data\n ${options.includePricing ? TCGPLAYER_PRICING_FIELDS : ''}\n createdAt\n updatedAt\n dataset {\n id\n key\n name\n gameId\n publisherId\n }\n `\n}\n\nconst RECORD_FIELDS = recordFields()\n\nconst DECK_VERSION_FIELDS = `\n id\n deckId\n versionNumber\n slug\n identifier\n title\n description\n formatKey\n visibility\n externalRef\n sourceUrl\n metadata\n publishNote\n computedDiff\n publishedByAccountId\n publishedByApiApplicationId\n createdAt\n entries {\n id\n datasetId\n recordId\n identifier\n quantity\n section\n sortOrder\n annotations\n record {\n ${RECORD_FIELDS}\n }\n }\n`\n\nconst DECK_COLLABORATOR_FIELDS = `\n id\n deckId\n accountId\n role\n createdByAccountId\n createdAt\n updatedAt\n`\n\nconst DECK_PREVIEW_TOKEN_FIELDS = `\n id\n deckId\n label\n expiresAt\n revokedAt\n lastUsedAt\n createdAt\n updatedAt\n`\n\nconst DECK_FIELDS = `\n id\n accountId\n apiApplicationId\n gameId\n slug\n identifier\n title\n description\n formatKey\n visibility\n externalRef\n sourceUrl\n metadata\n latestPublishedVersion {\n ${DECK_VERSION_FIELDS}\n }\n publishedAt\n hasUnpublishedChanges\n createdAt\n updatedAt\n game {\n ${GAME_FIELDS}\n }\n entries {\n id\n datasetId\n recordId\n identifier\n quantity\n section\n sortOrder\n annotations\n record {\n ${RECORD_FIELDS}\n }\n }\n`\n\nconst RESOLVED_LINKS_FIELDS = `\n resolvedLinks {\n field\n linkFieldKey\n values\n records {\n id\n datasetId\n data\n }\n }\n`\n\nfunction connectionFields(nodeFields: string): string {\n return `\n totalCount\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n edges {\n cursor\n node {\n ${nodeFields}\n }\n }\n `\n}\n\n// ============================================================================\n// Query Builder\n// ============================================================================\n\nexport interface SearchPublishersParams {\n search?: string\n first?: number\n after?: string\n}\n\nexport interface SearchGamesParams {\n publisherSlug?: string\n search?: string\n first?: number\n after?: string\n}\n\nexport interface SearchDatasetsParams {\n publisherSlug?: string\n gameKey?: string\n search?: string\n purpose?: 'DATA' | 'RULES'\n first?: number\n after?: string\n}\n\nexport interface SearchRecordsParams {\n publisherSlug: string\n gameKey: string\n datasetKey: string\n filter?: FilterCondition\n search?: string\n orderBy?: string\n resolveLinks?: string[]\n first?: number\n after?: string\n validateSchema?: boolean\n includePricing?: boolean\n}\n\nexport interface ListDecksParams {\n first?: number\n after?: string\n}\n\nexport interface ListDeckVersionsParams {\n first?: number\n after?: string\n}\n\nexport const QueryBuilder = {\n // Publishers\n searchPublishers(params: SearchPublishersParams = {}): {\n query: string\n variables: Record<string, unknown>\n } {\n const variables: Record<string, unknown> = {}\n const args: string[] = []\n const defs: string[] = []\n\n if (params.search !== undefined) {\n defs.push('$search: String')\n args.push('search: $search')\n variables['search'] = params.search\n }\n if (params.first !== undefined) {\n defs.push('$first: Int')\n args.push('first: $first')\n variables['first'] = params.first\n }\n if (params.after !== undefined) {\n defs.push('$after: String')\n args.push('after: $after')\n variables['after'] = params.after\n }\n\n const defStr = defs.length > 0 ? `(${defs.join(', ')})` : ''\n const argStr = args.length > 0 ? `(${args.join(', ')})` : ''\n\n return {\n query: `\n query SearchPublishers${defStr} {\n searchPublishers${argStr} {\n ${connectionFields(PUBLISHER_FIELDS)}\n }\n }\n `,\n variables,\n }\n },\n\n fetchPublisherById(): { query: string } {\n return {\n query: `\n query FetchPublisher($id: UUID!) {\n fetchPublisher(id: $id) {\n ${PUBLISHER_FIELDS}\n }\n }\n `,\n }\n },\n\n fetchPublisherBySlug(): { query: string } {\n return {\n query: `\n query FetchPublisher($slug: String!) {\n fetchPublisher(slug: $slug) {\n ${PUBLISHER_FIELDS}\n }\n }\n `,\n }\n },\n\n fetchPublishers(): { query: string } {\n return {\n query: `\n query FetchPublishers($slugs: [String!]!) {\n fetchPublishers(slugs: $slugs) {\n ${PUBLISHER_FIELDS}\n }\n }\n `,\n }\n },\n\n // Games\n searchGames(params: SearchGamesParams = {}): {\n query: string\n variables: Record<string, unknown>\n } {\n const variables: Record<string, unknown> = {}\n const args: string[] = []\n const defs: string[] = []\n\n if (params.publisherSlug !== undefined) {\n defs.push('$publisherSlug: String')\n args.push('publisherSlug: $publisherSlug')\n variables['publisherSlug'] = params.publisherSlug\n }\n if (params.search !== undefined) {\n defs.push('$search: String')\n args.push('search: $search')\n variables['search'] = params.search\n }\n if (params.first !== undefined) {\n defs.push('$first: Int')\n args.push('first: $first')\n variables['first'] = params.first\n }\n if (params.after !== undefined) {\n defs.push('$after: String')\n args.push('after: $after')\n variables['after'] = params.after\n }\n\n const defStr = defs.length > 0 ? `(${defs.join(', ')})` : ''\n const argStr = args.length > 0 ? `(${args.join(', ')})` : ''\n\n return {\n query: `\n query SearchGames${defStr} {\n searchGames${argStr} {\n ${connectionFields(GAME_FIELDS)}\n }\n }\n `,\n variables,\n }\n },\n\n fetchGameById(): { query: string } {\n return {\n query: `\n query FetchGame($id: UUID!) {\n fetchGame(id: $id) {\n ${GAME_FIELDS}\n }\n }\n `,\n }\n },\n\n fetchGameByKeys(): { query: string } {\n return {\n query: `\n query FetchGame($publisherSlug: String!, $gameKey: String!) {\n fetchGame(publisherSlug: $publisherSlug, gameKey: $gameKey) {\n ${GAME_FIELDS}\n }\n }\n `,\n }\n },\n\n fetchGames(): { query: string } {\n return {\n query: `\n query FetchGames($ids: [UUID!]!) {\n fetchGames(ids: $ids) {\n ${GAME_FIELDS}\n }\n }\n `,\n }\n },\n\n // Datasets\n searchDatasets(params: SearchDatasetsParams = {}): {\n query: string\n variables: Record<string, unknown>\n } {\n const variables: Record<string, unknown> = {}\n const args: string[] = []\n const defs: string[] = []\n\n if (params.publisherSlug !== undefined) {\n defs.push('$publisherSlug: String')\n args.push('publisherSlug: $publisherSlug')\n variables['publisherSlug'] = params.publisherSlug\n }\n if (params.gameKey !== undefined) {\n defs.push('$gameKey: String')\n args.push('gameKey: $gameKey')\n variables['gameKey'] = params.gameKey\n }\n if (params.search !== undefined) {\n defs.push('$search: String')\n args.push('search: $search')\n variables['search'] = params.search\n }\n if (params.purpose !== undefined) {\n defs.push('$purpose: DatasetPurpose')\n args.push('purpose: $purpose')\n variables['purpose'] = params.purpose\n }\n if (params.first !== undefined) {\n defs.push('$first: Int')\n args.push('first: $first')\n variables['first'] = params.first\n }\n if (params.after !== undefined) {\n defs.push('$after: String')\n args.push('after: $after')\n variables['after'] = params.after\n }\n\n const defStr = defs.length > 0 ? `(${defs.join(', ')})` : ''\n const argStr = args.length > 0 ? `(${args.join(', ')})` : ''\n\n return {\n query: `\n query SearchDatasets${defStr} {\n searchDatasets${argStr} {\n ${connectionFields(DATASET_FIELDS)}\n }\n }\n `,\n variables,\n }\n },\n\n fetchDatasetById(): { query: string } {\n return {\n query: `\n query FetchDataset($id: UUID!) {\n fetchDataset(id: $id) {\n ${DATASET_FIELDS}\n ${SCHEMA_FIELDS}\n }\n }\n `,\n }\n },\n\n fetchDatasetByKeys(): { query: string } {\n return {\n query: `\n query FetchDataset($publisherSlug: String!, $gameKey: String!, $datasetKey: String!) {\n fetchDataset(publisherSlug: $publisherSlug, gameKey: $gameKey, datasetKey: $datasetKey) {\n ${DATASET_FIELDS}\n ${SCHEMA_FIELDS}\n }\n }\n `,\n }\n },\n\n fetchDatasets(): { query: string } {\n return {\n query: `\n query FetchDatasets($ids: [UUID!]!) {\n fetchDatasets(ids: $ids) {\n ${DATASET_FIELDS}\n }\n }\n `,\n }\n },\n\n // Records\n searchRecords(params: SearchRecordsParams): {\n query: string\n variables: Record<string, unknown>\n } {\n const variables: Record<string, unknown> = {\n publisherSlug: params.publisherSlug,\n gameKey: params.gameKey,\n datasetKey: params.datasetKey,\n }\n const args: string[] = [\n 'publisherSlug: $publisherSlug',\n 'gameKey: $gameKey',\n 'datasetKey: $datasetKey',\n ]\n const defs: string[] = ['$publisherSlug: String!', '$gameKey: String!', '$datasetKey: String!']\n\n if (params.filter !== undefined) {\n defs.push('$filter: JSON')\n args.push('filter: $filter')\n variables['filter'] = params.filter\n }\n if (params.search !== undefined) {\n defs.push('$search: String')\n args.push('search: $search')\n variables['search'] = params.search\n }\n if (params.orderBy !== undefined) {\n defs.push('$orderBy: String')\n args.push('orderBy: $orderBy')\n variables['orderBy'] = params.orderBy\n }\n if (params.resolveLinks !== undefined) {\n defs.push('$resolveLinks: [String!]')\n args.push('resolveLinks: $resolveLinks')\n variables['resolveLinks'] = params.resolveLinks\n }\n if (params.first !== undefined) {\n defs.push('$first: Int')\n args.push('first: $first')\n variables['first'] = params.first\n }\n if (params.after !== undefined) {\n defs.push('$after: String')\n args.push('after: $after')\n variables['after'] = params.after\n }\n if (params.validateSchema !== undefined) {\n defs.push('$validateSchema: Boolean')\n args.push('validateSchema: $validateSchema')\n variables['validateSchema'] = params.validateSchema\n }\n\n const includeResolvedLinks = params.resolveLinks && params.resolveLinks.length > 0\n const selectedRecordFields = recordFields({ includePricing: params.includePricing })\n const nodeFields = includeResolvedLinks\n ? `${selectedRecordFields}\\n${RESOLVED_LINKS_FIELDS}`\n : selectedRecordFields\n\n return {\n query: `\n query SearchRecords(${defs.join(', ')}) {\n searchRecords(${args.join(', ')}) {\n ${connectionFields(nodeFields)}\n }\n }\n `,\n variables,\n }\n },\n\n fetchRecordById(params: RecordFieldOptions = {}): { query: string } {\n return {\n query: `\n query FetchRecord($id: UUID!) {\n fetchRecord(id: $id) {\n ${recordFields(params)}\n }\n }\n `,\n }\n },\n\n fetchRecordByIdentifier(params: RecordFieldOptions = {}): { query: string } {\n return {\n query: `\n query FetchRecordByIdentifier($publisherSlug: String!, $gameKey: String!, $datasetKey: String!, $identifier: String!) {\n fetchRecordByIdentifier(publisherSlug: $publisherSlug, gameKey: $gameKey, datasetKey: $datasetKey, identifier: $identifier) {\n ${recordFields(params)}\n }\n }\n `,\n }\n },\n\n fetchRecordsByIdentifier(params: RecordFieldOptions = {}): { query: string } {\n return {\n query: `\n query FetchRecordsByIdentifier($publisherSlug: String!, $gameKey: String!, $datasetKey: String!, $identifiers: [String!]!) {\n fetchRecordsByIdentifier(publisherSlug: $publisherSlug, gameKey: $gameKey, datasetKey: $datasetKey, identifiers: $identifiers) {\n ${recordFields(params)}\n }\n }\n `,\n }\n },\n\n fetchRecords(params: RecordFieldOptions = {}): { query: string } {\n return {\n query: `\n query FetchRecords($ids: [UUID!]!) {\n fetchRecords(ids: $ids) {\n ${recordFields(params)}\n }\n }\n `,\n }\n },\n\n // Decks\n listMyDecks(params: ListDecksParams = {}): {\n query: string\n variables: Record<string, unknown>\n } {\n const variables: Record<string, unknown> = {}\n const args: string[] = []\n const defs: string[] = []\n\n if (params.first !== undefined) {\n defs.push('$first: Int')\n args.push('first: $first')\n variables['first'] = params.first\n }\n if (params.after !== undefined) {\n defs.push('$after: String')\n args.push('after: $after')\n variables['after'] = params.after\n }\n\n const defStr = defs.length > 0 ? `(${defs.join(', ')})` : ''\n const argStr = args.length > 0 ? `(${args.join(', ')})` : ''\n\n return {\n query: `\n query MyDecks${defStr} {\n myDecks${argStr} {\n ${connectionFields(DECK_FIELDS)}\n }\n }\n `,\n variables,\n }\n },\n\n fetchDeckById(): { query: string } {\n return {\n query: `\n query FetchDeck($id: UUID!) {\n fetchDeck(id: $id) {\n ${DECK_FIELDS}\n }\n }\n `,\n }\n },\n\n myDeck(): { query: string } {\n return {\n query: `\n query MyDeck($id: UUID!) {\n myDeck(id: $id) {\n ${DECK_FIELDS}\n }\n }\n `,\n }\n },\n\n fetchDeckBySlug(): { query: string } {\n return {\n query: `\n query FetchDeckBySlug($publisherSlug: String!, $gameKey: String!, $slug: String!) {\n fetchDeckBySlug(publisherSlug: $publisherSlug, gameKey: $gameKey, slug: $slug) {\n ${DECK_FIELDS}\n }\n }\n `,\n }\n },\n\n fetchDeckByExternalRef(): { query: string } {\n return {\n query: `\n query FetchDeckByExternalRef($externalRef: String!) {\n fetchDeckByExternalRef(externalRef: $externalRef) {\n ${DECK_FIELDS}\n }\n }\n `,\n }\n },\n\n deckVersion(): { query: string } {\n return {\n query: `\n query DeckVersion($id: UUID!) {\n deckVersion(id: $id) {\n ${DECK_VERSION_FIELDS}\n }\n }\n `,\n }\n },\n\n deckVersions(params: ListDeckVersionsParams = {}): {\n query: string\n variables: Record<string, unknown>\n } {\n const variables: Record<string, unknown> = {}\n const args: string[] = ['deckId: $deckId']\n const defs: string[] = ['$deckId: UUID!']\n\n if (params.first !== undefined) {\n defs.push('$first: Int')\n args.push('first: $first')\n variables['first'] = params.first\n }\n if (params.after !== undefined) {\n defs.push('$after: String')\n args.push('after: $after')\n variables['after'] = params.after\n }\n\n return {\n query: `\n query DeckVersions(${defs.join(', ')}) {\n deckVersions(${args.join(', ')}) {\n ${connectionFields(DECK_VERSION_FIELDS)}\n }\n }\n `,\n variables,\n }\n },\n\n deckPreview(): { query: string } {\n return {\n query: `\n query DeckPreview($token: String!) {\n deckPreview(token: $token) {\n ${DECK_FIELDS}\n }\n }\n `,\n }\n },\n\n deckCollaborators(): { query: string } {\n return {\n query: `\n query DeckCollaborators($deckId: UUID!) {\n deckCollaborators(deckId: $deckId) {\n ${DECK_COLLABORATOR_FIELDS}\n }\n }\n `,\n }\n },\n\n deckPreviewTokens(): { query: string } {\n return {\n query: `\n query DeckPreviewTokens($deckId: UUID!) {\n deckPreviewTokens(deckId: $deckId) {\n ${DECK_PREVIEW_TOKEN_FIELDS}\n }\n }\n `,\n }\n },\n\n createDeck(): { query: string } {\n return {\n query: `\n mutation DeckCreate($input: DeckCreateInput!) {\n deckCreate(input: $input) {\n ${DECK_FIELDS}\n }\n }\n `,\n }\n },\n\n updateDeck(): { query: string } {\n return {\n query: `\n mutation DeckUpdate($id: UUID!, $input: DeckUpdateInput!) {\n deckUpdate(id: $id, input: $input) {\n ${DECK_FIELDS}\n }\n }\n `,\n }\n },\n\n deleteDeck(): { query: string } {\n return {\n query: `\n mutation DeckDelete($id: UUID!) {\n deckDelete(id: $id)\n }\n `,\n }\n },\n\n publishDeck(): { query: string } {\n return {\n query: `\n mutation DeckPublish($id: UUID!, $input: DeckPublishInput!) {\n deckPublish(id: $id, input: $input) {\n ${DECK_VERSION_FIELDS}\n }\n }\n `,\n }\n },\n\n upsertDeckCollaborator(): { query: string } {\n return {\n query: `\n mutation DeckCollaboratorUpsert($deckId: UUID!, $accountId: UUID!, $role: DeckCollaboratorRole!) {\n deckCollaboratorUpsert(deckId: $deckId, accountId: $accountId, role: $role) {\n ${DECK_COLLABORATOR_FIELDS}\n }\n }\n `,\n }\n },\n\n removeDeckCollaborator(): { query: string } {\n return {\n query: `\n mutation DeckCollaboratorRemove($deckId: UUID!, $accountId: UUID!) {\n deckCollaboratorRemove(deckId: $deckId, accountId: $accountId)\n }\n `,\n }\n },\n\n createDeckPreviewToken(): { query: string } {\n return {\n query: `\n mutation DeckPreviewTokenCreate($input: DeckPreviewTokenCreateInput!) {\n deckPreviewTokenCreate(input: $input) {\n token\n previewToken {\n ${DECK_PREVIEW_TOKEN_FIELDS}\n }\n }\n }\n `,\n }\n },\n\n revokeDeckPreviewToken(): { query: string } {\n return {\n query: `\n mutation DeckPreviewTokenRevoke($id: UUID!) {\n deckPreviewTokenRevoke(id: $id)\n }\n `,\n }\n },\n\n deckCreateVariables(input: DeckCreateInput): Record<string, unknown> {\n return { input }\n },\n\n deckUpdateVariables(id: string, input: DeckUpdateInput): Record<string, unknown> {\n return { id, input }\n },\n\n deckPublishVariables(id: string, input: DeckPublishInput = {}): Record<string, unknown> {\n return { id, input }\n },\n\n deckCollaboratorVariables(\n deckId: string,\n accountId: string,\n role?: DeckCollaboratorRole\n ): Record<string, unknown> {\n return role === undefined ? { deckId, accountId } : { deckId, accountId, role }\n },\n\n deckPreviewTokenCreateVariables(input: DeckPreviewTokenCreateInput): Record<string, unknown> {\n return { input }\n },\n\n // API Key Info\n fetchMe(): { query: string } {\n return {\n query: `\n query FetchMe {\n fetchMe {\n application {\n id\n name\n description\n environment\n apiKeyPrefix\n allowedOrigins\n allowedIps\n createdAt\n updatedAt\n lastUsedAt\n }\n account {\n id\n displayName\n createdAt\n }\n }\n }\n `,\n }\n },\n}\n","/**\n * Collection class for paginated results with async iteration support\n */\n\nimport type { Connection, PageInfo, Edge } from './types.js'\n\nexport type NextPageLoader<T> = (cursor: string) => Promise<Collection<T>>\n\n/**\n * Represents a paginated collection of results from the API.\n * Implements AsyncIterable for easy iteration through all pages.\n */\nexport class Collection<T> implements AsyncIterable<T> {\n /** Total count of matching records across all pages */\n readonly totalCount: number\n\n /** Pagination info */\n readonly pageInfo: PageInfo\n\n /** Items in the current page */\n readonly items: T[]\n\n /** Function to load the next page */\n private nextPageLoader?: NextPageLoader<T>\n\n constructor(\n data: Connection<T>,\n options: {\n nextPageLoader?: NextPageLoader<T>\n itemTransformer?: (node: T) => T\n } = {}\n ) {\n this.totalCount = data.totalCount\n this.pageInfo = data.pageInfo\n this.items = data.edges.map((edge: Edge<T>) =>\n options.itemTransformer ? options.itemTransformer(edge.node) : edge.node\n )\n this.nextPageLoader = options.nextPageLoader\n }\n\n /** Check if there are more pages */\n get hasNextPage(): boolean {\n return this.pageInfo.hasNextPage\n }\n\n /** Check if there are previous pages */\n get hasPreviousPage(): boolean {\n return this.pageInfo.hasPreviousPage\n }\n\n /** Get the cursor for the next page */\n get endCursor(): string | null {\n return this.pageInfo.endCursor\n }\n\n /** Get the cursor for the previous page */\n get startCursor(): string | null {\n return this.pageInfo.startCursor\n }\n\n /** Number of items in the current page */\n get length(): number {\n return this.items.length\n }\n\n /** Check if the current page is empty */\n get isEmpty(): boolean {\n return this.items.length === 0\n }\n\n /** Get the first item */\n get first(): T | undefined {\n return this.items[0]\n }\n\n /** Get the last item */\n get last(): T | undefined {\n return this.items[this.items.length - 1]\n }\n\n /**\n * Fetch the next page of results\n *\n * @returns The next page collection, or null if no more pages\n * @throws Error if no next page loader is configured\n */\n async nextPage(): Promise<Collection<T> | null> {\n if (!this.hasNextPage) {\n return null\n }\n\n if (!this.nextPageLoader) {\n throw new Error('No next page loader configured')\n }\n\n if (!this.endCursor) {\n return null\n }\n\n return this.nextPageLoader(this.endCursor)\n }\n\n /**\n * Async iterator that automatically paginates through all results\n *\n * @example\n * for await (const record of collection) {\n * console.log(record.name)\n * }\n *\n * @example\n * const allRecords = []\n * for await (const record of collection) {\n * allRecords.push(record)\n * }\n */\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n let current: Collection<T> | null = this\n\n while (current) {\n for (const item of current.items) {\n yield item\n }\n\n if (!current.hasNextPage) {\n break\n }\n\n current = await current.nextPage()\n }\n }\n\n /**\n * Iterate through all results, calling a callback for each item\n * Similar to Array.forEach but async and auto-paginating\n *\n * @example\n * await collection.forEach(async (record) => {\n * await processRecord(record)\n * })\n */\n async forEach(callback: (item: T, index: number) => void | Promise<void>): Promise<void> {\n let index = 0\n for await (const item of this) {\n await callback(item, index++)\n }\n }\n\n /**\n * Map over all results, returning a new array\n * Auto-paginates through all pages\n *\n * @example\n * const names = await collection.map(record => record.name)\n */\n async map<U>(callback: (item: T, index: number) => U | Promise<U>): Promise<U[]> {\n const results: U[] = []\n let index = 0\n for await (const item of this) {\n results.push(await callback(item, index++))\n }\n return results\n }\n\n /**\n * Filter results, returning items that match the predicate\n * Auto-paginates through all pages\n *\n * @example\n * const rareCards = await collection.filter(card => card.rarity === 'rare')\n */\n async filter(predicate: (item: T, index: number) => boolean | Promise<boolean>): Promise<T[]> {\n const results: T[] = []\n let index = 0\n for await (const item of this) {\n if (await predicate(item, index++)) {\n results.push(item)\n }\n }\n return results\n }\n\n /**\n * Find the first item matching a predicate\n * Stops iterating once found\n *\n * @example\n * const pikachu = await collection.find(card => card.name === 'Pikachu')\n */\n async find(\n predicate: (item: T, index: number) => boolean | Promise<boolean>\n ): Promise<T | undefined> {\n let index = 0\n for await (const item of this) {\n if (await predicate(item, index++)) {\n return item\n }\n }\n return undefined\n }\n\n /**\n * Take the first n items\n * Stops fetching pages once n items are collected\n *\n * @example\n * const first100 = await collection.take(100)\n */\n async take(n: number): Promise<T[]> {\n const results: T[] = []\n for await (const item of this) {\n if (results.length >= n) {\n break\n }\n results.push(item)\n }\n return results\n }\n\n /**\n * Collect all items into an array\n * Auto-paginates through all pages\n *\n * @example\n * const allRecords = await collection.toArray()\n */\n async toArray(): Promise<T[]> {\n const results: T[] = []\n for await (const item of this) {\n results.push(item)\n }\n return results\n }\n\n /**\n * Iterate in batches (similar to Rails find_in_batches)\n *\n * @example\n * for await (const batch of collection.batches()) {\n * await processBatch(batch)\n * }\n */\n async *batches(): AsyncGenerator<T[]> {\n let current: Collection<T> | null = this\n\n while (current) {\n if (current.items.length > 0) {\n yield current.items\n }\n\n if (!current.hasNextPage) {\n break\n }\n\n current = await current.nextPage()\n }\n }\n\n /**\n * Iterate one item at a time with batched fetching (similar to Rails find_each)\n *\n * @example\n * for await (const item of collection.each()) {\n * await processItem(item)\n * }\n */\n each(): AsyncIterable<T> {\n return this\n }\n}\n","/**\n * Configuration management for CardDB client\n */\n\nimport type { CardDBConfig, ResourceType, Logger, Cache, LogLevel } from '@carddb/core'\nimport { RestrictedError } from '@carddb/core'\n\nexport const DEFAULT_ENDPOINT = 'https://carddb.xtda.org/query'\nexport const DEFAULT_TIMEOUT = 30000 // 30 seconds\nexport const DEFAULT_OPEN_TIMEOUT = 10000 // 10 seconds\nexport const DEFAULT_CACHE_TTL = 300 // 5 minutes\nexport const DEFAULT_MAX_RETRIES = 3\nexport const DEFAULT_MAX_NETWORK_RETRIES = 2\nexport const DEFAULT_RETRY_BASE_DELAY = 1000 // 1 second\nexport const DEFAULT_RETRY_MAX_DELAY = 30000 // 30 seconds\n\nexport class Configuration {\n apiKey?: string\n endpoint: string\n timeout: number\n openTimeout: number\n defaultPublisher?: string\n defaultGame?: string\n allowedPublishers?: string[]\n allowedGames?: Record<string, string[]>\n logger?: Logger\n logLevel: LogLevel\n retryOnRateLimit: boolean\n maxRetries: number\n retryOnNetworkError: boolean\n maxNetworkRetries: number\n retryBaseDelay: number\n retryMaxDelay: number\n cache?: Cache\n cacheTtl: number\n cacheTtls: Partial<Record<ResourceType, number>>\n\n constructor(config: CardDBConfig = {}) {\n this.apiKey = config.apiKey\n this.endpoint = config.endpoint ?? DEFAULT_ENDPOINT\n this.timeout = config.timeout ?? DEFAULT_TIMEOUT\n this.openTimeout = config.openTimeout ?? DEFAULT_OPEN_TIMEOUT\n this.defaultPublisher = config.defaultPublisher\n this.defaultGame = config.defaultGame\n this.allowedPublishers = config.allowedPublishers\n this.allowedGames = config.allowedGames\n this.logger = config.logger\n this.logLevel = config.logLevel ?? 'info'\n this.retryOnRateLimit = config.retryOnRateLimit ?? false\n this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES\n this.retryOnNetworkError = config.retryOnNetworkError ?? true\n this.maxNetworkRetries = config.maxNetworkRetries ?? DEFAULT_MAX_NETWORK_RETRIES\n this.retryBaseDelay = config.retryBaseDelay ?? DEFAULT_RETRY_BASE_DELAY\n this.retryMaxDelay = config.retryMaxDelay ?? DEFAULT_RETRY_MAX_DELAY\n this.cache = config.cache\n this.cacheTtl = config.cacheTtl ?? DEFAULT_CACHE_TTL\n this.cacheTtls = config.cacheTtls ?? {}\n }\n\n /**\n * Calculate delay for exponential backoff\n * @param attempt - The attempt number (0-indexed)\n * @returns Delay in milliseconds with jitter\n */\n calculateRetryDelay(attempt: number): number {\n // Exponential backoff: baseDelay * 2^attempt\n const exponentialDelay = this.retryBaseDelay * Math.pow(2, attempt)\n // Cap at max delay\n const cappedDelay = Math.min(exponentialDelay, this.retryMaxDelay)\n // Add jitter (±25%)\n const jitter = cappedDelay * 0.25 * (Math.random() * 2 - 1)\n return Math.round(cappedDelay + jitter)\n }\n\n /**\n * Get the cache TTL for a specific resource type\n */\n cacheTtlFor(resource: ResourceType): number {\n return this.cacheTtls[resource] ?? this.cacheTtl\n }\n\n /**\n * Resolve publisher slug, using default if not provided\n */\n resolvePublisher(publisherSlug?: string): string | undefined {\n return publisherSlug ?? this.defaultPublisher\n }\n\n /**\n * Resolve game key, using default if not provided\n */\n resolveGame(gameKey?: string): string | undefined {\n return gameKey ?? this.defaultGame\n }\n\n /**\n * Validate that a publisher is allowed by the configuration\n */\n validatePublisher(publisherSlug: string): void {\n if (!this.allowedPublishers) return\n if (this.allowedPublishers.includes(publisherSlug)) return\n\n throw new RestrictedError(`Publisher '${publisherSlug}' is not in the allowed publishers list`)\n }\n\n /**\n * Validate that a game is allowed by the configuration\n */\n validateGame(publisherSlug: string, gameKey: string): void {\n if (!this.allowedGames) return\n const allowedForPublisher = this.allowedGames[publisherSlug]\n if (!allowedForPublisher) return // No restrictions for this publisher\n if (allowedForPublisher.includes(gameKey)) return\n\n throw new RestrictedError(`Game '${gameKey}' is not allowed for publisher '${publisherSlug}'`)\n }\n\n /**\n * Validate both publisher and game access\n */\n validateAccess(publisherSlug?: string, gameKey?: string): void {\n if (publisherSlug) {\n this.validatePublisher(publisherSlug)\n if (gameKey) {\n this.validateGame(publisherSlug, gameKey)\n }\n }\n }\n\n /**\n * Check if a log level should be logged\n */\n shouldLog(level: LogLevel): boolean {\n const levels: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n }\n return levels[level] >= levels[this.logLevel]\n }\n\n /**\n * Create a copy of this configuration with overrides\n */\n merge(overrides: Partial<CardDBConfig>): Configuration {\n return new Configuration({\n apiKey: overrides.apiKey ?? this.apiKey,\n endpoint: overrides.endpoint ?? this.endpoint,\n timeout: overrides.timeout ?? this.timeout,\n openTimeout: overrides.openTimeout ?? this.openTimeout,\n defaultPublisher: overrides.defaultPublisher ?? this.defaultPublisher,\n defaultGame: overrides.defaultGame ?? this.defaultGame,\n allowedPublishers: overrides.allowedPublishers ?? this.allowedPublishers,\n allowedGames: overrides.allowedGames ?? this.allowedGames,\n logger: overrides.logger ?? this.logger,\n logLevel: overrides.logLevel ?? this.logLevel,\n retryOnRateLimit: overrides.retryOnRateLimit ?? this.retryOnRateLimit,\n maxRetries: overrides.maxRetries ?? this.maxRetries,\n retryOnNetworkError: overrides.retryOnNetworkError ?? this.retryOnNetworkError,\n maxNetworkRetries: overrides.maxNetworkRetries ?? this.maxNetworkRetries,\n retryBaseDelay: overrides.retryBaseDelay ?? this.retryBaseDelay,\n retryMaxDelay: overrides.retryMaxDelay ?? this.retryMaxDelay,\n cache: overrides.cache ?? this.cache,\n cacheTtl: overrides.cacheTtl ?? this.cacheTtl,\n cacheTtls: overrides.cacheTtls ?? this.cacheTtls,\n })\n }\n}\n","/**\n * User-Agent string generation for analytics tracking\n *\n * Format: CardDB-SDK/js/{version} ({runtime}/{runtime_version})\n * Examples:\n * - CardDB-SDK/js/0.1.0 (node/20.10.0)\n * - CardDB-SDK/js/0.1.0 (bun/1.0.0)\n * - CardDB-SDK/js/0.1.0 (chrome/120.0.0.0)\n * - CardDB-SDK/js/0.1.0 (firefox/121.0)\n */\n\nconst SDK_VERSION = '0.1.0'\n\ninterface RuntimeInfo {\n name: string\n version: string\n}\n\n/**\n * Detect the current JavaScript runtime\n */\nfunction detectRuntime(): RuntimeInfo {\n // Check for Bun first (it also has process.versions.node)\n if (typeof globalThis !== 'undefined' && 'Bun' in globalThis) {\n const bunVersion =\n (globalThis as Record<string, unknown>).Bun &&\n typeof (globalThis as Record<string, unknown>).Bun === 'object' &&\n ((globalThis as Record<string, unknown>).Bun as Record<string, unknown>).version\n return {\n name: 'bun',\n version: typeof bunVersion === 'string' ? bunVersion : 'unknown',\n }\n }\n\n // Check for Deno\n if (typeof globalThis !== 'undefined' && 'Deno' in globalThis) {\n const denoVersion =\n (globalThis as Record<string, unknown>).Deno &&\n typeof (globalThis as Record<string, unknown>).Deno === 'object' &&\n ((globalThis as Record<string, unknown>).Deno as Record<string, unknown>).version &&\n typeof ((globalThis as Record<string, unknown>).Deno as Record<string, unknown>).version ===\n 'object' &&\n (\n ((globalThis as Record<string, unknown>).Deno as Record<string, unknown>).version as Record<\n string,\n unknown\n >\n ).deno\n return {\n name: 'deno',\n version: typeof denoVersion === 'string' ? denoVersion : 'unknown',\n }\n }\n\n // Check for Node.js\n if (typeof process !== 'undefined' && process.versions && process.versions.node) {\n return {\n name: 'node',\n version: process.versions.node,\n }\n }\n\n // Check for browser\n if (typeof navigator !== 'undefined' && navigator.userAgent) {\n return detectBrowser(navigator.userAgent)\n }\n\n return { name: 'unknown', version: 'unknown' }\n}\n\n/**\n * Parse browser name and version from User-Agent string\n */\nfunction detectBrowser(userAgent: string): RuntimeInfo {\n // Order matters - check more specific browsers first\n\n // Edge (Chromium-based)\n const edgeMatch = userAgent.match(/Edg\\/(\\d+(?:\\.\\d+)*)/)\n if (edgeMatch) {\n return { name: 'edge', version: edgeMatch[1]! }\n }\n\n // Chrome\n const chromeMatch = userAgent.match(/Chrome\\/(\\d+(?:\\.\\d+)*)/)\n if (chromeMatch && !userAgent.includes('Edg/')) {\n return { name: 'chrome', version: chromeMatch[1]! }\n }\n\n // Firefox\n const firefoxMatch = userAgent.match(/Firefox\\/(\\d+(?:\\.\\d+)*)/)\n if (firefoxMatch) {\n return { name: 'firefox', version: firefoxMatch[1]! }\n }\n\n // Safari (check after Chrome since Chrome UA includes Safari)\n const safariMatch = userAgent.match(/Version\\/(\\d+(?:\\.\\d+)*).*Safari/)\n if (safariMatch) {\n return { name: 'safari', version: safariMatch[1]! }\n }\n\n // Generic browser fallback\n return { name: 'browser', version: 'unknown' }\n}\n\n/**\n * Generate the User-Agent string for CardDB SDK\n */\nexport function getUserAgent(): string {\n const runtime = detectRuntime()\n return `CardDB-SDK/js/${SDK_VERSION} (${runtime.name}/${runtime.version})`\n}\n\n/**\n * Get the SDK version\n */\nexport function getSDKVersion(): string {\n return SDK_VERSION\n}\n","/**\n * HTTP connection wrapper for GraphQL requests\n */\n\nimport {\n CardDBError,\n AuthenticationError,\n RateLimitError,\n ValidationError,\n GraphQLError,\n ConnectionError,\n TimeoutError,\n ServerError,\n} from '@carddb/core'\nimport type { GraphQLErrorInfo, RateLimitInfo } from '@carddb/core'\nimport type { Configuration } from './configuration.js'\nimport { getUserAgent } from './user-agent.js'\n\nexport interface GraphQLResponse {\n data?: Record<string, unknown>\n errors?: GraphQLErrorInfo[]\n}\n\n// Store rate limit info per-request (can be accessed after request)\nlet lastRateLimitInfo: RateLimitInfo | null = null\n\nexport function getRateLimitInfo(): RateLimitInfo | null {\n return lastRateLimitInfo\n}\n\nexport class Connection {\n private config: Configuration\n\n constructor(config: Configuration) {\n this.config = config\n }\n\n /**\n * Execute a GraphQL query\n */\n async execute(\n query: string,\n variables: Record<string, unknown> = {}\n ): Promise<Record<string, unknown>> {\n const operationName = this.extractOperationName(query)\n let rateLimitRetries = 0\n let networkRetries = 0\n\n while (true) {\n try {\n const startTime = Date.now()\n this.logRequest(operationName, variables)\n\n const response = await this.fetch(query, variables)\n const duration = Date.now() - startTime\n\n const result = await this.handleResponse(response)\n this.logResponse(operationName, duration)\n\n return result\n } catch (error) {\n // Handle rate limit errors\n if (error instanceof RateLimitError) {\n if (this.config.retryOnRateLimit && rateLimitRetries < this.config.maxRetries) {\n rateLimitRetries++\n const sleepTime = error.retryAfter ?? 60\n this.logRateLimitRetry(operationName, rateLimitRetries, sleepTime)\n await this.sleep(sleepTime * 1000)\n continue\n }\n }\n\n // Handle network errors (connection, timeout) with exponential backoff\n if (this.isRetryableNetworkError(error)) {\n if (this.config.retryOnNetworkError && networkRetries < this.config.maxNetworkRetries) {\n const delay = this.config.calculateRetryDelay(networkRetries)\n this.logNetworkRetry(operationName, networkRetries + 1, delay, error)\n networkRetries++\n await this.sleep(delay)\n continue\n }\n }\n\n // Handle server errors (5xx) with exponential backoff\n if (error instanceof ServerError) {\n if (this.config.retryOnNetworkError && networkRetries < this.config.maxNetworkRetries) {\n const delay = this.config.calculateRetryDelay(networkRetries)\n this.logNetworkRetry(operationName, networkRetries + 1, delay, error)\n networkRetries++\n await this.sleep(delay)\n continue\n }\n }\n\n throw error\n }\n }\n }\n\n /**\n * Check if an error is a retryable network error\n */\n private isRetryableNetworkError(error: unknown): boolean {\n return error instanceof ConnectionError || error instanceof TimeoutError\n }\n\n private async fetch(query: string, variables: Record<string, unknown>): Promise<Response> {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout)\n\n try {\n const response = await fetch(this.config.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'User-Agent': getUserAgent(),\n ...(this.config.apiKey ? { 'X-API-Key': this.config.apiKey } : {}),\n },\n body: JSON.stringify({ query, variables }),\n signal: controller.signal,\n })\n\n return response\n } catch (error) {\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n this.logError('Request timed out')\n throw new TimeoutError('Request timed out')\n }\n this.logError(`Connection failed: ${error.message}`)\n throw new ConnectionError(`Connection failed: ${error.message}`)\n }\n throw new ConnectionError('Connection failed')\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n private async handleResponse(response: Response): Promise<Record<string, unknown>> {\n // Extract rate limit headers\n this.extractRateLimitInfo(response)\n\n switch (response.status) {\n case 200:\n return this.handleSuccessResponse(response)\n case 401:\n throw new AuthenticationError('Invalid or missing API key')\n case 429:\n return this.handleRateLimitResponse(response)\n default:\n if (response.status >= 400 && response.status < 500) {\n return this.handleClientError(response)\n }\n if (response.status >= 500) {\n const body = await this.parseBody(response)\n throw new ServerError(`Server error (${response.status})`, {\n status: response.status,\n response: body,\n })\n }\n throw new CardDBError(`Unexpected response status: ${response.status}`)\n }\n }\n\n private async handleSuccessResponse(response: Response): Promise<Record<string, unknown>> {\n const body = (await this.parseBody(response)) as GraphQLResponse\n\n // Check for GraphQL errors\n if (body.errors && body.errors.length > 0) {\n this.handleGraphQLErrors(body.errors, body)\n }\n\n return body.data ?? {}\n }\n\n private handleGraphQLErrors(errors: GraphQLErrorInfo[], body: GraphQLResponse): never {\n const firstError = errors[0]!\n const message = firstError.message || 'GraphQL error'\n const code = firstError.extensions?.['code'] as string | undefined\n\n switch (code) {\n case 'UNAUTHENTICATED':\n throw new AuthenticationError(message, body)\n case 'RATE_LIMITED':\n throw new RateLimitError(message, { response: body })\n case 'NOT_FOUND':\n throw new CardDBError(message, body)\n case 'VALIDATION_ERROR':\n case 'BAD_USER_INPUT':\n throw new ValidationError(message, { errors, response: body })\n default:\n throw new GraphQLError(message, { errors, response: body })\n }\n }\n\n private async handleRateLimitResponse(response: Response): Promise<never> {\n const retryAfter = parseInt(response.headers.get('Retry-After') ?? '60', 10)\n const limit = parseInt(response.headers.get('X-RateLimit-Limit') ?? '', 10) || null\n const remaining = parseInt(response.headers.get('X-RateLimit-Remaining') ?? '', 10) || null\n const reset = parseInt(response.headers.get('X-RateLimit-Reset') ?? '', 10) || null\n const resetAt = reset ? new Date(reset * 1000) : null\n\n const body = await this.parseBody(response)\n\n throw new RateLimitError('Rate limit exceeded', {\n retryAfter,\n limit,\n remaining,\n resetAt,\n response: body,\n })\n }\n\n private async handleClientError(response: Response): Promise<never> {\n const body = (await this.parseBody(response)) as GraphQLResponse\n const message = body.errors?.[0]?.message ?? `Client error (${response.status})`\n throw new ValidationError(message, { response: body })\n }\n\n private async parseBody(response: Response): Promise<unknown> {\n try {\n return await response.json()\n } catch {\n return { raw: await response.text() }\n }\n }\n\n private extractRateLimitInfo(response: Response): void {\n const limit = parseInt(response.headers.get('X-RateLimit-Limit') ?? '', 10) || null\n const remaining = parseInt(response.headers.get('X-RateLimit-Remaining') ?? '', 10) || null\n const reset = parseInt(response.headers.get('X-RateLimit-Reset') ?? '', 10) || null\n\n lastRateLimitInfo = { limit, remaining, reset }\n }\n\n private extractOperationName(query: string): string {\n const match = query.match(/(?:query|mutation)\\s+(\\w+)/)\n return match ? match[1]! : 'Unknown'\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n }\n\n // Logging helpers\n\n private logRequest(operationName: string, variables: Record<string, unknown>): void {\n if (!this.config.logger || !this.config.shouldLog('debug')) return\n this.config.logger.debug(`[CardDB] Executing ${operationName}`, { variables })\n }\n\n private logResponse(operationName: string, duration: number): void {\n if (!this.config.logger || !this.config.shouldLog('info')) return\n this.config.logger.info(`[CardDB] ${operationName} completed in ${duration}ms`)\n }\n\n private logRateLimitRetry(operationName: string, retry: number, sleepTime: number): void {\n if (!this.config.logger || !this.config.shouldLog('warn')) return\n this.config.logger.warn(\n `[CardDB] Rate limited on ${operationName}, retry ${retry}/${this.config.maxRetries} after ${sleepTime}s`\n )\n }\n\n private logNetworkRetry(\n operationName: string,\n retry: number,\n delay: number,\n error: unknown\n ): void {\n if (!this.config.logger || !this.config.shouldLog('warn')) return\n const errorType = error instanceof Error ? error.name : 'Unknown'\n this.config.logger.warn(\n `[CardDB] ${errorType} on ${operationName}, retry ${retry}/${this.config.maxNetworkRetries} after ${delay}ms`\n )\n }\n\n private logError(message: string): void {\n if (!this.config.logger || !this.config.shouldLog('error')) return\n this.config.logger.error(`[CardDB] ${message}`)\n }\n}\n","/**\n * Cache utilities for CardDB client\n */\n\nimport type { Cache } from '@carddb/core'\n\n/**\n * Generate a cache key from components\n */\nexport function cacheKey(\n resource: string,\n method: string,\n params: Record<string, unknown>\n): string {\n const sortedParams = Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n .join('&')\n return `carddb:${resource}:${method}:${sortedParams}`\n}\n\n/**\n * Read from cache (handles both sync and async caches)\n */\nexport async function readCache<T>(cache: Cache, key: string): Promise<T | null> {\n const result = cache.get<T>(key)\n if (result instanceof Promise) {\n return result\n }\n return result\n}\n\n/**\n * Write to cache (handles both sync and async caches)\n */\nexport async function writeCache<T>(\n cache: Cache,\n key: string,\n value: T,\n ttl: number\n): Promise<void> {\n const result = cache.set(key, value, ttl)\n if (result instanceof Promise) {\n await result\n }\n}\n","/**\n * Base resource class with common functionality\n */\n\nimport type { ResourceType } from '@carddb/core'\nimport type { Configuration } from '../configuration.js'\nimport type { Connection } from '../connection.js'\nimport { cacheKey, readCache, writeCache } from '../cache.js'\n\nexport abstract class BaseResource {\n protected connection: Connection\n protected config: Configuration\n\n constructor(connection: Connection, config: Configuration) {\n this.connection = connection\n this.config = config\n }\n\n /**\n * Resolve publisher slug, using default if not provided\n */\n protected resolvePublisher(publisherSlug?: string): string {\n const resolved = this.config.resolvePublisher(publisherSlug)\n if (!resolved) {\n throw new Error('publisher_slug is required (no default configured)')\n }\n return resolved\n }\n\n /**\n * Resolve game key, using default if not provided\n */\n protected resolveGame(gameKey?: string): string {\n const resolved = this.config.resolveGame(gameKey)\n if (!resolved) {\n throw new Error('game_key is required (no default configured)')\n }\n return resolved\n }\n\n /**\n * Validate access to publisher/game\n */\n protected validateAccess(publisherSlug?: string, gameKey?: string): void {\n this.config.validateAccess(publisherSlug, gameKey)\n }\n\n /**\n * Execute a query with optional caching\n */\n protected async withCache<T>(\n key: string,\n resource: ResourceType,\n options: { cache?: boolean },\n fn: () => Promise<T>\n ): Promise<T> {\n const useCache = options.cache ?? !!this.config.cache\n const cache = this.config.cache\n\n if (!useCache || !cache) {\n return fn()\n }\n\n // Try to read from cache\n const cached = await readCache<T>(cache, key)\n if (cached !== null) {\n return cached\n }\n\n // Execute query and cache result\n const result = await fn()\n if (result !== null && result !== undefined) {\n const ttl = this.config.cacheTtlFor(resource)\n await writeCache(cache, key, result, ttl)\n }\n\n return result\n }\n\n /**\n * Generate a cache key\n */\n protected cacheKey(resource: string, method: string, params: Record<string, unknown>): string {\n return cacheKey(resource, method, params)\n }\n}\n","/**\n * Publishers resource for CardDB API\n */\n\nimport type { Publisher, Connection as ConnectionType } from '@carddb/core'\nimport { Collection, QueryBuilder } from '@carddb/core'\nimport { BaseResource } from './base.js'\nimport type { Configuration } from '../configuration.js'\nimport type { Connection } from '../connection.js'\n\nexport interface SearchPublishersOptions {\n /** Search term to filter publishers by name */\n search?: string\n /** Maximum number of results per page (default: 20, max: 100) */\n first?: number\n /** Cursor for pagination */\n after?: string\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport interface GetPublisherOptions {\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport class PublishersResource extends BaseResource {\n constructor(connection: Connection, config: Configuration) {\n super(connection, config)\n }\n\n /**\n * Search for publishers\n *\n * @example\n * const publishers = await client.publishers.search({ search: 'pokemon' })\n * for await (const publisher of publishers) {\n * console.log(publisher.name)\n * }\n */\n async search(options: SearchPublishersOptions = {}): Promise<Collection<Publisher>> {\n const { query, variables } = QueryBuilder.searchPublishers({\n search: options.search,\n first: options.first,\n after: options.after,\n })\n\n const key = this.cacheKey('publishers', 'search', variables)\n\n const data = await this.withCache(key, 'publishers', options, async () => {\n const result = await this.connection.execute(query, variables)\n return result['searchPublishers'] as ConnectionType<Publisher>\n })\n\n return new Collection(data, {\n nextPageLoader: async (cursor: string) => {\n return this.search({ ...options, after: cursor })\n },\n })\n }\n\n /**\n * Get a single publisher by slug or ID\n *\n * @example\n * const publisher = await client.publishers.get('pokemon')\n * const publisher = await client.publishers.get('550e8400-e29b-41d4-a716-446655440000')\n */\n async get(slugOrId: string, options: GetPublisherOptions = {}): Promise<Publisher | null> {\n const isUUID = this.isUUID(slugOrId)\n const key = this.cacheKey('publishers', 'get', { [isUUID ? 'id' : 'slug']: slugOrId })\n\n return this.withCache(key, 'publishers', options, async () => {\n if (isUUID) {\n const { query } = QueryBuilder.fetchPublisherById()\n const result = await this.connection.execute(query, { id: slugOrId })\n return (result['fetchPublisher'] as Publisher) ?? null\n } else {\n const { query } = QueryBuilder.fetchPublisherBySlug()\n const result = await this.connection.execute(query, { slug: slugOrId })\n return (result['fetchPublisher'] as Publisher) ?? null\n }\n })\n }\n\n /**\n * Get multiple publishers by slug\n *\n * @example\n * const publishers = await client.publishers.getMany(['pokemon', 'wizards'])\n */\n async getMany(slugs: string[], options: GetPublisherOptions = {}): Promise<Publisher[]> {\n if (slugs.length === 0) return []\n\n const key = this.cacheKey('publishers', 'getMany', { slugs })\n\n return this.withCache(key, 'publishers', options, async () => {\n const { query } = QueryBuilder.fetchPublishers()\n const result = await this.connection.execute(query, { slugs })\n return (result['fetchPublishers'] as Publisher[]) ?? []\n })\n }\n\n /**\n * Check if a string is a valid UUID\n */\n private isUUID(value: string): boolean {\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i\n return uuidRegex.test(value)\n }\n}\n","/**\n * Games resource for CardDB API\n */\n\nimport type { Game, Connection as ConnectionType } from '@carddb/core'\nimport { Collection, QueryBuilder } from '@carddb/core'\nimport { BaseResource } from './base.js'\nimport type { Configuration } from '../configuration.js'\nimport type { Connection } from '../connection.js'\n\nexport interface SearchGamesOptions {\n /** Publisher slug to filter games */\n publisherSlug?: string\n /** Search term to filter games by name */\n search?: string\n /** Maximum number of results per page (default: 20, max: 100) */\n first?: number\n /** Cursor for pagination */\n after?: string\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport interface GetGameOptions {\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport class GamesResource extends BaseResource {\n constructor(connection: Connection, config: Configuration) {\n super(connection, config)\n }\n\n /**\n * Search for games\n *\n * @example\n * // Search all games\n * const games = await client.games.search({ search: 'trading card' })\n *\n * // Search games from a specific publisher\n * const games = await client.games.search({ publisherSlug: 'pokemon' })\n */\n async search(options: SearchGamesOptions = {}): Promise<Collection<Game>> {\n const publisherSlug = this.config.resolvePublisher(options.publisherSlug)\n\n // Validate access if publisher is specified\n if (publisherSlug) {\n this.validateAccess(publisherSlug)\n }\n\n const { query, variables } = QueryBuilder.searchGames({\n publisherSlug,\n search: options.search,\n first: options.first,\n after: options.after,\n })\n\n const key = this.cacheKey('games', 'search', variables)\n\n const data = await this.withCache(key, 'games', options, async () => {\n const result = await this.connection.execute(query, variables)\n return result['searchGames'] as ConnectionType<Game>\n })\n\n return new Collection(data, {\n nextPageLoader: async (cursor: string) => {\n return this.search({ ...options, after: cursor })\n },\n })\n }\n\n /**\n * Get a single game by ID\n *\n * @example\n * const game = await client.games.get('550e8400-e29b-41d4-a716-446655440000')\n */\n async get(id: string, options?: GetGameOptions): Promise<Game | null>\n\n /**\n * Get a single game by publisher slug and game key\n *\n * @example\n * const game = await client.games.get('pokemon', 'tcg')\n */\n async get(publisherSlug: string, gameKey: string, options?: GetGameOptions): Promise<Game | null>\n\n async get(\n idOrPublisherSlug: string,\n gameKeyOrOptions?: string | GetGameOptions,\n options?: GetGameOptions\n ): Promise<Game | null> {\n // Determine if called with ID or with publisherSlug + gameKey\n if (typeof gameKeyOrOptions === 'string') {\n // Called as get(publisherSlug, gameKey, options?)\n const publisherSlug = idOrPublisherSlug\n const gameKey = gameKeyOrOptions\n const opts = options ?? {}\n\n this.validateAccess(publisherSlug, gameKey)\n\n const key = this.cacheKey('games', 'getByKeys', { publisherSlug, gameKey })\n\n return this.withCache(key, 'games', opts, async () => {\n const { query } = QueryBuilder.fetchGameByKeys()\n const result = await this.connection.execute(query, { publisherSlug, gameKey })\n return (result['fetchGame'] as Game) ?? null\n })\n } else {\n // Called as get(id, options?)\n const id = idOrPublisherSlug\n const opts = gameKeyOrOptions ?? {}\n\n const key = this.cacheKey('games', 'get', { id })\n\n return this.withCache(key, 'games', opts, async () => {\n const { query } = QueryBuilder.fetchGameById()\n const result = await this.connection.execute(query, { id })\n return (result['fetchGame'] as Game) ?? null\n })\n }\n }\n\n /**\n * Get multiple games by ID\n *\n * @example\n * const games = await client.games.getMany(['id1', 'id2', 'id3'])\n */\n async getMany(ids: string[], options: GetGameOptions = {}): Promise<Game[]> {\n if (ids.length === 0) return []\n\n const key = this.cacheKey('games', 'getMany', { ids })\n\n return this.withCache(key, 'games', options, async () => {\n const { query } = QueryBuilder.fetchGames()\n const result = await this.connection.execute(query, { ids })\n return (result['fetchGames'] as Game[]) ?? []\n })\n }\n}\n","/**\n * Datasets resource for CardDB API\n */\n\nimport type { Dataset, Connection as ConnectionType } from '@carddb/core'\nimport { Collection, QueryBuilder } from '@carddb/core'\nimport { BaseResource } from './base.js'\nimport type { Configuration } from '../configuration.js'\nimport type { Connection } from '../connection.js'\n\nexport interface SearchDatasetsOptions {\n /** Publisher slug to filter datasets */\n publisherSlug?: string\n /** Game key to filter datasets (requires publisherSlug) */\n gameKey?: string\n /** Search term to filter datasets by name */\n search?: string\n /** Dataset purpose to filter by */\n purpose?: 'DATA' | 'RULES'\n /** Maximum number of results per page (default: 20, max: 100) */\n first?: number\n /** Cursor for pagination */\n after?: string\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport interface GetDatasetOptions {\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport class DatasetsResource extends BaseResource {\n constructor(connection: Connection, config: Configuration) {\n super(connection, config)\n }\n\n /**\n * Search for datasets\n *\n * @example\n * // Search all datasets\n * const datasets = await client.datasets.search({ search: 'cards' })\n *\n * // Search datasets from a specific publisher and game\n * const datasets = await client.datasets.search({\n * publisherSlug: 'pokemon',\n * gameKey: 'tcg'\n * })\n */\n async search(options: SearchDatasetsOptions = {}): Promise<Collection<Dataset>> {\n const publisherSlug = this.config.resolvePublisher(options.publisherSlug)\n const gameKey = this.config.resolveGame(options.gameKey)\n\n // Validate access if specified\n if (publisherSlug) {\n this.validateAccess(publisherSlug, gameKey)\n }\n\n const { query, variables } = QueryBuilder.searchDatasets({\n publisherSlug,\n gameKey,\n search: options.search,\n purpose: options.purpose,\n first: options.first,\n after: options.after,\n })\n\n const key = this.cacheKey('datasets', 'search', variables)\n\n const data = await this.withCache(key, 'datasets', options, async () => {\n const result = await this.connection.execute(query, variables)\n return result['searchDatasets'] as ConnectionType<Dataset>\n })\n\n return new Collection(data, {\n nextPageLoader: async (cursor: string) => {\n return this.search({ ...options, after: cursor })\n },\n })\n }\n\n /**\n * Get a single dataset by ID (includes schema)\n *\n * @example\n * const dataset = await client.datasets.get('550e8400-e29b-41d4-a716-446655440000')\n */\n async get(id: string, options?: GetDatasetOptions): Promise<Dataset | null>\n\n /**\n * Get a single dataset by publisher slug, game key, and dataset key (includes schema)\n *\n * @example\n * const dataset = await client.datasets.get('pokemon', 'tcg', 'cards')\n */\n async get(\n publisherSlug: string,\n gameKey: string,\n datasetKey: string,\n options?: GetDatasetOptions\n ): Promise<Dataset | null>\n\n async get(\n idOrPublisherSlug: string,\n gameKeyOrOptions?: string | GetDatasetOptions,\n datasetKey?: string,\n options?: GetDatasetOptions\n ): Promise<Dataset | null> {\n // Determine if called with ID or with publisherSlug + gameKey + datasetKey\n if (typeof gameKeyOrOptions === 'string' && typeof datasetKey === 'string') {\n // Called as get(publisherSlug, gameKey, datasetKey, options?)\n const publisherSlug = idOrPublisherSlug\n const gameKey = gameKeyOrOptions\n const opts = options ?? {}\n\n this.validateAccess(publisherSlug, gameKey)\n\n const key = this.cacheKey('datasets', 'getByKeys', { publisherSlug, gameKey, datasetKey })\n\n return this.withCache(key, 'datasets', opts, async () => {\n const { query } = QueryBuilder.fetchDatasetByKeys()\n const result = await this.connection.execute(query, { publisherSlug, gameKey, datasetKey })\n return (result['fetchDataset'] as Dataset) ?? null\n })\n } else {\n // Called as get(id, options?)\n const id = idOrPublisherSlug\n const opts = (gameKeyOrOptions as GetDatasetOptions) ?? {}\n\n const key = this.cacheKey('datasets', 'get', { id })\n\n return this.withCache(key, 'datasets', opts, async () => {\n const { query } = QueryBuilder.fetchDatasetById()\n const result = await this.connection.execute(query, { id })\n return (result['fetchDataset'] as Dataset) ?? null\n })\n }\n }\n\n /**\n * Get multiple datasets by ID\n *\n * @example\n * const datasets = await client.datasets.getMany(['id1', 'id2', 'id3'])\n */\n async getMany(ids: string[], options: GetDatasetOptions = {}): Promise<Dataset[]> {\n if (ids.length === 0) return []\n\n const key = this.cacheKey('datasets', 'getMany', { ids })\n\n return this.withCache(key, 'datasets', options, async () => {\n const { query } = QueryBuilder.fetchDatasets()\n const result = await this.connection.execute(query, { ids })\n return (result['fetchDatasets'] as Dataset[]) ?? []\n })\n }\n}\n","/**\n * Decks resource for CardDB API\n */\n\nimport type {\n Connection as ConnectionType,\n DatasetRecord,\n Deck,\n DeckCollaborator,\n DeckCollaboratorRole,\n DeckCreateInput,\n DeckPreviewToken,\n DeckPreviewTokenCreateInput,\n DeckPreviewTokenCreatePayload,\n DeckPublishInput,\n DeckUpdateInput,\n DeckVersion,\n HydratedDeckEntry,\n HydrateDeckEntryInput,\n} from '@carddb/core'\nimport { Collection, QueryBuilder } from '@carddb/core'\nimport { BaseResource } from './base.js'\nimport type { Configuration } from '../configuration.js'\nimport type { Connection } from '../connection.js'\n\nexport interface ListDecksOptions {\n /** Maximum number of results per page */\n first?: number\n /** Cursor for pagination */\n after?: string\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport interface FetchDeckOptions {\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport type FetchDeckByExternalRefOptions = FetchDeckOptions\n\nexport type FetchDeckBySlugOptions = FetchDeckOptions\n\nexport type ListDeckVersionsOptions = ListDecksOptions\n\nexport type ListDeckCollaboratorsOptions = FetchDeckOptions\n\nexport type ListDeckPreviewTokensOptions = FetchDeckOptions\n\nexport interface HydrateDeckEntriesOptions {\n /** Publisher slug (uses default if configured) */\n publisherSlug?: string\n /** Game key (uses default if configured) */\n gameKey?: string\n /** Dataset key containing the deck entries */\n datasetKey: string\n /** Field key used to map returned records to input identifiers */\n identifierField?: string\n /** Deck entries to hydrate */\n entries: HydrateDeckEntryInput[]\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport class DecksResource extends BaseResource {\n constructor(connection: Connection, config: Configuration) {\n super(connection, config)\n }\n\n /**\n * Fetch a hosted deck by CardDB UUID.\n */\n async fetch(id: string, options: FetchDeckOptions = {}): Promise<Deck | null> {\n const key = this.cacheKey('decks', 'fetch', { id })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.fetchDeckById()\n const result = await this.connection.execute(query, { id })\n return (result['fetchDeck'] as Deck) ?? null\n })\n }\n\n /**\n * Fetch one deck owned by the current account or API application.\n */\n async fetchMine(id: string, options: FetchDeckOptions = {}): Promise<Deck | null> {\n const key = this.cacheKey('decks', 'fetchMine', { id })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.myDeck()\n const result = await this.connection.execute(query, { id })\n return (result['myDeck'] as Deck) ?? null\n })\n }\n\n /**\n * Fetch a hosted deck by canonical or historical slug.\n */\n async fetchBySlug(\n publisherSlug: string,\n gameKey: string,\n slug: string,\n options: FetchDeckBySlugOptions = {}\n ): Promise<Deck | null> {\n const key = this.cacheKey('decks', 'fetchBySlug', { publisherSlug, gameKey, slug })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.fetchDeckBySlug()\n const result = await this.connection.execute(query, { publisherSlug, gameKey, slug })\n return (result['fetchDeckBySlug'] as Deck) ?? null\n })\n }\n\n /**\n * Fetch a hosted deck by external reference for the current API application.\n */\n async fetchByExternalRef(\n externalRef: string,\n options: FetchDeckByExternalRefOptions = {}\n ): Promise<Deck | null> {\n const key = this.cacheKey('decks', 'fetchByExternalRef', { externalRef })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.fetchDeckByExternalRef()\n const result = await this.connection.execute(query, { externalRef })\n return (result['fetchDeckByExternalRef'] as Deck) ?? null\n })\n }\n\n /**\n * List decks owned by the current account or API application.\n */\n async listMine(options: ListDecksOptions = {}): Promise<Collection<Deck>> {\n const { query, variables } = QueryBuilder.listMyDecks({\n first: options.first,\n after: options.after,\n })\n const key = this.cacheKey('decks', 'listMine', variables)\n\n const data = await this.withCache(key, 'decks', options, async () => {\n const result = await this.connection.execute(query, variables)\n return result['myDecks'] as ConnectionType<Deck>\n })\n\n return new Collection(data, {\n nextPageLoader: async (cursor: string) => this.listMine({ ...options, after: cursor }),\n })\n }\n\n /**\n * Fetch one immutable published deck version.\n */\n async fetchVersion(id: string, options: FetchDeckOptions = {}): Promise<DeckVersion | null> {\n const key = this.cacheKey('decks', 'fetchVersion', { id })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.deckVersion()\n const result = await this.connection.execute(query, { id })\n return (result['deckVersion'] as DeckVersion) ?? null\n })\n }\n\n /**\n * List immutable published versions for a deck.\n */\n async listVersions(\n deckId: string,\n options: ListDeckVersionsOptions = {}\n ): Promise<Collection<DeckVersion>> {\n const { query, variables: pageVariables } = QueryBuilder.deckVersions({\n first: options.first,\n after: options.after,\n })\n const variables = { deckId, ...pageVariables }\n const key = this.cacheKey('decks', 'listVersions', variables)\n\n const data = await this.withCache(key, 'decks', options, async () => {\n const result = await this.connection.execute(query, variables)\n return result['deckVersions'] as ConnectionType<DeckVersion>\n })\n\n return new Collection(data, {\n nextPageLoader: async (cursor: string) =>\n this.listVersions(deckId, { ...options, after: cursor }),\n })\n }\n\n /**\n * Fetch current draft data using a revocable preview token.\n */\n async preview(token: string, options: FetchDeckOptions = {}): Promise<Deck | null> {\n const key = this.cacheKey('decks', 'preview', { token })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.deckPreview()\n const result = await this.connection.execute(query, { token })\n return (result['deckPreview'] as Deck) ?? null\n })\n }\n\n /**\n * List collaborators for a deck.\n */\n async listCollaborators(\n deckId: string,\n options: ListDeckCollaboratorsOptions = {}\n ): Promise<DeckCollaborator[]> {\n const key = this.cacheKey('decks', 'listCollaborators', { deckId })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.deckCollaborators()\n const result = await this.connection.execute(query, { deckId })\n return result['deckCollaborators'] as DeckCollaborator[]\n })\n }\n\n /**\n * List draft preview tokens for a deck.\n */\n async listPreviewTokens(\n deckId: string,\n options: ListDeckPreviewTokensOptions = {}\n ): Promise<DeckPreviewToken[]> {\n const key = this.cacheKey('decks', 'listPreviewTokens', { deckId })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.deckPreviewTokens()\n const result = await this.connection.execute(query, { deckId })\n return result['deckPreviewTokens'] as DeckPreviewToken[]\n })\n }\n\n /**\n * Create a hosted deck.\n */\n async create(input: DeckCreateInput): Promise<Deck> {\n const { query } = QueryBuilder.createDeck()\n const variables = QueryBuilder.deckCreateVariables(input)\n const result = await this.connection.execute(query, variables)\n return result['deckCreate'] as Deck\n }\n\n /**\n * Update a hosted deck.\n */\n async update(id: string, input: DeckUpdateInput): Promise<Deck> {\n const { query } = QueryBuilder.updateDeck()\n const variables = QueryBuilder.deckUpdateVariables(id, input)\n const result = await this.connection.execute(query, variables)\n return result['deckUpdate'] as Deck\n }\n\n /**\n * Delete a hosted deck.\n */\n async delete(id: string): Promise<boolean> {\n const { query } = QueryBuilder.deleteDeck()\n const result = await this.connection.execute(query, { id })\n return Boolean(result['deckDelete'])\n }\n\n /**\n * Publish the current draft as an immutable deck version.\n */\n async publish(id: string, input: DeckPublishInput = {}): Promise<DeckVersion> {\n const { query } = QueryBuilder.publishDeck()\n const variables = QueryBuilder.deckPublishVariables(id, input)\n const result = await this.connection.execute(query, variables)\n return result['deckPublish'] as DeckVersion\n }\n\n /**\n * Create or update a deck collaborator.\n */\n async upsertCollaborator(\n deckId: string,\n accountId: string,\n role: DeckCollaboratorRole\n ): Promise<DeckCollaborator> {\n const { query } = QueryBuilder.upsertDeckCollaborator()\n const variables = QueryBuilder.deckCollaboratorVariables(deckId, accountId, role)\n const result = await this.connection.execute(query, variables)\n return result['deckCollaboratorUpsert'] as DeckCollaborator\n }\n\n /**\n * Remove a deck collaborator.\n */\n async removeCollaborator(deckId: string, accountId: string): Promise<boolean> {\n const { query } = QueryBuilder.removeDeckCollaborator()\n const variables = QueryBuilder.deckCollaboratorVariables(deckId, accountId)\n const result = await this.connection.execute(query, variables)\n return Boolean(result['deckCollaboratorRemove'])\n }\n\n /**\n * Create a revocable draft preview token.\n */\n async createPreviewToken(\n input: DeckPreviewTokenCreateInput\n ): Promise<DeckPreviewTokenCreatePayload> {\n const { query } = QueryBuilder.createDeckPreviewToken()\n const variables = QueryBuilder.deckPreviewTokenCreateVariables(input)\n const result = await this.connection.execute(query, variables)\n return result['deckPreviewTokenCreate'] as DeckPreviewTokenCreatePayload\n }\n\n /**\n * Revoke a draft preview token.\n */\n async revokePreviewToken(id: string): Promise<boolean> {\n const { query } = QueryBuilder.revokeDeckPreviewToken()\n const result = await this.connection.execute(query, { id })\n return Boolean(result['deckPreviewTokenRevoke'])\n }\n\n /**\n * Hydrate third-party-owned deck entries without storing them in CardDB.\n */\n async hydrateEntries(options: HydrateDeckEntriesOptions): Promise<HydratedDeckEntry[]> {\n if (options.entries.length === 0) return []\n\n const publisherSlug = this.resolvePublisher(options.publisherSlug)\n const gameKey = this.resolveGame(options.gameKey)\n this.validateAccess(publisherSlug, gameKey)\n\n const identifiers = options.entries.map((entry) => entry.identifier)\n const key = this.cacheKey('decks', 'hydrateEntries', {\n publisherSlug,\n gameKey,\n datasetKey: options.datasetKey,\n identifiers,\n })\n\n const records = await this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.fetchRecordsByIdentifier()\n const result = await this.connection.execute(query, {\n publisherSlug,\n gameKey,\n datasetKey: options.datasetKey,\n identifiers,\n })\n return result['fetchRecordsByIdentifier'] as DatasetRecord[]\n })\n\n const recordsByIdentifier = recordsByDeckIdentifier(\n records,\n identifiers,\n options.identifierField\n )\n return options.entries.map((entry) => ({\n ...entry,\n record: recordsByIdentifier.get(entry.identifier) ?? null,\n }))\n }\n}\n\nfunction recordsByDeckIdentifier(\n records: DatasetRecord[],\n identifiers: string[],\n identifierField?: string\n): Map<string, DatasetRecord> {\n const remaining = new Set(identifiers)\n const recordsByIdentifier = new Map<string, DatasetRecord>()\n\n for (const record of records) {\n const identifier = identifierField\n ? record.data[identifierField]\n : Object.values(record.data).find((value) => remaining.has(String(value)))\n\n if (identifier === undefined || identifier === null) continue\n\n const key = String(identifier)\n if (!remaining.has(key)) continue\n\n recordsByIdentifier.set(key, record)\n remaining.delete(key)\n }\n\n return recordsByIdentifier\n}\n","/**\n * Records resource for CardDB API\n */\n\nimport type { DatasetRecord, FilterInput, Connection as ConnectionType } from '@carddb/core'\nimport { Collection, QueryBuilder, resolveFilter } from '@carddb/core'\nimport { BaseResource } from './base.js'\nimport type { Configuration } from '../configuration.js'\nimport type { Connection } from '../connection.js'\n\nexport interface SearchRecordsOptions {\n /** Publisher slug (uses default if configured) */\n publisherSlug?: string\n /** Game key (uses default if configured) */\n gameKey?: string\n /** Dataset key (required) */\n datasetKey: string\n /**\n * Filter conditions - can be an object or a builder function\n *\n * @example Object literal\n * filter: { hp: { gte: 100 }, type: 'Pokemon' }\n *\n * @example Builder function\n * filter: f => f\n * .where('hp', gte(100))\n * .where('type', 'Pokemon')\n * .any(or => or\n * .where('rarity', 'rare')\n * .where('rarity', 'mythic')\n * )\n */\n filter?: FilterInput\n /** Full-text search across searchable fields */\n search?: string\n /**\n * Order by field with direction\n * @example 'name:asc', 'hp:desc', 'createdAt:desc'\n */\n orderBy?: string\n /**\n * Link fields to resolve (returns linked record data)\n * @example ['set_id', 'artist_id']\n */\n resolveLinks?: string[]\n /** Maximum number of results per page (default: 20, max: 100) */\n first?: number\n /** Cursor for pagination */\n after?: string\n /** Whether to validate filter against schema (default: true) */\n validateSchema?: boolean\n /** Include live TCGPlayer pricing when configured for the dataset */\n includePricing?: boolean\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport interface GetRecordOptions {\n /** Include live TCGPlayer pricing when configured for the dataset */\n includePricing?: boolean\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport interface GetRecordByIdentifierOptions {\n /** Publisher slug (uses default if configured) */\n publisherSlug?: string\n /** Game key (uses default if configured) */\n gameKey?: string\n /** Dataset key (required) */\n datasetKey: string\n /** The identifier value to look up */\n identifier: string\n /** Include live TCGPlayer pricing when configured for the dataset */\n includePricing?: boolean\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport interface GetRecordsByIdentifierOptions {\n /** Publisher slug (uses default if configured) */\n publisherSlug?: string\n /** Game key (uses default if configured) */\n gameKey?: string\n /** Dataset key (required) */\n datasetKey: string\n /** Identifier values to look up */\n identifiers: string[]\n /** Include live TCGPlayer pricing when configured for the dataset */\n includePricing?: boolean\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport class RecordsResource extends BaseResource {\n constructor(connection: Connection, config: Configuration) {\n super(connection, config)\n }\n\n /**\n * Search for records in a dataset with filtering, search, and pagination\n *\n * @example Basic search\n * const records = await client.records.search({\n * publisherSlug: 'pokemon',\n * gameKey: 'tcg',\n * datasetKey: 'cards',\n * })\n *\n * @example With defaults configured\n * // If client has defaultPublisher: 'pokemon', defaultGame: 'tcg'\n * const records = await client.records.search({ datasetKey: 'cards' })\n *\n * @example With filtering (object literal)\n * const records = await client.records.search({\n * datasetKey: 'cards',\n * filter: {\n * hp: { gte: 100 },\n * types: { contains: 'Fire' }\n * }\n * })\n *\n * @example With filtering (builder function)\n * const records = await client.records.search({\n * datasetKey: 'cards',\n * filter: f => f\n * .where('hp', gte(100))\n * .where('types', contains('Fire'))\n * .any(or => or\n * .where('rarity', 'Rare')\n * .where('rarity', 'Rare Holo')\n * )\n * })\n *\n * @example With link resolution\n * const records = await client.records.search({\n * datasetKey: 'cards',\n * resolveLinks: ['set_id'],\n * filter: f => f.whereLink('set_id', { code: 'BASE' })\n * })\n *\n * @example Iterate through all results\n * const records = await client.records.search({ datasetKey: 'cards' })\n * for await (const record of records) {\n * console.log(record.data.name)\n * }\n */\n async search(options: SearchRecordsOptions): Promise<Collection<DatasetRecord>> {\n const publisherSlug = this.resolvePublisher(options.publisherSlug)\n const gameKey = this.resolveGame(options.gameKey)\n\n this.validateAccess(publisherSlug, gameKey)\n\n // Resolve filter (handles both object and builder function)\n const filter = resolveFilter(options.filter)\n\n const { query, variables } = QueryBuilder.searchRecords({\n publisherSlug,\n gameKey,\n datasetKey: options.datasetKey,\n filter,\n search: options.search,\n orderBy: options.orderBy,\n resolveLinks: options.resolveLinks,\n first: options.first,\n after: options.after,\n validateSchema: options.validateSchema,\n includePricing: options.includePricing,\n })\n\n const key = this.cacheKey('records', 'search', {\n ...variables,\n includePricing: options.includePricing ?? false,\n })\n\n const data = await this.withCache(key, 'records', options, async () => {\n const result = await this.connection.execute(query, variables)\n return result['searchRecords'] as ConnectionType<DatasetRecord>\n })\n\n return new Collection(data, {\n nextPageLoader: async (cursor: string) => {\n return this.search({ ...options, after: cursor })\n },\n })\n }\n\n /**\n * Get a single record by ID\n *\n * @example\n * const record = await client.records.get('550e8400-e29b-41d4-a716-446655440000')\n */\n async get(id: string, options: GetRecordOptions = {}): Promise<DatasetRecord | null> {\n const key = this.cacheKey('records', 'get', {\n id,\n includePricing: options.includePricing ?? false,\n })\n\n return this.withCache(key, 'records', options, async () => {\n const { query } = QueryBuilder.fetchRecordById({ includePricing: options.includePricing })\n const result = await this.connection.execute(query, { id })\n return (result['fetchRecord'] as DatasetRecord) ?? null\n })\n }\n\n /**\n * Get a record by its identifier field value\n *\n * The identifier field is defined in the dataset schema (the field marked as isIdentifier)\n *\n * @example\n * const record = await client.records.getByIdentifier({\n * publisherSlug: 'pokemon',\n * gameKey: 'tcg',\n * datasetKey: 'cards',\n * identifier: 'base1-4'\n * })\n *\n * @example With defaults configured\n * const record = await client.records.getByIdentifier({\n * datasetKey: 'cards',\n * identifier: 'base1-4'\n * })\n */\n async getByIdentifier(options: GetRecordByIdentifierOptions): Promise<DatasetRecord | null> {\n const publisherSlug = this.resolvePublisher(options.publisherSlug)\n const gameKey = this.resolveGame(options.gameKey)\n\n this.validateAccess(publisherSlug, gameKey)\n\n const key = this.cacheKey('records', 'getByIdentifier', {\n publisherSlug,\n gameKey,\n datasetKey: options.datasetKey,\n identifier: options.identifier,\n includePricing: options.includePricing ?? false,\n })\n\n return this.withCache(key, 'records', options, async () => {\n const { query } = QueryBuilder.fetchRecordByIdentifier({\n includePricing: options.includePricing,\n })\n const result = await this.connection.execute(query, {\n publisherSlug,\n gameKey,\n datasetKey: options.datasetKey,\n identifier: options.identifier,\n })\n return (result['fetchRecordByIdentifier'] as DatasetRecord) ?? null\n })\n }\n\n /**\n * Get multiple records by their identifier field values\n *\n * Missing identifiers are omitted from the result.\n *\n * @example\n * const records = await client.records.getManyByIdentifier({\n * publisherSlug: 'pokemon',\n * gameKey: 'tcg',\n * datasetKey: 'cards',\n * identifiers: ['base1-4', 'base1-5']\n * })\n *\n * @example With defaults configured\n * const records = await client.records.getManyByIdentifier({\n * datasetKey: 'cards',\n * identifiers: ['base1-4', 'base1-5']\n * })\n */\n async getManyByIdentifier(options: GetRecordsByIdentifierOptions): Promise<DatasetRecord[]> {\n if (options.identifiers.length === 0) return []\n\n const publisherSlug = this.resolvePublisher(options.publisherSlug)\n const gameKey = this.resolveGame(options.gameKey)\n\n this.validateAccess(publisherSlug, gameKey)\n\n const key = this.cacheKey('records', 'getManyByIdentifier', {\n publisherSlug,\n gameKey,\n datasetKey: options.datasetKey,\n identifiers: options.identifiers,\n includePricing: options.includePricing ?? false,\n })\n\n return this.withCache(key, 'records', options, async () => {\n const { query } = QueryBuilder.fetchRecordsByIdentifier({\n includePricing: options.includePricing,\n })\n const result = await this.connection.execute(query, {\n publisherSlug,\n gameKey,\n datasetKey: options.datasetKey,\n identifiers: options.identifiers,\n })\n return (result['fetchRecordsByIdentifier'] as DatasetRecord[]) ?? []\n })\n }\n\n /**\n * Get multiple records by ID\n *\n * @example\n * const records = await client.records.getMany(['id1', 'id2', 'id3'])\n */\n async getMany(ids: string[], options: GetRecordOptions = {}): Promise<DatasetRecord[]> {\n if (ids.length === 0) return []\n\n const key = this.cacheKey('records', 'getMany', {\n ids,\n includePricing: options.includePricing ?? false,\n })\n\n return this.withCache(key, 'records', options, async () => {\n const { query } = QueryBuilder.fetchRecords({ includePricing: options.includePricing })\n const result = await this.connection.execute(query, { ids })\n return (result['fetchRecords'] as DatasetRecord[]) ?? []\n })\n }\n}\n","/**\n * Rules resource for CardDB API\n */\n\nimport type {\n Dataset,\n DatasetRecord,\n FilterInput,\n Connection as ConnectionType,\n} from '@carddb/core'\nimport { Collection, QueryBuilder, resolveFilter } from '@carddb/core'\nimport { BaseResource } from './base.js'\nimport type { Configuration } from '../configuration.js'\nimport type { Connection } from '../connection.js'\n\nexport interface ListRuleDatasetsOptions {\n /** Publisher slug (uses default if configured) */\n publisherSlug?: string\n /** Game key (uses default if configured) */\n gameKey?: string\n /** Search term to filter rule datasets by name */\n search?: string\n /** Maximum number of results per page (default: 20, max: 100) */\n first?: number\n /** Cursor for pagination */\n after?: string\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport interface ListRulesOptions {\n /** Publisher slug (uses default if configured) */\n publisherSlug?: string\n /** Game key (uses default if configured) */\n gameKey?: string\n /** Rules dataset key (defaults to \"rules\") */\n datasetKey?: string\n /** Filter conditions */\n filter?: FilterInput\n /** Full-text search across searchable fields */\n search?: string\n /** Order by field with direction, e.g. \"name:asc\" */\n orderBy?: string\n /** Link fields to resolve */\n resolveLinks?: string[]\n /** Maximum number of results per page (default: 20, max: 100) */\n first?: number\n /** Cursor for pagination */\n after?: string\n /** Whether to validate filter against schema (default: true) */\n validateSchema?: boolean\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport interface ListFormatsOptions extends Omit<ListRulesOptions, 'datasetKey'> {\n /** Formats dataset key (defaults to \"formats\") */\n datasetKey?: string\n}\n\nexport class RulesResource extends BaseResource {\n constructor(connection: Connection, config: Configuration) {\n super(connection, config)\n }\n\n /**\n * List rule-related datasets for a game.\n *\n * @example\n * const datasets = await client.rules.datasets({ publisherSlug: 'wotc', gameKey: 'magic' })\n */\n async datasets(options: ListRuleDatasetsOptions = {}): Promise<Collection<Dataset>> {\n const publisherSlug = this.resolvePublisher(options.publisherSlug)\n const gameKey = this.resolveGame(options.gameKey)\n\n this.validateAccess(publisherSlug, gameKey)\n\n const { query, variables } = QueryBuilder.searchDatasets({\n publisherSlug,\n gameKey,\n search: options.search,\n purpose: 'RULES',\n first: options.first,\n after: options.after,\n })\n\n const key = this.cacheKey('rules', 'datasets', variables)\n const data = await this.withCache(key, 'datasets', options, async () => {\n const result = await this.connection.execute(query, variables)\n return result['searchDatasets'] as ConnectionType<Dataset>\n })\n\n return new Collection(data, {\n nextPageLoader: async (cursor: string) => this.datasets({ ...options, after: cursor }),\n })\n }\n\n /**\n * List rules from the game's rules dataset.\n *\n * @example\n * const rules = await client.rules.list({ first: 100 })\n */\n async list(options: ListRulesOptions = {}): Promise<Collection<DatasetRecord>> {\n return this.searchRuleRecords('rules', options)\n }\n\n /**\n * List deck/game formats from the game's formats dataset.\n *\n * @example\n * const formats = await client.rules.formats({ first: 100 })\n * const names = formats.items.map(format => format.data.name)\n */\n async formats(options: ListFormatsOptions = {}): Promise<Collection<DatasetRecord>> {\n return this.searchRuleRecords(options.datasetKey ?? 'formats', options)\n }\n\n private async searchRuleRecords(\n defaultDatasetKey: string,\n options: ListRulesOptions\n ): Promise<Collection<DatasetRecord>> {\n const publisherSlug = this.resolvePublisher(options.publisherSlug)\n const gameKey = this.resolveGame(options.gameKey)\n const datasetKey = options.datasetKey ?? defaultDatasetKey\n\n this.validateAccess(publisherSlug, gameKey)\n\n const filter = resolveFilter(options.filter)\n const { query, variables } = QueryBuilder.searchRecords({\n publisherSlug,\n gameKey,\n datasetKey,\n filter,\n search: options.search,\n orderBy: options.orderBy,\n resolveLinks: options.resolveLinks,\n first: options.first,\n after: options.after,\n validateSchema: options.validateSchema,\n })\n\n const key = this.cacheKey('rules', 'records', variables)\n const data = await this.withCache(key, 'records', options, async () => {\n const result = await this.connection.execute(query, variables)\n return result['searchRecords'] as ConnectionType<DatasetRecord>\n })\n\n return new Collection(data, {\n nextPageLoader: async (cursor: string) =>\n this.searchRuleRecords(defaultDatasetKey, { ...options, after: cursor }),\n })\n }\n}\n","/**\n * CardDB Client - Main entry point for the CardDB API\n */\n\nimport type { CardDBConfig, APIKeyInfo } from '@carddb/core'\nimport { QueryBuilder } from '@carddb/core'\nimport { Configuration } from './configuration.js'\nimport { Connection, getRateLimitInfo } from './connection.js'\nimport { PublishersResource } from './resources/publishers.js'\nimport { GamesResource } from './resources/games.js'\nimport { DatasetsResource } from './resources/datasets.js'\nimport { DecksResource } from './resources/decks.js'\nimport { RecordsResource } from './resources/records.js'\nimport { RulesResource } from './resources/rules.js'\n\n/**\n * CardDB API Client\n *\n * @example Basic usage\n * ```typescript\n * import { CardDBClient } from '@carddb/node'\n *\n * const client = new CardDBClient({\n * apiKey: 'carddb_xxx...'\n * })\n *\n * // Search for publishers\n * const publishers = await client.publishers.search()\n *\n * // Get records with filtering\n * const cards = await client.records.search({\n * publisherSlug: 'pokemon',\n * gameKey: 'tcg',\n * datasetKey: 'cards',\n * filter: { hp: { gte: 100 } }\n * })\n * ```\n *\n * @example With defaults configured\n * ```typescript\n * const client = new CardDBClient({\n * apiKey: 'carddb_xxx...',\n * defaultPublisher: 'pokemon',\n * defaultGame: 'tcg'\n * })\n *\n * // Now you can omit publisherSlug and gameKey\n * const cards = await client.records.search({\n * datasetKey: 'cards'\n * })\n * ```\n *\n * @example With caching\n * ```typescript\n * import { CardDBClient, MemoryCache } from '@carddb/node'\n *\n * const client = new CardDBClient({\n * apiKey: 'carddb_xxx...',\n * cache: new MemoryCache(),\n * cacheTtl: 300 // 5 minutes\n * })\n * ```\n */\nexport class CardDBClient {\n private config: Configuration\n private connection: Connection\n\n /** Publishers resource for searching and fetching publishers */\n readonly publishers: PublishersResource\n\n /** Games resource for searching and fetching games */\n readonly games: GamesResource\n\n /** Datasets resource for searching and fetching datasets */\n readonly datasets: DatasetsResource\n\n /** Records resource for searching and fetching records */\n readonly records: RecordsResource\n\n /** Decks resource for hosted decks and external deck hydration */\n readonly decks: DecksResource\n\n /** Rules resource for game rules and deck formats */\n readonly rules: RulesResource\n\n /**\n * Create a new CardDB client\n *\n * @param config - Client configuration options\n */\n constructor(config: CardDBConfig = {}) {\n this.config = new Configuration(config)\n this.connection = new Connection(this.config)\n\n // Initialize resources\n this.publishers = new PublishersResource(this.connection, this.config)\n this.games = new GamesResource(this.connection, this.config)\n this.datasets = new DatasetsResource(this.connection, this.config)\n this.records = new RecordsResource(this.connection, this.config)\n this.decks = new DecksResource(this.connection, this.config)\n this.rules = new RulesResource(this.connection, this.config)\n }\n\n /**\n * Get information about the current API key\n *\n * Returns null if no API key is configured or the key is invalid.\n *\n * @example\n * const info = await client.me()\n * if (info) {\n * console.log(`Logged in as: ${info.account.displayName}`)\n * console.log(`Application: ${info.application.name}`)\n * }\n */\n async me(): Promise<APIKeyInfo | null> {\n const { query } = QueryBuilder.fetchMe()\n const result = await this.connection.execute(query)\n return (result['fetchMe'] as APIKeyInfo) ?? null\n }\n\n /**\n * Get rate limit information from the last request\n *\n * @example\n * await client.publishers.search()\n * const rateLimit = client.getRateLimitInfo()\n * console.log(`Remaining: ${rateLimit?.remaining}/${rateLimit?.limit}`)\n */\n getRateLimitInfo() {\n return getRateLimitInfo()\n }\n\n /**\n * Create a new client with configuration overrides\n *\n * Useful for creating scoped clients with different defaults.\n *\n * @example\n * const pokemonClient = client.withConfig({\n * defaultPublisher: 'pokemon',\n * defaultGame: 'tcg'\n * })\n *\n * // Now all queries use these defaults\n * const cards = await pokemonClient.records.search({ datasetKey: 'cards' })\n */\n withConfig(overrides: Partial<CardDBConfig>): CardDBClient {\n const mergedConfig = this.config.merge(overrides)\n return new CardDBClient({\n apiKey: mergedConfig.apiKey,\n endpoint: mergedConfig.endpoint,\n timeout: mergedConfig.timeout,\n openTimeout: mergedConfig.openTimeout,\n defaultPublisher: mergedConfig.defaultPublisher,\n defaultGame: mergedConfig.defaultGame,\n allowedPublishers: mergedConfig.allowedPublishers,\n allowedGames: mergedConfig.allowedGames,\n logger: mergedConfig.logger,\n logLevel: mergedConfig.logLevel,\n retryOnRateLimit: mergedConfig.retryOnRateLimit,\n maxRetries: mergedConfig.maxRetries,\n retryOnNetworkError: mergedConfig.retryOnNetworkError,\n maxNetworkRetries: mergedConfig.maxNetworkRetries,\n retryBaseDelay: mergedConfig.retryBaseDelay,\n retryMaxDelay: mergedConfig.retryMaxDelay,\n cache: mergedConfig.cache,\n cacheTtl: mergedConfig.cacheTtl,\n cacheTtls: mergedConfig.cacheTtls,\n })\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../core/src/errors.ts","../../../core/src/operators.ts","../../../core/src/filter-builder.ts","../../../core/src/query-builder.ts","../../../core/src/collection.ts","../../../client/src/configuration.ts","../../../client/src/user-agent.ts","../../../client/src/connection.ts","../../../client/src/cache.ts","../../../client/src/resources/base.ts","../../../client/src/resources/publishers.ts","../../../client/src/resources/games.ts","../../../client/src/resources/datasets.ts","../../../client/src/resources/decks.ts","../../../client/src/resources/records.ts","../../../client/src/resources/rules.ts","../../../client/src/client.ts","../../src/cache.ts","../../src/index.ts"],"names":["CardDBError","_CardDBError","message","response","AuthenticationError","RateLimitError","options","NotFoundError","ValidationError","RestrictedError","GraphQLError","ConnectionError","TimeoutError","ServerError","LinkResolutionError","field","f","eq","value","neq","gt","gte","lt","lte","within","values","notWithin","contains","like","pattern","ilike","isNull","isNotNull","FilterBuilder","_FilterBuilder","fieldOrConditions","val","callback","orBuilder","orConditions","conditions","linkFilter","key","anyFilter","allConditions","resolveFilter","input","builder","result","PUBLISHER_FIELDS","GAME_FIELDS","DATASET_FIELDS","SCHEMA_NESTED_FIELDS_DEPTH","fieldInfoFields","depth","SCHEMA_FIELDS","TCGPLAYER_PRICING_FIELDS","recordFields","RECORD_FIELDS","DECK_SECTION_DEFINITION_FIELDS","DECK_ENTRY_FIELDS","DECK_VALIDATED_AGAINST_FIELDS","DECK_VALIDATION_ISSUE_FIELDS","DECK_VALIDATION_FIELDS","DECK_DIFF_FIELDS","DECK_VERSION_FIELDS","DECK_COLLABORATOR_FIELDS","DECK_PREVIEW_TOKEN_FIELDS","DECK_EMBED_TOKEN_FIELDS","DECK_ACCESS_TOKEN_ISSUER_FIELDS","DECK_ACCESS_TOKEN_FIELDS","DECK_IMPORT_ENTRY_FIELDS","DECK_IMPORT_ISSUE_FIELDS","DECK_IMPORT_UNMATCHED_FIELDS","DECK_IMPORT_AMBIGUOUS_FIELDS","DECK_IMPORT_FORMAT_DEFINITION_FIELDS","DECK_IMPORT_FORMAT_DETECTION_FIELDS","DECK_IMPORT_FORMAT_TEST_PAYLOAD_FIELDS","DECK_HYDRATE_ENTRIES_PAYLOAD_FIELDS","DECK_EXPORT_PAYLOAD_FIELDS","DECK_FIELDS","DECK_OWNERSHIP_TRANSFER_PAYLOAD_FIELDS","DECK_COPY_PAYLOAD_FIELDS","DECK_ACCESS_APPLICATION_FIELDS","DECK_API_APPLICATION_ACCESS_FIELDS","DECK_PUBLISH_PAYLOAD_FIELDS","DECK_ENTRY_MUTATION_PAYLOAD_FIELDS","DECK_ENTRY_REORDER_PAYLOAD_FIELDS","DECK_ENTRIES_REPLACE_PAYLOAD_FIELDS","DECK_IMPORT_PAYLOAD_FIELDS","RESOLVED_LINKS_FIELDS","connectionFields","nodeFields","QueryBuilder","params","variables","args","defs","defStr","argStr","includeResolvedLinks","selectedRecordFields","id","expectedDraftRevision","deckId","format","fromVersionId","toVersionId","accountId","role","includeRevoked","applicationId","apiApplicationId","Collection","data","edge","current","item","index","results","predicate","n","DEFAULT_ENDPOINT","DEFAULT_TIMEOUT","DEFAULT_OPEN_TIMEOUT","DEFAULT_CACHE_TTL","DEFAULT_MAX_RETRIES","DEFAULT_MAX_NETWORK_RETRIES","DEFAULT_RETRY_BASE_DELAY","DEFAULT_RETRY_MAX_DELAY","Configuration","_Configuration","config","attempt","exponentialDelay","cappedDelay","jitter","resource","publisherSlug","gameKey","allowedForPublisher","operation","level","levels","overrides","SDK_VERSION","detectRuntime","bunVersion","denoVersion","detectBrowser","userAgent","edgeMatch","chromeMatch","firefoxMatch","safariMatch","getUserAgent","runtime","getSDKVersion","lastRateLimitInfo","getRateLimitInfo","Connection","query","operationName","rateLimitRetries","networkRetries","startTime","duration","error","sleepTime","delay","controller","timeoutId","apiKey","body","errors","firstError","retryAfter","limit","remaining","reset","resetAt","match","ms","resolve","retry","errorType","cacheKey","method","sortedParams","v","a","b","k","readCache","cache","writeCache","ttl","BaseResource","connection","resolved","fn","useCache","cached","PublishersResource","cursor","slugOrId","isUUID","slugs","GamesResource","idOrPublisherSlug","gameKeyOrOptions","opts","ids","DatasetsResource","datasetKey","DecksResource","slug","externalRef","pageVariables","token","gameId","identifiers","entry","records","recordsByIdentifier","recordsByDeckIdentifier","identifierField","record","identifier","RecordsResource","filter","RulesResource","defaultDatasetKey","CardDBClient","_CardDBClient","mergedConfig","BrowserCache","storageType","raw","e","keysToRemove","i","count","now","fullKey"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Error classes for CardDB clients\n */\n\nexport interface GraphQLErrorInfo {\n message: string\n path?: string[]\n extensions?: Record<string, unknown>\n}\n\n/**\n * Base error class for all CardDB errors\n */\nexport class CardDBError extends Error {\n /** The full response body if available */\n readonly response?: unknown\n\n constructor(message: string, response?: unknown) {\n super(message)\n this.name = 'CardDBError'\n this.response = response\n // Maintains proper stack trace for where error was thrown (V8 only)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, CardDBError)\n }\n }\n}\n\n/**\n * Raised when authentication fails (invalid API key or token)\n */\nexport class AuthenticationError extends CardDBError {\n constructor(message = 'Invalid or missing API key', response?: unknown) {\n super(message, response)\n this.name = 'AuthenticationError'\n }\n}\n\n/**\n * Raised when rate limits are exceeded\n */\nexport class RateLimitError extends CardDBError {\n /** Seconds until rate limit resets */\n readonly retryAfter: number | null\n\n /** Maximum requests allowed */\n readonly limit: number | null\n\n /** Remaining requests in window */\n readonly remaining: number | null\n\n /** Time when the rate limit resets */\n readonly resetAt: Date | null\n\n constructor(\n message = 'Rate limit exceeded',\n options: {\n retryAfter?: number | null\n limit?: number | null\n remaining?: number | null\n resetAt?: Date | null\n response?: unknown\n } = {}\n ) {\n super(message, options.response)\n this.name = 'RateLimitError'\n this.retryAfter = options.retryAfter ?? null\n this.limit = options.limit ?? null\n this.remaining = options.remaining ?? null\n this.resetAt = options.resetAt ?? null\n }\n}\n\n/**\n * Raised when a requested resource is not found\n */\nexport class NotFoundError extends CardDBError {\n constructor(message = 'Resource not found', response?: unknown) {\n super(message, response)\n this.name = 'NotFoundError'\n }\n}\n\n/**\n * Raised when request validation fails\n */\nexport class ValidationError extends CardDBError {\n /** List of validation errors */\n readonly errors: GraphQLErrorInfo[]\n\n constructor(\n message = 'Validation error',\n options: {\n errors?: GraphQLErrorInfo[]\n response?: unknown\n } = {}\n ) {\n super(message, options.response)\n this.name = 'ValidationError'\n this.errors = options.errors ?? []\n }\n}\n\n/**\n * Raised when accessing a restricted publisher or game\n */\nexport class RestrictedError extends CardDBError {\n constructor(message: string, response?: unknown) {\n super(message, response)\n this.name = 'RestrictedError'\n }\n}\n\n/**\n * Raised for GraphQL-level errors\n */\nexport class GraphQLError extends CardDBError {\n /** List of GraphQL errors */\n readonly errors: GraphQLErrorInfo[]\n\n constructor(\n message = 'GraphQL error',\n options: {\n errors?: GraphQLErrorInfo[]\n response?: unknown\n } = {}\n ) {\n super(message, options.response)\n this.name = 'GraphQLError'\n this.errors = options.errors ?? []\n }\n}\n\n/**\n * Raised for network/connection issues\n */\nexport class ConnectionError extends CardDBError {\n constructor(message = 'Connection error', response?: unknown) {\n super(message, response)\n this.name = 'ConnectionError'\n }\n}\n\n/**\n * Raised when request times out\n */\nexport class TimeoutError extends ConnectionError {\n constructor(message = 'Request timed out', response?: unknown) {\n super(message, response)\n this.name = 'TimeoutError'\n }\n}\n\n/**\n * Raised when the server returns an unexpected response\n */\nexport class ServerError extends CardDBError {\n /** HTTP status code */\n readonly status: number | null\n\n constructor(\n message = 'Server error',\n options: {\n status?: number | null\n response?: unknown\n } = {}\n ) {\n super(message, options.response)\n this.name = 'ServerError'\n this.status = options.status ?? null\n }\n}\n\n/**\n * Information about a failed link resolution\n */\nexport interface LinkResolutionFailure {\n /** The link field key that failed */\n field: string\n /** The value that couldn't be resolved */\n value: string | null\n /** The reason for the failure */\n reason: 'not_found' | 'invalid' | 'permission_denied' | 'unknown'\n /** Optional error message from the server */\n message?: string\n}\n\n/**\n * Raised when link resolution fails for one or more links\n *\n * This is a warning-level error that contains the partial results along with\n * information about which links failed to resolve. The application can choose\n * to handle this gracefully or treat it as a fatal error.\n */\nexport class LinkResolutionError extends CardDBError {\n /** List of link resolution failures */\n readonly failures: LinkResolutionFailure[]\n\n /** Partial results that were successfully resolved */\n readonly partialResults?: unknown\n\n constructor(\n message = 'Some links could not be resolved',\n options: {\n failures?: LinkResolutionFailure[]\n partialResults?: unknown\n response?: unknown\n } = {}\n ) {\n super(message, options.response)\n this.name = 'LinkResolutionError'\n this.failures = options.failures ?? []\n this.partialResults = options.partialResults\n }\n\n /**\n * Get failures for a specific field\n */\n getFailuresForField(field: string): LinkResolutionFailure[] {\n return this.failures.filter((f) => f.field === field)\n }\n\n /**\n * Check if a specific field had resolution failures\n */\n hasFailuresForField(field: string): boolean {\n return this.failures.some((f) => f.field === field)\n }\n}\n","/**\n * Filter operator helper functions\n *\n * These functions create operator objects that can be used in filters.\n *\n * @example\n * // With filter builder\n * filter: (f) => f\n * .where('hp', gte(100))\n * .where('types', contains('Pokemon'))\n *\n * @example\n * // With object literal\n * filter: {\n * hp: gte(100),\n * types: contains('Pokemon')\n * }\n */\n\nimport type { FilterOperatorValue } from './types.js'\n\n/** Equality operator */\nexport function eq(value: unknown): FilterOperatorValue {\n return { eq: value }\n}\n\n/** Not equal operator */\nexport function neq(value: unknown): FilterOperatorValue {\n return { neq: value }\n}\n\n/** Greater than operator */\nexport function gt(value: number): FilterOperatorValue {\n return { gt: value }\n}\n\n/** Greater than or equal operator */\nexport function gte(value: number): FilterOperatorValue {\n return { gte: value }\n}\n\n/** Less than operator */\nexport function lt(value: number): FilterOperatorValue {\n return { lt: value }\n}\n\n/** Less than or equal operator */\nexport function lte(value: number): FilterOperatorValue {\n return { lte: value }\n}\n\n/** Value in array operator */\nexport function within(values: unknown[]): FilterOperatorValue {\n return { in: values }\n}\n\n/** Value not in array operator */\nexport function notWithin(values: unknown[]): FilterOperatorValue {\n return { nin: values }\n}\n\n/** Array contains value operator */\nexport function contains(value: unknown): FilterOperatorValue {\n return { contains: value }\n}\n\n/** Case-sensitive pattern match (SQL LIKE) */\nexport function like(pattern: string): FilterOperatorValue {\n return { like: pattern }\n}\n\n/** Case-insensitive pattern match (SQL ILIKE) */\nexport function ilike(pattern: string): FilterOperatorValue {\n return { ilike: pattern }\n}\n\n/** Is null operator */\nexport function isNull(): FilterOperatorValue {\n return { is_null: true }\n}\n\n/** Is not null operator */\nexport function isNotNull(): FilterOperatorValue {\n return { is_null: false }\n}\n","/**\n * Filter builder for constructing complex filter queries\n *\n * Supports both builder pattern and object literal styles:\n *\n * @example Builder pattern\n * filter: (f) => f\n * .where('hp', gte(100))\n * .where('types', contains('Pokemon'))\n * .any(or => or\n * .where('rarity', 'rare')\n * .where('rarity', 'mythic')\n * )\n *\n * @example Object literal\n * filter: {\n * hp: { gte: 100 },\n * types: { contains: 'Pokemon' },\n * $or: [\n * { rarity: 'rare' },\n * { rarity: 'mythic' }\n * ]\n * }\n */\n\nimport type { FilterCondition, FilterValue, FilterInput } from './types.js'\n\nexport class FilterBuilder {\n private conditions: FilterCondition[] = []\n private orGroups: FilterCondition[] = []\n\n /**\n * Add a condition to the filter\n *\n * @example Single field\n * .where('name', 'Pikachu')\n * .where('hp', gte(100))\n *\n * @example Multiple fields (object)\n * .where({ name: 'Pikachu', hp: gte(100) })\n */\n where(field: string, value: FilterValue): this\n where(conditions: Record<string, FilterValue>): this\n where(fieldOrConditions: string | Record<string, FilterValue>, value?: FilterValue): this {\n if (typeof fieldOrConditions === 'string') {\n this.conditions.push({ [fieldOrConditions]: value })\n } else {\n for (const [field, val] of Object.entries(fieldOrConditions)) {\n this.conditions.push({ [field]: val })\n }\n }\n return this\n }\n\n /**\n * Add an OR group (any of the conditions must match)\n *\n * @example\n * .where('type', 'creature')\n * .any(or => or\n * .where('color', 'red')\n * .where('color', 'blue')\n * )\n */\n any(callback: (builder: FilterBuilder) => void): this {\n const orBuilder = new FilterBuilder()\n callback(orBuilder)\n const orConditions = orBuilder.getConditions()\n if (orConditions.length > 0) {\n this.orGroups.push({ $or: orConditions })\n }\n return this\n }\n\n /**\n * Add a link filter condition (filter on linked records)\n *\n * @example\n * .whereLink('set_id', { code: 'DMU' })\n * .whereLink('set_id', { name: ilike('%dominaria%') })\n */\n whereLink(field: string, conditions: Record<string, FilterValue>): this {\n const linkFilter: Record<string, FilterValue> = {}\n for (const [key, val] of Object.entries(conditions)) {\n linkFilter[key] = val\n }\n this.conditions.push({ [`${field}._link`]: linkFilter })\n return this\n }\n\n /**\n * Add an array element filter (for ARRAY of HASH fields)\n * Matches if any element in the array matches all conditions\n *\n * @example\n * .whereAny('attacks', { damage: gte(50) })\n * .whereAny('attacks', { name: ilike('%thunder%') })\n */\n whereAny(field: string, conditions: Record<string, FilterValue>): this {\n const anyFilter: Record<string, FilterValue> = {}\n for (const [key, val] of Object.entries(conditions)) {\n anyFilter[key] = val\n }\n this.conditions.push({ [`${field}._any`]: anyFilter })\n return this\n }\n\n /**\n * Get the conditions array (used internally for OR groups)\n */\n getConditions(): FilterCondition[] {\n return this.conditions\n }\n\n /**\n * Build the final filter object\n */\n build(): FilterCondition {\n const allConditions = [...this.conditions, ...this.orGroups]\n\n if (allConditions.length === 0) {\n return {}\n }\n\n if (allConditions.length === 1) {\n return allConditions[0]!\n }\n\n return { $and: allConditions }\n }\n}\n\n/**\n * Resolve a filter input to a filter condition object\n *\n * Handles both builder functions and object literals\n */\nexport function resolveFilter(input: FilterInput | undefined): FilterCondition | undefined {\n if (input === undefined) {\n return undefined\n }\n\n if (typeof input === 'function') {\n const builder = new FilterBuilder()\n input(builder)\n const result = builder.build()\n return Object.keys(result).length > 0 ? result : undefined\n }\n\n return Object.keys(input).length > 0 ? input : undefined\n}\n","/**\n * GraphQL query builder for CardDB API\n */\n\nimport type {\n DeckAccessTokenExchangeInput,\n DeckAccessTokenIssuerCreateInput,\n DeckAPIApplicationAccessGrantInput,\n DeckClaimInput,\n DeckCollaboratorRole,\n DeckCopyInput,\n DeckCreateInput,\n DeckEmbedTokenCreateInput,\n DeckEntriesReplaceInput,\n DeckEntryAddInput,\n DeckEntryReorderInput,\n DeckEntryUpdateInput,\n DeckExportFormat,\n DeckHydrateEntriesInput,\n DeckImportFormatCreateInput,\n DeckImportFormatTestInput,\n DeckImportFormatUpdateInput,\n DeckImportInput,\n DeckPreviewTokenCreateInput,\n DeckPublishInput,\n DeckRemoveInvalidEntriesInput,\n DeckTransferOwnershipInput,\n DeckUpsertByExternalRefInput,\n DeckUpdateInput,\n DeckValidateInput,\n FilterCondition,\n AppDecksFilterInput,\n PublicDecksFilterInput,\n ViewerDecksFilterInput,\n} from './types.js'\n\n// ============================================================================\n// Field Definitions\n// ============================================================================\n\nconst PUBLISHER_FIELDS = `\n id\n name\n slug\n status\n description\n website\n createdAt\n updatedAt\n logoFile {\n id\n url\n }\n bannerFile {\n id\n url\n }\n`\n\nconst GAME_FIELDS = `\n id\n publisherId\n key\n name\n description\n website\n visibility\n isArchived\n createdAt\n updatedAt\n publisher {\n id\n name\n slug\n }\n logoFile {\n id\n url\n }\n coverFile {\n id\n url\n }\n`\n\nconst DATASET_FIELDS = `\n id\n publisherId\n gameId\n key\n name\n description\n purpose\n tcgplayerProductIdFieldKey\n visibility\n isArchived\n createdAt\n updatedAt\n publisher {\n id\n name\n slug\n }\n game {\n id\n key\n name\n }\n`\n\nconst SCHEMA_NESTED_FIELDS_DEPTH = 4\n\nfunction fieldInfoFields(depth: number): string {\n const nestedFields =\n depth > 0\n ? `\n nestedFields {\n ${fieldInfoFields(depth - 1)}\n }`\n : ''\n\n return `\n key\n label\n description\n type\n isRequired\n filterable\n searchable\n isIdentifier\n itemType\n displayFormat\n semanticType\n allowedValues\n ${nestedFields}\n `\n}\n\nconst SCHEMA_FIELDS = `\n schema {\n fields {\n ${fieldInfoFields(SCHEMA_NESTED_FIELDS_DEPTH)}\n }\n filterableFields\n searchableFields\n linkFields {\n key\n label\n targetDatasetKey\n targetDatasetName\n targetDatasetId\n }\n }\n`\n\ninterface RecordFieldOptions {\n includePricing?: boolean\n}\n\nconst TCGPLAYER_PRICING_FIELDS = `\n pricing {\n productId\n prices {\n subTypeName\n lowPrice\n midPrice\n highPrice\n marketPrice\n directLowPrice\n }\n }\n`\n\nfunction recordFields(options: RecordFieldOptions = {}): string {\n return `\n id\n datasetId\n data\n ${options.includePricing ? TCGPLAYER_PRICING_FIELDS : ''}\n createdAt\n updatedAt\n dataset {\n id\n key\n name\n gameId\n publisherId\n }\n `\n}\n\nconst RECORD_FIELDS = recordFields()\n\nconst DECK_SECTION_DEFINITION_FIELDS = `\n key\n label\n description\n order\n default\n aliases\n minCards\n maxCards\n excludedFromDeckSize\n legalCardTypes\n metadata\n`\n\nconst DECK_ENTRY_FIELDS = `\n id\n datasetId\n recordId\n identifier\n quantity\n section\n sortOrder\n annotations\n display\n record {\n ${RECORD_FIELDS}\n }\n`\n\nconst DECK_VALIDATED_AGAINST_FIELDS = `\n rulesetId\n rulesetVersionId\n rulesetVersionLabel\n cardDatasetId\n cardDatasetVersionId\n validatedAt\n validationResultSummary\n`\n\nconst DECK_VALIDATION_ISSUE_FIELDS = `\n code\n severity\n message\n entryIds\n section\n datasetId\n identifier\n metadata\n`\n\nconst DECK_VALIDATION_FIELDS = `\n deckId\n valid\n blockers {\n ${DECK_VALIDATION_ISSUE_FIELDS}\n }\n warnings {\n ${DECK_VALIDATION_ISSUE_FIELDS}\n }\n affectedEntries {\n entryId\n datasetId\n recordId\n identifier\n section\n quantity\n }\n validatedAgainst {\n ${DECK_VALIDATED_AGAINST_FIELDS}\n }\n checkedAt\n`\n\nconst DECK_DIFF_FIELDS = `\n deckId\n fromVersionId\n toVersionId\n toDraftRevision\n hasChanges\n diff\n`\n\nconst DECK_VERSION_FIELDS = `\n id\n deckId\n versionNumber\n slug\n identifier\n title\n description\n formatKey\n visibility\n externalRef\n sourceUrl\n metadata\n publishNote\n computedDiff\n rulesetId\n rulesetVersionId\n cardDatasetId\n cardDatasetVersionId\n validatedAt\n validationSummary\n validatedAgainst {\n ${DECK_VALIDATED_AGAINST_FIELDS}\n }\n sectionDefinitions {\n ${DECK_SECTION_DEFINITION_FIELDS}\n }\n publishedByAccountId\n publishedByApiApplicationId\n createdAt\n entries {\n ${DECK_ENTRY_FIELDS}\n }\n`\n\nconst DECK_COLLABORATOR_FIELDS = `\n id\n deckId\n accountId\n role\n createdByAccountId\n createdAt\n updatedAt\n`\n\nconst DECK_PREVIEW_TOKEN_FIELDS = `\n id\n deckId\n label\n expiresAt\n revokedAt\n lastUsedAt\n createdAt\n updatedAt\n`\n\nconst DECK_EMBED_TOKEN_FIELDS = `\n id\n deckId\n apiApplicationId\n label\n readMode\n allowedOrigins\n externalSubject\n expiresAt\n revokedAt\n lastUsedAt\n createdAt\n updatedAt\n`\n\nconst DECK_ACCESS_TOKEN_ISSUER_FIELDS = `\n id\n deckId\n apiApplicationId\n label\n readModes\n maxTokenLifetimeSeconds\n directSigningAlg\n directSigningKeyId\n directSigningPublicKey\n directSigningKeyRevokedAt\n revokedAt\n createdAt\n updatedAt\n`\n\nconst DECK_ACCESS_TOKEN_FIELDS = `\n id\n deckId\n apiApplicationId\n issuerId\n readMode\n externalSubject\n expiresAt\n revokedAt\n lastUsedAt\n createdAt\n updatedAt\n`\n\nconst DECK_IMPORT_ENTRY_FIELDS = `\n lineNumber\n raw\n datasetKey\n datasetId\n recordId\n identifier\n quantity\n section\n sortOrder\n display\n record {\n ${RECORD_FIELDS}\n }\n`\n\nconst DECK_IMPORT_ISSUE_FIELDS = `\n lineNumber\n raw\n code\n message\n`\n\nconst DECK_IMPORT_UNMATCHED_FIELDS = `\n lineNumber\n raw\n datasetKey\n identifier\n quantity\n section\n code\n message\n`\n\nconst DECK_IMPORT_AMBIGUOUS_FIELDS = `\n lineNumber\n raw\n datasetKey\n identifier\n quantity\n section\n candidates {\n recordId\n identifier\n display\n }\n`\n\nconst DECK_IMPORT_FORMAT_DEFINITION_FIELDS = `\n id\n gameId\n key\n name\n description\n enabled\n priority\n datasetKey\n config\n archivedAt\n isArchived\n createdAt\n updatedAt\n`\n\nconst DECK_IMPORT_FORMAT_DETECTION_FIELDS = `\n formatId\n key\n name\n confidence\n reason\n`\n\nconst DECK_IMPORT_FORMAT_TEST_PAYLOAD_FIELDS = `\n detection {\n ${DECK_IMPORT_FORMAT_DETECTION_FIELDS}\n }\n entries {\n ${DECK_IMPORT_ENTRY_FIELDS}\n }\n parseErrors {\n ${DECK_IMPORT_ISSUE_FIELDS}\n }\n unmatched {\n ${DECK_IMPORT_UNMATCHED_FIELDS}\n }\n ambiguous {\n ${DECK_IMPORT_AMBIGUOUS_FIELDS}\n }\n`\n\nconst DECK_HYDRATE_ENTRIES_PAYLOAD_FIELDS = `\n entries {\n ${DECK_IMPORT_ENTRY_FIELDS}\n }\n unmatched {\n ${DECK_IMPORT_UNMATCHED_FIELDS}\n }\n ambiguous {\n ${DECK_IMPORT_AMBIGUOUS_FIELDS}\n }\n`\n\nconst DECK_EXPORT_PAYLOAD_FIELDS = `\n deckId\n format\n text\n entryCount\n`\n\nconst DECK_FIELDS = `\n id\n ownerType\n ownerAccountId\n ownerApiApplicationId\n environment\n createdByAccountId\n createdByApiApplicationId\n accountId\n apiApplicationId\n gameId\n slug\n identifier\n title\n description\n formatKey\n visibility\n accessMode\n discoverability\n state\n archivedAt\n deletedAt\n unpublishedAt\n externalRefApiApplicationId\n externalRef\n externalSubjectRef\n rulesetId\n sourceUrl\n metadata\n sectionDefinitions {\n ${DECK_SECTION_DEFINITION_FIELDS}\n }\n latestPublishedVersion {\n ${DECK_VERSION_FIELDS}\n }\n publishedAt\n draftRevision\n draftUpdatedAt\n draftUpdatedByAccountId\n draftUpdatedByApiApplicationId\n hasUnpublishedChanges\n createdAt\n updatedAt\n game {\n ${GAME_FIELDS}\n }\n entries {\n ${DECK_ENTRY_FIELDS}\n }\n`\n\nconst DECK_OWNERSHIP_TRANSFER_PAYLOAD_FIELDS = `\n deck {\n ${DECK_FIELDS}\n }\n retainedAppAccess\n`\n\nconst DECK_COPY_PAYLOAD_FIELDS = `\n deck {\n ${DECK_FIELDS}\n }\n copiedFromDeckId\n retainedAppAccess\n`\n\nconst DECK_ACCESS_APPLICATION_FIELDS = `\n id\n name\n description\n revokedAt\n`\n\nconst DECK_API_APPLICATION_ACCESS_FIELDS = `\n id\n deckId\n deck {\n ${DECK_FIELDS}\n }\n apiApplicationId\n apiApplication {\n ${DECK_ACCESS_APPLICATION_FIELDS}\n }\n role\n grantSource\n externalRef\n createdByAccountId\n createdByApiApplicationId\n revokedAt\n createdAt\n updatedAt\n`\n\nconst DECK_PUBLISH_PAYLOAD_FIELDS = `\n deck {\n ${DECK_FIELDS}\n }\n version {\n ${DECK_VERSION_FIELDS}\n }\n validation {\n ${DECK_VALIDATION_FIELDS}\n }\n blockers {\n ${DECK_VALIDATION_ISSUE_FIELDS}\n }\n warnings {\n ${DECK_VALIDATION_ISSUE_FIELDS}\n }\n`\n\nconst DECK_ENTRY_MUTATION_PAYLOAD_FIELDS = `\n deck {\n ${DECK_FIELDS}\n }\n entry {\n ${DECK_ENTRY_FIELDS}\n }\n`\n\nconst DECK_ENTRY_REORDER_PAYLOAD_FIELDS = `\n deck {\n ${DECK_FIELDS}\n }\n entries {\n ${DECK_ENTRY_FIELDS}\n }\n`\n\nconst DECK_ENTRIES_REPLACE_PAYLOAD_FIELDS = DECK_ENTRY_REORDER_PAYLOAD_FIELDS\n\nconst DECK_IMPORT_PAYLOAD_FIELDS = `\n deck {\n ${DECK_FIELDS}\n }\n applied\n dryRun\n replace\n format\n importFormat {\n ${DECK_IMPORT_FORMAT_DEFINITION_FIELDS}\n }\n detection {\n ${DECK_IMPORT_FORMAT_DETECTION_FIELDS}\n }\n entries {\n ${DECK_IMPORT_ENTRY_FIELDS}\n }\n parseErrors {\n ${DECK_IMPORT_ISSUE_FIELDS}\n }\n unmatched {\n ${DECK_IMPORT_UNMATCHED_FIELDS}\n }\n ambiguous {\n ${DECK_IMPORT_AMBIGUOUS_FIELDS}\n }\n validation {\n ${DECK_VALIDATION_FIELDS}\n }\n`\n\nconst RESOLVED_LINKS_FIELDS = `\n resolvedLinks {\n field\n linkFieldKey\n values\n records {\n id\n datasetId\n data\n }\n }\n`\n\nfunction connectionFields(nodeFields: string): string {\n return `\n totalCount\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n edges {\n cursor\n node {\n ${nodeFields}\n }\n }\n `\n}\n\n// ============================================================================\n// Query Builder\n// ============================================================================\n\nexport interface SearchPublishersParams {\n search?: string\n first?: number\n after?: string\n}\n\nexport interface SearchGamesParams {\n publisherSlug?: string\n search?: string\n first?: number\n after?: string\n}\n\nexport interface SearchDatasetsParams {\n publisherSlug?: string\n gameKey?: string\n search?: string\n purpose?: 'DATA' | 'RULES'\n first?: number\n after?: string\n}\n\nexport interface SearchRecordsParams {\n publisherSlug: string\n gameKey: string\n datasetKey: string\n filter?: FilterCondition\n search?: string\n orderBy?: string\n resolveLinks?: string[]\n first?: number\n after?: string\n validateSchema?: boolean\n includePricing?: boolean\n}\n\nexport interface ListDecksParams {\n first?: number\n after?: string\n includeArchived?: boolean\n}\n\nexport interface ListDeckVersionsParams {\n first?: number\n after?: string\n}\n\nexport interface DeckSectionDefinitionsParams {\n publisherSlug?: string\n gameKey?: string\n gameId?: string\n rulesetKey?: string\n rulesetVersionId?: string\n}\n\nexport interface ViewerDecksParams {\n filter?: ViewerDecksFilterInput\n first?: number\n after?: string\n}\n\nexport interface AppDecksParams {\n filter?: AppDecksFilterInput\n first?: number\n after?: string\n}\n\nexport interface PublicDecksParams {\n filter?: PublicDecksFilterInput\n first?: number\n after?: string\n}\n\nexport interface ListDeckImportFormatsParams {\n gameId: string\n includeArchived?: boolean\n first?: number\n after?: string\n}\n\nexport const QueryBuilder = {\n // Publishers\n searchPublishers(params: SearchPublishersParams = {}): {\n query: string\n variables: Record<string, unknown>\n } {\n const variables: Record<string, unknown> = {}\n const args: string[] = []\n const defs: string[] = []\n\n if (params.search !== undefined) {\n defs.push('$search: String')\n args.push('search: $search')\n variables['search'] = params.search\n }\n if (params.first !== undefined) {\n defs.push('$first: Int')\n args.push('first: $first')\n variables['first'] = params.first\n }\n if (params.after !== undefined) {\n defs.push('$after: String')\n args.push('after: $after')\n variables['after'] = params.after\n }\n const defStr = defs.length > 0 ? `(${defs.join(', ')})` : ''\n const argStr = args.length > 0 ? `(${args.join(', ')})` : ''\n\n return {\n query: `\n query SearchPublishers${defStr} {\n searchPublishers${argStr} {\n ${connectionFields(PUBLISHER_FIELDS)}\n }\n }\n `,\n variables,\n }\n },\n\n fetchPublisherById(): { query: string } {\n return {\n query: `\n query FetchPublisher($id: UUID!) {\n fetchPublisher(id: $id) {\n ${PUBLISHER_FIELDS}\n }\n }\n `,\n }\n },\n\n fetchPublisherBySlug(): { query: string } {\n return {\n query: `\n query FetchPublisher($slug: String!) {\n fetchPublisher(slug: $slug) {\n ${PUBLISHER_FIELDS}\n }\n }\n `,\n }\n },\n\n fetchPublishers(): { query: string } {\n return {\n query: `\n query FetchPublishers($slugs: [String!]!) {\n fetchPublishers(slugs: $slugs) {\n ${PUBLISHER_FIELDS}\n }\n }\n `,\n }\n },\n\n // Games\n searchGames(params: SearchGamesParams = {}): {\n query: string\n variables: Record<string, unknown>\n } {\n const variables: Record<string, unknown> = {}\n const args: string[] = []\n const defs: string[] = []\n\n if (params.publisherSlug !== undefined) {\n defs.push('$publisherSlug: String')\n args.push('publisherSlug: $publisherSlug')\n variables['publisherSlug'] = params.publisherSlug\n }\n if (params.search !== undefined) {\n defs.push('$search: String')\n args.push('search: $search')\n variables['search'] = params.search\n }\n if (params.first !== undefined) {\n defs.push('$first: Int')\n args.push('first: $first')\n variables['first'] = params.first\n }\n if (params.after !== undefined) {\n defs.push('$after: String')\n args.push('after: $after')\n variables['after'] = params.after\n }\n const defStr = defs.length > 0 ? `(${defs.join(', ')})` : ''\n const argStr = args.length > 0 ? `(${args.join(', ')})` : ''\n\n return {\n query: `\n query SearchGames${defStr} {\n searchGames${argStr} {\n ${connectionFields(GAME_FIELDS)}\n }\n }\n `,\n variables,\n }\n },\n\n fetchGameById(): { query: string } {\n return {\n query: `\n query FetchGame($id: UUID!) {\n fetchGame(id: $id) {\n ${GAME_FIELDS}\n }\n }\n `,\n }\n },\n\n fetchGameByKeys(): { query: string } {\n return {\n query: `\n query FetchGame($publisherSlug: String!, $gameKey: String!) {\n fetchGame(publisherSlug: $publisherSlug, gameKey: $gameKey) {\n ${GAME_FIELDS}\n }\n }\n `,\n }\n },\n\n fetchGames(): { query: string } {\n return {\n query: `\n query FetchGames($ids: [UUID!]!) {\n fetchGames(ids: $ids) {\n ${GAME_FIELDS}\n }\n }\n `,\n }\n },\n\n // Datasets\n searchDatasets(params: SearchDatasetsParams = {}): {\n query: string\n variables: Record<string, unknown>\n } {\n const variables: Record<string, unknown> = {}\n const args: string[] = []\n const defs: string[] = []\n\n if (params.publisherSlug !== undefined) {\n defs.push('$publisherSlug: String')\n args.push('publisherSlug: $publisherSlug')\n variables['publisherSlug'] = params.publisherSlug\n }\n if (params.gameKey !== undefined) {\n defs.push('$gameKey: String')\n args.push('gameKey: $gameKey')\n variables['gameKey'] = params.gameKey\n }\n if (params.search !== undefined) {\n defs.push('$search: String')\n args.push('search: $search')\n variables['search'] = params.search\n }\n if (params.purpose !== undefined) {\n defs.push('$purpose: DatasetPurpose')\n args.push('purpose: $purpose')\n variables['purpose'] = params.purpose\n }\n if (params.first !== undefined) {\n defs.push('$first: Int')\n args.push('first: $first')\n variables['first'] = params.first\n }\n if (params.after !== undefined) {\n defs.push('$after: String')\n args.push('after: $after')\n variables['after'] = params.after\n }\n\n const defStr = defs.length > 0 ? `(${defs.join(', ')})` : ''\n const argStr = args.length > 0 ? `(${args.join(', ')})` : ''\n\n return {\n query: `\n query SearchDatasets${defStr} {\n searchDatasets${argStr} {\n ${connectionFields(DATASET_FIELDS)}\n }\n }\n `,\n variables,\n }\n },\n\n fetchDatasetById(): { query: string } {\n return {\n query: `\n query FetchDataset($id: UUID!) {\n fetchDataset(id: $id) {\n ${DATASET_FIELDS}\n ${SCHEMA_FIELDS}\n }\n }\n `,\n }\n },\n\n fetchDatasetByKeys(): { query: string } {\n return {\n query: `\n query FetchDataset($publisherSlug: String!, $gameKey: String!, $datasetKey: String!) {\n fetchDataset(publisherSlug: $publisherSlug, gameKey: $gameKey, datasetKey: $datasetKey) {\n ${DATASET_FIELDS}\n ${SCHEMA_FIELDS}\n }\n }\n `,\n }\n },\n\n fetchDatasets(): { query: string } {\n return {\n query: `\n query FetchDatasets($ids: [UUID!]!) {\n fetchDatasets(ids: $ids) {\n ${DATASET_FIELDS}\n }\n }\n `,\n }\n },\n\n // Records\n searchRecords(params: SearchRecordsParams): {\n query: string\n variables: Record<string, unknown>\n } {\n const variables: Record<string, unknown> = {\n publisherSlug: params.publisherSlug,\n gameKey: params.gameKey,\n datasetKey: params.datasetKey,\n }\n const args: string[] = [\n 'publisherSlug: $publisherSlug',\n 'gameKey: $gameKey',\n 'datasetKey: $datasetKey',\n ]\n const defs: string[] = ['$publisherSlug: String!', '$gameKey: String!', '$datasetKey: String!']\n\n if (params.filter !== undefined) {\n defs.push('$filter: JSON')\n args.push('filter: $filter')\n variables['filter'] = params.filter\n }\n if (params.search !== undefined) {\n defs.push('$search: String')\n args.push('search: $search')\n variables['search'] = params.search\n }\n if (params.orderBy !== undefined) {\n defs.push('$orderBy: String')\n args.push('orderBy: $orderBy')\n variables['orderBy'] = params.orderBy\n }\n if (params.resolveLinks !== undefined) {\n defs.push('$resolveLinks: [String!]')\n args.push('resolveLinks: $resolveLinks')\n variables['resolveLinks'] = params.resolveLinks\n }\n if (params.first !== undefined) {\n defs.push('$first: Int')\n args.push('first: $first')\n variables['first'] = params.first\n }\n if (params.after !== undefined) {\n defs.push('$after: String')\n args.push('after: $after')\n variables['after'] = params.after\n }\n if (params.validateSchema !== undefined) {\n defs.push('$validateSchema: Boolean')\n args.push('validateSchema: $validateSchema')\n variables['validateSchema'] = params.validateSchema\n }\n\n const includeResolvedLinks = params.resolveLinks && params.resolveLinks.length > 0\n const selectedRecordFields = recordFields({ includePricing: params.includePricing })\n const nodeFields = includeResolvedLinks\n ? `${selectedRecordFields}\\n${RESOLVED_LINKS_FIELDS}`\n : selectedRecordFields\n\n return {\n query: `\n query SearchRecords(${defs.join(', ')}) {\n searchRecords(${args.join(', ')}) {\n ${connectionFields(nodeFields)}\n }\n }\n `,\n variables,\n }\n },\n\n fetchRecordById(params: RecordFieldOptions = {}): { query: string } {\n return {\n query: `\n query FetchRecord($id: UUID!) {\n fetchRecord(id: $id) {\n ${recordFields(params)}\n }\n }\n `,\n }\n },\n\n fetchRecordByIdentifier(params: RecordFieldOptions = {}): { query: string } {\n return {\n query: `\n query FetchRecordByIdentifier($publisherSlug: String!, $gameKey: String!, $datasetKey: String!, $identifier: String!) {\n fetchRecordByIdentifier(publisherSlug: $publisherSlug, gameKey: $gameKey, datasetKey: $datasetKey, identifier: $identifier) {\n ${recordFields(params)}\n }\n }\n `,\n }\n },\n\n fetchRecordsByIdentifier(params: RecordFieldOptions = {}): { query: string } {\n return {\n query: `\n query FetchRecordsByIdentifier($publisherSlug: String!, $gameKey: String!, $datasetKey: String!, $identifiers: [String!]!) {\n fetchRecordsByIdentifier(publisherSlug: $publisherSlug, gameKey: $gameKey, datasetKey: $datasetKey, identifiers: $identifiers) {\n ${recordFields(params)}\n }\n }\n `,\n }\n },\n\n fetchRecords(params: RecordFieldOptions = {}): { query: string } {\n return {\n query: `\n query FetchRecords($ids: [UUID!]!) {\n fetchRecords(ids: $ids) {\n ${recordFields(params)}\n }\n }\n `,\n }\n },\n\n // Decks\n listMyDecks(params: ListDecksParams = {}): {\n query: string\n variables: Record<string, unknown>\n } {\n const variables: Record<string, unknown> = {}\n const args: string[] = []\n const defs: string[] = []\n\n if (params.first !== undefined) {\n defs.push('$first: Int')\n args.push('first: $first')\n variables['first'] = params.first\n }\n if (params.after !== undefined) {\n defs.push('$after: String')\n args.push('after: $after')\n variables['after'] = params.after\n }\n if (params.includeArchived !== undefined) {\n defs.push('$includeArchived: Boolean')\n args.push('includeArchived: $includeArchived')\n variables['includeArchived'] = params.includeArchived\n }\n\n const defStr = defs.length > 0 ? `(${defs.join(', ')})` : ''\n const argStr = args.length > 0 ? `(${args.join(', ')})` : ''\n\n return {\n query: `\n query MyDecks${defStr} {\n myDecks${argStr} {\n ${connectionFields(DECK_FIELDS)}\n }\n }\n `,\n variables,\n }\n },\n\n viewerDecks(params: ViewerDecksParams = {}): {\n query: string\n variables: Record<string, unknown>\n } {\n const variables: Record<string, unknown> = {}\n const args: string[] = []\n const defs: string[] = []\n\n if (params.filter !== undefined) {\n defs.push('$filter: ViewerDecksFilterInput')\n args.push('filter: $filter')\n variables['filter'] = params.filter\n }\n if (params.first !== undefined) {\n defs.push('$first: Int')\n args.push('first: $first')\n variables['first'] = params.first\n }\n if (params.after !== undefined) {\n defs.push('$after: String')\n args.push('after: $after')\n variables['after'] = params.after\n }\n\n const defStr = defs.length > 0 ? `(${defs.join(', ')})` : ''\n const argStr = args.length > 0 ? `(${args.join(', ')})` : ''\n\n return {\n query: `\n query ViewerDecks${defStr} {\n viewerDecks${argStr} {\n ${connectionFields(DECK_FIELDS)}\n }\n }\n `,\n variables,\n }\n },\n\n appDecks(params: AppDecksParams = {}): {\n query: string\n variables: Record<string, unknown>\n } {\n const variables: Record<string, unknown> = {}\n const args: string[] = []\n const defs: string[] = []\n\n if (params.filter !== undefined) {\n defs.push('$filter: AppDecksFilterInput')\n args.push('filter: $filter')\n variables['filter'] = params.filter\n }\n if (params.first !== undefined) {\n defs.push('$first: Int')\n args.push('first: $first')\n variables['first'] = params.first\n }\n if (params.after !== undefined) {\n defs.push('$after: String')\n args.push('after: $after')\n variables['after'] = params.after\n }\n\n const defStr = defs.length > 0 ? `(${defs.join(', ')})` : ''\n const argStr = args.length > 0 ? `(${args.join(', ')})` : ''\n\n return {\n query: `\n query AppDecks${defStr} {\n appDecks${argStr} {\n ${connectionFields(DECK_FIELDS)}\n }\n }\n `,\n variables,\n }\n },\n\n publicDecks(params: PublicDecksParams = {}): {\n query: string\n variables: Record<string, unknown>\n } {\n const variables: Record<string, unknown> = {}\n const args: string[] = []\n const defs: string[] = []\n\n if (params.filter !== undefined) {\n defs.push('$filter: PublicDecksFilterInput')\n args.push('filter: $filter')\n variables['filter'] = params.filter\n }\n if (params.first !== undefined) {\n defs.push('$first: Int')\n args.push('first: $first')\n variables['first'] = params.first\n }\n if (params.after !== undefined) {\n defs.push('$after: String')\n args.push('after: $after')\n variables['after'] = params.after\n }\n\n const defStr = defs.length > 0 ? `(${defs.join(', ')})` : ''\n const argStr = args.length > 0 ? `(${args.join(', ')})` : ''\n\n return {\n query: `\n query PublicDecks${defStr} {\n publicDecks${argStr} {\n ${connectionFields(DECK_FIELDS)}\n }\n }\n `,\n variables,\n }\n },\n\n fetchDeckById(): { query: string } {\n return {\n query: `\n query FetchDeck($id: UUID!) {\n fetchDeck(id: $id) {\n ${DECK_FIELDS}\n }\n }\n `,\n }\n },\n\n deckById(): { query: string } {\n return {\n query: `\n query Deck($id: UUID!) {\n deck(id: $id) {\n ${DECK_FIELDS}\n }\n }\n `,\n }\n },\n\n myDeck(): { query: string } {\n return {\n query: `\n query MyDeck($id: UUID!) {\n myDeck(id: $id) {\n ${DECK_FIELDS}\n }\n }\n `,\n }\n },\n\n fetchDeckBySlug(): { query: string } {\n return {\n query: `\n query FetchDeckBySlug($publisherSlug: String!, $gameKey: String!, $slug: String!) {\n fetchDeckBySlug(publisherSlug: $publisherSlug, gameKey: $gameKey, slug: $slug) {\n ${DECK_FIELDS}\n }\n }\n `,\n }\n },\n\n deckBySlug(): { query: string } {\n return {\n query: `\n query DeckBySlug($publisherSlug: String!, $gameKey: String!, $slug: String!) {\n deckBySlug(publisherSlug: $publisherSlug, gameKey: $gameKey, slug: $slug) {\n ${DECK_FIELDS}\n }\n }\n `,\n }\n },\n\n fetchDeckByExternalRef(): { query: string } {\n return {\n query: `\n query FetchDeckByExternalRef($externalRef: String!) {\n fetchDeckByExternalRef(externalRef: $externalRef) {\n ${DECK_FIELDS}\n }\n }\n `,\n }\n },\n\n deckByExternalRef(): { query: string } {\n return {\n query: `\n query DeckByExternalRef($externalRef: String!) {\n deckByExternalRef(externalRef: $externalRef) {\n ${DECK_FIELDS}\n }\n }\n `,\n }\n },\n\n deckVersion(): { query: string } {\n return {\n query: `\n query DeckVersion($id: UUID!) {\n deckVersion(id: $id) {\n ${DECK_VERSION_FIELDS}\n }\n }\n `,\n }\n },\n\n deckVersions(params: ListDeckVersionsParams = {}): {\n query: string\n variables: Record<string, unknown>\n } {\n const variables: Record<string, unknown> = {}\n const args: string[] = ['deckId: $deckId']\n const defs: string[] = ['$deckId: UUID!']\n\n if (params.first !== undefined) {\n defs.push('$first: Int')\n args.push('first: $first')\n variables['first'] = params.first\n }\n if (params.after !== undefined) {\n defs.push('$after: String')\n args.push('after: $after')\n variables['after'] = params.after\n }\n\n return {\n query: `\n query DeckVersions(${defs.join(', ')}) {\n deckVersions(${args.join(', ')}) {\n ${connectionFields(DECK_VERSION_FIELDS)}\n }\n }\n `,\n variables,\n }\n },\n\n deckPreview(): { query: string } {\n return {\n query: `\n query DeckPreview($token: String!) {\n deckPreview(token: $token) {\n ${DECK_FIELDS}\n }\n }\n `,\n }\n },\n\n deckEmbed(): { query: string } {\n return {\n query: `\n query DeckEmbed($token: String!) {\n deckEmbed(token: $token) {\n ${DECK_FIELDS}\n }\n }\n `,\n }\n },\n\n deckAccess(): { query: string } {\n return {\n query: `\n query DeckAccess($token: String!) {\n deckAccess(token: $token) {\n ${DECK_FIELDS}\n }\n }\n `,\n }\n },\n\n deckDraftDiff(): { query: string } {\n return {\n query: `\n query DeckDraftDiff($id: UUID!) {\n deckDraftDiff(id: $id) {\n ${DECK_DIFF_FIELDS}\n }\n }\n `,\n }\n },\n\n deckVersionDiff(): { query: string } {\n return {\n query: `\n query DeckVersionDiff($fromVersionId: UUID!, $toVersionId: UUID!) {\n deckVersionDiff(fromVersionId: $fromVersionId, toVersionId: $toVersionId) {\n ${DECK_DIFF_FIELDS}\n }\n }\n `,\n }\n },\n\n deckHydrateEntries(): { query: string } {\n return {\n query: `\n query DeckHydrateEntries($input: DeckHydrateEntriesInput!) {\n deckHydrateEntries(input: $input) {\n ${DECK_HYDRATE_ENTRIES_PAYLOAD_FIELDS}\n }\n }\n `,\n }\n },\n\n deckExport(): { query: string } {\n return {\n query: `\n query DeckExport($id: UUID!, $format: DeckExportFormat!) {\n deckExport(id: $id, format: $format) {\n ${DECK_EXPORT_PAYLOAD_FIELDS}\n }\n }\n `,\n }\n },\n\n deckValidate(): { query: string } {\n return {\n query: `\n query DeckValidate($id: UUID!, $input: DeckValidateInput) {\n deckValidate(id: $id, input: $input) {\n ${DECK_VALIDATION_FIELDS}\n }\n }\n `,\n }\n },\n\n deckSectionDefinitions(params: DeckSectionDefinitionsParams = {}): {\n query: string\n variables: Record<string, unknown>\n } {\n const variables: Record<string, unknown> = {}\n const args: string[] = []\n const defs: string[] = []\n\n if (params.publisherSlug !== undefined) {\n defs.push('$publisherSlug: String')\n args.push('publisherSlug: $publisherSlug')\n variables['publisherSlug'] = params.publisherSlug\n }\n if (params.gameKey !== undefined) {\n defs.push('$gameKey: String')\n args.push('gameKey: $gameKey')\n variables['gameKey'] = params.gameKey\n }\n if (params.gameId !== undefined) {\n defs.push('$gameId: UUID')\n args.push('gameId: $gameId')\n variables['gameId'] = params.gameId\n }\n if (params.rulesetKey !== undefined) {\n defs.push('$rulesetKey: String')\n args.push('rulesetKey: $rulesetKey')\n variables['rulesetKey'] = params.rulesetKey\n }\n if (params.rulesetVersionId !== undefined) {\n defs.push('$rulesetVersionId: UUID')\n args.push('rulesetVersionId: $rulesetVersionId')\n variables['rulesetVersionId'] = params.rulesetVersionId\n }\n\n const defStr = defs.length > 0 ? `(${defs.join(', ')})` : ''\n const argStr = args.length > 0 ? `(${args.join(', ')})` : ''\n\n return {\n query: `\n query DeckSectionDefinitions${defStr} {\n deckSectionDefinitions${argStr} {\n ${DECK_SECTION_DEFINITION_FIELDS}\n }\n }\n `,\n variables,\n }\n },\n\n deckCollaborators(): { query: string } {\n return {\n query: `\n query DeckCollaborators($deckId: UUID!) {\n deckCollaborators(deckId: $deckId) {\n ${DECK_COLLABORATOR_FIELDS}\n }\n }\n `,\n }\n },\n\n deckEmbedTokens(): { query: string } {\n return {\n query: `\n query DeckEmbedTokens($deckId: UUID!) {\n deckEmbedTokens(deckId: $deckId) {\n ${DECK_EMBED_TOKEN_FIELDS}\n }\n }\n `,\n }\n },\n\n deckAccessTokenIssuers(): { query: string } {\n return {\n query: `\n query DeckAccessTokenIssuers($deckId: UUID!) {\n deckAccessTokenIssuers(deckId: $deckId) {\n ${DECK_ACCESS_TOKEN_ISSUER_FIELDS}\n }\n }\n `,\n }\n },\n\n deckApiApplicationAccesses(): { query: string } {\n return {\n query: `\n query DeckApiApplicationAccesses($deckId: UUID!, $includeRevoked: Boolean) {\n deckApiApplicationAccesses(deckId: $deckId, includeRevoked: $includeRevoked) {\n ${DECK_API_APPLICATION_ACCESS_FIELDS}\n }\n }\n `,\n }\n },\n\n myDeckApiApplicationAccesses(): { query: string } {\n return {\n query: `\n query MyDeckApiApplicationAccesses($applicationId: UUID) {\n myDeckApiApplicationAccesses(applicationId: $applicationId) {\n ${DECK_API_APPLICATION_ACCESS_FIELDS}\n }\n }\n `,\n }\n },\n\n deckImportFormats(params: ListDeckImportFormatsParams): {\n query: string\n variables: Record<string, unknown>\n } {\n const variables: Record<string, unknown> = { gameId: params.gameId }\n const args: string[] = ['gameId: $gameId']\n const defs: string[] = ['$gameId: UUID!']\n\n if (params.includeArchived !== undefined) {\n defs.push('$includeArchived: Boolean')\n args.push('includeArchived: $includeArchived')\n variables['includeArchived'] = params.includeArchived\n }\n if (params.first !== undefined) {\n defs.push('$first: Int')\n args.push('first: $first')\n variables['first'] = params.first\n }\n if (params.after !== undefined) {\n defs.push('$after: String')\n args.push('after: $after')\n variables['after'] = params.after\n }\n\n return {\n query: `\n query DeckImportFormats(${defs.join(', ')}) {\n deckImportFormats(${args.join(', ')}) {\n ${connectionFields(DECK_IMPORT_FORMAT_DEFINITION_FIELDS)}\n }\n }\n `,\n variables,\n }\n },\n\n deckImportFormat(): { query: string } {\n return {\n query: `\n query DeckImportFormat($id: UUID!) {\n deckImportFormat(id: $id) {\n ${DECK_IMPORT_FORMAT_DEFINITION_FIELDS}\n }\n }\n `,\n }\n },\n\n deckImportFormatTest(): { query: string } {\n return {\n query: `\n query DeckImportFormatTest($input: DeckImportFormatTestInput!) {\n deckImportFormatTest(input: $input) {\n ${DECK_IMPORT_FORMAT_TEST_PAYLOAD_FIELDS}\n }\n }\n `,\n }\n },\n\n deckPreviewTokens(): { query: string } {\n return {\n query: `\n query DeckPreviewTokens($deckId: UUID!) {\n deckPreviewTokens(deckId: $deckId) {\n ${DECK_PREVIEW_TOKEN_FIELDS}\n }\n }\n `,\n }\n },\n\n createDeck(): { query: string } {\n return {\n query: `\n mutation DeckCreate($input: DeckCreateInput!) {\n deckCreate(input: $input) {\n ${DECK_FIELDS}\n }\n }\n `,\n }\n },\n\n updateDeck(): { query: string } {\n return {\n query: `\n mutation DeckUpdate($id: UUID!, $input: DeckUpdateInput!) {\n deckUpdate(id: $id, input: $input) {\n ${DECK_FIELDS}\n }\n }\n `,\n }\n },\n\n deleteDeck(): { query: string } {\n return {\n query: `\n mutation DeckDelete($id: UUID!) {\n deckDelete(id: $id)\n }\n `,\n }\n },\n\n archiveDeck(): { query: string } {\n return {\n query: `\n mutation DeckArchive($id: UUID!) {\n deckArchive(id: $id) {\n ${DECK_FIELDS}\n }\n }\n `,\n }\n },\n\n restoreDeck(): { query: string } {\n return {\n query: `\n mutation DeckRestore($id: UUID!) {\n deckRestore(id: $id) {\n ${DECK_FIELDS}\n }\n }\n `,\n }\n },\n\n unpublishDeck(): { query: string } {\n return {\n query: `\n mutation DeckUnpublish($id: UUID!) {\n deckUnpublish(id: $id) {\n ${DECK_FIELDS}\n }\n }\n `,\n }\n },\n\n addDeckEntry(): { query: string } {\n return {\n query: `\n mutation DeckEntryAdd($input: DeckEntryAddInput!) {\n deckEntryAdd(input: $input) {\n ${DECK_ENTRY_MUTATION_PAYLOAD_FIELDS}\n }\n }\n `,\n }\n },\n\n updateDeckEntry(): { query: string } {\n return {\n query: `\n mutation DeckEntryUpdate($id: UUID!, $input: DeckEntryUpdateInput!) {\n deckEntryUpdate(id: $id, input: $input) {\n ${DECK_ENTRY_MUTATION_PAYLOAD_FIELDS}\n }\n }\n `,\n }\n },\n\n removeDeckEntry(): { query: string } {\n return {\n query: `\n mutation DeckEntryRemove($id: UUID!, $expectedDraftRevision: Int!) {\n deckEntryRemove(id: $id, expectedDraftRevision: $expectedDraftRevision) {\n ${DECK_ENTRY_MUTATION_PAYLOAD_FIELDS}\n }\n }\n `,\n }\n },\n\n reorderDeckEntries(): { query: string } {\n return {\n query: `\n mutation DeckEntryReorder($deckId: UUID!, $input: DeckEntryReorderInput!) {\n deckEntryReorder(deckId: $deckId, input: $input) {\n ${DECK_ENTRY_REORDER_PAYLOAD_FIELDS}\n }\n }\n `,\n }\n },\n\n replaceDeckEntries(): { query: string } {\n return {\n query: `\n mutation DeckEntriesReplace($deckId: UUID!, $input: DeckEntriesReplaceInput!) {\n deckEntriesReplace(deckId: $deckId, input: $input) {\n ${DECK_ENTRIES_REPLACE_PAYLOAD_FIELDS}\n }\n }\n `,\n }\n },\n\n importDeck(): { query: string } {\n return {\n query: `\n mutation DeckImport($input: DeckImportInput!) {\n deckImport(input: $input) {\n ${DECK_IMPORT_PAYLOAD_FIELDS}\n }\n }\n `,\n }\n },\n\n createDeckImportFormat(): { query: string } {\n return {\n query: `\n mutation DeckImportFormatCreate($input: DeckImportFormatCreateInput!) {\n deckImportFormatCreate(input: $input) {\n ${DECK_IMPORT_FORMAT_DEFINITION_FIELDS}\n }\n }\n `,\n }\n },\n\n updateDeckImportFormat(): { query: string } {\n return {\n query: `\n mutation DeckImportFormatUpdate($id: UUID!, $input: DeckImportFormatUpdateInput!) {\n deckImportFormatUpdate(id: $id, input: $input) {\n ${DECK_IMPORT_FORMAT_DEFINITION_FIELDS}\n }\n }\n `,\n }\n },\n\n archiveDeckImportFormat(): { query: string } {\n return {\n query: `\n mutation DeckImportFormatArchive($id: UUID!) {\n deckImportFormatArchive(id: $id) {\n ${DECK_IMPORT_FORMAT_DEFINITION_FIELDS}\n }\n }\n `,\n }\n },\n\n unarchiveDeckImportFormat(): { query: string } {\n return {\n query: `\n mutation DeckImportFormatUnarchive($id: UUID!) {\n deckImportFormatUnarchive(id: $id) {\n ${DECK_IMPORT_FORMAT_DEFINITION_FIELDS}\n }\n }\n `,\n }\n },\n\n upsertDeckByExternalRef(): { query: string } {\n return {\n query: `\n mutation DeckUpsertByExternalRef($input: DeckUpsertByExternalRefInput!) {\n deckUpsertByExternalRef(input: $input) {\n deck {\n ${DECK_FIELDS}\n }\n created\n idempotentReplay\n }\n }\n `,\n }\n },\n\n claimDeck(): { query: string } {\n return {\n query: `\n mutation DeckClaim($id: UUID!, $input: DeckClaimInput!) {\n deckClaim(id: $id, input: $input) {\n ${DECK_OWNERSHIP_TRANSFER_PAYLOAD_FIELDS}\n }\n }\n `,\n }\n },\n\n transferDeckOwnership(): { query: string } {\n return {\n query: `\n mutation DeckTransferOwnership($id: UUID!, $input: DeckTransferOwnershipInput!) {\n deckTransferOwnership(id: $id, input: $input) {\n ${DECK_OWNERSHIP_TRANSFER_PAYLOAD_FIELDS}\n }\n }\n `,\n }\n },\n\n copyDeck(): { query: string } {\n return {\n query: `\n mutation DeckCopy($id: UUID!, $input: DeckCopyInput!) {\n deckCopy(id: $id, input: $input) {\n ${DECK_COPY_PAYLOAD_FIELDS}\n }\n }\n `,\n }\n },\n\n publishDeck(): { query: string } {\n return {\n query: `\n mutation DeckPublish($id: UUID!, $input: DeckPublishInput!) {\n deckPublish(id: $id, input: $input) {\n ${DECK_PUBLISH_PAYLOAD_FIELDS}\n }\n }\n `,\n }\n },\n\n removeInvalidDeckEntries(): { query: string } {\n return {\n query: `\n mutation DeckRemoveInvalidEntries($id: UUID!, $input: DeckRemoveInvalidEntriesInput!) {\n deckRemoveInvalidEntries(id: $id, input: $input) {\n ${DECK_FIELDS}\n }\n }\n `,\n }\n },\n\n upsertDeckCollaborator(): { query: string } {\n return {\n query: `\n mutation DeckCollaboratorUpsert($deckId: UUID!, $accountId: UUID!, $role: DeckCollaboratorRole!) {\n deckCollaboratorUpsert(deckId: $deckId, accountId: $accountId, role: $role) {\n ${DECK_COLLABORATOR_FIELDS}\n }\n }\n `,\n }\n },\n\n removeDeckCollaborator(): { query: string } {\n return {\n query: `\n mutation DeckCollaboratorRemove($deckId: UUID!, $accountId: UUID!) {\n deckCollaboratorRemove(deckId: $deckId, accountId: $accountId)\n }\n `,\n }\n },\n\n createDeckPreviewToken(): { query: string } {\n return {\n query: `\n mutation DeckPreviewTokenCreate($input: DeckPreviewTokenCreateInput!) {\n deckPreviewTokenCreate(input: $input) {\n token\n previewToken {\n ${DECK_PREVIEW_TOKEN_FIELDS}\n }\n }\n }\n `,\n }\n },\n\n revokeDeckPreviewToken(): { query: string } {\n return {\n query: `\n mutation DeckPreviewTokenRevoke($id: UUID!) {\n deckPreviewTokenRevoke(id: $id)\n }\n `,\n }\n },\n\n createDeckEmbedToken(): { query: string } {\n return {\n query: `\n mutation DeckEmbedTokenCreate($input: DeckEmbedTokenCreateInput!) {\n deckEmbedTokenCreate(input: $input) {\n token\n embedToken {\n ${DECK_EMBED_TOKEN_FIELDS}\n }\n }\n }\n `,\n }\n },\n\n revokeDeckEmbedToken(): { query: string } {\n return {\n query: `\n mutation DeckEmbedTokenRevoke($id: UUID!) {\n deckEmbedTokenRevoke(id: $id)\n }\n `,\n }\n },\n\n createDeckAccessTokenIssuer(): { query: string } {\n return {\n query: `\n mutation DeckAccessTokenIssuerCreate($input: DeckAccessTokenIssuerCreateInput!) {\n deckAccessTokenIssuerCreate(input: $input) {\n ${DECK_ACCESS_TOKEN_ISSUER_FIELDS}\n }\n }\n `,\n }\n },\n\n revokeDeckAccessTokenIssuer(): { query: string } {\n return {\n query: `\n mutation DeckAccessTokenIssuerRevoke($id: UUID!) {\n deckAccessTokenIssuerRevoke(id: $id)\n }\n `,\n }\n },\n\n revokeDeckAccessTokenIssuerSigningKey(): { query: string } {\n return {\n query: `\n mutation DeckAccessTokenIssuerSigningKeyRevoke($id: UUID!) {\n deckAccessTokenIssuerSigningKeyRevoke(id: $id) {\n ${DECK_ACCESS_TOKEN_ISSUER_FIELDS}\n }\n }\n `,\n }\n },\n\n exchangeDeckAccessToken(): { query: string } {\n return {\n query: `\n mutation DeckAccessTokenExchange($input: DeckAccessTokenExchangeInput!) {\n deckAccessTokenExchange(input: $input) {\n token\n accessToken {\n ${DECK_ACCESS_TOKEN_FIELDS}\n }\n }\n }\n `,\n }\n },\n\n grantDeckApiApplicationAccess(): { query: string } {\n return {\n query: `\n mutation DeckApiApplicationAccessGrant($input: DeckAPIApplicationAccessGrantInput!) {\n deckApiApplicationAccessGrant(input: $input) {\n ${DECK_API_APPLICATION_ACCESS_FIELDS}\n }\n }\n `,\n }\n },\n\n revokeDeckApiApplicationAccess(): { query: string } {\n return {\n query: `\n mutation DeckApiApplicationAccessRevoke($deckId: UUID!, $apiApplicationId: UUID!) {\n deckApiApplicationAccessRevoke(deckId: $deckId, apiApplicationId: $apiApplicationId)\n }\n `,\n }\n },\n\n revokeDeckAccessToken(): { query: string } {\n return {\n query: `\n mutation DeckAccessTokenRevoke($id: UUID!) {\n deckAccessTokenRevoke(id: $id)\n }\n `,\n }\n },\n\n deckCreateVariables(input: DeckCreateInput): Record<string, unknown> {\n return { input }\n },\n\n deckUpdateVariables(id: string, input: DeckUpdateInput): Record<string, unknown> {\n return { id, input }\n },\n\n deckEntryAddVariables(input: DeckEntryAddInput): Record<string, unknown> {\n return { input }\n },\n\n deckEntryUpdateVariables(id: string, input: DeckEntryUpdateInput): Record<string, unknown> {\n return { id, input }\n },\n\n deckEntryRemoveVariables(id: string, expectedDraftRevision: number): Record<string, unknown> {\n return { id, expectedDraftRevision }\n },\n\n deckEntryReorderVariables(deckId: string, input: DeckEntryReorderInput): Record<string, unknown> {\n return { deckId, input }\n },\n\n deckEntriesReplaceVariables(\n deckId: string,\n input: DeckEntriesReplaceInput\n ): Record<string, unknown> {\n return { deckId, input }\n },\n\n deckImportVariables(input: DeckImportInput): Record<string, unknown> {\n return { input }\n },\n\n deckImportFormatCreateVariables(input: DeckImportFormatCreateInput): Record<string, unknown> {\n return { input }\n },\n\n deckImportFormatUpdateVariables(\n id: string,\n input: DeckImportFormatUpdateInput\n ): Record<string, unknown> {\n return { id, input }\n },\n\n deckImportFormatTestVariables(input: DeckImportFormatTestInput): Record<string, unknown> {\n return { input }\n },\n\n deckUpsertByExternalRefVariables(input: DeckUpsertByExternalRefInput): Record<string, unknown> {\n return { input }\n },\n\n deckClaimVariables(id: string, input: DeckClaimInput): Record<string, unknown> {\n return { id, input }\n },\n\n deckTransferOwnershipVariables(\n id: string,\n input: DeckTransferOwnershipInput\n ): Record<string, unknown> {\n return { id, input }\n },\n\n deckCopyVariables(id: string, input: DeckCopyInput): Record<string, unknown> {\n return { id, input }\n },\n\n deckPublishVariables(id: string, input: DeckPublishInput): Record<string, unknown> {\n return { id, input }\n },\n\n deckValidateVariables(id: string, input?: DeckValidateInput): Record<string, unknown> {\n return input === undefined ? { id } : { id, input }\n },\n\n deckRemoveInvalidEntriesVariables(\n id: string,\n input: DeckRemoveInvalidEntriesInput\n ): Record<string, unknown> {\n return { id, input }\n },\n\n deckHydrateEntriesVariables(input: DeckHydrateEntriesInput): Record<string, unknown> {\n return { input }\n },\n\n deckExportVariables(id: string, format: DeckExportFormat): Record<string, unknown> {\n return { id, format }\n },\n\n deckVersionDiffVariables(fromVersionId: string, toVersionId: string): Record<string, unknown> {\n return { fromVersionId, toVersionId }\n },\n\n deckCollaboratorVariables(\n deckId: string,\n accountId: string,\n role?: DeckCollaboratorRole\n ): Record<string, unknown> {\n return role === undefined ? { deckId, accountId } : { deckId, accountId, role }\n },\n\n deckPreviewTokenCreateVariables(input: DeckPreviewTokenCreateInput): Record<string, unknown> {\n return { input }\n },\n\n deckEmbedTokenCreateVariables(input: DeckEmbedTokenCreateInput): Record<string, unknown> {\n return { input }\n },\n\n deckAccessTokenIssuerCreateVariables(\n input: DeckAccessTokenIssuerCreateInput\n ): Record<string, unknown> {\n return { input }\n },\n\n deckAccessTokenExchangeVariables(input: DeckAccessTokenExchangeInput): Record<string, unknown> {\n return { input }\n },\n\n deckApiApplicationAccessesVariables(\n deckId: string,\n includeRevoked?: boolean\n ): Record<string, unknown> {\n return includeRevoked === undefined ? { deckId } : { deckId, includeRevoked }\n },\n\n myDeckApiApplicationAccessesVariables(applicationId?: string): Record<string, unknown> {\n return applicationId === undefined ? {} : { applicationId }\n },\n\n deckApiApplicationAccessGrantVariables(\n input: DeckAPIApplicationAccessGrantInput\n ): Record<string, unknown> {\n return { input }\n },\n\n deckApiApplicationAccessRevokeVariables(\n deckId: string,\n apiApplicationId: string\n ): Record<string, unknown> {\n return { deckId, apiApplicationId }\n },\n\n // API Key Info\n fetchMe(): { query: string } {\n return {\n query: `\n query FetchMe {\n fetchMe {\n application {\n id\n name\n description\n environment\n apiKeyPrefix\n allowedOrigins\n allowedIps\n createdAt\n updatedAt\n lastUsedAt\n }\n account {\n id\n displayName\n createdAt\n }\n }\n }\n `,\n }\n },\n}\n","/**\n * Collection class for paginated results with async iteration support\n */\n\nimport type { Connection, PageInfo, Edge } from './types.js'\n\nexport type NextPageLoader<T> = (cursor: string) => Promise<Collection<T>>\n\n/**\n * Represents a paginated collection of results from the API.\n * Implements AsyncIterable for easy iteration through all pages.\n */\nexport class Collection<T> implements AsyncIterable<T> {\n /** Total count of matching records across all pages */\n readonly totalCount: number\n\n /** Pagination info */\n readonly pageInfo: PageInfo\n\n /** Items in the current page */\n readonly items: T[]\n\n /** Function to load the next page */\n private nextPageLoader?: NextPageLoader<T>\n\n constructor(\n data: Connection<T>,\n options: {\n nextPageLoader?: NextPageLoader<T>\n itemTransformer?: (node: T) => T\n } = {}\n ) {\n this.totalCount = data.totalCount\n this.pageInfo = data.pageInfo\n this.items = data.edges.map((edge: Edge<T>) =>\n options.itemTransformer ? options.itemTransformer(edge.node) : edge.node\n )\n this.nextPageLoader = options.nextPageLoader\n }\n\n /** Check if there are more pages */\n get hasNextPage(): boolean {\n return this.pageInfo.hasNextPage\n }\n\n /** Check if there are previous pages */\n get hasPreviousPage(): boolean {\n return this.pageInfo.hasPreviousPage\n }\n\n /** Get the cursor for the next page */\n get endCursor(): string | null {\n return this.pageInfo.endCursor\n }\n\n /** Get the cursor for the previous page */\n get startCursor(): string | null {\n return this.pageInfo.startCursor\n }\n\n /** Number of items in the current page */\n get length(): number {\n return this.items.length\n }\n\n /** Check if the current page is empty */\n get isEmpty(): boolean {\n return this.items.length === 0\n }\n\n /** Get the first item */\n get first(): T | undefined {\n return this.items[0]\n }\n\n /** Get the last item */\n get last(): T | undefined {\n return this.items[this.items.length - 1]\n }\n\n /**\n * Fetch the next page of results\n *\n * @returns The next page collection, or null if no more pages\n * @throws Error if no next page loader is configured\n */\n async nextPage(): Promise<Collection<T> | null> {\n if (!this.hasNextPage) {\n return null\n }\n\n if (!this.nextPageLoader) {\n throw new Error('No next page loader configured')\n }\n\n if (!this.endCursor) {\n return null\n }\n\n return this.nextPageLoader(this.endCursor)\n }\n\n /**\n * Async iterator that automatically paginates through all results\n *\n * @example\n * for await (const record of collection) {\n * console.log(record.name)\n * }\n *\n * @example\n * const allRecords = []\n * for await (const record of collection) {\n * allRecords.push(record)\n * }\n */\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n let current: Collection<T> | null = this\n\n while (current) {\n for (const item of current.items) {\n yield item\n }\n\n if (!current.hasNextPage) {\n break\n }\n\n current = await current.nextPage()\n }\n }\n\n /**\n * Iterate through all results, calling a callback for each item\n * Similar to Array.forEach but async and auto-paginating\n *\n * @example\n * await collection.forEach(async (record) => {\n * await processRecord(record)\n * })\n */\n async forEach(callback: (item: T, index: number) => void | Promise<void>): Promise<void> {\n let index = 0\n for await (const item of this) {\n await callback(item, index++)\n }\n }\n\n /**\n * Map over all results, returning a new array\n * Auto-paginates through all pages\n *\n * @example\n * const names = await collection.map(record => record.name)\n */\n async map<U>(callback: (item: T, index: number) => U | Promise<U>): Promise<U[]> {\n const results: U[] = []\n let index = 0\n for await (const item of this) {\n results.push(await callback(item, index++))\n }\n return results\n }\n\n /**\n * Filter results, returning items that match the predicate\n * Auto-paginates through all pages\n *\n * @example\n * const rareCards = await collection.filter(card => card.rarity === 'rare')\n */\n async filter(predicate: (item: T, index: number) => boolean | Promise<boolean>): Promise<T[]> {\n const results: T[] = []\n let index = 0\n for await (const item of this) {\n if (await predicate(item, index++)) {\n results.push(item)\n }\n }\n return results\n }\n\n /**\n * Find the first item matching a predicate\n * Stops iterating once found\n *\n * @example\n * const pikachu = await collection.find(card => card.name === 'Pikachu')\n */\n async find(\n predicate: (item: T, index: number) => boolean | Promise<boolean>\n ): Promise<T | undefined> {\n let index = 0\n for await (const item of this) {\n if (await predicate(item, index++)) {\n return item\n }\n }\n return undefined\n }\n\n /**\n * Take the first n items\n * Stops fetching pages once n items are collected\n *\n * @example\n * const first100 = await collection.take(100)\n */\n async take(n: number): Promise<T[]> {\n const results: T[] = []\n for await (const item of this) {\n if (results.length >= n) {\n break\n }\n results.push(item)\n }\n return results\n }\n\n /**\n * Collect all items into an array\n * Auto-paginates through all pages\n *\n * @example\n * const allRecords = await collection.toArray()\n */\n async toArray(): Promise<T[]> {\n const results: T[] = []\n for await (const item of this) {\n results.push(item)\n }\n return results\n }\n\n /**\n * Iterate in batches (similar to Rails find_in_batches)\n *\n * @example\n * for await (const batch of collection.batches()) {\n * await processBatch(batch)\n * }\n */\n async *batches(): AsyncGenerator<T[]> {\n let current: Collection<T> | null = this\n\n while (current) {\n if (current.items.length > 0) {\n yield current.items\n }\n\n if (!current.hasNextPage) {\n break\n }\n\n current = await current.nextPage()\n }\n }\n\n /**\n * Iterate one item at a time with batched fetching (similar to Rails find_each)\n *\n * @example\n * for await (const item of collection.each()) {\n * await processItem(item)\n * }\n */\n each(): AsyncIterable<T> {\n return this\n }\n}\n","/**\n * Configuration management for CardDB client\n */\n\nimport type { CardDBConfig, ResourceType, Logger, Cache, LogLevel } from '@carddb/core'\nimport { RestrictedError } from '@carddb/core'\n\nexport const DEFAULT_ENDPOINT = 'https://carddb.xtda.org/query'\nexport const DEFAULT_TIMEOUT = 30000 // 30 seconds\nexport const DEFAULT_OPEN_TIMEOUT = 10000 // 10 seconds\nexport const DEFAULT_CACHE_TTL = 300 // 5 minutes\nexport const DEFAULT_MAX_RETRIES = 3\nexport const DEFAULT_MAX_NETWORK_RETRIES = 2\nexport const DEFAULT_RETRY_BASE_DELAY = 1000 // 1 second\nexport const DEFAULT_RETRY_MAX_DELAY = 30000 // 30 seconds\n\nexport class Configuration {\n apiKey?: string\n publishableKey?: string\n secretKey?: string\n accessToken?: string\n private legacyApiKey?: string\n environment?: 'TEST' | 'LIVE'\n endpoint: string\n timeout: number\n openTimeout: number\n defaultPublisher?: string\n defaultGame?: string\n allowedPublishers?: string[]\n allowedGames?: Record<string, string[]>\n logger?: Logger\n logLevel: LogLevel\n retryOnRateLimit: boolean\n maxRetries: number\n retryOnNetworkError: boolean\n maxNetworkRetries: number\n retryBaseDelay: number\n retryMaxDelay: number\n cache?: Cache\n cacheTtl: number\n cacheTtls: Partial<Record<ResourceType, number>>\n\n constructor(config: CardDBConfig = {}) {\n this.legacyApiKey = config.apiKey\n this.publishableKey = config.publishableKey\n this.secretKey = config.secretKey\n this.accessToken = config.accessToken\n this.apiKey = config.apiKey ?? config.publishableKey ?? config.secretKey\n this.environment = config.environment\n this.endpoint = config.endpoint ?? DEFAULT_ENDPOINT\n this.timeout = config.timeout ?? DEFAULT_TIMEOUT\n this.openTimeout = config.openTimeout ?? DEFAULT_OPEN_TIMEOUT\n this.defaultPublisher = config.defaultPublisher\n this.defaultGame = config.defaultGame\n this.allowedPublishers = config.allowedPublishers\n this.allowedGames = config.allowedGames\n this.logger = config.logger\n this.logLevel = config.logLevel ?? 'info'\n this.retryOnRateLimit = config.retryOnRateLimit ?? false\n this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES\n this.retryOnNetworkError = config.retryOnNetworkError ?? true\n this.maxNetworkRetries = config.maxNetworkRetries ?? DEFAULT_MAX_NETWORK_RETRIES\n this.retryBaseDelay = config.retryBaseDelay ?? DEFAULT_RETRY_BASE_DELAY\n this.retryMaxDelay = config.retryMaxDelay ?? DEFAULT_RETRY_MAX_DELAY\n this.cache = config.cache\n this.cacheTtl = config.cacheTtl ?? DEFAULT_CACHE_TTL\n this.cacheTtls = config.cacheTtls ?? {}\n }\n\n /**\n * Calculate delay for exponential backoff\n * @param attempt - The attempt number (0-indexed)\n * @returns Delay in milliseconds with jitter\n */\n calculateRetryDelay(attempt: number): number {\n // Exponential backoff: baseDelay * 2^attempt\n const exponentialDelay = this.retryBaseDelay * Math.pow(2, attempt)\n // Cap at max delay\n const cappedDelay = Math.min(exponentialDelay, this.retryMaxDelay)\n // Add jitter (±25%)\n const jitter = cappedDelay * 0.25 * (Math.random() * 2 - 1)\n return Math.round(cappedDelay + jitter)\n }\n\n /**\n * Get the cache TTL for a specific resource type\n */\n cacheTtlFor(resource: ResourceType): number {\n return this.cacheTtls[resource] ?? this.cacheTtl\n }\n\n /**\n * Resolve publisher slug, using default if not provided\n */\n resolvePublisher(publisherSlug?: string): string | undefined {\n return publisherSlug ?? this.defaultPublisher\n }\n\n /**\n * Resolve game key, using default if not provided\n */\n resolveGame(gameKey?: string): string | undefined {\n return gameKey ?? this.defaultGame\n }\n\n /**\n * Validate that a publisher is allowed by the configuration\n */\n validatePublisher(publisherSlug: string): void {\n if (!this.allowedPublishers) return\n if (this.allowedPublishers.includes(publisherSlug)) return\n\n throw new RestrictedError(`Publisher '${publisherSlug}' is not in the allowed publishers list`)\n }\n\n /**\n * Validate that a game is allowed by the configuration\n */\n validateGame(publisherSlug: string, gameKey: string): void {\n if (!this.allowedGames) return\n const allowedForPublisher = this.allowedGames[publisherSlug]\n if (!allowedForPublisher) return // No restrictions for this publisher\n if (allowedForPublisher.includes(gameKey)) return\n\n throw new RestrictedError(`Game '${gameKey}' is not allowed for publisher '${publisherSlug}'`)\n }\n\n /**\n * Validate both publisher and game access\n */\n validateAccess(publisherSlug?: string, gameKey?: string): void {\n if (publisherSlug) {\n this.validatePublisher(publisherSlug)\n if (gameKey) {\n this.validateGame(publisherSlug, gameKey)\n }\n }\n }\n\n /**\n * Secret-key-only helpers are for server runtimes and trusted backend workflows.\n */\n requireSecretCredential(operation: string): void {\n if (!this.accessToken && (this.legacyApiKey || (this.secretKey && !this.publishableKey))) return\n\n throw new RestrictedError(\n `${operation} requires a server-side secretKey or legacy apiKey credential`\n )\n }\n\n /**\n * API key sent on requests when no OAuth bearer token is configured.\n */\n requestApiKey(): string | undefined {\n return this.legacyApiKey ?? this.publishableKey ?? this.secretKey\n }\n\n /**\n * Explicit legacy apiKey supplied by the caller, excluding publishable/secret aliases.\n */\n configApiKey(): string | undefined {\n return this.legacyApiKey\n }\n\n /**\n * Check if a log level should be logged\n */\n shouldLog(level: LogLevel): boolean {\n const levels: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n }\n return levels[level] >= levels[this.logLevel]\n }\n\n /**\n * Create a copy of this configuration with overrides\n */\n merge(overrides: Partial<CardDBConfig>): Configuration {\n return new Configuration({\n apiKey: overrides.apiKey ?? this.legacyApiKey,\n publishableKey: overrides.publishableKey ?? this.publishableKey,\n secretKey: overrides.secretKey ?? this.secretKey,\n accessToken: overrides.accessToken ?? this.accessToken,\n environment: overrides.environment ?? this.environment,\n endpoint: overrides.endpoint ?? this.endpoint,\n timeout: overrides.timeout ?? this.timeout,\n openTimeout: overrides.openTimeout ?? this.openTimeout,\n defaultPublisher: overrides.defaultPublisher ?? this.defaultPublisher,\n defaultGame: overrides.defaultGame ?? this.defaultGame,\n allowedPublishers: overrides.allowedPublishers ?? this.allowedPublishers,\n allowedGames: overrides.allowedGames ?? this.allowedGames,\n logger: overrides.logger ?? this.logger,\n logLevel: overrides.logLevel ?? this.logLevel,\n retryOnRateLimit: overrides.retryOnRateLimit ?? this.retryOnRateLimit,\n maxRetries: overrides.maxRetries ?? this.maxRetries,\n retryOnNetworkError: overrides.retryOnNetworkError ?? this.retryOnNetworkError,\n maxNetworkRetries: overrides.maxNetworkRetries ?? this.maxNetworkRetries,\n retryBaseDelay: overrides.retryBaseDelay ?? this.retryBaseDelay,\n retryMaxDelay: overrides.retryMaxDelay ?? this.retryMaxDelay,\n cache: overrides.cache ?? this.cache,\n cacheTtl: overrides.cacheTtl ?? this.cacheTtl,\n cacheTtls: overrides.cacheTtls ?? this.cacheTtls,\n })\n }\n}\n","/**\n * User-Agent string generation for analytics tracking\n *\n * Format: CardDB-SDK/js/{version} ({runtime}/{runtime_version})\n * Examples:\n * - CardDB-SDK/js/0.1.0 (node/20.10.0)\n * - CardDB-SDK/js/0.1.0 (bun/1.0.0)\n * - CardDB-SDK/js/0.1.0 (chrome/120.0.0.0)\n * - CardDB-SDK/js/0.1.0 (firefox/121.0)\n */\n\nconst SDK_VERSION = '0.1.0'\n\ninterface RuntimeInfo {\n name: string\n version: string\n}\n\n/**\n * Detect the current JavaScript runtime\n */\nfunction detectRuntime(): RuntimeInfo {\n // Check for Bun first (it also has process.versions.node)\n if (typeof globalThis !== 'undefined' && 'Bun' in globalThis) {\n const bunVersion =\n (globalThis as Record<string, unknown>).Bun &&\n typeof (globalThis as Record<string, unknown>).Bun === 'object' &&\n ((globalThis as Record<string, unknown>).Bun as Record<string, unknown>).version\n return {\n name: 'bun',\n version: typeof bunVersion === 'string' ? bunVersion : 'unknown',\n }\n }\n\n // Check for Deno\n if (typeof globalThis !== 'undefined' && 'Deno' in globalThis) {\n const denoVersion =\n (globalThis as Record<string, unknown>).Deno &&\n typeof (globalThis as Record<string, unknown>).Deno === 'object' &&\n ((globalThis as Record<string, unknown>).Deno as Record<string, unknown>).version &&\n typeof ((globalThis as Record<string, unknown>).Deno as Record<string, unknown>).version ===\n 'object' &&\n (\n ((globalThis as Record<string, unknown>).Deno as Record<string, unknown>).version as Record<\n string,\n unknown\n >\n ).deno\n return {\n name: 'deno',\n version: typeof denoVersion === 'string' ? denoVersion : 'unknown',\n }\n }\n\n // Check for Node.js\n if (typeof process !== 'undefined' && process.versions && process.versions.node) {\n return {\n name: 'node',\n version: process.versions.node,\n }\n }\n\n // Check for browser\n if (typeof navigator !== 'undefined' && navigator.userAgent) {\n return detectBrowser(navigator.userAgent)\n }\n\n return { name: 'unknown', version: 'unknown' }\n}\n\n/**\n * Parse browser name and version from User-Agent string\n */\nfunction detectBrowser(userAgent: string): RuntimeInfo {\n // Order matters - check more specific browsers first\n\n // Edge (Chromium-based)\n const edgeMatch = userAgent.match(/Edg\\/(\\d+(?:\\.\\d+)*)/)\n if (edgeMatch) {\n return { name: 'edge', version: edgeMatch[1]! }\n }\n\n // Chrome\n const chromeMatch = userAgent.match(/Chrome\\/(\\d+(?:\\.\\d+)*)/)\n if (chromeMatch && !userAgent.includes('Edg/')) {\n return { name: 'chrome', version: chromeMatch[1]! }\n }\n\n // Firefox\n const firefoxMatch = userAgent.match(/Firefox\\/(\\d+(?:\\.\\d+)*)/)\n if (firefoxMatch) {\n return { name: 'firefox', version: firefoxMatch[1]! }\n }\n\n // Safari (check after Chrome since Chrome UA includes Safari)\n const safariMatch = userAgent.match(/Version\\/(\\d+(?:\\.\\d+)*).*Safari/)\n if (safariMatch) {\n return { name: 'safari', version: safariMatch[1]! }\n }\n\n // Generic browser fallback\n return { name: 'browser', version: 'unknown' }\n}\n\n/**\n * Generate the User-Agent string for CardDB SDK\n */\nexport function getUserAgent(): string {\n const runtime = detectRuntime()\n return `CardDB-SDK/js/${SDK_VERSION} (${runtime.name}/${runtime.version})`\n}\n\n/**\n * Get the SDK version\n */\nexport function getSDKVersion(): string {\n return SDK_VERSION\n}\n","/**\n * HTTP connection wrapper for GraphQL requests\n */\n\nimport {\n CardDBError,\n AuthenticationError,\n RateLimitError,\n ValidationError,\n GraphQLError,\n ConnectionError,\n TimeoutError,\n ServerError,\n} from '@carddb/core'\nimport type { GraphQLErrorInfo, RateLimitInfo } from '@carddb/core'\nimport type { Configuration } from './configuration.js'\nimport { getUserAgent } from './user-agent.js'\n\nexport interface GraphQLResponse {\n data?: Record<string, unknown>\n errors?: GraphQLErrorInfo[]\n}\n\n// Store rate limit info per-request (can be accessed after request)\nlet lastRateLimitInfo: RateLimitInfo | null = null\n\nexport function getRateLimitInfo(): RateLimitInfo | null {\n return lastRateLimitInfo\n}\n\nexport class Connection {\n private config: Configuration\n\n constructor(config: Configuration) {\n this.config = config\n }\n\n /**\n * Execute a GraphQL query\n */\n async execute(\n query: string,\n variables: Record<string, unknown> = {}\n ): Promise<Record<string, unknown>> {\n const operationName = this.extractOperationName(query)\n let rateLimitRetries = 0\n let networkRetries = 0\n\n while (true) {\n try {\n const startTime = Date.now()\n this.logRequest(operationName, variables)\n\n const response = await this.fetch(query, variables)\n const duration = Date.now() - startTime\n\n const result = await this.handleResponse(response)\n this.logResponse(operationName, duration)\n\n return result\n } catch (error) {\n // Handle rate limit errors\n if (error instanceof RateLimitError) {\n if (this.config.retryOnRateLimit && rateLimitRetries < this.config.maxRetries) {\n rateLimitRetries++\n const sleepTime = error.retryAfter ?? 60\n this.logRateLimitRetry(operationName, rateLimitRetries, sleepTime)\n await this.sleep(sleepTime * 1000)\n continue\n }\n }\n\n // Handle network errors (connection, timeout) with exponential backoff\n if (this.isRetryableNetworkError(error)) {\n if (this.config.retryOnNetworkError && networkRetries < this.config.maxNetworkRetries) {\n const delay = this.config.calculateRetryDelay(networkRetries)\n this.logNetworkRetry(operationName, networkRetries + 1, delay, error)\n networkRetries++\n await this.sleep(delay)\n continue\n }\n }\n\n // Handle server errors (5xx) with exponential backoff\n if (error instanceof ServerError) {\n if (this.config.retryOnNetworkError && networkRetries < this.config.maxNetworkRetries) {\n const delay = this.config.calculateRetryDelay(networkRetries)\n this.logNetworkRetry(operationName, networkRetries + 1, delay, error)\n networkRetries++\n await this.sleep(delay)\n continue\n }\n }\n\n throw error\n }\n }\n }\n\n /**\n * Check if an error is a retryable network error\n */\n private isRetryableNetworkError(error: unknown): boolean {\n return error instanceof ConnectionError || error instanceof TimeoutError\n }\n\n private async fetch(query: string, variables: Record<string, unknown>): Promise<Response> {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout)\n const apiKey = this.config.requestApiKey()\n\n try {\n const response = await fetch(this.config.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'User-Agent': getUserAgent(),\n ...(this.config.accessToken\n ? { Authorization: `Bearer ${this.config.accessToken}` }\n : {}),\n ...(!this.config.accessToken && apiKey ? { 'X-API-Key': apiKey } : {}),\n },\n body: JSON.stringify({ query, variables }),\n signal: controller.signal,\n })\n\n return response\n } catch (error) {\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n this.logError('Request timed out')\n throw new TimeoutError('Request timed out')\n }\n this.logError(`Connection failed: ${error.message}`)\n throw new ConnectionError(`Connection failed: ${error.message}`)\n }\n throw new ConnectionError('Connection failed')\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n private async handleResponse(response: Response): Promise<Record<string, unknown>> {\n // Extract rate limit headers\n this.extractRateLimitInfo(response)\n\n switch (response.status) {\n case 200:\n return this.handleSuccessResponse(response)\n case 401:\n throw new AuthenticationError('Invalid or missing API key')\n case 429:\n return this.handleRateLimitResponse(response)\n default:\n if (response.status >= 400 && response.status < 500) {\n return this.handleClientError(response)\n }\n if (response.status >= 500) {\n const body = await this.parseBody(response)\n throw new ServerError(`Server error (${response.status})`, {\n status: response.status,\n response: body,\n })\n }\n throw new CardDBError(`Unexpected response status: ${response.status}`)\n }\n }\n\n private async handleSuccessResponse(response: Response): Promise<Record<string, unknown>> {\n const body = (await this.parseBody(response)) as GraphQLResponse\n\n // Check for GraphQL errors\n if (body.errors && body.errors.length > 0) {\n this.handleGraphQLErrors(body.errors, body)\n }\n\n return body.data ?? {}\n }\n\n private handleGraphQLErrors(errors: GraphQLErrorInfo[], body: GraphQLResponse): never {\n const firstError = errors[0]!\n const message = firstError.message || 'GraphQL error'\n const code = firstError.extensions?.['code'] as string | undefined\n\n switch (code) {\n case 'UNAUTHENTICATED':\n throw new AuthenticationError(message, body)\n case 'RATE_LIMITED':\n throw new RateLimitError(message, { response: body })\n case 'NOT_FOUND':\n throw new CardDBError(message, body)\n case 'VALIDATION_ERROR':\n case 'BAD_USER_INPUT':\n throw new ValidationError(message, { errors, response: body })\n default:\n throw new GraphQLError(message, { errors, response: body })\n }\n }\n\n private async handleRateLimitResponse(response: Response): Promise<never> {\n const retryAfter = parseInt(response.headers.get('Retry-After') ?? '60', 10)\n const limit = parseInt(response.headers.get('X-RateLimit-Limit') ?? '', 10) || null\n const remaining = parseInt(response.headers.get('X-RateLimit-Remaining') ?? '', 10) || null\n const reset = parseInt(response.headers.get('X-RateLimit-Reset') ?? '', 10) || null\n const resetAt = reset ? new Date(reset * 1000) : null\n\n const body = await this.parseBody(response)\n\n throw new RateLimitError('Rate limit exceeded', {\n retryAfter,\n limit,\n remaining,\n resetAt,\n response: body,\n })\n }\n\n private async handleClientError(response: Response): Promise<never> {\n const body = (await this.parseBody(response)) as GraphQLResponse\n const message = body.errors?.[0]?.message ?? `Client error (${response.status})`\n throw new ValidationError(message, { response: body })\n }\n\n private async parseBody(response: Response): Promise<unknown> {\n try {\n return await response.json()\n } catch {\n return { raw: await response.text() }\n }\n }\n\n private extractRateLimitInfo(response: Response): void {\n const limit = parseInt(response.headers.get('X-RateLimit-Limit') ?? '', 10) || null\n const remaining = parseInt(response.headers.get('X-RateLimit-Remaining') ?? '', 10) || null\n const reset = parseInt(response.headers.get('X-RateLimit-Reset') ?? '', 10) || null\n\n lastRateLimitInfo = { limit, remaining, reset }\n }\n\n private extractOperationName(query: string): string {\n const match = query.match(/(?:query|mutation)\\s+(\\w+)/)\n return match ? match[1]! : 'Unknown'\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n }\n\n // Logging helpers\n\n private logRequest(operationName: string, variables: Record<string, unknown>): void {\n if (!this.config.logger || !this.config.shouldLog('debug')) return\n this.config.logger.debug(`[CardDB] Executing ${operationName}`, { variables })\n }\n\n private logResponse(operationName: string, duration: number): void {\n if (!this.config.logger || !this.config.shouldLog('info')) return\n this.config.logger.info(`[CardDB] ${operationName} completed in ${duration}ms`)\n }\n\n private logRateLimitRetry(operationName: string, retry: number, sleepTime: number): void {\n if (!this.config.logger || !this.config.shouldLog('warn')) return\n this.config.logger.warn(\n `[CardDB] Rate limited on ${operationName}, retry ${retry}/${this.config.maxRetries} after ${sleepTime}s`\n )\n }\n\n private logNetworkRetry(\n operationName: string,\n retry: number,\n delay: number,\n error: unknown\n ): void {\n if (!this.config.logger || !this.config.shouldLog('warn')) return\n const errorType = error instanceof Error ? error.name : 'Unknown'\n this.config.logger.warn(\n `[CardDB] ${errorType} on ${operationName}, retry ${retry}/${this.config.maxNetworkRetries} after ${delay}ms`\n )\n }\n\n private logError(message: string): void {\n if (!this.config.logger || !this.config.shouldLog('error')) return\n this.config.logger.error(`[CardDB] ${message}`)\n }\n}\n","/**\n * Cache utilities for CardDB client\n */\n\nimport type { Cache } from '@carddb/core'\n\n/**\n * Generate a cache key from components\n */\nexport function cacheKey(\n resource: string,\n method: string,\n params: Record<string, unknown>\n): string {\n const sortedParams = Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n .join('&')\n return `carddb:${resource}:${method}:${sortedParams}`\n}\n\n/**\n * Read from cache (handles both sync and async caches)\n */\nexport async function readCache<T>(cache: Cache, key: string): Promise<T | null> {\n const result = cache.get<T>(key)\n if (result instanceof Promise) {\n return result\n }\n return result\n}\n\n/**\n * Write to cache (handles both sync and async caches)\n */\nexport async function writeCache<T>(\n cache: Cache,\n key: string,\n value: T,\n ttl: number\n): Promise<void> {\n const result = cache.set(key, value, ttl)\n if (result instanceof Promise) {\n await result\n }\n}\n","/**\n * Base resource class with common functionality\n */\n\nimport type { ResourceType } from '@carddb/core'\nimport type { Configuration } from '../configuration.js'\nimport type { Connection } from '../connection.js'\nimport { cacheKey, readCache, writeCache } from '../cache.js'\n\nexport abstract class BaseResource {\n protected connection: Connection\n protected config: Configuration\n\n constructor(connection: Connection, config: Configuration) {\n this.connection = connection\n this.config = config\n }\n\n /**\n * Resolve publisher slug, using default if not provided\n */\n protected resolvePublisher(publisherSlug?: string): string {\n const resolved = this.config.resolvePublisher(publisherSlug)\n if (!resolved) {\n throw new Error('publisher_slug is required (no default configured)')\n }\n return resolved\n }\n\n /**\n * Resolve game key, using default if not provided\n */\n protected resolveGame(gameKey?: string): string {\n const resolved = this.config.resolveGame(gameKey)\n if (!resolved) {\n throw new Error('game_key is required (no default configured)')\n }\n return resolved\n }\n\n /**\n * Validate access to publisher/game\n */\n protected validateAccess(publisherSlug?: string, gameKey?: string): void {\n this.config.validateAccess(publisherSlug, gameKey)\n }\n\n /**\n * Execute a query with optional caching\n */\n protected async withCache<T>(\n key: string,\n resource: ResourceType,\n options: { cache?: boolean },\n fn: () => Promise<T>\n ): Promise<T> {\n const useCache = options.cache ?? !!this.config.cache\n const cache = this.config.cache\n\n if (!useCache || !cache) {\n return fn()\n }\n\n // Try to read from cache\n const cached = await readCache<T>(cache, key)\n if (cached !== null) {\n return cached\n }\n\n // Execute query and cache result\n const result = await fn()\n if (result !== null && result !== undefined) {\n const ttl = this.config.cacheTtlFor(resource)\n await writeCache(cache, key, result, ttl)\n }\n\n return result\n }\n\n /**\n * Generate a cache key\n */\n protected cacheKey(resource: string, method: string, params: Record<string, unknown>): string {\n return cacheKey(resource, method, params)\n }\n}\n","/**\n * Publishers resource for CardDB API\n */\n\nimport type { Publisher, Connection as ConnectionType } from '@carddb/core'\nimport { Collection, QueryBuilder } from '@carddb/core'\nimport { BaseResource } from './base.js'\nimport type { Configuration } from '../configuration.js'\nimport type { Connection } from '../connection.js'\n\nexport interface SearchPublishersOptions {\n /** Search term to filter publishers by name */\n search?: string\n /** Maximum number of results per page (default: 20, max: 100) */\n first?: number\n /** Cursor for pagination */\n after?: string\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport interface GetPublisherOptions {\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport class PublishersResource extends BaseResource {\n constructor(connection: Connection, config: Configuration) {\n super(connection, config)\n }\n\n /**\n * Search for publishers\n *\n * @example\n * const publishers = await client.publishers.search({ search: 'pokemon' })\n * for await (const publisher of publishers) {\n * console.log(publisher.name)\n * }\n */\n async search(options: SearchPublishersOptions = {}): Promise<Collection<Publisher>> {\n const { query, variables } = QueryBuilder.searchPublishers({\n search: options.search,\n first: options.first,\n after: options.after,\n })\n\n const key = this.cacheKey('publishers', 'search', variables)\n\n const data = await this.withCache(key, 'publishers', options, async () => {\n const result = await this.connection.execute(query, variables)\n return result['searchPublishers'] as ConnectionType<Publisher>\n })\n\n return new Collection(data, {\n nextPageLoader: async (cursor: string) => {\n return this.search({ ...options, after: cursor })\n },\n })\n }\n\n /**\n * Get a single publisher by slug or ID\n *\n * @example\n * const publisher = await client.publishers.get('pokemon')\n * const publisher = await client.publishers.get('550e8400-e29b-41d4-a716-446655440000')\n */\n async get(slugOrId: string, options: GetPublisherOptions = {}): Promise<Publisher | null> {\n const isUUID = this.isUUID(slugOrId)\n const key = this.cacheKey('publishers', 'get', { [isUUID ? 'id' : 'slug']: slugOrId })\n\n return this.withCache(key, 'publishers', options, async () => {\n if (isUUID) {\n const { query } = QueryBuilder.fetchPublisherById()\n const result = await this.connection.execute(query, { id: slugOrId })\n return (result['fetchPublisher'] as Publisher) ?? null\n } else {\n const { query } = QueryBuilder.fetchPublisherBySlug()\n const result = await this.connection.execute(query, { slug: slugOrId })\n return (result['fetchPublisher'] as Publisher) ?? null\n }\n })\n }\n\n /**\n * Get multiple publishers by slug\n *\n * @example\n * const publishers = await client.publishers.getMany(['pokemon', 'wizards'])\n */\n async getMany(slugs: string[], options: GetPublisherOptions = {}): Promise<Publisher[]> {\n if (slugs.length === 0) return []\n\n const key = this.cacheKey('publishers', 'getMany', { slugs })\n\n return this.withCache(key, 'publishers', options, async () => {\n const { query } = QueryBuilder.fetchPublishers()\n const result = await this.connection.execute(query, { slugs })\n return (result['fetchPublishers'] as Publisher[]) ?? []\n })\n }\n\n /**\n * Check if a string is a valid UUID\n */\n private isUUID(value: string): boolean {\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i\n return uuidRegex.test(value)\n }\n}\n","/**\n * Games resource for CardDB API\n */\n\nimport type { Game, Connection as ConnectionType } from '@carddb/core'\nimport { Collection, QueryBuilder } from '@carddb/core'\nimport { BaseResource } from './base.js'\nimport type { Configuration } from '../configuration.js'\nimport type { Connection } from '../connection.js'\n\nexport interface SearchGamesOptions {\n /** Publisher slug to filter games */\n publisherSlug?: string\n /** Search term to filter games by name */\n search?: string\n /** Maximum number of results per page (default: 20, max: 100) */\n first?: number\n /** Cursor for pagination */\n after?: string\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport interface GetGameOptions {\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport class GamesResource extends BaseResource {\n constructor(connection: Connection, config: Configuration) {\n super(connection, config)\n }\n\n /**\n * Search for games\n *\n * @example\n * // Search all games\n * const games = await client.games.search({ search: 'trading card' })\n *\n * // Search games from a specific publisher\n * const games = await client.games.search({ publisherSlug: 'pokemon' })\n */\n async search(options: SearchGamesOptions = {}): Promise<Collection<Game>> {\n const publisherSlug = this.config.resolvePublisher(options.publisherSlug)\n\n // Validate access if publisher is specified\n if (publisherSlug) {\n this.validateAccess(publisherSlug)\n }\n\n const { query, variables } = QueryBuilder.searchGames({\n publisherSlug,\n search: options.search,\n first: options.first,\n after: options.after,\n })\n\n const key = this.cacheKey('games', 'search', variables)\n\n const data = await this.withCache(key, 'games', options, async () => {\n const result = await this.connection.execute(query, variables)\n return result['searchGames'] as ConnectionType<Game>\n })\n\n return new Collection(data, {\n nextPageLoader: async (cursor: string) => {\n return this.search({ ...options, after: cursor })\n },\n })\n }\n\n /**\n * Get a single game by ID\n *\n * @example\n * const game = await client.games.get('550e8400-e29b-41d4-a716-446655440000')\n */\n async get(id: string, options?: GetGameOptions): Promise<Game | null>\n\n /**\n * Get a single game by publisher slug and game key\n *\n * @example\n * const game = await client.games.get('pokemon', 'tcg')\n */\n async get(publisherSlug: string, gameKey: string, options?: GetGameOptions): Promise<Game | null>\n\n async get(\n idOrPublisherSlug: string,\n gameKeyOrOptions?: string | GetGameOptions,\n options?: GetGameOptions\n ): Promise<Game | null> {\n // Determine if called with ID or with publisherSlug + gameKey\n if (typeof gameKeyOrOptions === 'string') {\n // Called as get(publisherSlug, gameKey, options?)\n const publisherSlug = idOrPublisherSlug\n const gameKey = gameKeyOrOptions\n const opts = options ?? {}\n\n this.validateAccess(publisherSlug, gameKey)\n\n const key = this.cacheKey('games', 'getByKeys', { publisherSlug, gameKey })\n\n return this.withCache(key, 'games', opts, async () => {\n const { query } = QueryBuilder.fetchGameByKeys()\n const result = await this.connection.execute(query, { publisherSlug, gameKey })\n return (result['fetchGame'] as Game) ?? null\n })\n } else {\n // Called as get(id, options?)\n const id = idOrPublisherSlug\n const opts = gameKeyOrOptions ?? {}\n\n const key = this.cacheKey('games', 'get', { id })\n\n return this.withCache(key, 'games', opts, async () => {\n const { query } = QueryBuilder.fetchGameById()\n const result = await this.connection.execute(query, { id })\n return (result['fetchGame'] as Game) ?? null\n })\n }\n }\n\n /**\n * Get multiple games by ID\n *\n * @example\n * const games = await client.games.getMany(['id1', 'id2', 'id3'])\n */\n async getMany(ids: string[], options: GetGameOptions = {}): Promise<Game[]> {\n if (ids.length === 0) return []\n\n const key = this.cacheKey('games', 'getMany', { ids })\n\n return this.withCache(key, 'games', options, async () => {\n const { query } = QueryBuilder.fetchGames()\n const result = await this.connection.execute(query, { ids })\n return (result['fetchGames'] as Game[]) ?? []\n })\n }\n}\n","/**\n * Datasets resource for CardDB API\n */\n\nimport type { Dataset, Connection as ConnectionType } from '@carddb/core'\nimport { Collection, QueryBuilder } from '@carddb/core'\nimport { BaseResource } from './base.js'\nimport type { Configuration } from '../configuration.js'\nimport type { Connection } from '../connection.js'\n\nexport interface SearchDatasetsOptions {\n /** Publisher slug to filter datasets */\n publisherSlug?: string\n /** Game key to filter datasets (requires publisherSlug) */\n gameKey?: string\n /** Search term to filter datasets by name */\n search?: string\n /** Dataset purpose to filter by */\n purpose?: 'DATA' | 'RULES'\n /** Maximum number of results per page (default: 20, max: 100) */\n first?: number\n /** Cursor for pagination */\n after?: string\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport interface GetDatasetOptions {\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport class DatasetsResource extends BaseResource {\n constructor(connection: Connection, config: Configuration) {\n super(connection, config)\n }\n\n /**\n * Search for datasets\n *\n * @example\n * // Search all datasets\n * const datasets = await client.datasets.search({ search: 'cards' })\n *\n * // Search datasets from a specific publisher and game\n * const datasets = await client.datasets.search({\n * publisherSlug: 'pokemon',\n * gameKey: 'tcg'\n * })\n */\n async search(options: SearchDatasetsOptions = {}): Promise<Collection<Dataset>> {\n const publisherSlug = this.config.resolvePublisher(options.publisherSlug)\n const gameKey = this.config.resolveGame(options.gameKey)\n\n // Validate access if specified\n if (publisherSlug) {\n this.validateAccess(publisherSlug, gameKey)\n }\n\n const { query, variables } = QueryBuilder.searchDatasets({\n publisherSlug,\n gameKey,\n search: options.search,\n purpose: options.purpose,\n first: options.first,\n after: options.after,\n })\n\n const key = this.cacheKey('datasets', 'search', variables)\n\n const data = await this.withCache(key, 'datasets', options, async () => {\n const result = await this.connection.execute(query, variables)\n return result['searchDatasets'] as ConnectionType<Dataset>\n })\n\n return new Collection(data, {\n nextPageLoader: async (cursor: string) => {\n return this.search({ ...options, after: cursor })\n },\n })\n }\n\n /**\n * Get a single dataset by ID (includes schema)\n *\n * @example\n * const dataset = await client.datasets.get('550e8400-e29b-41d4-a716-446655440000')\n */\n async get(id: string, options?: GetDatasetOptions): Promise<Dataset | null>\n\n /**\n * Get a single dataset by publisher slug, game key, and dataset key (includes schema)\n *\n * @example\n * const dataset = await client.datasets.get('pokemon', 'tcg', 'cards')\n */\n async get(\n publisherSlug: string,\n gameKey: string,\n datasetKey: string,\n options?: GetDatasetOptions\n ): Promise<Dataset | null>\n\n async get(\n idOrPublisherSlug: string,\n gameKeyOrOptions?: string | GetDatasetOptions,\n datasetKey?: string,\n options?: GetDatasetOptions\n ): Promise<Dataset | null> {\n // Determine if called with ID or with publisherSlug + gameKey + datasetKey\n if (typeof gameKeyOrOptions === 'string' && typeof datasetKey === 'string') {\n // Called as get(publisherSlug, gameKey, datasetKey, options?)\n const publisherSlug = idOrPublisherSlug\n const gameKey = gameKeyOrOptions\n const opts = options ?? {}\n\n this.validateAccess(publisherSlug, gameKey)\n\n const key = this.cacheKey('datasets', 'getByKeys', { publisherSlug, gameKey, datasetKey })\n\n return this.withCache(key, 'datasets', opts, async () => {\n const { query } = QueryBuilder.fetchDatasetByKeys()\n const result = await this.connection.execute(query, { publisherSlug, gameKey, datasetKey })\n return (result['fetchDataset'] as Dataset) ?? null\n })\n } else {\n // Called as get(id, options?)\n const id = idOrPublisherSlug\n const opts = (gameKeyOrOptions as GetDatasetOptions) ?? {}\n\n const key = this.cacheKey('datasets', 'get', { id })\n\n return this.withCache(key, 'datasets', opts, async () => {\n const { query } = QueryBuilder.fetchDatasetById()\n const result = await this.connection.execute(query, { id })\n return (result['fetchDataset'] as Dataset) ?? null\n })\n }\n }\n\n /**\n * Get multiple datasets by ID\n *\n * @example\n * const datasets = await client.datasets.getMany(['id1', 'id2', 'id3'])\n */\n async getMany(ids: string[], options: GetDatasetOptions = {}): Promise<Dataset[]> {\n if (ids.length === 0) return []\n\n const key = this.cacheKey('datasets', 'getMany', { ids })\n\n return this.withCache(key, 'datasets', options, async () => {\n const { query } = QueryBuilder.fetchDatasets()\n const result = await this.connection.execute(query, { ids })\n return (result['fetchDatasets'] as Dataset[]) ?? []\n })\n }\n}\n","/**\n * Decks resource for CardDB API\n */\n\nimport type {\n AppDecksFilterInput,\n Connection as ConnectionType,\n DatasetRecord,\n Deck,\n DeckAccessTokenExchangeInput,\n DeckAccessTokenExchangePayload,\n DeckAccessTokenIssuer,\n DeckAccessTokenIssuerCreateInput,\n DeckAPIApplicationAccess,\n DeckAPIApplicationAccessGrantInput,\n DeckClaimInput,\n DeckCollaborator,\n DeckCollaboratorRole,\n DeckCopyInput,\n DeckCopyPayload,\n DeckCreateInput,\n DeckDiff,\n DeckEmbedToken,\n DeckEmbedTokenCreateInput,\n DeckEmbedTokenCreatePayload,\n DeckEntriesReplaceInput,\n DeckEntriesReplacePayload,\n DeckEntryAddInput,\n DeckEntryMutationPayload,\n DeckEntryReorderInput,\n DeckEntryReorderPayload,\n DeckEntryUpdateInput,\n DeckExportFormat,\n DeckExportPayload,\n DeckHydrateEntriesInput,\n DeckHydrateEntriesPayload,\n DeckImportFormatCreateInput,\n DeckImportFormatDefinition,\n DeckImportFormatTestInput,\n DeckImportFormatTestPayload,\n DeckImportFormatUpdateInput,\n DeckImportInput,\n DeckImportPayload,\n DeckOwnershipTransferPayload,\n DeckPreviewToken,\n DeckPreviewTokenCreateInput,\n DeckPreviewTokenCreatePayload,\n DeckPublishInput,\n DeckPublishPayload,\n DeckRemoveInvalidEntriesInput,\n DeckSectionDefinition,\n DeckTransferOwnershipInput,\n DeckUpsertByExternalRefInput,\n DeckUpsertByExternalRefPayload,\n DeckUpdateInput,\n DeckValidateInput,\n DeckValidation,\n DeckVersion,\n HydratedDeckEntry,\n HydrateDeckEntryInput,\n PublicDecksFilterInput,\n ViewerDecksFilterInput,\n} from '@carddb/core'\nimport { Collection, QueryBuilder } from '@carddb/core'\nimport { BaseResource } from './base.js'\nimport type { Configuration } from '../configuration.js'\nimport type { Connection } from '../connection.js'\n\nexport interface ListDecksOptions {\n /** Maximum number of results per page */\n first?: number\n /** Cursor for pagination */\n after?: string\n /** Include archived decks in owner lists */\n includeArchived?: boolean\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport interface ListViewerDecksOptions extends ListDecksOptions {\n filter?: ViewerDecksFilterInput\n}\n\nexport interface ListAppDecksOptions extends ListDecksOptions {\n filter?: AppDecksFilterInput\n}\n\nexport interface ListPublicDecksOptions extends Omit<ListDecksOptions, 'includeArchived'> {\n filter?: PublicDecksFilterInput\n}\n\nexport interface FetchDeckOptions {\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport type FetchDeckByExternalRefOptions = FetchDeckOptions\n\nexport type FetchDeckBySlugOptions = FetchDeckOptions\n\nexport type ListDeckVersionsOptions = ListDecksOptions\n\nexport type ListDeckCollaboratorsOptions = FetchDeckOptions\n\nexport type ListDeckPreviewTokensOptions = FetchDeckOptions\n\nexport type ListDeckEmbedTokensOptions = FetchDeckOptions\n\nexport type ListDeckAccessTokenIssuersOptions = FetchDeckOptions\n\nexport interface ListDeckApiApplicationAccessesOptions extends FetchDeckOptions {\n includeRevoked?: boolean\n}\n\nexport interface ListMyDeckApiApplicationAccessesOptions extends FetchDeckOptions {\n applicationId?: string\n}\n\nexport type ListDeckImportFormatsOptions = ListDecksOptions\n\nexport interface DeckSectionDefinitionsOptions extends FetchDeckOptions {\n publisherSlug?: string\n gameKey?: string\n gameId?: string\n rulesetKey?: string\n rulesetVersionId?: string\n}\n\nexport interface HydrateDeckEntriesOptions {\n /** Publisher slug (uses default if configured) */\n publisherSlug?: string\n /** Game key (uses default if configured) */\n gameKey?: string\n /** Dataset key containing the deck entries */\n datasetKey: string\n /** Field key used to map returned records to input identifiers */\n identifierField?: string\n /** Deck entries to hydrate */\n entries: HydrateDeckEntryInput[]\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport class DecksResource extends BaseResource {\n constructor(connection: Connection, config: Configuration) {\n super(connection, config)\n }\n\n /**\n * Fetch a hosted deck by CardDB UUID.\n */\n async fetch(id: string, options: FetchDeckOptions = {}): Promise<Deck | null> {\n const key = this.cacheKey('decks', 'fetch', { id })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.fetchDeckById()\n const result = await this.connection.execute(query, { id })\n return (result['fetchDeck'] as Deck) ?? null\n })\n }\n\n /**\n * Fetch a deck by UUID using the ownership-aware `deck` API.\n */\n async get(id: string, options: FetchDeckOptions = {}): Promise<Deck | null> {\n const key = this.cacheKey('decks', 'get', { id })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.deckById()\n const result = await this.connection.execute(query, { id })\n return (result['deck'] as Deck) ?? null\n })\n }\n\n /**\n * Fetch one deck owned by the current account or API application.\n */\n async fetchMine(id: string, options: FetchDeckOptions = {}): Promise<Deck | null> {\n const key = this.cacheKey('decks', 'fetchMine', { id })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.myDeck()\n const result = await this.connection.execute(query, { id })\n return (result['myDeck'] as Deck) ?? null\n })\n }\n\n /**\n * Fetch a hosted deck by canonical or historical slug.\n */\n async fetchBySlug(\n publisherSlug: string,\n gameKey: string,\n slug: string,\n options: FetchDeckBySlugOptions = {}\n ): Promise<Deck | null> {\n const key = this.cacheKey('decks', 'fetchBySlug', { publisherSlug, gameKey, slug })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.fetchDeckBySlug()\n const result = await this.connection.execute(query, { publisherSlug, gameKey, slug })\n return (result['fetchDeckBySlug'] as Deck) ?? null\n })\n }\n\n /**\n * Fetch by slug using the ownership-aware `deckBySlug` API.\n */\n async getBySlug(\n publisherSlug: string,\n gameKey: string,\n slug: string,\n options: FetchDeckBySlugOptions = {}\n ): Promise<Deck | null> {\n const key = this.cacheKey('decks', 'getBySlug', { publisherSlug, gameKey, slug })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.deckBySlug()\n const result = await this.connection.execute(query, { publisherSlug, gameKey, slug })\n return (result['deckBySlug'] as Deck) ?? null\n })\n }\n\n /**\n * Fetch a hosted deck by external reference for the current API application.\n */\n async fetchByExternalRef(\n externalRef: string,\n options: FetchDeckByExternalRefOptions = {}\n ): Promise<Deck | null> {\n const key = this.cacheKey('decks', 'fetchByExternalRef', { externalRef })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.fetchDeckByExternalRef()\n const result = await this.connection.execute(query, { externalRef })\n return (result['fetchDeckByExternalRef'] as Deck) ?? null\n })\n }\n\n /**\n * Fetch by external reference using the ownership-aware `deckByExternalRef` API.\n */\n async getByExternalRef(\n externalRef: string,\n options: FetchDeckByExternalRefOptions = {}\n ): Promise<Deck | null> {\n const key = this.cacheKey('decks', 'getByExternalRef', { externalRef })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.deckByExternalRef()\n const result = await this.connection.execute(query, { externalRef })\n return (result['deckByExternalRef'] as Deck) ?? null\n })\n }\n\n /**\n * List decks owned by the current account or API application.\n */\n async listMine(options: ListDecksOptions = {}): Promise<Collection<Deck>> {\n const { query, variables } = QueryBuilder.listMyDecks({\n first: options.first,\n after: options.after,\n includeArchived: options.includeArchived,\n })\n const key = this.cacheKey('decks', 'listMine', variables)\n\n const data = await this.withCache(key, 'decks', options, async () => {\n const result = await this.connection.execute(query, variables)\n return result['myDecks'] as ConnectionType<Deck>\n })\n\n return new Collection(data, {\n nextPageLoader: async (cursor: string) => this.listMine({ ...options, after: cursor }),\n })\n }\n\n /**\n * List decks owned by the current account or OAuth grant.\n */\n async listViewer(options: ListViewerDecksOptions = {}): Promise<Collection<Deck>> {\n const { query, variables } = QueryBuilder.viewerDecks({\n filter: options.filter,\n first: options.first,\n after: options.after,\n })\n const key = this.cacheKey('decks', 'listViewer', variables)\n\n const data = await this.withCache(key, 'decks', options, async () => {\n const result = await this.connection.execute(query, variables)\n return result['viewerDecks'] as ConnectionType<Deck>\n })\n\n return new Collection(data, {\n nextPageLoader: async (cursor: string) => this.listViewer({ ...options, after: cursor }),\n })\n }\n\n /**\n * List app-owned decks for the current secret-key API application.\n */\n async listApp(options: ListAppDecksOptions = {}): Promise<Collection<Deck>> {\n this.config.requireSecretCredential('decks.listApp')\n\n const { query, variables } = QueryBuilder.appDecks({\n filter: options.filter,\n first: options.first,\n after: options.after,\n })\n const key = this.cacheKey('decks', 'listApp', variables)\n\n const data = await this.withCache(key, 'decks', options, async () => {\n const result = await this.connection.execute(query, variables)\n return result['appDecks'] as ConnectionType<Deck>\n })\n\n return new Collection(data, {\n nextPageLoader: async (cursor: string) => this.listApp({ ...options, after: cursor }),\n })\n }\n\n /**\n * List published live decks eligible for public discovery.\n */\n async listPublic(options: ListPublicDecksOptions = {}): Promise<Collection<Deck>> {\n const { query, variables } = QueryBuilder.publicDecks({\n filter: options.filter,\n first: options.first,\n after: options.after,\n })\n const key = this.cacheKey('decks', 'listPublic', variables)\n\n const data = await this.withCache(key, 'decks', options, async () => {\n const result = await this.connection.execute(query, variables)\n return result['publicDecks'] as ConnectionType<Deck>\n })\n\n return new Collection(data, {\n nextPageLoader: async (cursor: string) => this.listPublic({ ...options, after: cursor }),\n })\n }\n\n /**\n * Fetch one immutable published deck version.\n */\n async fetchVersion(id: string, options: FetchDeckOptions = {}): Promise<DeckVersion | null> {\n const key = this.cacheKey('decks', 'fetchVersion', { id })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.deckVersion()\n const result = await this.connection.execute(query, { id })\n return (result['deckVersion'] as DeckVersion) ?? null\n })\n }\n\n /**\n * List immutable published versions for a deck.\n */\n async listVersions(\n deckId: string,\n options: ListDeckVersionsOptions = {}\n ): Promise<Collection<DeckVersion>> {\n const { query, variables: pageVariables } = QueryBuilder.deckVersions({\n first: options.first,\n after: options.after,\n })\n const variables = { deckId, ...pageVariables }\n const key = this.cacheKey('decks', 'listVersions', variables)\n\n const data = await this.withCache(key, 'decks', options, async () => {\n const result = await this.connection.execute(query, variables)\n return result['deckVersions'] as ConnectionType<DeckVersion>\n })\n\n return new Collection(data, {\n nextPageLoader: async (cursor: string) =>\n this.listVersions(deckId, { ...options, after: cursor }),\n })\n }\n\n /**\n * Fetch current draft data using a revocable preview token.\n */\n async preview(token: string, options: FetchDeckOptions = {}): Promise<Deck | null> {\n const key = this.cacheKey('decks', 'preview', { token })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.deckPreview()\n const result = await this.connection.execute(query, { token })\n return (result['deckPreview'] as Deck) ?? null\n })\n }\n\n /**\n * Fetch published embed data using a revocable embed token.\n */\n async embed(token: string, options: FetchDeckOptions = {}): Promise<Deck | null> {\n const key = this.cacheKey('decks', 'embed', { token })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.deckEmbed()\n const result = await this.connection.execute(query, { token })\n return (result['deckEmbed'] as Deck) ?? null\n })\n }\n\n /**\n * Fetch token-authorized published data using an exchanged access token.\n */\n async access(token: string, options: FetchDeckOptions = {}): Promise<Deck | null> {\n const key = this.cacheKey('decks', 'access', { token })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.deckAccess()\n const result = await this.connection.execute(query, { token })\n return (result['deckAccess'] as Deck) ?? null\n })\n }\n\n /**\n * Compare the current draft against the latest published version.\n */\n async draftDiff(id: string, options: FetchDeckOptions = {}): Promise<DeckDiff> {\n const key = this.cacheKey('decks', 'draftDiff', { id })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.deckDraftDiff()\n const result = await this.connection.execute(query, { id })\n return result['deckDraftDiff'] as DeckDiff\n })\n }\n\n /**\n * Compare any two readable immutable deck versions from the same deck.\n */\n async versionDiff(\n fromVersionId: string,\n toVersionId: string,\n options: FetchDeckOptions = {}\n ): Promise<DeckDiff> {\n const variables = QueryBuilder.deckVersionDiffVariables(fromVersionId, toVersionId)\n const key = this.cacheKey('decks', 'versionDiff', variables)\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.deckVersionDiff()\n const result = await this.connection.execute(query, variables)\n return result['deckVersionDiff'] as DeckDiff\n })\n }\n\n /**\n * Validate a draft against current or explicitly requested immutable rules/data.\n */\n async validate(\n id: string,\n input?: DeckValidateInput,\n options: FetchDeckOptions = {}\n ): Promise<DeckValidation> {\n const variables = QueryBuilder.deckValidateVariables(id, input)\n const key = this.cacheKey('decks', 'validate', variables)\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.deckValidate()\n const result = await this.connection.execute(query, variables)\n return result['deckValidate'] as DeckValidation\n })\n }\n\n /**\n * Hydrate unpersisted deck entries against a stored deck's game without mutating the deck.\n */\n async hydrateDeckEntries(\n input: DeckHydrateEntriesInput,\n options: FetchDeckOptions = {}\n ): Promise<DeckHydrateEntriesPayload> {\n const variables = QueryBuilder.deckHydrateEntriesVariables(input)\n const key = this.cacheKey('decks', 'hydrateDeckEntries', variables)\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.deckHydrateEntries()\n const result = await this.connection.execute(query, variables)\n return result['deckHydrateEntries'] as DeckHydrateEntriesPayload\n })\n }\n\n /**\n * Export a readable deck representation in a deterministic text format.\n */\n async exportDeck(\n id: string,\n format: DeckExportFormat = 'SIMPLE_TEXT',\n options: FetchDeckOptions = {}\n ): Promise<DeckExportPayload> {\n const variables = QueryBuilder.deckExportVariables(id, format)\n const key = this.cacheKey('decks', 'exportDeck', variables)\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.deckExport()\n const result = await this.connection.execute(query, variables)\n return result['deckExport'] as DeckExportPayload\n })\n }\n\n /**\n * Resolve current or historical ruleset section definitions.\n */\n async sectionDefinitions(\n options: DeckSectionDefinitionsOptions = {}\n ): Promise<DeckSectionDefinition[]> {\n const { query, variables } = QueryBuilder.deckSectionDefinitions({\n publisherSlug: options.publisherSlug,\n gameKey: options.gameKey,\n gameId: options.gameId,\n rulesetKey: options.rulesetKey,\n rulesetVersionId: options.rulesetVersionId,\n })\n const key = this.cacheKey('decks', 'sectionDefinitions', variables)\n\n return this.withCache(key, 'decks', options, async () => {\n const result = await this.connection.execute(query, variables)\n return result['deckSectionDefinitions'] as DeckSectionDefinition[]\n })\n }\n\n /**\n * List collaborators for a deck.\n */\n async listCollaborators(\n deckId: string,\n options: ListDeckCollaboratorsOptions = {}\n ): Promise<DeckCollaborator[]> {\n const key = this.cacheKey('decks', 'listCollaborators', { deckId })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.deckCollaborators()\n const result = await this.connection.execute(query, { deckId })\n return result['deckCollaborators'] as DeckCollaborator[]\n })\n }\n\n /**\n * List draft preview tokens for a deck.\n */\n async listPreviewTokens(\n deckId: string,\n options: ListDeckPreviewTokensOptions = {}\n ): Promise<DeckPreviewToken[]> {\n const key = this.cacheKey('decks', 'listPreviewTokens', { deckId })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.deckPreviewTokens()\n const result = await this.connection.execute(query, { deckId })\n return result['deckPreviewTokens'] as DeckPreviewToken[]\n })\n }\n\n /**\n * List published embed tokens for a deck.\n */\n async listEmbedTokens(\n deckId: string,\n options: ListDeckEmbedTokensOptions = {}\n ): Promise<DeckEmbedToken[]> {\n const key = this.cacheKey('decks', 'listEmbedTokens', { deckId })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.deckEmbedTokens()\n const result = await this.connection.execute(query, { deckId })\n return result['deckEmbedTokens'] as DeckEmbedToken[]\n })\n }\n\n /**\n * List trusted access token issuers for a deck.\n */\n async listAccessTokenIssuers(\n deckId: string,\n options: ListDeckAccessTokenIssuersOptions = {}\n ): Promise<DeckAccessTokenIssuer[]> {\n const key = this.cacheKey('decks', 'listAccessTokenIssuers', { deckId })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.deckAccessTokenIssuers()\n const result = await this.connection.execute(query, { deckId })\n return result['deckAccessTokenIssuers'] as DeckAccessTokenIssuer[]\n })\n }\n\n /**\n * List API applications with explicit access to one owned deck.\n */\n async listApiApplicationAccesses(\n deckId: string,\n options: ListDeckApiApplicationAccessesOptions = {}\n ): Promise<DeckAPIApplicationAccess[]> {\n const variables = QueryBuilder.deckApiApplicationAccessesVariables(\n deckId,\n options.includeRevoked\n )\n const key = this.cacheKey('decks', 'listApiApplicationAccesses', variables)\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.deckApiApplicationAccesses()\n const result = await this.connection.execute(query, variables)\n return result['deckApiApplicationAccesses'] as DeckAPIApplicationAccess[]\n })\n }\n\n /**\n * List selected-deck grants for the current account.\n */\n async listMyApiApplicationAccesses(\n options: ListMyDeckApiApplicationAccessesOptions = {}\n ): Promise<DeckAPIApplicationAccess[]> {\n const variables = QueryBuilder.myDeckApiApplicationAccessesVariables(options.applicationId)\n const key = this.cacheKey('decks', 'listMyApiApplicationAccesses', variables)\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.myDeckApiApplicationAccesses()\n const result = await this.connection.execute(query, variables)\n return result['myDeckApiApplicationAccesses'] as DeckAPIApplicationAccess[]\n })\n }\n\n /**\n * Create a hosted deck.\n */\n async create(input: DeckCreateInput): Promise<Deck> {\n const { query } = QueryBuilder.createDeck()\n const variables = QueryBuilder.deckCreateVariables(input)\n const result = await this.connection.execute(query, variables)\n return result['deckCreate'] as Deck\n }\n\n /**\n * Update a hosted deck.\n */\n async update(id: string, input: DeckUpdateInput): Promise<Deck> {\n const { query } = QueryBuilder.updateDeck()\n const variables = QueryBuilder.deckUpdateVariables(id, input)\n const result = await this.connection.execute(query, variables)\n return result['deckUpdate'] as Deck\n }\n\n /**\n * Update deck-level metadata without mutating entries.\n */\n async updateMetadata(id: string, input: DeckUpdateInput): Promise<Deck> {\n return this.update(id, input)\n }\n\n /**\n * Create or replace a draft by API-application external reference.\n */\n async upsertByExternalRef(\n input: DeckUpsertByExternalRefInput\n ): Promise<DeckUpsertByExternalRefPayload> {\n this.config.requireSecretCredential('decks.upsertByExternalRef')\n\n const { query } = QueryBuilder.upsertDeckByExternalRef()\n const variables = QueryBuilder.deckUpsertByExternalRefVariables(input)\n const result = await this.connection.execute(query, variables)\n return result['deckUpsertByExternalRef'] as DeckUpsertByExternalRefPayload\n }\n\n /**\n * Claim an app-owned deck into the consenting OAuth user's account.\n */\n async claim(id: string, input: DeckClaimInput): Promise<DeckOwnershipTransferPayload> {\n const { query } = QueryBuilder.claimDeck()\n const variables = QueryBuilder.deckClaimVariables(id, input)\n const result = await this.connection.execute(query, variables)\n return result['deckClaim'] as DeckOwnershipTransferPayload\n }\n\n /**\n * Transfer a deck to another account.\n */\n async transferOwnership(\n id: string,\n input: DeckTransferOwnershipInput\n ): Promise<DeckOwnershipTransferPayload> {\n const { query } = QueryBuilder.transferDeckOwnership()\n const variables = QueryBuilder.deckTransferOwnershipVariables(id, input)\n const result = await this.connection.execute(query, variables)\n return result['deckTransferOwnership'] as DeckOwnershipTransferPayload\n }\n\n /**\n * Copy a deck into the current principal's ownership namespace.\n */\n async copy(id: string, input: DeckCopyInput): Promise<DeckCopyPayload> {\n const { query } = QueryBuilder.copyDeck()\n const variables = QueryBuilder.deckCopyVariables(id, input)\n const result = await this.connection.execute(query, variables)\n return result['deckCopy'] as DeckCopyPayload\n }\n\n /**\n * Add one entry to a deck draft.\n */\n async addEntry(input: DeckEntryAddInput): Promise<DeckEntryMutationPayload> {\n const { query } = QueryBuilder.addDeckEntry()\n const variables = QueryBuilder.deckEntryAddVariables(input)\n const result = await this.connection.execute(query, variables)\n return result['deckEntryAdd'] as DeckEntryMutationPayload\n }\n\n /**\n * Update one stable deck entry.\n */\n async updateEntry(id: string, input: DeckEntryUpdateInput): Promise<DeckEntryMutationPayload> {\n const { query } = QueryBuilder.updateDeckEntry()\n const variables = QueryBuilder.deckEntryUpdateVariables(id, input)\n const result = await this.connection.execute(query, variables)\n return result['deckEntryUpdate'] as DeckEntryMutationPayload\n }\n\n /**\n * Remove one stable deck entry.\n */\n async removeEntry(id: string, expectedDraftRevision: number): Promise<DeckEntryMutationPayload> {\n const { query } = QueryBuilder.removeDeckEntry()\n const variables = QueryBuilder.deckEntryRemoveVariables(id, expectedDraftRevision)\n const result = await this.connection.execute(query, variables)\n return result['deckEntryRemove'] as DeckEntryMutationPayload\n }\n\n /**\n * Reorder deck entries within or across sections.\n */\n async reorderEntries(\n deckId: string,\n input: DeckEntryReorderInput\n ): Promise<DeckEntryReorderPayload> {\n const { query } = QueryBuilder.reorderDeckEntries()\n const variables = QueryBuilder.deckEntryReorderVariables(deckId, input)\n const result = await this.connection.execute(query, variables)\n return result['deckEntryReorder'] as DeckEntryReorderPayload\n }\n\n /**\n * Explicitly replace all deck entries for import or repair flows.\n */\n async replaceEntries(\n deckId: string,\n input: DeckEntriesReplaceInput\n ): Promise<DeckEntriesReplacePayload> {\n const { query } = QueryBuilder.replaceDeckEntries()\n const variables = QueryBuilder.deckEntriesReplaceVariables(deckId, input)\n const result = await this.connection.execute(query, variables)\n return result['deckEntriesReplace'] as DeckEntriesReplacePayload\n }\n\n /**\n * Import a decklist into an existing deck or dry-run resolution.\n */\n async importDeck(input: DeckImportInput): Promise<DeckImportPayload> {\n const { query } = QueryBuilder.importDeck()\n const variables = QueryBuilder.deckImportVariables(input)\n const result = await this.connection.execute(query, variables)\n return result['deckImport'] as DeckImportPayload\n }\n\n /**\n * List publisher-managed configured import formats for a game.\n */\n async listImportFormats(\n gameId: string,\n options: ListDeckImportFormatsOptions = {}\n ): Promise<Collection<DeckImportFormatDefinition>> {\n const { query, variables } = QueryBuilder.deckImportFormats({\n gameId,\n includeArchived: options.includeArchived,\n first: options.first,\n after: options.after,\n })\n const key = this.cacheKey('decks', 'listImportFormats', variables)\n\n const data = await this.withCache(key, 'decks', options, async () => {\n const result = await this.connection.execute(query, variables)\n return result['deckImportFormats'] as ConnectionType<DeckImportFormatDefinition>\n })\n\n return new Collection(data, {\n nextPageLoader: async (cursor: string) =>\n this.listImportFormats(gameId, { ...options, after: cursor }),\n })\n }\n\n /**\n * Fetch one configured import format by UUID.\n */\n async fetchImportFormat(\n id: string,\n options: FetchDeckOptions = {}\n ): Promise<DeckImportFormatDefinition | null> {\n const key = this.cacheKey('decks', 'fetchImportFormat', { id })\n\n return this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.deckImportFormat()\n const result = await this.connection.execute(query, { id })\n return (result['deckImportFormat'] as DeckImportFormatDefinition) ?? null\n })\n }\n\n /**\n * Preview configured import-format parsing and record resolution.\n */\n async testImportFormat(input: DeckImportFormatTestInput): Promise<DeckImportFormatTestPayload> {\n const { query } = QueryBuilder.deckImportFormatTest()\n const variables = QueryBuilder.deckImportFormatTestVariables(input)\n const result = await this.connection.execute(query, variables)\n return result['deckImportFormatTest'] as DeckImportFormatTestPayload\n }\n\n /**\n * Create a publisher-managed configured import format.\n */\n async createImportFormat(\n input: DeckImportFormatCreateInput\n ): Promise<DeckImportFormatDefinition> {\n const { query } = QueryBuilder.createDeckImportFormat()\n const variables = QueryBuilder.deckImportFormatCreateVariables(input)\n const result = await this.connection.execute(query, variables)\n return result['deckImportFormatCreate'] as DeckImportFormatDefinition\n }\n\n /**\n * Update a publisher-managed configured import format.\n */\n async updateImportFormat(\n id: string,\n input: DeckImportFormatUpdateInput\n ): Promise<DeckImportFormatDefinition> {\n const { query } = QueryBuilder.updateDeckImportFormat()\n const variables = QueryBuilder.deckImportFormatUpdateVariables(id, input)\n const result = await this.connection.execute(query, variables)\n return result['deckImportFormatUpdate'] as DeckImportFormatDefinition\n }\n\n /**\n * Archive a configured import format.\n */\n async archiveImportFormat(id: string): Promise<DeckImportFormatDefinition> {\n const { query } = QueryBuilder.archiveDeckImportFormat()\n const result = await this.connection.execute(query, { id })\n return result['deckImportFormatArchive'] as DeckImportFormatDefinition\n }\n\n /**\n * Restore an archived configured import format.\n */\n async unarchiveImportFormat(id: string): Promise<DeckImportFormatDefinition> {\n const { query } = QueryBuilder.unarchiveDeckImportFormat()\n const result = await this.connection.execute(query, { id })\n return result['deckImportFormatUnarchive'] as DeckImportFormatDefinition\n }\n\n /**\n * Delete a hosted deck.\n */\n async delete(id: string): Promise<boolean> {\n const { query } = QueryBuilder.deleteDeck()\n const result = await this.connection.execute(query, { id })\n return Boolean(result['deckDelete'])\n }\n\n /**\n * Recoverably hide a deck from normal owner and public lists.\n */\n async archive(id: string): Promise<Deck> {\n const { query } = QueryBuilder.archiveDeck()\n const result = await this.connection.execute(query, { id })\n return result['deckArchive'] as Deck\n }\n\n /**\n * Restore an archived deck to draft or published state.\n */\n async restore(id: string): Promise<Deck> {\n const { query } = QueryBuilder.restoreDeck()\n const result = await this.connection.execute(query, { id })\n return result['deckRestore'] as Deck\n }\n\n /**\n * Remove the current public published pointer while keeping version history.\n */\n async unpublish(id: string): Promise<Deck> {\n const { query } = QueryBuilder.unpublishDeck()\n const result = await this.connection.execute(query, { id })\n return result['deckUnpublish'] as Deck\n }\n\n /**\n * Publish the current draft as an immutable deck version.\n */\n async publish(id: string, input: DeckPublishInput): Promise<DeckPublishPayload> {\n const { query } = QueryBuilder.publishDeck()\n const variables = QueryBuilder.deckPublishVariables(id, input)\n const result = await this.connection.execute(query, variables)\n return result['deckPublish'] as DeckPublishPayload\n }\n\n /**\n * Remove draft entries that fail card-reference validation.\n */\n async removeInvalidEntries(id: string, input: DeckRemoveInvalidEntriesInput): Promise<Deck> {\n const { query } = QueryBuilder.removeInvalidDeckEntries()\n const variables = QueryBuilder.deckRemoveInvalidEntriesVariables(id, input)\n const result = await this.connection.execute(query, variables)\n return result['deckRemoveInvalidEntries'] as Deck\n }\n\n /**\n * Create or update a deck collaborator.\n */\n async upsertCollaborator(\n deckId: string,\n accountId: string,\n role: DeckCollaboratorRole\n ): Promise<DeckCollaborator> {\n const { query } = QueryBuilder.upsertDeckCollaborator()\n const variables = QueryBuilder.deckCollaboratorVariables(deckId, accountId, role)\n const result = await this.connection.execute(query, variables)\n return result['deckCollaboratorUpsert'] as DeckCollaborator\n }\n\n /**\n * Remove a deck collaborator.\n */\n async removeCollaborator(deckId: string, accountId: string): Promise<boolean> {\n const { query } = QueryBuilder.removeDeckCollaborator()\n const variables = QueryBuilder.deckCollaboratorVariables(deckId, accountId)\n const result = await this.connection.execute(query, variables)\n return Boolean(result['deckCollaboratorRemove'])\n }\n\n /**\n * Create a revocable draft preview token.\n */\n async createPreviewToken(\n input: DeckPreviewTokenCreateInput\n ): Promise<DeckPreviewTokenCreatePayload> {\n const { query } = QueryBuilder.createDeckPreviewToken()\n const variables = QueryBuilder.deckPreviewTokenCreateVariables(input)\n const result = await this.connection.execute(query, variables)\n return result['deckPreviewTokenCreate'] as DeckPreviewTokenCreatePayload\n }\n\n /**\n * Revoke a draft preview token.\n */\n async revokePreviewToken(id: string): Promise<boolean> {\n const { query } = QueryBuilder.revokeDeckPreviewToken()\n const result = await this.connection.execute(query, { id })\n return Boolean(result['deckPreviewTokenRevoke'])\n }\n\n /**\n * Create a revocable published embed token.\n */\n async createEmbedToken(input: DeckEmbedTokenCreateInput): Promise<DeckEmbedTokenCreatePayload> {\n const { query } = QueryBuilder.createDeckEmbedToken()\n const variables = QueryBuilder.deckEmbedTokenCreateVariables(input)\n const result = await this.connection.execute(query, variables)\n return result['deckEmbedTokenCreate'] as DeckEmbedTokenCreatePayload\n }\n\n /**\n * Revoke a published embed token.\n */\n async revokeEmbedToken(id: string): Promise<boolean> {\n const { query } = QueryBuilder.revokeDeckEmbedToken()\n const result = await this.connection.execute(query, { id })\n return Boolean(result['deckEmbedTokenRevoke'])\n }\n\n /**\n * Trust the current API application to exchange short-lived deck access tokens.\n */\n async createAccessTokenIssuer(\n input: DeckAccessTokenIssuerCreateInput\n ): Promise<DeckAccessTokenIssuer> {\n const { query } = QueryBuilder.createDeckAccessTokenIssuer()\n const variables = QueryBuilder.deckAccessTokenIssuerCreateVariables(input)\n const result = await this.connection.execute(query, variables)\n return result['deckAccessTokenIssuerCreate'] as DeckAccessTokenIssuer\n }\n\n /**\n * Revoke a trusted deck access token issuer.\n */\n async revokeAccessTokenIssuer(id: string): Promise<boolean> {\n const { query } = QueryBuilder.revokeDeckAccessTokenIssuer()\n const result = await this.connection.execute(query, { id })\n return Boolean(result['deckAccessTokenIssuerRevoke'])\n }\n\n /**\n * Revoke only the direct signing key for a trusted deck access token issuer.\n */\n async revokeAccessTokenIssuerSigningKey(id: string): Promise<DeckAccessTokenIssuer> {\n const { query } = QueryBuilder.revokeDeckAccessTokenIssuerSigningKey()\n const result = await this.connection.execute(query, { id })\n return result['deckAccessTokenIssuerSigningKeyRevoke'] as DeckAccessTokenIssuer\n }\n\n /**\n * Grant or update one OAuth app's selected-deck access.\n */\n async grantApiApplicationAccess(\n input: DeckAPIApplicationAccessGrantInput\n ): Promise<DeckAPIApplicationAccess> {\n const { query } = QueryBuilder.grantDeckApiApplicationAccess()\n const variables = QueryBuilder.deckApiApplicationAccessGrantVariables(input)\n const result = await this.connection.execute(query, variables)\n return result['deckApiApplicationAccessGrant'] as DeckAPIApplicationAccess\n }\n\n /**\n * Revoke one OAuth app's selected-deck access.\n */\n async revokeApiApplicationAccess(deckId: string, apiApplicationId: string): Promise<boolean> {\n const { query } = QueryBuilder.revokeDeckApiApplicationAccess()\n const variables = QueryBuilder.deckApiApplicationAccessRevokeVariables(deckId, apiApplicationId)\n const result = await this.connection.execute(query, variables)\n return Boolean(result['deckApiApplicationAccessRevoke'])\n }\n\n /**\n * Exchange the current trusted API application credential for a deck access token.\n */\n async exchangeAccessToken(\n input: DeckAccessTokenExchangeInput\n ): Promise<DeckAccessTokenExchangePayload> {\n this.config.requireSecretCredential('decks.exchangeAccessToken')\n\n const { query } = QueryBuilder.exchangeDeckAccessToken()\n const variables = QueryBuilder.deckAccessTokenExchangeVariables(input)\n const result = await this.connection.execute(query, variables)\n return result['deckAccessTokenExchange'] as DeckAccessTokenExchangePayload\n }\n\n /**\n * Revoke an exchanged deck access token.\n */\n async revokeAccessToken(id: string): Promise<boolean> {\n this.config.requireSecretCredential('decks.revokeAccessToken')\n\n const { query } = QueryBuilder.revokeDeckAccessToken()\n const result = await this.connection.execute(query, { id })\n return Boolean(result['deckAccessTokenRevoke'])\n }\n\n /**\n * Hydrate third-party-owned deck entries without storing them in CardDB.\n */\n async hydrateEntries(options: HydrateDeckEntriesOptions): Promise<HydratedDeckEntry[]> {\n if (options.entries.length === 0) return []\n\n const publisherSlug = this.resolvePublisher(options.publisherSlug)\n const gameKey = this.resolveGame(options.gameKey)\n this.validateAccess(publisherSlug, gameKey)\n\n const identifiers = options.entries.map((entry) => entry.identifier)\n const key = this.cacheKey('decks', 'hydrateEntries', {\n publisherSlug,\n gameKey,\n datasetKey: options.datasetKey,\n identifiers,\n })\n\n const records = await this.withCache(key, 'decks', options, async () => {\n const { query } = QueryBuilder.fetchRecordsByIdentifier()\n const result = await this.connection.execute(query, {\n publisherSlug,\n gameKey,\n datasetKey: options.datasetKey,\n identifiers,\n })\n return result['fetchRecordsByIdentifier'] as DatasetRecord[]\n })\n\n const recordsByIdentifier = recordsByDeckIdentifier(\n records,\n identifiers,\n options.identifierField\n )\n return options.entries.map((entry) => ({\n ...entry,\n record: recordsByIdentifier.get(entry.identifier) ?? null,\n }))\n }\n}\n\nfunction recordsByDeckIdentifier(\n records: DatasetRecord[],\n identifiers: string[],\n identifierField?: string\n): Map<string, DatasetRecord> {\n const remaining = new Set(identifiers)\n const recordsByIdentifier = new Map<string, DatasetRecord>()\n\n for (const record of records) {\n const identifier = identifierField\n ? record.data[identifierField]\n : Object.values(record.data).find((value) => remaining.has(String(value)))\n\n if (identifier === undefined || identifier === null) continue\n\n const key = String(identifier)\n if (!remaining.has(key)) continue\n\n recordsByIdentifier.set(key, record)\n remaining.delete(key)\n }\n\n return recordsByIdentifier\n}\n","/**\n * Records resource for CardDB API\n */\n\nimport type { DatasetRecord, FilterInput, Connection as ConnectionType } from '@carddb/core'\nimport { Collection, QueryBuilder, resolveFilter } from '@carddb/core'\nimport { BaseResource } from './base.js'\nimport type { Configuration } from '../configuration.js'\nimport type { Connection } from '../connection.js'\n\nexport interface SearchRecordsOptions {\n /** Publisher slug (uses default if configured) */\n publisherSlug?: string\n /** Game key (uses default if configured) */\n gameKey?: string\n /** Dataset key (required) */\n datasetKey: string\n /**\n * Filter conditions - can be an object or a builder function\n *\n * @example Object literal\n * filter: { hp: { gte: 100 }, type: 'Pokemon' }\n *\n * @example Builder function\n * filter: f => f\n * .where('hp', gte(100))\n * .where('type', 'Pokemon')\n * .any(or => or\n * .where('rarity', 'rare')\n * .where('rarity', 'mythic')\n * )\n */\n filter?: FilterInput\n /** Full-text search across searchable fields */\n search?: string\n /**\n * Order by field with direction\n * @example 'name:asc', 'hp:desc', 'createdAt:desc'\n */\n orderBy?: string\n /**\n * Link fields to resolve (returns linked record data)\n * @example ['set_id', 'artist_id']\n */\n resolveLinks?: string[]\n /** Maximum number of results per page (default: 20, max: 100) */\n first?: number\n /** Cursor for pagination */\n after?: string\n /** Whether to validate filter against schema (default: true) */\n validateSchema?: boolean\n /** Include live TCGPlayer pricing when configured for the dataset */\n includePricing?: boolean\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport interface GetRecordOptions {\n /** Include live TCGPlayer pricing when configured for the dataset */\n includePricing?: boolean\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport interface GetRecordByIdentifierOptions {\n /** Publisher slug (uses default if configured) */\n publisherSlug?: string\n /** Game key (uses default if configured) */\n gameKey?: string\n /** Dataset key (required) */\n datasetKey: string\n /** The identifier value to look up */\n identifier: string\n /** Include live TCGPlayer pricing when configured for the dataset */\n includePricing?: boolean\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport interface GetRecordsByIdentifierOptions {\n /** Publisher slug (uses default if configured) */\n publisherSlug?: string\n /** Game key (uses default if configured) */\n gameKey?: string\n /** Dataset key (required) */\n datasetKey: string\n /** Identifier values to look up */\n identifiers: string[]\n /** Include live TCGPlayer pricing when configured for the dataset */\n includePricing?: boolean\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport class RecordsResource extends BaseResource {\n constructor(connection: Connection, config: Configuration) {\n super(connection, config)\n }\n\n /**\n * Search for records in a dataset with filtering, search, and pagination\n *\n * @example Basic search\n * const records = await client.records.search({\n * publisherSlug: 'pokemon',\n * gameKey: 'tcg',\n * datasetKey: 'cards',\n * })\n *\n * @example With defaults configured\n * // If client has defaultPublisher: 'pokemon', defaultGame: 'tcg'\n * const records = await client.records.search({ datasetKey: 'cards' })\n *\n * @example With filtering (object literal)\n * const records = await client.records.search({\n * datasetKey: 'cards',\n * filter: {\n * hp: { gte: 100 },\n * types: { contains: 'Fire' }\n * }\n * })\n *\n * @example With filtering (builder function)\n * const records = await client.records.search({\n * datasetKey: 'cards',\n * filter: f => f\n * .where('hp', gte(100))\n * .where('types', contains('Fire'))\n * .any(or => or\n * .where('rarity', 'Rare')\n * .where('rarity', 'Rare Holo')\n * )\n * })\n *\n * @example With link resolution\n * const records = await client.records.search({\n * datasetKey: 'cards',\n * resolveLinks: ['set_id'],\n * filter: f => f.whereLink('set_id', { code: 'BASE' })\n * })\n *\n * @example Iterate through all results\n * const records = await client.records.search({ datasetKey: 'cards' })\n * for await (const record of records) {\n * console.log(record.data.name)\n * }\n */\n async search(options: SearchRecordsOptions): Promise<Collection<DatasetRecord>> {\n const publisherSlug = this.resolvePublisher(options.publisherSlug)\n const gameKey = this.resolveGame(options.gameKey)\n\n this.validateAccess(publisherSlug, gameKey)\n\n // Resolve filter (handles both object and builder function)\n const filter = resolveFilter(options.filter)\n\n const { query, variables } = QueryBuilder.searchRecords({\n publisherSlug,\n gameKey,\n datasetKey: options.datasetKey,\n filter,\n search: options.search,\n orderBy: options.orderBy,\n resolveLinks: options.resolveLinks,\n first: options.first,\n after: options.after,\n validateSchema: options.validateSchema,\n includePricing: options.includePricing,\n })\n\n const key = this.cacheKey('records', 'search', {\n ...variables,\n includePricing: options.includePricing ?? false,\n })\n\n const data = await this.withCache(key, 'records', options, async () => {\n const result = await this.connection.execute(query, variables)\n return result['searchRecords'] as ConnectionType<DatasetRecord>\n })\n\n return new Collection(data, {\n nextPageLoader: async (cursor: string) => {\n return this.search({ ...options, after: cursor })\n },\n })\n }\n\n /**\n * Get a single record by ID\n *\n * @example\n * const record = await client.records.get('550e8400-e29b-41d4-a716-446655440000')\n */\n async get(id: string, options: GetRecordOptions = {}): Promise<DatasetRecord | null> {\n const key = this.cacheKey('records', 'get', {\n id,\n includePricing: options.includePricing ?? false,\n })\n\n return this.withCache(key, 'records', options, async () => {\n const { query } = QueryBuilder.fetchRecordById({ includePricing: options.includePricing })\n const result = await this.connection.execute(query, { id })\n return (result['fetchRecord'] as DatasetRecord) ?? null\n })\n }\n\n /**\n * Get a record by its identifier field value\n *\n * The identifier field is defined in the dataset schema (the field marked as isIdentifier)\n *\n * @example\n * const record = await client.records.getByIdentifier({\n * publisherSlug: 'pokemon',\n * gameKey: 'tcg',\n * datasetKey: 'cards',\n * identifier: 'base1-4'\n * })\n *\n * @example With defaults configured\n * const record = await client.records.getByIdentifier({\n * datasetKey: 'cards',\n * identifier: 'base1-4'\n * })\n */\n async getByIdentifier(options: GetRecordByIdentifierOptions): Promise<DatasetRecord | null> {\n const publisherSlug = this.resolvePublisher(options.publisherSlug)\n const gameKey = this.resolveGame(options.gameKey)\n\n this.validateAccess(publisherSlug, gameKey)\n\n const key = this.cacheKey('records', 'getByIdentifier', {\n publisherSlug,\n gameKey,\n datasetKey: options.datasetKey,\n identifier: options.identifier,\n includePricing: options.includePricing ?? false,\n })\n\n return this.withCache(key, 'records', options, async () => {\n const { query } = QueryBuilder.fetchRecordByIdentifier({\n includePricing: options.includePricing,\n })\n const result = await this.connection.execute(query, {\n publisherSlug,\n gameKey,\n datasetKey: options.datasetKey,\n identifier: options.identifier,\n })\n return (result['fetchRecordByIdentifier'] as DatasetRecord) ?? null\n })\n }\n\n /**\n * Get multiple records by their identifier field values\n *\n * Missing identifiers are omitted from the result.\n *\n * @example\n * const records = await client.records.getManyByIdentifier({\n * publisherSlug: 'pokemon',\n * gameKey: 'tcg',\n * datasetKey: 'cards',\n * identifiers: ['base1-4', 'base1-5']\n * })\n *\n * @example With defaults configured\n * const records = await client.records.getManyByIdentifier({\n * datasetKey: 'cards',\n * identifiers: ['base1-4', 'base1-5']\n * })\n */\n async getManyByIdentifier(options: GetRecordsByIdentifierOptions): Promise<DatasetRecord[]> {\n if (options.identifiers.length === 0) return []\n\n const publisherSlug = this.resolvePublisher(options.publisherSlug)\n const gameKey = this.resolveGame(options.gameKey)\n\n this.validateAccess(publisherSlug, gameKey)\n\n const key = this.cacheKey('records', 'getManyByIdentifier', {\n publisherSlug,\n gameKey,\n datasetKey: options.datasetKey,\n identifiers: options.identifiers,\n includePricing: options.includePricing ?? false,\n })\n\n return this.withCache(key, 'records', options, async () => {\n const { query } = QueryBuilder.fetchRecordsByIdentifier({\n includePricing: options.includePricing,\n })\n const result = await this.connection.execute(query, {\n publisherSlug,\n gameKey,\n datasetKey: options.datasetKey,\n identifiers: options.identifiers,\n })\n return (result['fetchRecordsByIdentifier'] as DatasetRecord[]) ?? []\n })\n }\n\n /**\n * Get multiple records by ID\n *\n * @example\n * const records = await client.records.getMany(['id1', 'id2', 'id3'])\n */\n async getMany(ids: string[], options: GetRecordOptions = {}): Promise<DatasetRecord[]> {\n if (ids.length === 0) return []\n\n const key = this.cacheKey('records', 'getMany', {\n ids,\n includePricing: options.includePricing ?? false,\n })\n\n return this.withCache(key, 'records', options, async () => {\n const { query } = QueryBuilder.fetchRecords({ includePricing: options.includePricing })\n const result = await this.connection.execute(query, { ids })\n return (result['fetchRecords'] as DatasetRecord[]) ?? []\n })\n }\n}\n","/**\n * Rules resource for CardDB API\n */\n\nimport type {\n Dataset,\n DatasetRecord,\n FilterInput,\n Connection as ConnectionType,\n} from '@carddb/core'\nimport { Collection, QueryBuilder, resolveFilter } from '@carddb/core'\nimport { BaseResource } from './base.js'\nimport type { Configuration } from '../configuration.js'\nimport type { Connection } from '../connection.js'\n\nexport interface ListRuleDatasetsOptions {\n /** Publisher slug (uses default if configured) */\n publisherSlug?: string\n /** Game key (uses default if configured) */\n gameKey?: string\n /** Search term to filter rule datasets by name */\n search?: string\n /** Maximum number of results per page (default: 20, max: 100) */\n first?: number\n /** Cursor for pagination */\n after?: string\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport interface ListRulesOptions {\n /** Publisher slug (uses default if configured) */\n publisherSlug?: string\n /** Game key (uses default if configured) */\n gameKey?: string\n /** Rules dataset key (defaults to \"rules\") */\n datasetKey?: string\n /** Filter conditions */\n filter?: FilterInput\n /** Full-text search across searchable fields */\n search?: string\n /** Order by field with direction, e.g. \"name:asc\" */\n orderBy?: string\n /** Link fields to resolve */\n resolveLinks?: string[]\n /** Maximum number of results per page (default: 20, max: 100) */\n first?: number\n /** Cursor for pagination */\n after?: string\n /** Whether to validate filter against schema (default: true) */\n validateSchema?: boolean\n /** Whether to use cache (defaults to client config) */\n cache?: boolean\n}\n\nexport interface ListFormatsOptions extends Omit<ListRulesOptions, 'datasetKey'> {\n /** Formats dataset key (defaults to \"formats\") */\n datasetKey?: string\n}\n\nexport class RulesResource extends BaseResource {\n constructor(connection: Connection, config: Configuration) {\n super(connection, config)\n }\n\n /**\n * List rule-related datasets for a game.\n *\n * @example\n * const datasets = await client.rules.datasets({ publisherSlug: 'wotc', gameKey: 'magic' })\n */\n async datasets(options: ListRuleDatasetsOptions = {}): Promise<Collection<Dataset>> {\n const publisherSlug = this.resolvePublisher(options.publisherSlug)\n const gameKey = this.resolveGame(options.gameKey)\n\n this.validateAccess(publisherSlug, gameKey)\n\n const { query, variables } = QueryBuilder.searchDatasets({\n publisherSlug,\n gameKey,\n search: options.search,\n purpose: 'RULES',\n first: options.first,\n after: options.after,\n })\n\n const key = this.cacheKey('rules', 'datasets', variables)\n const data = await this.withCache(key, 'datasets', options, async () => {\n const result = await this.connection.execute(query, variables)\n return result['searchDatasets'] as ConnectionType<Dataset>\n })\n\n return new Collection(data, {\n nextPageLoader: async (cursor: string) => this.datasets({ ...options, after: cursor }),\n })\n }\n\n /**\n * List rules from the game's rules dataset.\n *\n * @example\n * const rules = await client.rules.list({ first: 100 })\n */\n async list(options: ListRulesOptions = {}): Promise<Collection<DatasetRecord>> {\n return this.searchRuleRecords('rules', options)\n }\n\n /**\n * List deck/game formats from the game's formats dataset.\n *\n * @example\n * const formats = await client.rules.formats({ first: 100 })\n * const names = formats.items.map(format => format.data.name)\n */\n async formats(options: ListFormatsOptions = {}): Promise<Collection<DatasetRecord>> {\n return this.searchRuleRecords(options.datasetKey ?? 'formats', options)\n }\n\n private async searchRuleRecords(\n defaultDatasetKey: string,\n options: ListRulesOptions\n ): Promise<Collection<DatasetRecord>> {\n const publisherSlug = this.resolvePublisher(options.publisherSlug)\n const gameKey = this.resolveGame(options.gameKey)\n const datasetKey = options.datasetKey ?? defaultDatasetKey\n\n this.validateAccess(publisherSlug, gameKey)\n\n const filter = resolveFilter(options.filter)\n const { query, variables } = QueryBuilder.searchRecords({\n publisherSlug,\n gameKey,\n datasetKey,\n filter,\n search: options.search,\n orderBy: options.orderBy,\n resolveLinks: options.resolveLinks,\n first: options.first,\n after: options.after,\n validateSchema: options.validateSchema,\n })\n\n const key = this.cacheKey('rules', 'records', variables)\n const data = await this.withCache(key, 'records', options, async () => {\n const result = await this.connection.execute(query, variables)\n return result['searchRecords'] as ConnectionType<DatasetRecord>\n })\n\n return new Collection(data, {\n nextPageLoader: async (cursor: string) =>\n this.searchRuleRecords(defaultDatasetKey, { ...options, after: cursor }),\n })\n }\n}\n","/**\n * CardDB Client - Main entry point for the CardDB API\n */\n\nimport type { CardDBConfig, APIKeyInfo } from '@carddb/core'\nimport { QueryBuilder } from '@carddb/core'\nimport { Configuration } from './configuration.js'\nimport { Connection, getRateLimitInfo } from './connection.js'\nimport { PublishersResource } from './resources/publishers.js'\nimport { GamesResource } from './resources/games.js'\nimport { DatasetsResource } from './resources/datasets.js'\nimport { DecksResource } from './resources/decks.js'\nimport { RecordsResource } from './resources/records.js'\nimport { RulesResource } from './resources/rules.js'\n\n/**\n * CardDB API Client\n *\n * @example Basic usage\n * ```typescript\n * import { CardDBClient } from '@carddb/node'\n *\n * const client = new CardDBClient({\n * apiKey: 'carddb_xxx...'\n * })\n *\n * // Search for publishers\n * const publishers = await client.publishers.search()\n *\n * // Get records with filtering\n * const cards = await client.records.search({\n * publisherSlug: 'pokemon',\n * gameKey: 'tcg',\n * datasetKey: 'cards',\n * filter: { hp: { gte: 100 } }\n * })\n * ```\n *\n * @example With defaults configured\n * ```typescript\n * const client = new CardDBClient({\n * apiKey: 'carddb_xxx...',\n * defaultPublisher: 'pokemon',\n * defaultGame: 'tcg'\n * })\n *\n * // Now you can omit publisherSlug and gameKey\n * const cards = await client.records.search({\n * datasetKey: 'cards'\n * })\n * ```\n *\n * @example With caching\n * ```typescript\n * import { CardDBClient, MemoryCache } from '@carddb/node'\n *\n * const client = new CardDBClient({\n * apiKey: 'carddb_xxx...',\n * cache: new MemoryCache(),\n * cacheTtl: 300 // 5 minutes\n * })\n * ```\n */\nexport class CardDBClient {\n private config: Configuration\n private connection: Connection\n\n /** Publishers resource for searching and fetching publishers */\n readonly publishers: PublishersResource\n\n /** Games resource for searching and fetching games */\n readonly games: GamesResource\n\n /** Datasets resource for searching and fetching datasets */\n readonly datasets: DatasetsResource\n\n /** Records resource for searching and fetching records */\n readonly records: RecordsResource\n\n /** Decks resource for hosted decks and external deck hydration */\n readonly decks: DecksResource\n\n /** Rules resource for game rules and deck formats */\n readonly rules: RulesResource\n\n /**\n * Create a new CardDB client\n *\n * @param config - Client configuration options\n */\n constructor(config: CardDBConfig = {}) {\n this.config = new Configuration(config)\n this.connection = new Connection(this.config)\n\n // Initialize resources\n this.publishers = new PublishersResource(this.connection, this.config)\n this.games = new GamesResource(this.connection, this.config)\n this.datasets = new DatasetsResource(this.connection, this.config)\n this.records = new RecordsResource(this.connection, this.config)\n this.decks = new DecksResource(this.connection, this.config)\n this.rules = new RulesResource(this.connection, this.config)\n }\n\n /**\n * Get information about the current API key\n *\n * Returns null if no API key is configured or the key is invalid.\n *\n * @example\n * const info = await client.me()\n * if (info) {\n * console.log(`Logged in as: ${info.account.displayName}`)\n * console.log(`Application: ${info.application.name}`)\n * }\n */\n async me(): Promise<APIKeyInfo | null> {\n const { query } = QueryBuilder.fetchMe()\n const result = await this.connection.execute(query)\n return (result['fetchMe'] as APIKeyInfo) ?? null\n }\n\n /**\n * Get rate limit information from the last request\n *\n * @example\n * await client.publishers.search()\n * const rateLimit = client.getRateLimitInfo()\n * console.log(`Remaining: ${rateLimit?.remaining}/${rateLimit?.limit}`)\n */\n getRateLimitInfo() {\n return getRateLimitInfo()\n }\n\n /**\n * Create a new client with configuration overrides\n *\n * Useful for creating scoped clients with different defaults.\n *\n * @example\n * const pokemonClient = client.withConfig({\n * defaultPublisher: 'pokemon',\n * defaultGame: 'tcg'\n * })\n *\n * // Now all queries use these defaults\n * const cards = await pokemonClient.records.search({ datasetKey: 'cards' })\n */\n withConfig(overrides: Partial<CardDBConfig>): CardDBClient {\n const mergedConfig = this.config.merge(overrides)\n return new CardDBClient({\n apiKey: mergedConfig.configApiKey(),\n publishableKey: mergedConfig.publishableKey,\n secretKey: mergedConfig.secretKey,\n accessToken: mergedConfig.accessToken,\n environment: mergedConfig.environment,\n endpoint: mergedConfig.endpoint,\n timeout: mergedConfig.timeout,\n openTimeout: mergedConfig.openTimeout,\n defaultPublisher: mergedConfig.defaultPublisher,\n defaultGame: mergedConfig.defaultGame,\n allowedPublishers: mergedConfig.allowedPublishers,\n allowedGames: mergedConfig.allowedGames,\n logger: mergedConfig.logger,\n logLevel: mergedConfig.logLevel,\n retryOnRateLimit: mergedConfig.retryOnRateLimit,\n maxRetries: mergedConfig.maxRetries,\n retryOnNetworkError: mergedConfig.retryOnNetworkError,\n maxNetworkRetries: mergedConfig.maxNetworkRetries,\n retryBaseDelay: mergedConfig.retryBaseDelay,\n retryMaxDelay: mergedConfig.retryMaxDelay,\n cache: mergedConfig.cache,\n cacheTtl: mergedConfig.cacheTtl,\n cacheTtls: mergedConfig.cacheTtls,\n })\n }\n}\n","/**\n * Browser-based cache implementations using localStorage/sessionStorage\n */\n\nimport type { Cache } from '@carddb/core'\n\ninterface CacheEntry<T> {\n value: T\n expiresAt: number | null\n}\n\ntype StorageType = 'localStorage' | 'sessionStorage'\n\n/**\n * Browser cache using localStorage or sessionStorage.\n *\n * Uses localStorage by default for persistent caching across sessions.\n * Use sessionStorage for per-session caching that clears when the tab is closed.\n *\n * @example localStorage (default, persistent)\n * import { CardDBClient, BrowserCache } from '@carddb/browser'\n *\n * const client = new CardDBClient({\n * cache: new BrowserCache(),\n * cacheTtl: 300 // 5 minutes\n * })\n *\n * @example sessionStorage (per-session)\n * import { CardDBClient, BrowserCache } from '@carddb/browser'\n *\n * const client = new CardDBClient({\n * cache: new BrowserCache({ storage: 'sessionStorage' }),\n * cacheTtl: 300\n * })\n *\n * @example Custom prefix\n * const cache = new BrowserCache({ prefix: 'myapp:carddb:' })\n */\nexport class BrowserCache implements Cache {\n private storage: Storage\n private prefix: string\n\n constructor(options: { storage?: StorageType; prefix?: string } = {}) {\n const storageType = options.storage ?? 'localStorage'\n this.storage =\n storageType === 'sessionStorage' ? globalThis.sessionStorage : globalThis.localStorage\n this.prefix = options.prefix ?? 'carddb:'\n }\n\n /**\n * Get a value from the cache\n */\n get<T>(key: string): T | null {\n try {\n const raw = this.storage.getItem(this.prefix + key)\n if (!raw) return null\n\n const entry = JSON.parse(raw) as CacheEntry<T>\n\n // Check if expired\n if (entry.expiresAt !== null && Date.now() > entry.expiresAt) {\n this.storage.removeItem(this.prefix + key)\n return null\n }\n\n return entry.value\n } catch {\n // If parsing fails, remove the invalid entry\n this.storage.removeItem(this.prefix + key)\n return null\n }\n }\n\n /**\n * Set a value in the cache\n *\n * @param key - The cache key\n * @param value - The value to cache (must be JSON-serializable)\n * @param ttl - Time to live in seconds (optional, undefined = no expiry)\n */\n set<T>(key: string, value: T, ttl?: number): void {\n try {\n const entry: CacheEntry<T> = {\n value,\n expiresAt: ttl !== undefined ? Date.now() + ttl * 1000 : null,\n }\n this.storage.setItem(this.prefix + key, JSON.stringify(entry))\n } catch (e) {\n // Storage might be full or disabled - silently fail\n // In the future, we could implement LRU eviction here\n console.warn('[CardDB] Failed to write to cache:', e)\n }\n }\n\n /**\n * Delete a value from the cache\n */\n delete(key: string): void {\n this.storage.removeItem(this.prefix + key)\n }\n\n /**\n * Clear all CardDB cached values (only keys with our prefix)\n */\n clear(): void {\n const keysToRemove: string[] = []\n for (let i = 0; i < this.storage.length; i++) {\n const key = this.storage.key(i)\n if (key && key.startsWith(this.prefix)) {\n keysToRemove.push(key)\n }\n }\n for (const key of keysToRemove) {\n this.storage.removeItem(key)\n }\n }\n\n /**\n * Check if a key exists and is not expired\n */\n has(key: string): boolean {\n return this.get(key) !== null\n }\n\n /**\n * Get approximate number of cached entries (only counts our prefixed keys)\n */\n get size(): number {\n let count = 0\n for (let i = 0; i < this.storage.length; i++) {\n const key = this.storage.key(i)\n if (key && key.startsWith(this.prefix)) {\n count++\n }\n }\n return count\n }\n\n /**\n * Clean up expired entries\n * Call this periodically if you want to reclaim storage space from expired entries\n */\n cleanup(): void {\n const now = Date.now()\n const keysToRemove: string[] = []\n\n for (let i = 0; i < this.storage.length; i++) {\n const fullKey = this.storage.key(i)\n if (fullKey && fullKey.startsWith(this.prefix)) {\n try {\n const raw = this.storage.getItem(fullKey)\n if (raw) {\n const entry = JSON.parse(raw) as CacheEntry<unknown>\n if (entry.expiresAt !== null && now > entry.expiresAt) {\n keysToRemove.push(fullKey)\n }\n }\n } catch {\n // Invalid entry, remove it\n keysToRemove.push(fullKey)\n }\n }\n }\n\n for (const key of keysToRemove) {\n this.storage.removeItem(key)\n }\n }\n}\n","/**\n * @carddb/browser - CardDB client for browsers\n *\n * @example\n * import { CardDBClient, BrowserCache, gte, ilike } from '@carddb/browser'\n *\n * const client = new CardDBClient({\n * publishableKey: 'carddb_pk_xxx...',\n * cache: new BrowserCache(), // localStorage-based\n * defaultPublisher: 'pokemon',\n * defaultGame: 'tcg'\n * })\n *\n * // Search for cards with filtering\n * const cards = await client.records.search({\n * datasetKey: 'cards',\n * filter: f => f\n * .where('hp', gte(100))\n * .where('name', ilike('%pikachu%'))\n * })\n *\n * // Iterate through all results (auto-paginates)\n * for await (const card of cards) {\n * console.log(card.data.name)\n * }\n *\n * @example Session-based caching\n * const client = new CardDBClient({\n * cache: new BrowserCache({ storage: 'sessionStorage' })\n * })\n */\n\nimport { CardDBClient as SharedCardDBClient } from '@carddb/client'\nimport { RestrictedError } from '@carddb/core'\nimport type { CardDBConfig } from '@carddb/core'\n\nexport type BrowserCardDBConfig = Omit<CardDBConfig, 'apiKey' | 'secretKey'> & {\n /** Legacy apiKey is ambiguous in browsers; use publishableKey or accessToken. */\n apiKey?: never\n /** Secret keys are server-only and are rejected by the browser client. */\n secretKey?: never\n}\n\nexport class CardDBClient extends SharedCardDBClient {\n constructor(config: BrowserCardDBConfig = {}) {\n if ('apiKey' in config && config.apiKey !== undefined) {\n throw new RestrictedError(\n 'apiKey is not accepted in browsers; use publishableKey or accessToken'\n )\n }\n\n if ('secretKey' in config && config.secretKey !== undefined) {\n throw new RestrictedError(\n 'secretKey is server-only; use publishableKey or accessToken in browsers'\n )\n }\n\n super(config)\n }\n}\n\n// Browser-specific cache implementation\nexport { BrowserCache } from './cache.js'\n\n// Re-export everything from @carddb/client\nexport * from '@carddb/client'\n"]}
|