@carddb/core 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +41 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +23 -5
- package/dist/index.d.ts +23 -5
- package/dist/index.js +41 -22
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -354,6 +354,7 @@ var DATASET_FIELDS = `
|
|
|
354
354
|
name
|
|
355
355
|
description
|
|
356
356
|
purpose
|
|
357
|
+
tcgplayerProductIdFieldKey
|
|
357
358
|
visibility
|
|
358
359
|
isArchived
|
|
359
360
|
createdAt
|
|
@@ -407,20 +408,37 @@ var SCHEMA_FIELDS = `
|
|
|
407
408
|
}
|
|
408
409
|
}
|
|
409
410
|
`;
|
|
410
|
-
var
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
publisherId
|
|
411
|
+
var TCGPLAYER_PRICING_FIELDS = `
|
|
412
|
+
pricing {
|
|
413
|
+
productId
|
|
414
|
+
prices {
|
|
415
|
+
subTypeName
|
|
416
|
+
lowPrice
|
|
417
|
+
midPrice
|
|
418
|
+
highPrice
|
|
419
|
+
marketPrice
|
|
420
|
+
directLowPrice
|
|
421
|
+
}
|
|
422
422
|
}
|
|
423
423
|
`;
|
|
424
|
+
function recordFields(options = {}) {
|
|
425
|
+
return `
|
|
426
|
+
id
|
|
427
|
+
datasetId
|
|
428
|
+
data
|
|
429
|
+
${options.includePricing ? TCGPLAYER_PRICING_FIELDS : ""}
|
|
430
|
+
createdAt
|
|
431
|
+
updatedAt
|
|
432
|
+
dataset {
|
|
433
|
+
id
|
|
434
|
+
key
|
|
435
|
+
name
|
|
436
|
+
gameId
|
|
437
|
+
publisherId
|
|
438
|
+
}
|
|
439
|
+
`;
|
|
440
|
+
}
|
|
441
|
+
var RECORD_FIELDS = recordFields();
|
|
424
442
|
var DECK_VERSION_FIELDS = `
|
|
425
443
|
id
|
|
426
444
|
deckId
|
|
@@ -809,8 +827,9 @@ var QueryBuilder = {
|
|
|
809
827
|
variables["validateSchema"] = params.validateSchema;
|
|
810
828
|
}
|
|
811
829
|
const includeResolvedLinks = params.resolveLinks && params.resolveLinks.length > 0;
|
|
812
|
-
const
|
|
813
|
-
|
|
830
|
+
const selectedRecordFields = recordFields({ includePricing: params.includePricing });
|
|
831
|
+
const nodeFields = includeResolvedLinks ? `${selectedRecordFields}
|
|
832
|
+
${RESOLVED_LINKS_FIELDS}` : selectedRecordFields;
|
|
814
833
|
return {
|
|
815
834
|
query: `
|
|
816
835
|
query SearchRecords(${defs.join(", ")}) {
|
|
@@ -822,45 +841,45 @@ ${RESOLVED_LINKS_FIELDS}` : RECORD_FIELDS;
|
|
|
822
841
|
variables
|
|
823
842
|
};
|
|
824
843
|
},
|
|
825
|
-
fetchRecordById() {
|
|
844
|
+
fetchRecordById(params = {}) {
|
|
826
845
|
return {
|
|
827
846
|
query: `
|
|
828
847
|
query FetchRecord($id: UUID!) {
|
|
829
848
|
fetchRecord(id: $id) {
|
|
830
|
-
${
|
|
849
|
+
${recordFields(params)}
|
|
831
850
|
}
|
|
832
851
|
}
|
|
833
852
|
`
|
|
834
853
|
};
|
|
835
854
|
},
|
|
836
|
-
fetchRecordByIdentifier() {
|
|
855
|
+
fetchRecordByIdentifier(params = {}) {
|
|
837
856
|
return {
|
|
838
857
|
query: `
|
|
839
858
|
query FetchRecordByIdentifier($publisherSlug: String!, $gameKey: String!, $datasetKey: String!, $identifier: String!) {
|
|
840
859
|
fetchRecordByIdentifier(publisherSlug: $publisherSlug, gameKey: $gameKey, datasetKey: $datasetKey, identifier: $identifier) {
|
|
841
|
-
${
|
|
860
|
+
${recordFields(params)}
|
|
842
861
|
}
|
|
843
862
|
}
|
|
844
863
|
`
|
|
845
864
|
};
|
|
846
865
|
},
|
|
847
|
-
fetchRecordsByIdentifier() {
|
|
866
|
+
fetchRecordsByIdentifier(params = {}) {
|
|
848
867
|
return {
|
|
849
868
|
query: `
|
|
850
869
|
query FetchRecordsByIdentifier($publisherSlug: String!, $gameKey: String!, $datasetKey: String!, $identifiers: [String!]!) {
|
|
851
870
|
fetchRecordsByIdentifier(publisherSlug: $publisherSlug, gameKey: $gameKey, datasetKey: $datasetKey, identifiers: $identifiers) {
|
|
852
|
-
${
|
|
871
|
+
${recordFields(params)}
|
|
853
872
|
}
|
|
854
873
|
}
|
|
855
874
|
`
|
|
856
875
|
};
|
|
857
876
|
},
|
|
858
|
-
fetchRecords() {
|
|
877
|
+
fetchRecords(params = {}) {
|
|
859
878
|
return {
|
|
860
879
|
query: `
|
|
861
880
|
query FetchRecords($ids: [UUID!]!) {
|
|
862
881
|
fetchRecords(ids: $ids) {
|
|
863
|
-
${
|
|
882
|
+
${recordFields(params)}
|
|
864
883
|
}
|
|
865
884
|
}
|
|
866
885
|
`
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/operators.ts","../src/filter-builder.ts","../src/query-builder.ts","../src/collection.ts"],"sourcesContent":["/**\n * @carddb/core - Core types and utilities for CardDB JavaScript clients\n */\n\n// Types\nexport type {\n // Configuration\n CardDBConfig,\n LogLevel,\n ResourceType,\n Logger,\n Cache,\n // Resources\n PublisherStatus,\n Publisher,\n PublisherRef,\n Game,\n GameRef,\n Dataset,\n DatasetRef,\n DatasetRecord,\n Deck,\n DeckEntry,\n DeckVisibility,\n DeckCollaboratorRole,\n DeckVersion,\n DeckVersionConnection,\n DeckCollaborator,\n DeckPreviewToken,\n DeckPreviewTokenCreatePayload,\n DeckEntryInput,\n DeckCreateInput,\n DeckUpdateInput,\n DeckPublishInput,\n DeckPreviewTokenCreateInput,\n HydrateDeckEntryInput,\n HydratedDeckEntry,\n ResolvedLink,\n FileInfo,\n // Schema\n DatasetSchema,\n FieldInfo,\n FieldType,\n LinkFieldInfo,\n // API Key\n APIKeyInfo,\n APIApplication,\n APIAccount,\n // Pagination\n PageInfo,\n Edge,\n Connection,\n // Filters\n FilterOperatorValue,\n FilterValue,\n FilterCondition,\n FilterInput,\n FilterBuilderInterface,\n // Rate Limit\n RateLimitInfo,\n} from './types.js'\n\n// Errors\nexport {\n CardDBError,\n AuthenticationError,\n RateLimitError,\n NotFoundError,\n ValidationError,\n RestrictedError,\n GraphQLError,\n ConnectionError,\n TimeoutError,\n ServerError,\n LinkResolutionError,\n} from './errors.js'\n\nexport type { GraphQLErrorInfo, LinkResolutionFailure } from './errors.js'\n\n// Filter Operators\nexport {\n eq,\n neq,\n gt,\n gte,\n lt,\n lte,\n within,\n notWithin,\n contains,\n like,\n ilike,\n isNull,\n isNotNull,\n} from './operators.js'\n\n// Filter Builder\nexport { FilterBuilder, resolveFilter } from './filter-builder.js'\n\n// Query Builder\nexport { QueryBuilder } from './query-builder.js'\n\nexport type {\n SearchPublishersParams,\n SearchGamesParams,\n SearchDatasetsParams,\n SearchRecordsParams,\n ListDecksParams,\n ListDeckVersionsParams,\n} from './query-builder.js'\n\n// Collection\nexport { Collection } from './collection.js'\n\nexport type { NextPageLoader } from './collection.js'\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 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\nconst RECORD_FIELDS = `\n id\n datasetId\n data\n createdAt\n updatedAt\n dataset {\n id\n key\n name\n gameId\n publisherId\n }\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 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}\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 nodeFields = includeResolvedLinks\n ? `${RECORD_FIELDS}\\n${RESOLVED_LINKS_FIELDS}`\n : RECORD_FIELDS\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(): { query: string } {\n return {\n query: `\n query FetchRecord($id: UUID!) {\n fetchRecord(id: $id) {\n ${RECORD_FIELDS}\n }\n }\n `,\n }\n },\n\n fetchRecordByIdentifier(): { 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 ${RECORD_FIELDS}\n }\n }\n `,\n }\n },\n\n fetchRecordsByIdentifier(): { 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 ${RECORD_FIELDS}\n }\n }\n `,\n }\n },\n\n fetchRecords(): { query: string } {\n return {\n query: `\n query FetchRecords($ids: [UUID!]!) {\n fetchRecords(ids: $ids) {\n ${RECORD_FIELDS}\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"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/operators.ts","../src/filter-builder.ts","../src/query-builder.ts","../src/collection.ts"],"sourcesContent":["/**\n * @carddb/core - Core types and utilities for CardDB JavaScript clients\n */\n\n// Types\nexport type {\n // Configuration\n CardDBConfig,\n LogLevel,\n ResourceType,\n Logger,\n Cache,\n // Resources\n PublisherStatus,\n Publisher,\n PublisherRef,\n Game,\n GameRef,\n Dataset,\n DatasetRef,\n DatasetRecord,\n TCGPlayerPricing,\n TCGPlayerPrice,\n Deck,\n DeckEntry,\n DeckVisibility,\n DeckCollaboratorRole,\n DeckVersion,\n DeckVersionConnection,\n DeckCollaborator,\n DeckPreviewToken,\n DeckPreviewTokenCreatePayload,\n DeckEntryInput,\n DeckCreateInput,\n DeckUpdateInput,\n DeckPublishInput,\n DeckPreviewTokenCreateInput,\n HydrateDeckEntryInput,\n HydratedDeckEntry,\n ResolvedLink,\n FileInfo,\n // Schema\n DatasetSchema,\n FieldInfo,\n FieldType,\n LinkFieldInfo,\n // API Key\n APIKeyInfo,\n APIApplication,\n APIAccount,\n // Pagination\n PageInfo,\n Edge,\n Connection,\n // Filters\n FilterOperatorValue,\n FilterValue,\n FilterCondition,\n FilterInput,\n FilterBuilderInterface,\n // Rate Limit\n RateLimitInfo,\n} from './types.js'\n\n// Errors\nexport {\n CardDBError,\n AuthenticationError,\n RateLimitError,\n NotFoundError,\n ValidationError,\n RestrictedError,\n GraphQLError,\n ConnectionError,\n TimeoutError,\n ServerError,\n LinkResolutionError,\n} from './errors.js'\n\nexport type { GraphQLErrorInfo, LinkResolutionFailure } from './errors.js'\n\n// Filter Operators\nexport {\n eq,\n neq,\n gt,\n gte,\n lt,\n lte,\n within,\n notWithin,\n contains,\n like,\n ilike,\n isNull,\n isNotNull,\n} from './operators.js'\n\n// Filter Builder\nexport { FilterBuilder, resolveFilter } from './filter-builder.js'\n\n// Query Builder\nexport { QueryBuilder } from './query-builder.js'\n\nexport type {\n SearchPublishersParams,\n SearchGamesParams,\n SearchDatasetsParams,\n SearchRecordsParams,\n ListDecksParams,\n ListDeckVersionsParams,\n} from './query-builder.js'\n\n// Collection\nexport { Collection } from './collection.js'\n\nexport type { NextPageLoader } from './collection.js'\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"],"mappings":"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","names":[]}
|
package/dist/index.d.cts
CHANGED
|
@@ -120,6 +120,7 @@ interface Dataset {
|
|
|
120
120
|
name: string;
|
|
121
121
|
description: string | null;
|
|
122
122
|
purpose: 'DATA' | 'RULES';
|
|
123
|
+
tcgplayerProductIdFieldKey: string | null;
|
|
123
124
|
visibility: string;
|
|
124
125
|
isArchived: boolean;
|
|
125
126
|
publisher: PublisherRef | null;
|
|
@@ -140,10 +141,23 @@ interface DatasetRecord {
|
|
|
140
141
|
datasetId: string;
|
|
141
142
|
data: Record<string, unknown>;
|
|
142
143
|
dataset: DatasetRef | null;
|
|
144
|
+
pricing?: TCGPlayerPricing | null;
|
|
143
145
|
resolvedLinks?: ResolvedLink[];
|
|
144
146
|
createdAt: string;
|
|
145
147
|
updatedAt: string;
|
|
146
148
|
}
|
|
149
|
+
interface TCGPlayerPricing {
|
|
150
|
+
productId: string;
|
|
151
|
+
prices: TCGPlayerPrice[];
|
|
152
|
+
}
|
|
153
|
+
interface TCGPlayerPrice {
|
|
154
|
+
subTypeName: string;
|
|
155
|
+
lowPrice: number | null;
|
|
156
|
+
midPrice: number | null;
|
|
157
|
+
highPrice: number | null;
|
|
158
|
+
marketPrice: number | null;
|
|
159
|
+
directLowPrice: number | null;
|
|
160
|
+
}
|
|
147
161
|
type DeckVisibility = 'PRIVATE' | 'UNLISTED' | 'PUBLIC';
|
|
148
162
|
type DeckCollaboratorRole = 'VIEWER' | 'EDITOR';
|
|
149
163
|
interface Deck {
|
|
@@ -649,6 +663,9 @@ declare function resolveFilter(input: FilterInput | undefined): FilterCondition
|
|
|
649
663
|
* GraphQL query builder for CardDB API
|
|
650
664
|
*/
|
|
651
665
|
|
|
666
|
+
interface RecordFieldOptions {
|
|
667
|
+
includePricing?: boolean;
|
|
668
|
+
}
|
|
652
669
|
interface SearchPublishersParams {
|
|
653
670
|
search?: string;
|
|
654
671
|
first?: number;
|
|
@@ -679,6 +696,7 @@ interface SearchRecordsParams {
|
|
|
679
696
|
first?: number;
|
|
680
697
|
after?: string;
|
|
681
698
|
validateSchema?: boolean;
|
|
699
|
+
includePricing?: boolean;
|
|
682
700
|
}
|
|
683
701
|
interface ListDecksParams {
|
|
684
702
|
first?: number;
|
|
@@ -732,16 +750,16 @@ declare const QueryBuilder: {
|
|
|
732
750
|
query: string;
|
|
733
751
|
variables: Record<string, unknown>;
|
|
734
752
|
};
|
|
735
|
-
fetchRecordById(): {
|
|
753
|
+
fetchRecordById(params?: RecordFieldOptions): {
|
|
736
754
|
query: string;
|
|
737
755
|
};
|
|
738
|
-
fetchRecordByIdentifier(): {
|
|
756
|
+
fetchRecordByIdentifier(params?: RecordFieldOptions): {
|
|
739
757
|
query: string;
|
|
740
758
|
};
|
|
741
|
-
fetchRecordsByIdentifier(): {
|
|
759
|
+
fetchRecordsByIdentifier(params?: RecordFieldOptions): {
|
|
742
760
|
query: string;
|
|
743
761
|
};
|
|
744
|
-
fetchRecords(): {
|
|
762
|
+
fetchRecords(params?: RecordFieldOptions): {
|
|
745
763
|
query: string;
|
|
746
764
|
};
|
|
747
765
|
listMyDecks(params?: ListDecksParams): {
|
|
@@ -940,4 +958,4 @@ declare class Collection<T> implements AsyncIterable<T> {
|
|
|
940
958
|
each(): AsyncIterable<T>;
|
|
941
959
|
}
|
|
942
960
|
|
|
943
|
-
export { type APIAccount, type APIApplication, type APIKeyInfo, AuthenticationError, type Cache, type CardDBConfig, CardDBError, Collection, type Connection, ConnectionError, type Dataset, type DatasetRecord, type DatasetRef, type DatasetSchema, type Deck, type DeckCollaborator, type DeckCollaboratorRole, type DeckCreateInput, type DeckEntry, type DeckEntryInput, type DeckPreviewToken, type DeckPreviewTokenCreateInput, type DeckPreviewTokenCreatePayload, type DeckPublishInput, type DeckUpdateInput, type DeckVersion, type DeckVersionConnection, type DeckVisibility, type Edge, type FieldInfo, type FieldType, type FileInfo, FilterBuilder, type FilterBuilderInterface, type FilterCondition, type FilterInput, type FilterOperatorValue, type FilterValue, type Game, type GameRef, GraphQLError, type GraphQLErrorInfo, type HydrateDeckEntryInput, type HydratedDeckEntry, type LinkFieldInfo, LinkResolutionError, type LinkResolutionFailure, type ListDeckVersionsParams, type ListDecksParams, type LogLevel, type Logger, type NextPageLoader, NotFoundError, type PageInfo, type Publisher, type PublisherRef, type PublisherStatus, QueryBuilder, RateLimitError, type RateLimitInfo, type ResolvedLink, type ResourceType, RestrictedError, type SearchDatasetsParams, type SearchGamesParams, type SearchPublishersParams, type SearchRecordsParams, ServerError, TimeoutError, ValidationError, contains, eq, gt, gte, ilike, isNotNull, isNull, like, lt, lte, neq, notWithin, resolveFilter, within };
|
|
961
|
+
export { type APIAccount, type APIApplication, type APIKeyInfo, AuthenticationError, type Cache, type CardDBConfig, CardDBError, Collection, type Connection, ConnectionError, type Dataset, type DatasetRecord, type DatasetRef, type DatasetSchema, type Deck, type DeckCollaborator, type DeckCollaboratorRole, type DeckCreateInput, type DeckEntry, type DeckEntryInput, type DeckPreviewToken, type DeckPreviewTokenCreateInput, type DeckPreviewTokenCreatePayload, type DeckPublishInput, type DeckUpdateInput, type DeckVersion, type DeckVersionConnection, type DeckVisibility, type Edge, type FieldInfo, type FieldType, type FileInfo, FilterBuilder, type FilterBuilderInterface, type FilterCondition, type FilterInput, type FilterOperatorValue, type FilterValue, type Game, type GameRef, GraphQLError, type GraphQLErrorInfo, type HydrateDeckEntryInput, type HydratedDeckEntry, type LinkFieldInfo, LinkResolutionError, type LinkResolutionFailure, type ListDeckVersionsParams, type ListDecksParams, type LogLevel, type Logger, type NextPageLoader, NotFoundError, type PageInfo, type Publisher, type PublisherRef, type PublisherStatus, QueryBuilder, RateLimitError, type RateLimitInfo, type ResolvedLink, type ResourceType, RestrictedError, type SearchDatasetsParams, type SearchGamesParams, type SearchPublishersParams, type SearchRecordsParams, ServerError, type TCGPlayerPrice, type TCGPlayerPricing, TimeoutError, ValidationError, contains, eq, gt, gte, ilike, isNotNull, isNull, like, lt, lte, neq, notWithin, resolveFilter, within };
|
package/dist/index.d.ts
CHANGED
|
@@ -120,6 +120,7 @@ interface Dataset {
|
|
|
120
120
|
name: string;
|
|
121
121
|
description: string | null;
|
|
122
122
|
purpose: 'DATA' | 'RULES';
|
|
123
|
+
tcgplayerProductIdFieldKey: string | null;
|
|
123
124
|
visibility: string;
|
|
124
125
|
isArchived: boolean;
|
|
125
126
|
publisher: PublisherRef | null;
|
|
@@ -140,10 +141,23 @@ interface DatasetRecord {
|
|
|
140
141
|
datasetId: string;
|
|
141
142
|
data: Record<string, unknown>;
|
|
142
143
|
dataset: DatasetRef | null;
|
|
144
|
+
pricing?: TCGPlayerPricing | null;
|
|
143
145
|
resolvedLinks?: ResolvedLink[];
|
|
144
146
|
createdAt: string;
|
|
145
147
|
updatedAt: string;
|
|
146
148
|
}
|
|
149
|
+
interface TCGPlayerPricing {
|
|
150
|
+
productId: string;
|
|
151
|
+
prices: TCGPlayerPrice[];
|
|
152
|
+
}
|
|
153
|
+
interface TCGPlayerPrice {
|
|
154
|
+
subTypeName: string;
|
|
155
|
+
lowPrice: number | null;
|
|
156
|
+
midPrice: number | null;
|
|
157
|
+
highPrice: number | null;
|
|
158
|
+
marketPrice: number | null;
|
|
159
|
+
directLowPrice: number | null;
|
|
160
|
+
}
|
|
147
161
|
type DeckVisibility = 'PRIVATE' | 'UNLISTED' | 'PUBLIC';
|
|
148
162
|
type DeckCollaboratorRole = 'VIEWER' | 'EDITOR';
|
|
149
163
|
interface Deck {
|
|
@@ -649,6 +663,9 @@ declare function resolveFilter(input: FilterInput | undefined): FilterCondition
|
|
|
649
663
|
* GraphQL query builder for CardDB API
|
|
650
664
|
*/
|
|
651
665
|
|
|
666
|
+
interface RecordFieldOptions {
|
|
667
|
+
includePricing?: boolean;
|
|
668
|
+
}
|
|
652
669
|
interface SearchPublishersParams {
|
|
653
670
|
search?: string;
|
|
654
671
|
first?: number;
|
|
@@ -679,6 +696,7 @@ interface SearchRecordsParams {
|
|
|
679
696
|
first?: number;
|
|
680
697
|
after?: string;
|
|
681
698
|
validateSchema?: boolean;
|
|
699
|
+
includePricing?: boolean;
|
|
682
700
|
}
|
|
683
701
|
interface ListDecksParams {
|
|
684
702
|
first?: number;
|
|
@@ -732,16 +750,16 @@ declare const QueryBuilder: {
|
|
|
732
750
|
query: string;
|
|
733
751
|
variables: Record<string, unknown>;
|
|
734
752
|
};
|
|
735
|
-
fetchRecordById(): {
|
|
753
|
+
fetchRecordById(params?: RecordFieldOptions): {
|
|
736
754
|
query: string;
|
|
737
755
|
};
|
|
738
|
-
fetchRecordByIdentifier(): {
|
|
756
|
+
fetchRecordByIdentifier(params?: RecordFieldOptions): {
|
|
739
757
|
query: string;
|
|
740
758
|
};
|
|
741
|
-
fetchRecordsByIdentifier(): {
|
|
759
|
+
fetchRecordsByIdentifier(params?: RecordFieldOptions): {
|
|
742
760
|
query: string;
|
|
743
761
|
};
|
|
744
|
-
fetchRecords(): {
|
|
762
|
+
fetchRecords(params?: RecordFieldOptions): {
|
|
745
763
|
query: string;
|
|
746
764
|
};
|
|
747
765
|
listMyDecks(params?: ListDecksParams): {
|
|
@@ -940,4 +958,4 @@ declare class Collection<T> implements AsyncIterable<T> {
|
|
|
940
958
|
each(): AsyncIterable<T>;
|
|
941
959
|
}
|
|
942
960
|
|
|
943
|
-
export { type APIAccount, type APIApplication, type APIKeyInfo, AuthenticationError, type Cache, type CardDBConfig, CardDBError, Collection, type Connection, ConnectionError, type Dataset, type DatasetRecord, type DatasetRef, type DatasetSchema, type Deck, type DeckCollaborator, type DeckCollaboratorRole, type DeckCreateInput, type DeckEntry, type DeckEntryInput, type DeckPreviewToken, type DeckPreviewTokenCreateInput, type DeckPreviewTokenCreatePayload, type DeckPublishInput, type DeckUpdateInput, type DeckVersion, type DeckVersionConnection, type DeckVisibility, type Edge, type FieldInfo, type FieldType, type FileInfo, FilterBuilder, type FilterBuilderInterface, type FilterCondition, type FilterInput, type FilterOperatorValue, type FilterValue, type Game, type GameRef, GraphQLError, type GraphQLErrorInfo, type HydrateDeckEntryInput, type HydratedDeckEntry, type LinkFieldInfo, LinkResolutionError, type LinkResolutionFailure, type ListDeckVersionsParams, type ListDecksParams, type LogLevel, type Logger, type NextPageLoader, NotFoundError, type PageInfo, type Publisher, type PublisherRef, type PublisherStatus, QueryBuilder, RateLimitError, type RateLimitInfo, type ResolvedLink, type ResourceType, RestrictedError, type SearchDatasetsParams, type SearchGamesParams, type SearchPublishersParams, type SearchRecordsParams, ServerError, TimeoutError, ValidationError, contains, eq, gt, gte, ilike, isNotNull, isNull, like, lt, lte, neq, notWithin, resolveFilter, within };
|
|
961
|
+
export { type APIAccount, type APIApplication, type APIKeyInfo, AuthenticationError, type Cache, type CardDBConfig, CardDBError, Collection, type Connection, ConnectionError, type Dataset, type DatasetRecord, type DatasetRef, type DatasetSchema, type Deck, type DeckCollaborator, type DeckCollaboratorRole, type DeckCreateInput, type DeckEntry, type DeckEntryInput, type DeckPreviewToken, type DeckPreviewTokenCreateInput, type DeckPreviewTokenCreatePayload, type DeckPublishInput, type DeckUpdateInput, type DeckVersion, type DeckVersionConnection, type DeckVisibility, type Edge, type FieldInfo, type FieldType, type FileInfo, FilterBuilder, type FilterBuilderInterface, type FilterCondition, type FilterInput, type FilterOperatorValue, type FilterValue, type Game, type GameRef, GraphQLError, type GraphQLErrorInfo, type HydrateDeckEntryInput, type HydratedDeckEntry, type LinkFieldInfo, LinkResolutionError, type LinkResolutionFailure, type ListDeckVersionsParams, type ListDecksParams, type LogLevel, type Logger, type NextPageLoader, NotFoundError, type PageInfo, type Publisher, type PublisherRef, type PublisherStatus, QueryBuilder, RateLimitError, type RateLimitInfo, type ResolvedLink, type ResourceType, RestrictedError, type SearchDatasetsParams, type SearchGamesParams, type SearchPublishersParams, type SearchRecordsParams, ServerError, type TCGPlayerPrice, type TCGPlayerPricing, TimeoutError, ValidationError, contains, eq, gt, gte, ilike, isNotNull, isNull, like, lt, lte, neq, notWithin, resolveFilter, within };
|
package/dist/index.js
CHANGED
|
@@ -301,6 +301,7 @@ var DATASET_FIELDS = `
|
|
|
301
301
|
name
|
|
302
302
|
description
|
|
303
303
|
purpose
|
|
304
|
+
tcgplayerProductIdFieldKey
|
|
304
305
|
visibility
|
|
305
306
|
isArchived
|
|
306
307
|
createdAt
|
|
@@ -354,20 +355,37 @@ var SCHEMA_FIELDS = `
|
|
|
354
355
|
}
|
|
355
356
|
}
|
|
356
357
|
`;
|
|
357
|
-
var
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
publisherId
|
|
358
|
+
var TCGPLAYER_PRICING_FIELDS = `
|
|
359
|
+
pricing {
|
|
360
|
+
productId
|
|
361
|
+
prices {
|
|
362
|
+
subTypeName
|
|
363
|
+
lowPrice
|
|
364
|
+
midPrice
|
|
365
|
+
highPrice
|
|
366
|
+
marketPrice
|
|
367
|
+
directLowPrice
|
|
368
|
+
}
|
|
369
369
|
}
|
|
370
370
|
`;
|
|
371
|
+
function recordFields(options = {}) {
|
|
372
|
+
return `
|
|
373
|
+
id
|
|
374
|
+
datasetId
|
|
375
|
+
data
|
|
376
|
+
${options.includePricing ? TCGPLAYER_PRICING_FIELDS : ""}
|
|
377
|
+
createdAt
|
|
378
|
+
updatedAt
|
|
379
|
+
dataset {
|
|
380
|
+
id
|
|
381
|
+
key
|
|
382
|
+
name
|
|
383
|
+
gameId
|
|
384
|
+
publisherId
|
|
385
|
+
}
|
|
386
|
+
`;
|
|
387
|
+
}
|
|
388
|
+
var RECORD_FIELDS = recordFields();
|
|
371
389
|
var DECK_VERSION_FIELDS = `
|
|
372
390
|
id
|
|
373
391
|
deckId
|
|
@@ -756,8 +774,9 @@ var QueryBuilder = {
|
|
|
756
774
|
variables["validateSchema"] = params.validateSchema;
|
|
757
775
|
}
|
|
758
776
|
const includeResolvedLinks = params.resolveLinks && params.resolveLinks.length > 0;
|
|
759
|
-
const
|
|
760
|
-
|
|
777
|
+
const selectedRecordFields = recordFields({ includePricing: params.includePricing });
|
|
778
|
+
const nodeFields = includeResolvedLinks ? `${selectedRecordFields}
|
|
779
|
+
${RESOLVED_LINKS_FIELDS}` : selectedRecordFields;
|
|
761
780
|
return {
|
|
762
781
|
query: `
|
|
763
782
|
query SearchRecords(${defs.join(", ")}) {
|
|
@@ -769,45 +788,45 @@ ${RESOLVED_LINKS_FIELDS}` : RECORD_FIELDS;
|
|
|
769
788
|
variables
|
|
770
789
|
};
|
|
771
790
|
},
|
|
772
|
-
fetchRecordById() {
|
|
791
|
+
fetchRecordById(params = {}) {
|
|
773
792
|
return {
|
|
774
793
|
query: `
|
|
775
794
|
query FetchRecord($id: UUID!) {
|
|
776
795
|
fetchRecord(id: $id) {
|
|
777
|
-
${
|
|
796
|
+
${recordFields(params)}
|
|
778
797
|
}
|
|
779
798
|
}
|
|
780
799
|
`
|
|
781
800
|
};
|
|
782
801
|
},
|
|
783
|
-
fetchRecordByIdentifier() {
|
|
802
|
+
fetchRecordByIdentifier(params = {}) {
|
|
784
803
|
return {
|
|
785
804
|
query: `
|
|
786
805
|
query FetchRecordByIdentifier($publisherSlug: String!, $gameKey: String!, $datasetKey: String!, $identifier: String!) {
|
|
787
806
|
fetchRecordByIdentifier(publisherSlug: $publisherSlug, gameKey: $gameKey, datasetKey: $datasetKey, identifier: $identifier) {
|
|
788
|
-
${
|
|
807
|
+
${recordFields(params)}
|
|
789
808
|
}
|
|
790
809
|
}
|
|
791
810
|
`
|
|
792
811
|
};
|
|
793
812
|
},
|
|
794
|
-
fetchRecordsByIdentifier() {
|
|
813
|
+
fetchRecordsByIdentifier(params = {}) {
|
|
795
814
|
return {
|
|
796
815
|
query: `
|
|
797
816
|
query FetchRecordsByIdentifier($publisherSlug: String!, $gameKey: String!, $datasetKey: String!, $identifiers: [String!]!) {
|
|
798
817
|
fetchRecordsByIdentifier(publisherSlug: $publisherSlug, gameKey: $gameKey, datasetKey: $datasetKey, identifiers: $identifiers) {
|
|
799
|
-
${
|
|
818
|
+
${recordFields(params)}
|
|
800
819
|
}
|
|
801
820
|
}
|
|
802
821
|
`
|
|
803
822
|
};
|
|
804
823
|
},
|
|
805
|
-
fetchRecords() {
|
|
824
|
+
fetchRecords(params = {}) {
|
|
806
825
|
return {
|
|
807
826
|
query: `
|
|
808
827
|
query FetchRecords($ids: [UUID!]!) {
|
|
809
828
|
fetchRecords(ids: $ids) {
|
|
810
|
-
${
|
|
829
|
+
${recordFields(params)}
|
|
811
830
|
}
|
|
812
831
|
}
|
|
813
832
|
`
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/operators.ts","../src/filter-builder.ts","../src/query-builder.ts","../src/collection.ts"],"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 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 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\nconst RECORD_FIELDS = `\n id\n datasetId\n data\n createdAt\n updatedAt\n dataset {\n id\n key\n name\n gameId\n publisherId\n }\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 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}\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 nodeFields = includeResolvedLinks\n ? `${RECORD_FIELDS}\\n${RESOLVED_LINKS_FIELDS}`\n : RECORD_FIELDS\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(): { query: string } {\n return {\n query: `\n query FetchRecord($id: UUID!) {\n fetchRecord(id: $id) {\n ${RECORD_FIELDS}\n }\n }\n `,\n }\n },\n\n fetchRecordByIdentifier(): { 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 ${RECORD_FIELDS}\n }\n }\n `,\n }\n },\n\n fetchRecordsByIdentifier(): { 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 ${RECORD_FIELDS}\n }\n }\n `,\n }\n },\n\n fetchRecords(): { query: string } {\n return {\n query: `\n query FetchRecords($ids: [UUID!]!) {\n fetchRecords(ids: $ids) {\n ${RECORD_FIELDS}\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"],"mappings":";AAaO,IAAM,cAAN,MAAM,qBAAoB,MAAM;AAAA;AAAA,EAE5B;AAAA,EAET,YAAY,SAAiB,UAAoB;AAC/C,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,WAAW;AAEhB,QAAI,MAAM,mBAAmB;AAC3B,YAAM,kBAAkB,MAAM,YAAW;AAAA,IAC3C;AAAA,EACF;AACF;AAKO,IAAM,sBAAN,cAAkC,YAAY;AAAA,EACnD,YAAY,UAAU,8BAA8B,UAAoB;AACtE,UAAM,SAAS,QAAQ;AACvB,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,iBAAN,cAA6B,YAAY;AAAA;AAAA,EAErC;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA,EAET,YACE,UAAU,uBACV,UAMI,CAAC,GACL;AACA,UAAM,SAAS,QAAQ,QAAQ;AAC/B,SAAK,OAAO;AACZ,SAAK,aAAa,QAAQ,cAAc;AACxC,SAAK,QAAQ,QAAQ,SAAS;AAC9B,SAAK,YAAY,QAAQ,aAAa;AACtC,SAAK,UAAU,QAAQ,WAAW;AAAA,EACpC;AACF;AAKO,IAAM,gBAAN,cAA4B,YAAY;AAAA,EAC7C,YAAY,UAAU,sBAAsB,UAAoB;AAC9D,UAAM,SAAS,QAAQ;AACvB,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,kBAAN,cAA8B,YAAY;AAAA;AAAA,EAEtC;AAAA,EAET,YACE,UAAU,oBACV,UAGI,CAAC,GACL;AACA,UAAM,SAAS,QAAQ,QAAQ;AAC/B,SAAK,OAAO;AACZ,SAAK,SAAS,QAAQ,UAAU,CAAC;AAAA,EACnC;AACF;AAKO,IAAM,kBAAN,cAA8B,YAAY;AAAA,EAC/C,YAAY,SAAiB,UAAoB;AAC/C,UAAM,SAAS,QAAQ;AACvB,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,eAAN,cAA2B,YAAY;AAAA;AAAA,EAEnC;AAAA,EAET,YACE,UAAU,iBACV,UAGI,CAAC,GACL;AACA,UAAM,SAAS,QAAQ,QAAQ;AAC/B,SAAK,OAAO;AACZ,SAAK,SAAS,QAAQ,UAAU,CAAC;AAAA,EACnC;AACF;AAKO,IAAM,kBAAN,cAA8B,YAAY;AAAA,EAC/C,YAAY,UAAU,oBAAoB,UAAoB;AAC5D,UAAM,SAAS,QAAQ;AACvB,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,eAAN,cAA2B,gBAAgB;AAAA,EAChD,YAAY,UAAU,qBAAqB,UAAoB;AAC7D,UAAM,SAAS,QAAQ;AACvB,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,cAAN,cAA0B,YAAY;AAAA;AAAA,EAElC;AAAA,EAET,YACE,UAAU,gBACV,UAGI,CAAC,GACL;AACA,UAAM,SAAS,QAAQ,QAAQ;AAC/B,SAAK,OAAO;AACZ,SAAK,SAAS,QAAQ,UAAU;AAAA,EAClC;AACF;AAuBO,IAAM,sBAAN,cAAkC,YAAY;AAAA;AAAA,EAE1C;AAAA;AAAA,EAGA;AAAA,EAET,YACE,UAAU,oCACV,UAII,CAAC,GACL;AACA,UAAM,SAAS,QAAQ,QAAQ;AAC/B,SAAK,OAAO;AACZ,SAAK,WAAW,QAAQ,YAAY,CAAC;AACrC,SAAK,iBAAiB,QAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,OAAwC;AAC1D,WAAO,KAAK,SAAS,OAAO,CAAC,MAAM,EAAE,UAAU,KAAK;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,OAAwB;AAC1C,WAAO,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE,UAAU,KAAK;AAAA,EACpD;AACF;;;AC9MO,SAAS,GAAG,OAAqC;AACtD,SAAO,EAAE,IAAI,MAAM;AACrB;AAGO,SAAS,IAAI,OAAqC;AACvD,SAAO,EAAE,KAAK,MAAM;AACtB;AAGO,SAAS,GAAG,OAAoC;AACrD,SAAO,EAAE,IAAI,MAAM;AACrB;AAGO,SAAS,IAAI,OAAoC;AACtD,SAAO,EAAE,KAAK,MAAM;AACtB;AAGO,SAAS,GAAG,OAAoC;AACrD,SAAO,EAAE,IAAI,MAAM;AACrB;AAGO,SAAS,IAAI,OAAoC;AACtD,SAAO,EAAE,KAAK,MAAM;AACtB;AAGO,SAAS,OAAO,QAAwC;AAC7D,SAAO,EAAE,IAAI,OAAO;AACtB;AAGO,SAAS,UAAU,QAAwC;AAChE,SAAO,EAAE,KAAK,OAAO;AACvB;AAGO,SAAS,SAAS,OAAqC;AAC5D,SAAO,EAAE,UAAU,MAAM;AAC3B;AAGO,SAAS,KAAK,SAAsC;AACzD,SAAO,EAAE,MAAM,QAAQ;AACzB;AAGO,SAAS,MAAM,SAAsC;AAC1D,SAAO,EAAE,OAAO,QAAQ;AAC1B;AAGO,SAAS,SAA8B;AAC5C,SAAO,EAAE,SAAS,KAAK;AACzB;AAGO,SAAS,YAAiC;AAC/C,SAAO,EAAE,SAAS,MAAM;AAC1B;;;ACzDO,IAAM,gBAAN,MAAM,eAAc;AAAA,EACjB,aAAgC,CAAC;AAAA,EACjC,WAA8B,CAAC;AAAA,EAcvC,MAAM,mBAAyD,OAA2B;AACxF,QAAI,OAAO,sBAAsB,UAAU;AACzC,WAAK,WAAW,KAAK,EAAE,CAAC,iBAAiB,GAAG,MAAM,CAAC;AAAA,IACrD,OAAO;AACL,iBAAW,CAAC,OAAO,GAAG,KAAK,OAAO,QAAQ,iBAAiB,GAAG;AAC5D,aAAK,WAAW,KAAK,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC;AAAA,MACvC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,IAAI,UAAkD;AACpD,UAAM,YAAY,IAAI,eAAc;AACpC,aAAS,SAAS;AAClB,UAAM,eAAe,UAAU,cAAc;AAC7C,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,SAAS,KAAK,EAAE,KAAK,aAAa,CAAC;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU,OAAe,YAA+C;AACtE,UAAM,aAA0C,CAAC;AACjD,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,UAAU,GAAG;AACnD,iBAAW,GAAG,IAAI;AAAA,IACpB;AACA,SAAK,WAAW,KAAK,EAAE,CAAC,GAAG,KAAK,QAAQ,GAAG,WAAW,CAAC;AACvD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,SAAS,OAAe,YAA+C;AACrE,UAAM,YAAyC,CAAC;AAChD,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,UAAU,GAAG;AACnD,gBAAU,GAAG,IAAI;AAAA,IACnB;AACA,SAAK,WAAW,KAAK,EAAE,CAAC,GAAG,KAAK,OAAO,GAAG,UAAU,CAAC;AACrD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAmC;AACjC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,QAAyB;AACvB,UAAM,gBAAgB,CAAC,GAAG,KAAK,YAAY,GAAG,KAAK,QAAQ;AAE3D,QAAI,cAAc,WAAW,GAAG;AAC9B,aAAO,CAAC;AAAA,IACV;AAEA,QAAI,cAAc,WAAW,GAAG;AAC9B,aAAO,cAAc,CAAC;AAAA,IACxB;AAEA,WAAO,EAAE,MAAM,cAAc;AAAA,EAC/B;AACF;AAOO,SAAS,cAAc,OAA6D;AACzF,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,YAAY;AAC/B,UAAM,UAAU,IAAI,cAAc;AAClC,UAAM,OAAO;AACb,UAAM,SAAS,QAAQ,MAAM;AAC7B,WAAO,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AAAA,EACnD;AAEA,SAAO,OAAO,KAAK,KAAK,EAAE,SAAS,IAAI,QAAQ;AACjD;;;ACrIA,IAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBzB,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BpB,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBvB,IAAM,6BAA6B;AAEnC,SAAS,gBAAgB,OAAuB;AAC9C,QAAM,eACJ,QAAQ,IACJ;AAAA;AAAA,UAEE,gBAAgB,QAAQ,CAAC,CAAC;AAAA,WAE5B;AAEN,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAaD,YAAY;AAAA;AAEpB;AAEA,IAAM,gBAAgB;AAAA;AAAA;AAAA,QAGd,gBAAgB,0BAA0B,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcnD,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAetB,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QA4BpB,aAAa;AAAA;AAAA;AAAA;AAKrB,IAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUjC,IAAM,4BAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWlC,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAed,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOnB,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAYT,aAAa;AAAA;AAAA;AAAA;AAKrB,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAa9B,SAAS,iBAAiB,YAA4B;AACpD,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAWC,UAAU;AAAA;AAAA;AAAA;AAIpB;AAmDO,IAAM,eAAe;AAAA;AAAA,EAE1B,iBAAiB,SAAiC,CAAC,GAGjD;AACA,UAAM,YAAqC,CAAC;AAC5C,UAAM,OAAiB,CAAC;AACxB,UAAM,OAAiB,CAAC;AAExB,QAAI,OAAO,WAAW,QAAW;AAC/B,WAAK,KAAK,iBAAiB;AAC3B,WAAK,KAAK,iBAAiB;AAC3B,gBAAU,QAAQ,IAAI,OAAO;AAAA,IAC/B;AACA,QAAI,OAAO,UAAU,QAAW;AAC9B,WAAK,KAAK,aAAa;AACvB,WAAK,KAAK,eAAe;AACzB,gBAAU,OAAO,IAAI,OAAO;AAAA,IAC9B;AACA,QAAI,OAAO,UAAU,QAAW;AAC9B,WAAK,KAAK,gBAAgB;AAC1B,WAAK,KAAK,eAAe;AACzB,gBAAU,OAAO,IAAI,OAAO;AAAA,IAC9B;AAEA,UAAM,SAAS,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM;AAC1D,UAAM,SAAS,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM;AAE1D,WAAO;AAAA,MACL,OAAO;AAAA,gCACmB,MAAM;AAAA,4BACV,MAAM;AAAA,cACpB,iBAAiB,gBAAgB,CAAC;AAAA;AAAA;AAAA;AAAA,MAI1C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,qBAAwC;AACtC,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,gBAAgB;AAAA;AAAA;AAAA;AAAA,IAI1B;AAAA,EACF;AAAA,EAEA,uBAA0C;AACxC,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,gBAAgB;AAAA;AAAA;AAAA;AAAA,IAI1B;AAAA,EACF;AAAA,EAEA,kBAAqC;AACnC,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,gBAAgB;AAAA;AAAA;AAAA;AAAA,IAI1B;AAAA,EACF;AAAA;AAAA,EAGA,YAAY,SAA4B,CAAC,GAGvC;AACA,UAAM,YAAqC,CAAC;AAC5C,UAAM,OAAiB,CAAC;AACxB,UAAM,OAAiB,CAAC;AAExB,QAAI,OAAO,kBAAkB,QAAW;AACtC,WAAK,KAAK,wBAAwB;AAClC,WAAK,KAAK,+BAA+B;AACzC,gBAAU,eAAe,IAAI,OAAO;AAAA,IACtC;AACA,QAAI,OAAO,WAAW,QAAW;AAC/B,WAAK,KAAK,iBAAiB;AAC3B,WAAK,KAAK,iBAAiB;AAC3B,gBAAU,QAAQ,IAAI,OAAO;AAAA,IAC/B;AACA,QAAI,OAAO,UAAU,QAAW;AAC9B,WAAK,KAAK,aAAa;AACvB,WAAK,KAAK,eAAe;AACzB,gBAAU,OAAO,IAAI,OAAO;AAAA,IAC9B;AACA,QAAI,OAAO,UAAU,QAAW;AAC9B,WAAK,KAAK,gBAAgB;AAC1B,WAAK,KAAK,eAAe;AACzB,gBAAU,OAAO,IAAI,OAAO;AAAA,IAC9B;AAEA,UAAM,SAAS,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM;AAC1D,UAAM,SAAS,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM;AAE1D,WAAO;AAAA,MACL,OAAO;AAAA,2BACc,MAAM;AAAA,uBACV,MAAM;AAAA,cACf,iBAAiB,WAAW,CAAC;AAAA;AAAA;AAAA;AAAA,MAIrC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gBAAmC;AACjC,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,WAAW;AAAA;AAAA;AAAA;AAAA,IAIrB;AAAA,EACF;AAAA,EAEA,kBAAqC;AACnC,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,WAAW;AAAA;AAAA;AAAA;AAAA,IAIrB;AAAA,EACF;AAAA,EAEA,aAAgC;AAC9B,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,WAAW;AAAA;AAAA;AAAA;AAAA,IAIrB;AAAA,EACF;AAAA;AAAA,EAGA,eAAe,SAA+B,CAAC,GAG7C;AACA,UAAM,YAAqC,CAAC;AAC5C,UAAM,OAAiB,CAAC;AACxB,UAAM,OAAiB,CAAC;AAExB,QAAI,OAAO,kBAAkB,QAAW;AACtC,WAAK,KAAK,wBAAwB;AAClC,WAAK,KAAK,+BAA+B;AACzC,gBAAU,eAAe,IAAI,OAAO;AAAA,IACtC;AACA,QAAI,OAAO,YAAY,QAAW;AAChC,WAAK,KAAK,kBAAkB;AAC5B,WAAK,KAAK,mBAAmB;AAC7B,gBAAU,SAAS,IAAI,OAAO;AAAA,IAChC;AACA,QAAI,OAAO,WAAW,QAAW;AAC/B,WAAK,KAAK,iBAAiB;AAC3B,WAAK,KAAK,iBAAiB;AAC3B,gBAAU,QAAQ,IAAI,OAAO;AAAA,IAC/B;AACA,QAAI,OAAO,YAAY,QAAW;AAChC,WAAK,KAAK,0BAA0B;AACpC,WAAK,KAAK,mBAAmB;AAC7B,gBAAU,SAAS,IAAI,OAAO;AAAA,IAChC;AACA,QAAI,OAAO,UAAU,QAAW;AAC9B,WAAK,KAAK,aAAa;AACvB,WAAK,KAAK,eAAe;AACzB,gBAAU,OAAO,IAAI,OAAO;AAAA,IAC9B;AACA,QAAI,OAAO,UAAU,QAAW;AAC9B,WAAK,KAAK,gBAAgB;AAC1B,WAAK,KAAK,eAAe;AACzB,gBAAU,OAAO,IAAI,OAAO;AAAA,IAC9B;AAEA,UAAM,SAAS,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM;AAC1D,UAAM,SAAS,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM;AAE1D,WAAO;AAAA,MACL,OAAO;AAAA,8BACiB,MAAM;AAAA,0BACV,MAAM;AAAA,cAClB,iBAAiB,cAAc,CAAC;AAAA;AAAA;AAAA;AAAA,MAIxC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,mBAAsC;AACpC,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,cAAc;AAAA,cACd,aAAa;AAAA;AAAA;AAAA;AAAA,IAIvB;AAAA,EACF;AAAA,EAEA,qBAAwC;AACtC,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,cAAc;AAAA,cACd,aAAa;AAAA;AAAA;AAAA;AAAA,IAIvB;AAAA,EACF;AAAA,EAEA,gBAAmC;AACjC,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,cAAc;AAAA;AAAA;AAAA;AAAA,IAIxB;AAAA,EACF;AAAA;AAAA,EAGA,cAAc,QAGZ;AACA,UAAM,YAAqC;AAAA,MACzC,eAAe,OAAO;AAAA,MACtB,SAAS,OAAO;AAAA,MAChB,YAAY,OAAO;AAAA,IACrB;AACA,UAAM,OAAiB;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,OAAiB,CAAC,2BAA2B,qBAAqB,sBAAsB;AAE9F,QAAI,OAAO,WAAW,QAAW;AAC/B,WAAK,KAAK,eAAe;AACzB,WAAK,KAAK,iBAAiB;AAC3B,gBAAU,QAAQ,IAAI,OAAO;AAAA,IAC/B;AACA,QAAI,OAAO,WAAW,QAAW;AAC/B,WAAK,KAAK,iBAAiB;AAC3B,WAAK,KAAK,iBAAiB;AAC3B,gBAAU,QAAQ,IAAI,OAAO;AAAA,IAC/B;AACA,QAAI,OAAO,YAAY,QAAW;AAChC,WAAK,KAAK,kBAAkB;AAC5B,WAAK,KAAK,mBAAmB;AAC7B,gBAAU,SAAS,IAAI,OAAO;AAAA,IAChC;AACA,QAAI,OAAO,iBAAiB,QAAW;AACrC,WAAK,KAAK,0BAA0B;AACpC,WAAK,KAAK,6BAA6B;AACvC,gBAAU,cAAc,IAAI,OAAO;AAAA,IACrC;AACA,QAAI,OAAO,UAAU,QAAW;AAC9B,WAAK,KAAK,aAAa;AACvB,WAAK,KAAK,eAAe;AACzB,gBAAU,OAAO,IAAI,OAAO;AAAA,IAC9B;AACA,QAAI,OAAO,UAAU,QAAW;AAC9B,WAAK,KAAK,gBAAgB;AAC1B,WAAK,KAAK,eAAe;AACzB,gBAAU,OAAO,IAAI,OAAO;AAAA,IAC9B;AACA,QAAI,OAAO,mBAAmB,QAAW;AACvC,WAAK,KAAK,0BAA0B;AACpC,WAAK,KAAK,iCAAiC;AAC3C,gBAAU,gBAAgB,IAAI,OAAO;AAAA,IACvC;AAEA,UAAM,uBAAuB,OAAO,gBAAgB,OAAO,aAAa,SAAS;AACjF,UAAM,aAAa,uBACf,GAAG,aAAa;AAAA,EAAK,qBAAqB,KAC1C;AAEJ,WAAO;AAAA,MACL,OAAO;AAAA,8BACiB,KAAK,KAAK,IAAI,CAAC;AAAA,0BACnB,KAAK,KAAK,IAAI,CAAC;AAAA,cAC3B,iBAAiB,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA,MAIpC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,kBAAqC;AACnC,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,aAAa;AAAA;AAAA;AAAA;AAAA,IAIvB;AAAA,EACF;AAAA,EAEA,0BAA6C;AAC3C,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,aAAa;AAAA;AAAA;AAAA;AAAA,IAIvB;AAAA,EACF;AAAA,EAEA,2BAA8C;AAC5C,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,aAAa;AAAA;AAAA;AAAA;AAAA,IAIvB;AAAA,EACF;AAAA,EAEA,eAAkC;AAChC,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,aAAa;AAAA;AAAA;AAAA;AAAA,IAIvB;AAAA,EACF;AAAA;AAAA,EAGA,YAAY,SAA0B,CAAC,GAGrC;AACA,UAAM,YAAqC,CAAC;AAC5C,UAAM,OAAiB,CAAC;AACxB,UAAM,OAAiB,CAAC;AAExB,QAAI,OAAO,UAAU,QAAW;AAC9B,WAAK,KAAK,aAAa;AACvB,WAAK,KAAK,eAAe;AACzB,gBAAU,OAAO,IAAI,OAAO;AAAA,IAC9B;AACA,QAAI,OAAO,UAAU,QAAW;AAC9B,WAAK,KAAK,gBAAgB;AAC1B,WAAK,KAAK,eAAe;AACzB,gBAAU,OAAO,IAAI,OAAO;AAAA,IAC9B;AAEA,UAAM,SAAS,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM;AAC1D,UAAM,SAAS,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM;AAE1D,WAAO;AAAA,MACL,OAAO;AAAA,uBACU,MAAM;AAAA,mBACV,MAAM;AAAA,cACX,iBAAiB,WAAW,CAAC;AAAA;AAAA;AAAA;AAAA,MAIrC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gBAAmC;AACjC,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,WAAW;AAAA;AAAA;AAAA;AAAA,IAIrB;AAAA,EACF;AAAA,EAEA,SAA4B;AAC1B,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,WAAW;AAAA;AAAA;AAAA;AAAA,IAIrB;AAAA,EACF;AAAA,EAEA,kBAAqC;AACnC,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,WAAW;AAAA;AAAA;AAAA;AAAA,IAIrB;AAAA,EACF;AAAA,EAEA,yBAA4C;AAC1C,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,WAAW;AAAA;AAAA;AAAA;AAAA,IAIrB;AAAA,EACF;AAAA,EAEA,cAAiC;AAC/B,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,mBAAmB;AAAA;AAAA;AAAA;AAAA,IAI7B;AAAA,EACF;AAAA,EAEA,aAAa,SAAiC,CAAC,GAG7C;AACA,UAAM,YAAqC,CAAC;AAC5C,UAAM,OAAiB,CAAC,iBAAiB;AACzC,UAAM,OAAiB,CAAC,gBAAgB;AAExC,QAAI,OAAO,UAAU,QAAW;AAC9B,WAAK,KAAK,aAAa;AACvB,WAAK,KAAK,eAAe;AACzB,gBAAU,OAAO,IAAI,OAAO;AAAA,IAC9B;AACA,QAAI,OAAO,UAAU,QAAW;AAC9B,WAAK,KAAK,gBAAgB;AAC1B,WAAK,KAAK,eAAe;AACzB,gBAAU,OAAO,IAAI,OAAO;AAAA,IAC9B;AAEA,WAAO;AAAA,MACL,OAAO;AAAA,6BACgB,KAAK,KAAK,IAAI,CAAC;AAAA,yBACnB,KAAK,KAAK,IAAI,CAAC;AAAA,cAC1B,iBAAiB,mBAAmB,CAAC;AAAA;AAAA;AAAA;AAAA,MAI7C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAiC;AAC/B,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,WAAW;AAAA;AAAA;AAAA;AAAA,IAIrB;AAAA,EACF;AAAA,EAEA,oBAAuC;AACrC,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,wBAAwB;AAAA;AAAA;AAAA;AAAA,IAIlC;AAAA,EACF;AAAA,EAEA,oBAAuC;AACrC,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,yBAAyB;AAAA;AAAA;AAAA;AAAA,IAInC;AAAA,EACF;AAAA,EAEA,aAAgC;AAC9B,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,WAAW;AAAA;AAAA;AAAA;AAAA,IAIrB;AAAA,EACF;AAAA,EAEA,aAAgC;AAC9B,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,WAAW;AAAA;AAAA;AAAA;AAAA,IAIrB;AAAA,EACF;AAAA,EAEA,aAAgC;AAC9B,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAKT;AAAA,EACF;AAAA,EAEA,cAAiC;AAC/B,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,mBAAmB;AAAA;AAAA;AAAA;AAAA,IAI7B;AAAA,EACF;AAAA,EAEA,yBAA4C;AAC1C,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA,cAGC,wBAAwB;AAAA;AAAA;AAAA;AAAA,IAIlC;AAAA,EACF;AAAA,EAEA,yBAA4C;AAC1C,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAKT;AAAA,EACF;AAAA,EAEA,yBAA4C;AAC1C,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,gBAKG,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA,IAKrC;AAAA,EACF;AAAA,EAEA,yBAA4C;AAC1C,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,IAKT;AAAA,EACF;AAAA,EAEA,oBAAoB,OAAiD;AACnE,WAAO,EAAE,MAAM;AAAA,EACjB;AAAA,EAEA,oBAAoB,IAAY,OAAiD;AAC/E,WAAO,EAAE,IAAI,MAAM;AAAA,EACrB;AAAA,EAEA,qBAAqB,IAAY,QAA0B,CAAC,GAA4B;AACtF,WAAO,EAAE,IAAI,MAAM;AAAA,EACrB;AAAA,EAEA,0BACE,QACA,WACA,MACyB;AACzB,WAAO,SAAS,SAAY,EAAE,QAAQ,UAAU,IAAI,EAAE,QAAQ,WAAW,KAAK;AAAA,EAChF;AAAA,EAEA,gCAAgC,OAA6D;AAC3F,WAAO,EAAE,MAAM;AAAA,EACjB;AAAA;AAAA,EAGA,UAA6B;AAC3B,WAAO;AAAA,MACL,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAuBT;AAAA,EACF;AACF;;;ACv9BO,IAAM,aAAN,MAAgD;AAAA;AAAA,EAE5C;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGD;AAAA,EAER,YACE,MACA,UAGI,CAAC,GACL;AACA,SAAK,aAAa,KAAK;AACvB,SAAK,WAAW,KAAK;AACrB,SAAK,QAAQ,KAAK,MAAM;AAAA,MAAI,CAAC,SAC3B,QAAQ,kBAAkB,QAAQ,gBAAgB,KAAK,IAAI,IAAI,KAAK;AAAA,IACtE;AACA,SAAK,iBAAiB,QAAQ;AAAA,EAChC;AAAA;AAAA,EAGA,IAAI,cAAuB;AACzB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA,EAGA,IAAI,kBAA2B;AAC7B,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA,EAGA,IAAI,YAA2B;AAC7B,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA,EAGA,IAAI,cAA6B;AAC/B,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA,EAGA,IAAI,SAAiB;AACnB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA,EAGA,IAAI,UAAmB;AACrB,WAAO,KAAK,MAAM,WAAW;AAAA,EAC/B;AAAA;AAAA,EAGA,IAAI,QAAuB;AACzB,WAAO,KAAK,MAAM,CAAC;AAAA,EACrB;AAAA;AAAA,EAGA,IAAI,OAAsB;AACxB,WAAO,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,WAA0C;AAC9C,QAAI,CAAC,KAAK,aAAa;AACrB,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,KAAK,gBAAgB;AACxB,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,QAAI,CAAC,KAAK,WAAW;AACnB,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,eAAe,KAAK,SAAS;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,QAAQ,OAAO,aAAa,IAAsB;AAChD,QAAI,UAAgC;AAEpC,WAAO,SAAS;AACd,iBAAW,QAAQ,QAAQ,OAAO;AAChC,cAAM;AAAA,MACR;AAEA,UAAI,CAAC,QAAQ,aAAa;AACxB;AAAA,MACF;AAEA,gBAAU,MAAM,QAAQ,SAAS;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,QAAQ,UAA2E;AACvF,QAAI,QAAQ;AACZ,qBAAiB,QAAQ,MAAM;AAC7B,YAAM,SAAS,MAAM,OAAO;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,IAAO,UAAoE;AAC/E,UAAM,UAAe,CAAC;AACtB,QAAI,QAAQ;AACZ,qBAAiB,QAAQ,MAAM;AAC7B,cAAQ,KAAK,MAAM,SAAS,MAAM,OAAO,CAAC;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAO,WAAiF;AAC5F,UAAM,UAAe,CAAC;AACtB,QAAI,QAAQ;AACZ,qBAAiB,QAAQ,MAAM;AAC7B,UAAI,MAAM,UAAU,MAAM,OAAO,GAAG;AAClC,gBAAQ,KAAK,IAAI;AAAA,MACnB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,KACJ,WACwB;AACxB,QAAI,QAAQ;AACZ,qBAAiB,QAAQ,MAAM;AAC7B,UAAI,MAAM,UAAU,MAAM,OAAO,GAAG;AAClC,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,KAAK,GAAyB;AAClC,UAAM,UAAe,CAAC;AACtB,qBAAiB,QAAQ,MAAM;AAC7B,UAAI,QAAQ,UAAU,GAAG;AACvB;AAAA,MACF;AACA,cAAQ,KAAK,IAAI;AAAA,IACnB;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,UAAwB;AAC5B,UAAM,UAAe,CAAC;AACtB,qBAAiB,QAAQ,MAAM;AAC7B,cAAQ,KAAK,IAAI;AAAA,IACnB;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,UAA+B;AACpC,QAAI,UAAgC;AAEpC,WAAO,SAAS;AACd,UAAI,QAAQ,MAAM,SAAS,GAAG;AAC5B,cAAM,QAAQ;AAAA,MAChB;AAEA,UAAI,CAAC,QAAQ,aAAa;AACxB;AAAA,MACF;AAEA,gBAAU,MAAM,QAAQ,SAAS;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAyB;AACvB,WAAO;AAAA,EACT;AACF;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/operators.ts","../src/filter-builder.ts","../src/query-builder.ts","../src/collection.ts"],"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 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"],"mappings":"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","names":[]}
|