scryfall-api 1.0.7 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -7
- package/README.md +9 -6
- package/lib/api/CardIdfentifier.d.ts +9 -0
- package/lib/api/Cards.d.ts +15 -323
- package/lib/api/Cards.spec.d.ts +1 -0
- package/lib/api/Catalog.d.ts +9 -9
- package/lib/api/Catalog.spec.d.ts +1 -0
- package/lib/api/Misc.d.ts +3 -11
- package/lib/api/Misc.spec.d.ts +1 -0
- package/lib/api/Rulings.d.ts +6 -10
- package/lib/api/Rulings.spec.d.ts +1 -0
- package/lib/api/Sets.d.ts +6 -46
- package/lib/api/Sets.spec.d.ts +1 -0
- package/lib/api/Symbology.d.ts +4 -24
- package/lib/api/Symbology.spec.d.ts +1 -0
- package/lib/error/MagicQueryError.d.ts +5 -0
- package/lib/index.d.ts +0 -25
- package/lib/query/MagicPageResult.d.ts +17 -0
- package/lib/query/MagicQuery.d.ts +13 -0
- package/lib/skryfall.es5.js +148 -639
- package/lib/skryfall.es5.js.map +1 -1
- package/lib/skryfall.es5.min.js +2 -2
- package/lib/skryfall.es5.min.js.map +1 -1
- package/lib/skryfall.umd.js +152 -651
- package/lib/skryfall.umd.js.map +1 -1
- package/lib/skryfall.umd.min.js +2 -2
- package/lib/skryfall.umd.min.js.map +1 -1
- package/lib/types/Border.d.ts +7 -0
- package/lib/types/BulkDataDefinition.d.ts +14 -0
- package/lib/types/BulkDataType.d.ts +2 -0
- package/lib/types/BulkDataTypes.d.ts +7 -0
- package/lib/types/Card.d.ts +91 -0
- package/lib/types/CardFace.d.ts +22 -0
- package/lib/types/CardIdentifier.d.ts +10 -0
- package/lib/types/CardSymbol.d.ts +13 -0
- package/lib/{util → types}/Color.d.ts +0 -0
- package/lib/types/Format.d.ts +15 -0
- package/lib/types/FrameEffect.d.ts +17 -0
- package/lib/types/Game.d.ts +5 -0
- package/lib/types/HomepageLink.d.ts +9 -0
- package/lib/types/ImageUris.d.ts +8 -0
- package/lib/types/Layout.d.ts +20 -0
- package/lib/types/Legalties.d.ts +5 -0
- package/lib/types/Legalty.d.ts +6 -0
- package/lib/types/ManaCost.d.ts +9 -0
- package/lib/types/PageQuery.d.ts +5 -0
- package/lib/types/PageQueryValue.d.ts +1 -0
- package/lib/types/Preview.d.ts +5 -0
- package/lib/types/Prices.d.ts +6 -0
- package/lib/types/PromoType.d.ts +27 -0
- package/lib/types/PurchaseUris.d.ts +6 -0
- package/lib/types/Query.d.ts +4 -0
- package/lib/types/Rarity.d.ts +6 -0
- package/lib/types/RelatedCard.d.ts +9 -0
- package/lib/types/RelatedCardComponent.d.ts +6 -0
- package/lib/types/RelatedUris.d.ts +7 -0
- package/lib/types/ResultCatalog.d.ts +2 -0
- package/lib/types/ResultData.d.ts +4 -0
- package/lib/types/ResultList.d.ts +7 -0
- package/lib/types/RetryStrategy.d.ts +11 -0
- package/lib/types/Ruling.d.ts +5 -0
- package/lib/types/SearchError.d.ts +7 -0
- package/lib/types/SearchOptions.d.ts +15 -0
- package/lib/types/Set.d.ts +20 -0
- package/lib/types/SetType.d.ts +22 -0
- package/lib/types/Sort.d.ts +15 -0
- package/lib/types/SortDirection.d.ts +5 -0
- package/lib/types/TOrArrayOfT.d.ts +1 -0
- package/lib/types/UniqueStrategy.d.ts +5 -0
- package/lib/types/index.d.ts +42 -0
- package/package.json +37 -29
- package/lib/api/BulkData.d.ts +0 -46
- package/lib/util/MagicEmitter.d.ts +0 -31
- package/lib/util/MagicQuerier.d.ts +0 -44
package/lib/skryfall.es5.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skryfall.es5.js","sources":["../src/util/MagicQuerier.ts","../src/api/BulkData.ts","../src/util/MagicEmitter.ts","../src/api/Cards.ts","../src/api/Catalog.ts","../src/api/Misc.ts","../src/api/Rulings.ts","../src/api/Sets.ts","../src/api/Symbology.ts","../src/util/Color.ts","../src/index.ts"],"sourcesContent":["import Axios, { AxiosRequestConfig, AxiosResponse } from 'axios';\nimport MagicEmitter from './MagicEmitter';\n\n// the path to the api\nconst endpoint = 'https://api.scryfall.com';\n// the api requests 50-100 ms between calls, we go on the generous side and never wait less than 100 ms between calls\nconst rateLimit = 100;\n\nlet lastQuery = 0;\n\nfunction sleep(ms = 0) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\ntype TOrArrayOfT<T> = T | T[];\n\nexport interface Data<T, NOT_FOUND = never> {\n data: T[];\n not_found?: NOT_FOUND[];\n}\n\nexport interface List<T, NOT_FOUND = never> extends Data<T, NOT_FOUND> {\n has_more: boolean;\n next_page: string | null;\n total_cards: string | null;\n warnings: string[];\n}\n\nexport type ApiCatalog = Data<string>;\n\nexport interface SearchError {\n object: 'error';\n code: string;\n status: number;\n details: string;\n warnings?: string[];\n}\n\nexport interface RetryStrategy {\n attempts: number;\n timeout?: number;\n /**\n * Whether even `not_found` and `bad_request` errors should be retried.\n * @deprecated Don't use this, this is for unit tests\n */\n forced?: boolean;\n // tslint:disable-next-line space-before-function-paren typescript autoformats this to remove the space\n canRetry?(error: SearchError): boolean;\n}\n\nexport default class MagicQuerier {\n public static lastQuery = 0;\n public static lastError: SearchError | undefined;\n public static lastRetries = 0;\n public static retry: RetryStrategy = { attempts: 1 };\n\n protected async query<T>(\n apiPath: TOrArrayOfT<string | number | undefined>,\n query?: { [key: string]: any },\n post?: any,\n requestOptions?: AxiosRequestConfig\n ): Promise<T> {\n if (Array.isArray(apiPath)) {\n apiPath = apiPath.join('/');\n }\n\n let lastError: SearchError | undefined;\n let result: AxiosResponse | undefined;\n let retries: number;\n for (retries = 0; retries < MagicQuerier.retry.attempts; retries++) {\n ({ result, lastError } = await this.tryQuery(\n `${apiPath}`,\n query,\n post,\n requestOptions\n ));\n if (result || (!this.canRetry(lastError!) && !MagicQuerier.retry.forced))\n break;\n await sleep(MagicQuerier.retry.timeout);\n }\n\n MagicQuerier.lastError = lastError;\n MagicQuerier.lastRetries = retries;\n\n return result ? result.data : { data: [], not_found: [] };\n }\n\n protected async queryPage<T>(\n emitter: MagicEmitter<T>,\n apiPath: string,\n query: any,\n page = 1\n ): Promise<void> {\n const results = await this.query<List<T>>(apiPath, { ...query, page });\n for (const card of results.data) {\n if (emitter.cancelled) break;\n emitter.emit('data', card);\n }\n\n if (results.has_more) {\n if (!emitter.cancelled) {\n if (emitter.willCancelAfterPage) emitter.cancel();\n else\n return this.queryPage(emitter, apiPath, query, page + 1).catch(\n (err) => {\n emitter.emit('error', err);\n }\n );\n }\n }\n\n if (!emitter.cancelled) emitter.emit('end');\n emitter.emit('done');\n }\n\n private async tryQuery(\n apiPath: string,\n query?: { [key: string]: any },\n post?: any,\n requestOptions?: AxiosRequestConfig\n ) {\n const now = Date.now();\n const timeSinceLastQuery = now - lastQuery;\n if (timeSinceLastQuery >= rateLimit) {\n lastQuery = now;\n } else {\n const timeUntilNextQuery = rateLimit - timeSinceLastQuery;\n lastQuery += timeUntilNextQuery;\n await sleep(timeUntilNextQuery);\n }\n\n let lastError: SearchError | undefined;\n\n const result =\n (await Axios.request({\n data: post,\n method: post ? 'POST' : 'GET',\n params: query,\n url: `${endpoint}/${apiPath}`,\n ...requestOptions,\n }).catch(({ response }: { response: { data: any } }) => {\n lastError = response.data;\n })) || undefined;\n\n return { result, lastError };\n }\n\n private canRetry(error: SearchError) {\n if (error.code == 'not_found' || error.code == 'bad_request') return false;\n return !MagicQuerier.retry.canRetry || MagicQuerier.retry.canRetry(error);\n }\n}\n","import Axios from 'axios';\nimport { Stream } from 'stream';\nimport MagicQuerier, { List } from '../util/MagicQuerier';\n\nenum BulkDataTypes {\n oracle_cards,\n unique_artwork,\n default_cards,\n all_cards,\n rulings,\n}\n\nexport type BulkDataType = keyof typeof BulkDataTypes;\n\nexport interface BulkDataDefinition {\n object: 'bulk_data';\n\n id: string;\n type: BulkDataType;\n updated_at: string;\n uri: string;\n name: string;\n description: string;\n compressed_size: number;\n download_uri: string;\n content_type: string;\n content_encoding: string;\n}\n\nclass BulkData extends MagicQuerier {\n /**\n * Returns a stream for the given bulk data if it has been updated since the last download time. If it hasn't, returns `undefined`\n * @param type The BulkDataType.\n * @param lastDownload The last time this bulk data was downloaded. If you want to re-download the data regardless of\n * the last time it was downloaded, set this to `0`.\n */\n public async downloadByType(\n type: BulkDataType,\n lastDownload: string | number | Date\n ) {\n return this.download(type, lastDownload);\n }\n\n /**\n * Returns a stream for the given bulk data if it has been updated since the last download time. If it hasn't, returns `undefined`\n * @param lastDownload The last time this bulk data was downloaded. If you want to re-download the data regardless of\n * the last time it was downloaded, set this to `0`.\n */\n public async downloadById(id: string, lastDownload: string | number | Date) {\n return this.download(id, lastDownload);\n }\n\n ////////////////////////////////////\n // Definitions\n //\n\n public async definitions() {\n return (await this.query<List<BulkDataDefinition>>('bulk-data')).data;\n }\n\n public async definitionByType(type: BulkDataType) {\n return this.definition(type);\n }\n\n public async definitionById(id: string) {\n return this.definition(id);\n }\n\n ////////////////////////////////////\n // Internals\n //\n\n private async download(\n idOrType: string,\n lastDownload: string | number | Date\n ) {\n const definition = await this.definition(idOrType);\n if (\n new Date(lastDownload).getTime() >\n new Date(definition.updated_at).getTime()\n )\n return undefined;\n\n const result = await Axios.request<Stream>({\n method: 'GET',\n url: definition.download_uri,\n responseType: 'stream',\n });\n\n return result.data;\n }\n\n private definition(idOrType: string) {\n return this.query<BulkDataDefinition>(['bulk-data', idOrType]);\n }\n}\n\nexport default new BulkData();\n","import { EventEmitter } from 'eventemitter3';\n\nexport default class MagicEmitter<T, NOT_FOUND = never> extends EventEmitter {\n private _ended = false;\n public get ended(): boolean {\n return this._ended;\n }\n\n private _cancelled = false;\n public get cancelled(): boolean {\n return this._cancelled;\n }\n\n private _willCancelAfterPage = false;\n public get willCancelAfterPage(): boolean {\n return this._willCancelAfterPage;\n }\n\n public constructor() {\n super();\n this.on('end', () => {\n this._ended = true;\n });\n this.on('cancel', () => {\n this._ended = true;\n });\n }\n\n public on(event: 'data', listener: (data: T) => any): this;\n public on(event: 'not_found', listener: (data: NOT_FOUND) => any): this;\n public on(event: 'end', listener: (...args: any[]) => any): this;\n public on(event: 'cancel', listener: (...args: any[]) => any): this;\n public on(event: 'error', listener: (err: Error) => any): this;\n public on(event: 'done', listener: (...args: any[]) => any): this;\n public on(event: string, listener: (...args: any[]) => any): this {\n super.on(event, listener);\n return this;\n }\n\n public emit(event: 'data', data: T): boolean;\n public emit(event: 'not_found', data: NOT_FOUND): boolean;\n public emit(event: 'end'): boolean;\n public emit(event: 'cancel'): boolean;\n public emit(event: 'error', error: Error): boolean;\n public emit(event: 'done'): boolean;\n public emit(event: string, ...data: any[]): boolean {\n return super.emit(event, ...data);\n }\n\n public emitAll(event: 'data', ...data: T[]): void;\n public emitAll(event: 'not_found', ...data: NOT_FOUND[]): void;\n public emitAll(event: string, ...data: any[]): void {\n for (const item of data) {\n super.emit(event, item);\n if (this._cancelled) break;\n }\n }\n\n public cancel(): this {\n this._cancelled = true;\n this.emit('cancel');\n return this;\n }\n\n public cancelAfterPage(): this {\n this._willCancelAfterPage = true;\n return this;\n }\n\n public async waitForAll(): Promise<any> {\n type Result = T[] & { not_found: NOT_FOUND[] };\n return new Promise<Result>((resolve, reject) => {\n const results: Result = ([] as T[]) as Result;\n results.not_found = [];\n this.on('data', (result) => {\n results.push(result);\n });\n this.on('not_found', (notFound) => {\n results.not_found.push(notFound);\n });\n this.on('end', () => resolve(results));\n this.on('error', reject);\n });\n }\n\n public [Symbol.asyncIterator](): AsyncGenerator<T, void, unknown> {\n return this.generate('data');\n }\n\n public all(): AsyncGenerator<T, void, unknown> {\n return this.generate('data');\n }\n\n public notFound(): AsyncGenerator<NOT_FOUND, void, unknown> {\n return this.generate('not_found');\n }\n\n private generate(event: 'data'): AsyncGenerator<T, void, unknown>;\n private generate(\n event: 'not_found'\n ): AsyncGenerator<NOT_FOUND, void, unknown>;\n private async *generate(event: string) {\n // save the new data on each event\n const unYielded: any[] = [];\n this.on(event as never, (data) => unYielded.push(data));\n\n while (!this._ended) {\n // wait for the next event before yielding any new data\n await new Promise((resolve) => this.once(event as never, resolve));\n\n let data: T | NOT_FOUND | undefined;\n while ((data = unYielded.shift())) yield data;\n }\n }\n}\n","import { Color } from '..';\nimport MagicEmitter from '../util/MagicEmitter';\nimport MagicQuerier, { ApiCatalog, List } from '../util/MagicQuerier';\nimport { Set } from './Sets';\n\nenum UniqueStrategy {\n cards,\n art,\n prints,\n}\n\nenum Sort {\n name,\n set,\n released,\n rarity,\n color,\n usd,\n tix,\n eur,\n cmc,\n power,\n toughness,\n edhrec,\n artist,\n}\n\nenum SortDirection {\n auto,\n asc,\n desc,\n}\n\nexport interface SearchOptions {\n unique?: keyof typeof UniqueStrategy;\n order?: keyof typeof Sort;\n dir?: keyof typeof SortDirection;\n include_extras?: boolean;\n include_multilingual?: boolean;\n include_variations?: boolean;\n /**\n * The page to start on. Defaults to `1`, for first page. A page is 175 cards.\n */\n page?: number;\n}\n\nenum Rarity {\n common,\n uncommon,\n rare,\n mythic,\n}\n\nenum FrameEffect {\n legendary,\n miracle,\n nyxtouched,\n draft,\n devoid,\n tombstone,\n colorshifted,\n inverted,\n sunmoondfc,\n compasslanddfc,\n originpwdfc,\n mooneldrazidfc,\n moonreversemoondfc,\n showcase,\n extendedart,\n}\n\nenum Game {\n paper,\n arena,\n mtgo,\n}\n\nenum Legality {\n legal,\n not_legal,\n restricted,\n banned,\n}\n\nenum Border {\n black,\n borderless,\n gold,\n silver,\n white,\n}\n\nenum Layout {\n normal,\n split,\n flip,\n transform,\n meld,\n leveler,\n saga,\n adventure,\n planar,\n scheme,\n vanguard,\n token,\n double_faced_token,\n emblem,\n augment,\n host,\n art_series,\n double_sided,\n}\n\nenum Format {\n standard,\n future,\n historic,\n pioneer,\n modern,\n legacy,\n pauper,\n vintage,\n penny,\n commander,\n brawl,\n duel,\n oldschool,\n}\n\nexport type Legalities = {\n [key in keyof typeof Format]: keyof typeof Legality;\n};\n\nexport interface ImageUris {\n small: string;\n normal: string;\n large: string;\n png: string;\n art_crop: string;\n border_crop: string;\n}\n\nexport interface Prices {\n usd?: string | null;\n usd_foil?: string | null;\n eur?: string | null;\n tix?: string | null;\n}\n\nexport interface PurchaseUris {\n tcgplayer?: string | null;\n cardmarket?: string | null;\n cardhoarder?: string | null;\n [key: string]: string | null | undefined;\n}\n\nexport interface RelatedUris {\n gatherer?: string | null;\n tcgplayer_decks?: string | null;\n edhrec?: string | null;\n mtgtop8?: string | null;\n [key: string]: string | null | undefined;\n}\n\nenum RelatedCardComponent {\n token,\n meld_part,\n meld_result,\n combo_piece,\n}\n\nexport interface RelatedCard {\n object: 'related_card';\n\n id: string;\n component: keyof typeof RelatedCardComponent;\n name: string;\n type_line: string;\n uri: string;\n}\n\nexport interface CardFace {\n object: 'card_face';\n\n artist?: string | null;\n color_indicator?: Color[] | null;\n colors: Color[];\n flavor_text?: string | null;\n illustration_id?: string | null;\n image_uris?: ImageUris | null;\n loyalty?: string | null;\n mana_cost: string;\n name: string;\n oracle_text?: string | null;\n power?: string | null;\n printed_name?: string | null;\n printed_text?: string | null;\n printed_type_line?: string | null;\n toughness?: string | null;\n type_line: string;\n watermark?: string | null;\n}\n\nexport interface Preview {\n previewed_at?: string | null;\n source_uri?: string | null;\n source?: string | null;\n}\n\nenum PromoType {\n tourney,\n prerelease,\n datestamped,\n planeswalkerdeck,\n buyabox,\n judgegift,\n event,\n convention,\n starterdeck,\n instore,\n setpromo,\n fnm,\n openhouse,\n league,\n draftweekend,\n gameday,\n release,\n intropack,\n giftbox,\n duels,\n wizardsplaynetwork,\n premiereshop,\n playerrewards,\n gateway,\n arenaleague,\n}\n\nexport interface Card {\n object: 'card';\n\n // core fields\n arena_id?: number | null;\n id: string;\n lang: string;\n mtgo_id?: number | null;\n mtgo_foil_id?: number | null;\n multiverse_ids?: number[] | null;\n tcgplayer_id?: number | null;\n oracle_id: string;\n prints_search_uri: string;\n rulings_uri: string;\n scryfall_uri: string;\n uri: string;\n\n // gameplay fields\n all_parts?: RelatedCard[] | null;\n card_faces?: CardFace[] | null;\n cmc: number;\n colors?: Color[] | null;\n color_identity: Color[];\n color_indicator?: Color[] | null;\n edhrec_rank?: number | null;\n foil: boolean;\n hand_modifier?: string | null;\n layout: keyof typeof Layout;\n legalities: Legalities;\n life_modifier?: string | null;\n loyalty?: string | null;\n mana_cost?: string | null;\n name: string;\n nonfoil: boolean;\n oracle_text?: string | null;\n oversized: boolean;\n power?: string | null;\n reserved: boolean;\n toughness?: string | null;\n type_line: string;\n\n // print fields\n artist?: string | null;\n artist_ids?: string[] | null;\n booster: boolean;\n border_color: keyof typeof Border;\n card_back_id: string;\n collector_number: string;\n digital: boolean;\n flavor_text?: string | null;\n frame_effects?: (keyof typeof FrameEffect)[] | null;\n frame: '1993' | '1997' | '2003' | '2015' | 'Future';\n full_art: boolean;\n games: (keyof typeof Game)[];\n highres_image: boolean;\n illustration_id?: string | null;\n image_uris?: ImageUris | null;\n prices: Prices;\n printed_name?: string | null;\n printed_text?: string | null;\n printed_type_line?: string | null;\n promo: boolean;\n promo_types?: (keyof typeof PromoType)[] | null;\n purchase_uris: PurchaseUris;\n rarity: keyof typeof Rarity;\n related_uris: RelatedUris;\n released_at: string;\n reprint: boolean;\n scryfall_set_uri: string;\n set_name: string;\n set_search_uri: string;\n set_type: Set['set_type'];\n set_uri: string;\n set: string;\n story_spotlight: boolean;\n textless: boolean;\n variation: boolean;\n variation_of?: string | null;\n watermark?: string | null;\n preview?: Preview | null;\n}\n\nexport interface CardIdentifier {\n id?: string;\n mtgo_id?: number;\n multiverse_id?: number;\n oracle_id?: string;\n illustration_id?: string;\n name?: string;\n set?: string;\n collector_number?: string;\n}\n\nexport class CardIdentifier {\n static byId(id: string): CardIdentifier {\n return { id };\n }\n\n static byMtgoId(id: number): CardIdentifier {\n return { mtgo_id: id };\n }\n\n static byMultiverseId(id: number): CardIdentifier {\n return { multiverse_id: id };\n }\n\n static byOracleId(id: string): CardIdentifier {\n return { oracle_id: id };\n }\n\n static byIllustrationId(id: string): CardIdentifier {\n return { illustration_id: id };\n }\n\n static byName(name: string, set?: string): CardIdentifier {\n return { name, set };\n }\n\n static bySet(set: string, collectorNumber: string | number): CardIdentifier {\n return { collector_number: `${collectorNumber}`, set };\n }\n}\n\nclass Cards extends MagicQuerier {\n public async byName(name: string, fuzzy?: boolean): Promise<Card>;\n public async byName(\n name: string,\n set?: string,\n fuzzy?: boolean\n ): Promise<Card>;\n public async byName(name: string, set?: string | boolean, fuzzy = false) {\n if (typeof set === 'boolean') {\n fuzzy = set;\n set = undefined;\n }\n\n return this.query<Card>('cards/named', {\n [fuzzy ? 'fuzzy' : 'exact']: name,\n set,\n });\n }\n\n public async byId(id: string) {\n return this.query<Card>(['cards', id]);\n }\n\n public async bySet(setCode: string, collectorNumber: number, lang?: string) {\n const path = ['cards', setCode, collectorNumber];\n if (lang) path.push(lang);\n return this.query<Card>(path);\n }\n\n public async byMultiverseId(id: number) {\n return this.query<Card>(['cards/multiverse', id]);\n }\n\n public async byMtgoId(id: number) {\n return this.query<Card>(['cards/mtgo', id]);\n }\n\n public async byArenaId(id: number) {\n return this.query<Card>(['cards/arena', id]);\n }\n\n public async byTcgPlayerId(id: number) {\n return this.query<Card>(['cards/tcgplayer', id]);\n }\n\n public async random() {\n return this.query<Card>('cards/random');\n }\n\n /**\n * Returns a MagicEmitter of every card in the Scryfall database that matches the given query.\n */\n public search(query: string, options?: SearchOptions | number) {\n const emitter = new MagicEmitter<Card>();\n\n this.queryPage(emitter, 'cards/search', {\n q: query,\n ...(typeof options === 'number' ? { page: options } : options),\n }).catch((err) => emitter.emit('error', err));\n\n return emitter;\n }\n\n public async autoCompleteName(name: string) {\n return (await this.query<ApiCatalog>('cards/autocomplete', { q: name }))\n .data;\n }\n\n public collection(...identifiers: CardIdentifier[]) {\n const emitter = new MagicEmitter<Card, CardIdentifier>();\n\n void this.processCollection(emitter, identifiers);\n\n return emitter;\n }\n\n private async processCollection(\n emitter: MagicEmitter<Card, CardIdentifier>,\n identifiers: CardIdentifier[]\n ) {\n for (let i = 0; i < identifiers.length; i += 75) {\n if (emitter.cancelled) break;\n\n // the api only supports a max collection size of 75, so we take the list of identifiers (any length)\n // and split it into 75 card-max requests\n const collectionSection = { identifiers: identifiers.slice(i, i + 75) };\n\n const { data, not_found } = await this.query<List<Card, CardIdentifier>>(\n 'cards/collection',\n undefined,\n collectionSection\n );\n\n emitter.emitAll('not_found', ...(not_found ?? []));\n\n if (!emitter.cancelled) emitter.emitAll('data', ...data);\n\n if (emitter.willCancelAfterPage) emitter.cancel();\n }\n\n if (!emitter.cancelled) emitter.emit('end');\n\n emitter.emit('done');\n }\n}\n\nexport default new Cards();\n","import MagicQuerier, { ApiCatalog } from '../util/MagicQuerier';\n\nclass Catalog extends MagicQuerier {\n public async cardNames() {\n return (await this.query<ApiCatalog>('catalog/card-names')).data;\n }\n\n public async artistNames() {\n return (await this.query<ApiCatalog>('catalog/artist-names')).data;\n }\n\n public async wordBank() {\n return (await this.query<ApiCatalog>('catalog/word-bank')).data;\n }\n\n public async creatureTypes() {\n return (await this.query<ApiCatalog>('catalog/creature-types')).data;\n }\n\n public async planeswalkerTypes() {\n return (await this.query<ApiCatalog>('catalog/planeswalker-types')).data;\n }\n\n public async landTypes() {\n return (await this.query<ApiCatalog>('catalog/land-types')).data;\n }\n\n public async artifactTypes() {\n return (await this.query<ApiCatalog>('catalog/artifact-types')).data;\n }\n\n public async enchantmentTypes() {\n return (await this.query<ApiCatalog>('catalog/enchantment-types')).data;\n }\n\n public async spellTypes() {\n return (await this.query<ApiCatalog>('catalog/spell-types')).data;\n }\n\n public async powers() {\n return (await this.query<ApiCatalog>('catalog/powers')).data;\n }\n\n public async toughnesses() {\n return (await this.query<ApiCatalog>('catalog/toughnesses')).data;\n }\n\n public async loyalties() {\n return (await this.query<ApiCatalog>('catalog/loyalties')).data;\n }\n\n public async watermarks() {\n return (await this.query<ApiCatalog>('catalog/watermarks')).data;\n }\n}\n\nexport default new Catalog();\n","import MagicQuerier, { List } from '../util/MagicQuerier';\n\nexport interface HomepageLink {\n id: number;\n created_at: string;\n updated_at: string;\n priority: number;\n text: string;\n uri: string;\n badge?: string | null;\n}\n\nclass Misc extends MagicQuerier {\n public async homepageLinks() {\n return (await this.query<List<HomepageLink>>('homepage-links')).data;\n }\n}\n\nexport default new Misc();\n","import MagicQuerier, { List } from '../util/MagicQuerier';\n\nexport interface Ruling {\n source: string;\n published_at: string;\n comment: string;\n}\n\nclass Rulings extends MagicQuerier {\n public async byId(id: string) {\n return (await this.query<List<Ruling>>(['cards', id, 'rulings'])).data;\n }\n\n public async bySet(setCode: string, collectorNumber: string | number) {\n return (\n await this.query<List<Ruling>>([\n 'cards',\n setCode,\n `${collectorNumber}`,\n 'rulings',\n ])\n ).data;\n }\n\n public async byMultiverseId(id: number) {\n return (await this.query<List<Ruling>>(['cards/multiverse', id, 'rulings']))\n .data;\n }\n\n public async byMtgoId(id: number) {\n return (await this.query<List<Ruling>>(['cards/mtgo', id, 'rulings'])).data;\n }\n\n public async byArenaId(id: number) {\n return (await this.query<List<Ruling>>(['cards/arena', id, 'rulings']))\n .data;\n }\n}\n\nexport default new Rulings();\n","import MagicQuerier, { List } from '../util/MagicQuerier';\n\nenum SetType {\n core,\n expansion,\n masters,\n masterpiece,\n from_the_vault,\n spellbook,\n premium_deck,\n duel_deck,\n draft_innovation,\n treasure_chest,\n commander,\n planechase,\n archenemy,\n vanguard,\n funny,\n starter,\n box,\n promo,\n token,\n memorabilia,\n}\n\nexport interface Set {\n id: string;\n code: string;\n mtgo_code?: string | null;\n tcgplayer_id?: number | null;\n name: string;\n set_type: keyof typeof SetType;\n released_at?: string | null;\n block_code?: string | null;\n block?: string | null;\n parent_set_code?: string | null;\n card_count: number;\n digital: boolean;\n foil_only: boolean;\n scryfall_uri: string;\n uri: string;\n icon_svg_uri: string;\n search_uri: string;\n}\n\nclass Sets extends MagicQuerier {\n public async all() {\n return (await this.query<List<Set>>('sets')).data;\n }\n\n public async byCode(code: string) {\n return this.query<Set>(['sets', code]);\n }\n\n public async byId(id: string) {\n return this.query<Set>(['sets', id]);\n }\n\n public async byTcgPlayerId(id: number) {\n return this.query<Set>(['sets/tcgplayer', id]);\n }\n}\n\nexport default new Sets();\n","import { Color } from '../util/Color';\nimport MagicQuerier, { List } from '../util/MagicQuerier';\n\nexport interface CardSymbol {\n symbol: string;\n loose_variant?: string | null;\n english: string;\n transposable: boolean;\n represents_mana: boolean;\n converted_mana_cost?: number | null;\n colors: Color[];\n appears_in_mana_costs: boolean;\n funny: boolean;\n gatherer_alternates?: string[] | null;\n}\n\nexport interface ManaCost {\n cost: string;\n cmc: number;\n colors: Color[];\n colorless: boolean;\n monocolored: boolean;\n multicolored: boolean;\n}\n\nclass Symbology extends MagicQuerier {\n public async all() {\n return (await this.query<List<CardSymbol>>('symbology')).data;\n }\n\n public async parseMana(shorthand: string) {\n return this.query<ManaCost>('symbology/parse-mana', { cost: shorthand });\n }\n}\n\nexport default new Symbology();\n","enum Colors {\n W,\n B,\n R,\n U,\n G,\n}\n\nexport type Color = keyof typeof Colors;\n","import MagicQuerier, { SearchError } from './util/MagicQuerier';\n\nexport { default as BulkData } from './api/BulkData';\nexport * from './api/Cards';\nexport { default as Cards } from './api/Cards';\nexport * from './api/Catalog';\nexport { default as Catalog } from './api/Catalog';\nexport * from './api/Misc';\nexport { default as Misc } from './api/Misc';\nexport * from './api/Rulings';\nexport { default as Rulings } from './api/Rulings';\nexport * from './api/Sets';\nexport { default as Sets } from './api/Sets';\nexport * from './api/Symbology';\nexport { default as Symbology } from './api/Symbology';\nexport * from './util/Color';\n\n/**\n * Returns the last error thrown while querying.\n */\nexport function error(): SearchError | undefined {\n return MagicQuerier.lastError;\n}\n\n/**\n * Sets the API calls to retry if they fail, for any reason.\n * @param attempts The number of attempts that can be made (includes the initial call).\n * @param timeout The time that the query should wait before attempting the request again.\n * @param canRetry The function.\n */\nexport function setRetry(\n attempts: number,\n timeout?: number,\n canRetry?: (error: SearchError) => boolean\n): void {\n MagicQuerier.retry = { attempts, timeout, canRetry };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"skryfall.es5.js","sources":["../src/query/MagicPageResult.ts","../src/error/MagicQueryError.ts","../src/query/MagicQuery.ts","../src/api/Cards.ts"],"sourcesContent":["import { PageQuery, ResultList } from '../types';\nimport MagicQuery from './MagicQuery';\n\nexport default class MagicPageResult<T, Q extends MagicQuery, P = unknown> {\n private hasMore: boolean;\n\n constructor(\n private readonly q: Q,\n private readonly apiPath: string,\n private readonly query: PageQuery,\n private readonly post?: P\n ) {\n this.hasMore = true;\n }\n\n private _count?: number;\n\n public get count() {\n return this._count;\n }\n\n public async all(): Promise<T[]> {\n const r: T[] = [];\n while (this.hasMore) {\n const result = await this.next();\n r.push(...result);\n }\n return r;\n }\n\n public async get(limit: number): Promise<T[]> {\n const r: T[] = [];\n while (this.hasMore) {\n const result = await this.next();\n r.push(...result);\n if (r.length == limit) {\n return r;\n } else if (r.length > limit) {\n return r.slice(0, limit);\n }\n }\n return r;\n }\n\n public async next(): Promise<T[]> {\n const results = await this.q.query<ResultList<T>, P>(\n this.apiPath,\n this.query,\n this.post\n );\n this.hasMore = results?.has_more || false;\n this._count = Number.parseInt((results?.total_cards || 0) + '');\n if (this.hasMore) {\n this.setNextPage();\n }\n return results?.data || [];\n }\n\n public async page(page: number): Promise<T[]> {\n this.query.page = page;\n return this.next();\n }\n\n private setNextPage(): void {\n this.query.page = this.query.page + 1;\n }\n}\n","import { SearchError } from '../types/SearchError';\n\nexport class MagicQueryError extends Error {\n constructor(readonly data?: SearchError) {\n super(data?.details);\n Object.setPrototypeOf(this, MagicQueryError.prototype);\n }\n}\n","import Axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios';\nimport { MagicQueryError } from '../error/MagicQueryError';\nimport { Query, RetryStrategy, SearchError, TOrArrayOfT } from '../types';\n\nexport default class MagicQuery {\n public static retry: RetryStrategy = { attempts: 1 };\n // the path to the api\n private static readonly endpoint = 'https://api.scryfall.com';\n // time where the last api call was made\n private static lastQuery = 100;\n // the api requests 50-100 ms between calls, we go on the generous side and never wait less than 100 ms between calls\n private static readonly rateLimit = 100;\n\n private static canRetry(error?: SearchError) {\n if (error?.code == 'not_found' || error?.code == 'bad_request')\n return false;\n return !MagicQuery.retry.canRetry || MagicQuery.retry.canRetry(error);\n }\n\n private static async debounce(): Promise<void> {\n const now = Date.now();\n const timeSinceLastQuery = now - MagicQuery.lastQuery;\n if (timeSinceLastQuery >= MagicQuery.rateLimit) {\n MagicQuery.lastQuery = now;\n } else {\n const timeUntilNextQuery = MagicQuery.rateLimit - timeSinceLastQuery;\n MagicQuery.lastQuery += timeUntilNextQuery;\n await MagicQuery.sleep(timeUntilNextQuery);\n }\n }\n\n private static sleep(ms = 0) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private static async tryQuery<T, Y>(\n apiPath: string,\n query?: Query,\n post?: Y,\n requestOptions?: AxiosRequestConfig\n ): Promise<AxiosResponse<T, Y>> {\n await MagicQuery.debounce();\n\n const config: AxiosRequestConfig<Y> = {\n data: post,\n method: post ? 'POST' : 'GET',\n params: query,\n url: `${MagicQuery.endpoint}/${apiPath}`,\n ...requestOptions,\n };\n\n try {\n return await Axios.request<T, AxiosResponse<T>, Y>(config);\n } catch (e: any) {\n if (e['isAxiosError']) {\n const error = e as AxiosError<SearchError>;\n throw new MagicQueryError(error.response?.data);\n } else {\n throw e;\n }\n }\n }\n\n public async query<T = unknown, Y = unknown>(\n apiPath: TOrArrayOfT<string | number | undefined>,\n query?: Query,\n post?: Y,\n requestOptions?: AxiosRequestConfig\n ): Promise<T | undefined> {\n if (Array.isArray(apiPath)) {\n apiPath = apiPath.join('/');\n }\n\n let retries: number;\n let result;\n\n for (retries = 0; retries < MagicQuery.retry.attempts; retries++) {\n let error: SearchError | undefined;\n try {\n result = await MagicQuery.tryQuery<T, Y>(\n `${apiPath}`,\n query,\n post,\n requestOptions\n );\n } catch (e: any) {\n if (e instanceof MagicQueryError) {\n error = e.data;\n } else {\n throw e;\n }\n }\n if (result || !MagicQuery.canRetry(error)) break;\n await MagicQuery.sleep(MagicQuery.retry.timeout);\n }\n\n return result?.data;\n }\n}\n","import MagicPageResult from '../query/MagicPageResult';\nimport MagicQuery from '../query/MagicQuery';\nimport {\n Card,\n CardIdentifier,\n ResultCatalog,\n ResultList,\n SearchOptions,\n} from '../types';\n\nclass Cards extends MagicQuery {\n public async autoCompleteName(name: string): Promise<string[]> {\n const result = await this.query<ResultCatalog>('cards/autocomplete', {\n q: name,\n });\n return result?.data || [];\n }\n\n public async byArenaId(id: number): Promise<Card | undefined> {\n return this.query<Card>(['cards/arena', id]);\n }\n\n public async byId(id: string): Promise<Card | undefined> {\n return this.query<Card>(['cards', id]);\n }\n\n public async byMtgoId(id: number): Promise<Card | undefined> {\n return this.query<Card>(['cards/mtgo', id]);\n }\n\n public async byMultiverseId(id: number): Promise<Card | undefined> {\n return this.query<Card>(['cards/multiverse', id]);\n }\n\n public async byName(name: string, fuzzy?: boolean): Promise<Card | undefined>;\n\n public async byName(\n name: string,\n set?: string,\n fuzzy?: boolean\n ): Promise<Card | undefined>;\n\n public async byName(\n name: string,\n set?: string | boolean,\n fuzzy = false\n ): Promise<Card | undefined> {\n if (typeof set === 'boolean') {\n fuzzy = set;\n set = undefined;\n }\n\n return this.query<Card>('cards/named', {\n [fuzzy ? 'fuzzy' : 'exact']: name,\n set,\n });\n }\n\n public async bySet(\n setCode: string,\n collectorNumber: number,\n lang?: string\n ): Promise<Card | undefined> {\n const path = ['cards', setCode, collectorNumber];\n if (lang) path.push(lang);\n return this.query<Card>(path);\n }\n\n public async byTcgPlayerId(id: number): Promise<Card | undefined> {\n return this.query<Card>(['cards/tcgplayer', id]);\n }\n\n public async collection(...identifiers: CardIdentifier[]): Promise<Card[]> {\n const cards: Card[] = [];\n for (let i = 0; i < identifiers.length; i += 75) {\n // the api only supports a max collection size of 75, so we take the list of identifiers (any length)\n // and split it into 75 card-max requests\n const collectionSection = { identifiers: identifiers.slice(i, i + 75) };\n\n const result = await this.query<ResultList<Card, CardIdentifier>>(\n 'cards/collection',\n undefined,\n collectionSection\n );\n cards.push(...(result?.data || []));\n }\n return cards;\n }\n\n public async random(): Promise<Card | undefined> {\n return this.query<Card>('cards/random');\n }\n\n public search(\n query: string,\n options?: SearchOptions | number\n ): MagicPageResult<Card, Cards> {\n return new MagicPageResult<Card, Cards>(this, 'cards/search', {\n q: query,\n ...(typeof options === 'number'\n ? { page: options }\n : { page: 1, ...options }),\n });\n }\n}\n\nexport default new Cards();\n"],"names":[],"mappings":"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"}
|
package/lib/skryfall.es5.min.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import t from"axios";
|
|
2
2
|
/*! *****************************************************************************
|
|
3
3
|
Copyright (c) Microsoft Corporation.
|
|
4
4
|
|
|
@@ -12,5 +12,5 @@ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
|
12
12
|
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
13
13
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
14
14
|
PERFORMANCE OF THIS SOFTWARE.
|
|
15
|
-
***************************************************************************** */function r(e,t,r,n){return new(r||(r=Promise))((function(i,o){function a(e){try{d(n.next(e))}catch(e){o(e)}}function s(e){try{d(n.throw(e))}catch(e){o(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,s)}d((n=n.apply(e,t||[])).next())}))}function n(e){return this instanceof n?(this.v=e,this):new n(e)}function i(e,t,r){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var i,o=r.apply(e,t||[]),a=[];return i={},s("next"),s("throw"),s("return"),i[Symbol.asyncIterator]=function(){return this},i;function s(e){o[e]&&(i[e]=function(t){return new Promise((function(r,n){a.push([e,t,r,n])>1||d(e,t)}))})}function d(e,t){try{(r=o[e](t)).value instanceof n?Promise.resolve(r.value.v).then(u,c):l(a[0][2],r)}catch(e){l(a[0][3],e)}var r}function u(e){d("next",e)}function c(e){d("throw",e)}function l(e,t){e(t),a.shift(),a.length&&d(a[0][0],a[0][1])}}let o=0;function a(e=0){return new Promise((t=>setTimeout(t,e)))}class s{query(e,t,n,i){return r(this,void 0,void 0,(function*(){let r,o,d;for(Array.isArray(e)&&(e=e.join("/")),d=0;d<s.retry.attempts&&(({result:o,lastError:r}=yield this.tryQuery(`${e}`,t,n,i)),!o&&(this.canRetry(r)||s.retry.forced));d++)yield a(s.retry.timeout);return s.lastError=r,s.lastRetries=d,o?o.data:{data:[],not_found:[]}}))}queryPage(e,t,n,i=1){return r(this,void 0,void 0,(function*(){const r=yield this.query(t,Object.assign(Object.assign({},n),{page:i}));for(const t of r.data){if(e.cancelled)break;e.emit("data",t)}if(r.has_more&&!e.cancelled){if(!e.willCancelAfterPage)return this.queryPage(e,t,n,i+1).catch((t=>{e.emit("error",t)}));e.cancel()}e.cancelled||e.emit("end"),e.emit("done")}))}tryQuery(t,n,i,s){return r(this,void 0,void 0,(function*(){const r=Date.now(),d=r-o;if(d>=100)o=r;else{const e=100-d;o+=e,yield a(e)}let u;return{result:(yield e.request(Object.assign({data:i,method:i?"POST":"GET",params:n,url:`https://api.scryfall.com/${t}`},s)).catch((({response:e})=>{u=e.data})))||void 0,lastError:u}}))}canRetry(e){return"not_found"!=e.code&&"bad_request"!=e.code&&(!s.retry.canRetry||s.retry.canRetry(e))}}var d;s.lastQuery=0,s.lastRetries=0,s.retry={attempts:1},function(e){e[e.oracle_cards=0]="oracle_cards",e[e.unique_artwork=1]="unique_artwork",e[e.default_cards=2]="default_cards",e[e.all_cards=3]="all_cards",e[e.rulings=4]="rulings"}(d||(d={}));var u,c,l,y,h,f,m,v,p,g,b,w,_=new class extends s{downloadByType(e,t){return r(this,void 0,void 0,(function*(){return this.download(e,t)}))}downloadById(e,t){return r(this,void 0,void 0,(function*(){return this.download(e,t)}))}definitions(){return r(this,void 0,void 0,(function*(){return(yield this.query("bulk-data")).data}))}definitionByType(e){return r(this,void 0,void 0,(function*(){return this.definition(e)}))}definitionById(e){return r(this,void 0,void 0,(function*(){return this.definition(e)}))}download(t,n){return r(this,void 0,void 0,(function*(){const r=yield this.definition(t);if(new Date(n).getTime()>new Date(r.updated_at).getTime())return;return(yield e.request({method:"GET",url:r.download_uri,responseType:"stream"})).data}))}definition(e){return this.query(["bulk-data",e])}};class q extends t{constructor(){super(),this._ended=!1,this._cancelled=!1,this._willCancelAfterPage=!1,this.on("end",(()=>{this._ended=!0})),this.on("cancel",(()=>{this._ended=!0}))}get ended(){return this._ended}get cancelled(){return this._cancelled}get willCancelAfterPage(){return this._willCancelAfterPage}on(e,t){return super.on(e,t),this}emit(e,...t){return super.emit(e,...t)}emitAll(e,...t){for(const r of t)if(super.emit(e,r),this._cancelled)break}cancel(){return this._cancelled=!0,this.emit("cancel"),this}cancelAfterPage(){return this._willCancelAfterPage=!0,this}waitForAll(){return r(this,void 0,void 0,(function*(){return new Promise(((e,t)=>{const r=[];r.not_found=[],this.on("data",(e=>{r.push(e)})),this.on("not_found",(e=>{r.not_found.push(e)})),this.on("end",(()=>e(r))),this.on("error",t)}))}))}[Symbol.asyncIterator](){return this.generate("data")}all(){return this.generate("data")}notFound(){return this.generate("not_found")}generate(e){return i(this,arguments,(function*(){const t=[];for(this.on(e,(e=>t.push(e)));!this._ended;){let r;for(yield n(new Promise((t=>this.once(e,t))));r=t.shift();)yield yield n(r)}}))}}!function(e){e[e.cards=0]="cards",e[e.art=1]="art",e[e.prints=2]="prints"}(u||(u={})),function(e){e[e.name=0]="name",e[e.set=1]="set",e[e.released=2]="released",e[e.rarity=3]="rarity",e[e.color=4]="color",e[e.usd=5]="usd",e[e.tix=6]="tix",e[e.eur=7]="eur",e[e.cmc=8]="cmc",e[e.power=9]="power",e[e.toughness=10]="toughness",e[e.edhrec=11]="edhrec",e[e.artist=12]="artist"}(c||(c={})),function(e){e[e.auto=0]="auto",e[e.asc=1]="asc",e[e.desc=2]="desc"}(l||(l={})),function(e){e[e.common=0]="common",e[e.uncommon=1]="uncommon",e[e.rare=2]="rare",e[e.mythic=3]="mythic"}(y||(y={})),function(e){e[e.legendary=0]="legendary",e[e.miracle=1]="miracle",e[e.nyxtouched=2]="nyxtouched",e[e.draft=3]="draft",e[e.devoid=4]="devoid",e[e.tombstone=5]="tombstone",e[e.colorshifted=6]="colorshifted",e[e.inverted=7]="inverted",e[e.sunmoondfc=8]="sunmoondfc",e[e.compasslanddfc=9]="compasslanddfc",e[e.originpwdfc=10]="originpwdfc",e[e.mooneldrazidfc=11]="mooneldrazidfc",e[e.moonreversemoondfc=12]="moonreversemoondfc",e[e.showcase=13]="showcase",e[e.extendedart=14]="extendedart"}(h||(h={})),function(e){e[e.paper=0]="paper",e[e.arena=1]="arena",e[e.mtgo=2]="mtgo"}(f||(f={})),function(e){e[e.legal=0]="legal",e[e.not_legal=1]="not_legal",e[e.restricted=2]="restricted",e[e.banned=3]="banned"}(m||(m={})),function(e){e[e.black=0]="black",e[e.borderless=1]="borderless",e[e.gold=2]="gold",e[e.silver=3]="silver",e[e.white=4]="white"}(v||(v={})),function(e){e[e.normal=0]="normal",e[e.split=1]="split",e[e.flip=2]="flip",e[e.transform=3]="transform",e[e.meld=4]="meld",e[e.leveler=5]="leveler",e[e.saga=6]="saga",e[e.adventure=7]="adventure",e[e.planar=8]="planar",e[e.scheme=9]="scheme",e[e.vanguard=10]="vanguard",e[e.token=11]="token",e[e.double_faced_token=12]="double_faced_token",e[e.emblem=13]="emblem",e[e.augment=14]="augment",e[e.host=15]="host",e[e.art_series=16]="art_series",e[e.double_sided=17]="double_sided"}(p||(p={})),function(e){e[e.standard=0]="standard",e[e.future=1]="future",e[e.historic=2]="historic",e[e.pioneer=3]="pioneer",e[e.modern=4]="modern",e[e.legacy=5]="legacy",e[e.pauper=6]="pauper",e[e.vintage=7]="vintage",e[e.penny=8]="penny",e[e.commander=9]="commander",e[e.brawl=10]="brawl",e[e.duel=11]="duel",e[e.oldschool=12]="oldschool"}(g||(g={})),function(e){e[e.token=0]="token",e[e.meld_part=1]="meld_part",e[e.meld_result=2]="meld_result",e[e.combo_piece=3]="combo_piece"}(b||(b={})),function(e){e[e.tourney=0]="tourney",e[e.prerelease=1]="prerelease",e[e.datestamped=2]="datestamped",e[e.planeswalkerdeck=3]="planeswalkerdeck",e[e.buyabox=4]="buyabox",e[e.judgegift=5]="judgegift",e[e.event=6]="event",e[e.convention=7]="convention",e[e.starterdeck=8]="starterdeck",e[e.instore=9]="instore",e[e.setpromo=10]="setpromo",e[e.fnm=11]="fnm",e[e.openhouse=12]="openhouse",e[e.league=13]="league",e[e.draftweekend=14]="draftweekend",e[e.gameday=15]="gameday",e[e.release=16]="release",e[e.intropack=17]="intropack",e[e.giftbox=18]="giftbox",e[e.duels=19]="duels",e[e.wizardsplaynetwork=20]="wizardsplaynetwork",e[e.premiereshop=21]="premiereshop",e[e.playerrewards=22]="playerrewards",e[e.gateway=23]="gateway",e[e.arenaleague=24]="arenaleague"}(w||(w={}));class k{static byId(e){return{id:e}}static byMtgoId(e){return{mtgo_id:e}}static byMultiverseId(e){return{multiverse_id:e}}static byOracleId(e){return{oracle_id:e}}static byIllustrationId(e){return{illustration_id:e}}static byName(e,t){return{name:e,set:t}}static bySet(e,t){return{collector_number:`${t}`,set:e}}}var x=new class extends s{byName(e,t,n=!1){return r(this,void 0,void 0,(function*(){return"boolean"==typeof t&&(n=t,t=void 0),this.query("cards/named",{[n?"fuzzy":"exact"]:e,set:t})}))}byId(e){return r(this,void 0,void 0,(function*(){return this.query(["cards",e])}))}bySet(e,t,n){return r(this,void 0,void 0,(function*(){const r=["cards",e,t];return n&&r.push(n),this.query(r)}))}byMultiverseId(e){return r(this,void 0,void 0,(function*(){return this.query(["cards/multiverse",e])}))}byMtgoId(e){return r(this,void 0,void 0,(function*(){return this.query(["cards/mtgo",e])}))}byArenaId(e){return r(this,void 0,void 0,(function*(){return this.query(["cards/arena",e])}))}byTcgPlayerId(e){return r(this,void 0,void 0,(function*(){return this.query(["cards/tcgplayer",e])}))}random(){return r(this,void 0,void 0,(function*(){return this.query("cards/random")}))}search(e,t){const r=new q;return this.queryPage(r,"cards/search",Object.assign({q:e},"number"==typeof t?{page:t}:t)).catch((e=>r.emit("error",e))),r}autoCompleteName(e){return r(this,void 0,void 0,(function*(){return(yield this.query("cards/autocomplete",{q:e})).data}))}collection(...e){const t=new q;return this.processCollection(t,e),t}processCollection(e,t){return r(this,void 0,void 0,(function*(){for(let r=0;r<t.length&&!e.cancelled;r+=75){const n={identifiers:t.slice(r,r+75)},{data:i,not_found:o}=yield this.query("cards/collection",void 0,n);e.emitAll("not_found",...null!=o?o:[]),e.cancelled||e.emitAll("data",...i),e.willCancelAfterPage&&e.cancel()}e.cancelled||e.emit("end"),e.emit("done")}))}};var I=new class extends s{cardNames(){return r(this,void 0,void 0,(function*(){return(yield this.query("catalog/card-names")).data}))}artistNames(){return r(this,void 0,void 0,(function*(){return(yield this.query("catalog/artist-names")).data}))}wordBank(){return r(this,void 0,void 0,(function*(){return(yield this.query("catalog/word-bank")).data}))}creatureTypes(){return r(this,void 0,void 0,(function*(){return(yield this.query("catalog/creature-types")).data}))}planeswalkerTypes(){return r(this,void 0,void 0,(function*(){return(yield this.query("catalog/planeswalker-types")).data}))}landTypes(){return r(this,void 0,void 0,(function*(){return(yield this.query("catalog/land-types")).data}))}artifactTypes(){return r(this,void 0,void 0,(function*(){return(yield this.query("catalog/artifact-types")).data}))}enchantmentTypes(){return r(this,void 0,void 0,(function*(){return(yield this.query("catalog/enchantment-types")).data}))}spellTypes(){return r(this,void 0,void 0,(function*(){return(yield this.query("catalog/spell-types")).data}))}powers(){return r(this,void 0,void 0,(function*(){return(yield this.query("catalog/powers")).data}))}toughnesses(){return r(this,void 0,void 0,(function*(){return(yield this.query("catalog/toughnesses")).data}))}loyalties(){return r(this,void 0,void 0,(function*(){return(yield this.query("catalog/loyalties")).data}))}watermarks(){return r(this,void 0,void 0,(function*(){return(yield this.query("catalog/watermarks")).data}))}};var P=new class extends s{homepageLinks(){return r(this,void 0,void 0,(function*(){return(yield this.query("homepage-links")).data}))}};var T,A=new class extends s{byId(e){return r(this,void 0,void 0,(function*(){return(yield this.query(["cards",e,"rulings"])).data}))}bySet(e,t){return r(this,void 0,void 0,(function*(){return(yield this.query(["cards",e,`${t}`,"rulings"])).data}))}byMultiverseId(e){return r(this,void 0,void 0,(function*(){return(yield this.query(["cards/multiverse",e,"rulings"])).data}))}byMtgoId(e){return r(this,void 0,void 0,(function*(){return(yield this.query(["cards/mtgo",e,"rulings"])).data}))}byArenaId(e){return r(this,void 0,void 0,(function*(){return(yield this.query(["cards/arena",e,"rulings"])).data}))}};!function(e){e[e.core=0]="core",e[e.expansion=1]="expansion",e[e.masters=2]="masters",e[e.masterpiece=3]="masterpiece",e[e.from_the_vault=4]="from_the_vault",e[e.spellbook=5]="spellbook",e[e.premium_deck=6]="premium_deck",e[e.duel_deck=7]="duel_deck",e[e.draft_innovation=8]="draft_innovation",e[e.treasure_chest=9]="treasure_chest",e[e.commander=10]="commander",e[e.planechase=11]="planechase",e[e.archenemy=12]="archenemy",e[e.vanguard=13]="vanguard",e[e.funny=14]="funny",e[e.starter=15]="starter",e[e.box=16]="box",e[e.promo=17]="promo",e[e.token=18]="token",e[e.memorabilia=19]="memorabilia"}(T||(T={}));var C=new class extends s{all(){return r(this,void 0,void 0,(function*(){return(yield this.query("sets")).data}))}byCode(e){return r(this,void 0,void 0,(function*(){return this.query(["sets",e])}))}byId(e){return r(this,void 0,void 0,(function*(){return this.query(["sets",e])}))}byTcgPlayerId(e){return r(this,void 0,void 0,(function*(){return this.query(["sets/tcgplayer",e])}))}};var R,S=new class extends s{all(){return r(this,void 0,void 0,(function*(){return(yield this.query("symbology")).data}))}parseMana(e){return r(this,void 0,void 0,(function*(){return this.query("symbology/parse-mana",{cost:e})}))}};function B(){return s.lastError}function M(e,t,r){s.retry={attempts:e,timeout:t,canRetry:r}}!function(e){e[e.W=0]="W",e[e.B=1]="B",e[e.R=2]="R",e[e.U=3]="U",e[e.G=4]="G"}(R||(R={}));export{_ as BulkData,k as CardIdentifier,x as Cards,I as Catalog,P as Misc,A as Rulings,C as Sets,S as Symbology,B as error,M as setRetry};
|
|
15
|
+
***************************************************************************** */function e(t,e,r,i){return new(r||(r=Promise))((function(n,o){function s(t){try{a(i.next(t))}catch(t){o(t)}}function u(t){try{a(i.throw(t))}catch(t){o(t)}}function a(t){var e;t.done?n(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(s,u)}a((i=i.apply(t,e||[])).next())}))}class r{constructor(t,e,r,i){this.q=t,this.apiPath=e,this.query=r,this.post=i,this.hasMore=!0}get count(){return this._count}all(){return e(this,void 0,void 0,(function*(){const t=[];for(;this.hasMore;){const e=yield this.next();t.push(...e)}return t}))}get(t){return e(this,void 0,void 0,(function*(){const e=[];for(;this.hasMore;){const r=yield this.next();if(e.push(...r),e.length==t)return e;if(e.length>t)return e.slice(0,t)}return e}))}next(){return e(this,void 0,void 0,(function*(){const t=yield this.q.query(this.apiPath,this.query,this.post);return this.hasMore=(null==t?void 0:t.has_more)||!1,this._count=Number.parseInt(((null==t?void 0:t.total_cards)||0)+""),this.hasMore&&this.setNextPage(),(null==t?void 0:t.data)||[]}))}page(t){return e(this,void 0,void 0,(function*(){return this.query.page=t,this.next()}))}setNextPage(){this.query.page=this.query.page+1}}class i extends Error{constructor(t){super(null==t?void 0:t.details),this.data=t,Object.setPrototypeOf(this,i.prototype)}}class n{static canRetry(t){return"not_found"!=(null==t?void 0:t.code)&&"bad_request"!=(null==t?void 0:t.code)&&(!n.retry.canRetry||n.retry.canRetry(t))}static debounce(){return e(this,void 0,void 0,(function*(){const t=Date.now(),e=t-n.lastQuery;if(e>=n.rateLimit)n.lastQuery=t;else{const t=n.rateLimit-e;n.lastQuery+=t,yield n.sleep(t)}}))}static sleep(t=0){return new Promise((e=>setTimeout(e,t)))}static tryQuery(r,o,s,u){var a;return e(this,void 0,void 0,(function*(){yield n.debounce();const e=Object.assign({data:s,method:s?"POST":"GET",params:o,url:`${n.endpoint}/${r}`},u);try{return yield t.request(e)}catch(t){if(t.isAxiosError){throw new i(null===(a=t.response)||void 0===a?void 0:a.data)}throw t}}))}query(t,r,o,s){return e(this,void 0,void 0,(function*(){let e,u;for(Array.isArray(t)&&(t=t.join("/")),e=0;e<n.retry.attempts;e++){let e;try{u=yield n.tryQuery(`${t}`,r,o,s)}catch(t){if(!(t instanceof i))throw t;e=t.data}if(u||!n.canRetry(e))break;yield n.sleep(n.retry.timeout)}return null==u?void 0:u.data}))}}n.retry={attempts:1},n.endpoint="https://api.scryfall.com",n.lastQuery=100,n.rateLimit=100;var o=new class extends n{autoCompleteName(t){return e(this,void 0,void 0,(function*(){const e=yield this.query("cards/autocomplete",{q:t});return(null==e?void 0:e.data)||[]}))}byArenaId(t){return e(this,void 0,void 0,(function*(){return this.query(["cards/arena",t])}))}byId(t){return e(this,void 0,void 0,(function*(){return this.query(["cards",t])}))}byMtgoId(t){return e(this,void 0,void 0,(function*(){return this.query(["cards/mtgo",t])}))}byMultiverseId(t){return e(this,void 0,void 0,(function*(){return this.query(["cards/multiverse",t])}))}byName(t,r,i=!1){return e(this,void 0,void 0,(function*(){return"boolean"==typeof r&&(i=r,r=void 0),this.query("cards/named",{[i?"fuzzy":"exact"]:t,set:r})}))}bySet(t,r,i){return e(this,void 0,void 0,(function*(){const e=["cards",t,r];return i&&e.push(i),this.query(e)}))}byTcgPlayerId(t){return e(this,void 0,void 0,(function*(){return this.query(["cards/tcgplayer",t])}))}collection(...t){return e(this,void 0,void 0,(function*(){const e=[];for(let r=0;r<t.length;r+=75){const i={identifiers:t.slice(r,r+75)},n=yield this.query("cards/collection",void 0,i);e.push(...(null==n?void 0:n.data)||[])}return e}))}random(){return e(this,void 0,void 0,(function*(){return this.query("cards/random")}))}search(t,e){return new r(this,"cards/search",Object.assign({q:t},"number"==typeof e?{page:e}:Object.assign({page:1},e)))}};export{o as Cards};
|
|
16
16
|
//# sourceMappingURL=skryfall.es5.min.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skryfall.es5.min.js","sources":["../src/util/MagicQuerier.ts","../src/api/BulkData.ts","../src/api/Cards.ts","../src/util/MagicEmitter.ts","../src/api/Catalog.ts","../src/api/Misc.ts","../src/api/Rulings.ts","../src/api/Sets.ts","../src/api/Symbology.ts","../src/util/Color.ts","../src/index.ts"],"sourcesContent":["import Axios, { AxiosRequestConfig, AxiosResponse } from 'axios';\nimport MagicEmitter from './MagicEmitter';\n\n// the path to the api\nconst endpoint = 'https://api.scryfall.com';\n// the api requests 50-100 ms between calls, we go on the generous side and never wait less than 100 ms between calls\nconst rateLimit = 100;\n\nlet lastQuery = 0;\n\nfunction sleep(ms = 0) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\ntype TOrArrayOfT<T> = T | T[];\n\nexport interface Data<T, NOT_FOUND = never> {\n data: T[];\n not_found?: NOT_FOUND[];\n}\n\nexport interface List<T, NOT_FOUND = never> extends Data<T, NOT_FOUND> {\n has_more: boolean;\n next_page: string | null;\n total_cards: string | null;\n warnings: string[];\n}\n\nexport type ApiCatalog = Data<string>;\n\nexport interface SearchError {\n object: 'error';\n code: string;\n status: number;\n details: string;\n warnings?: string[];\n}\n\nexport interface RetryStrategy {\n attempts: number;\n timeout?: number;\n /**\n * Whether even `not_found` and `bad_request` errors should be retried.\n * @deprecated Don't use this, this is for unit tests\n */\n forced?: boolean;\n // tslint:disable-next-line space-before-function-paren typescript autoformats this to remove the space\n canRetry?(error: SearchError): boolean;\n}\n\nexport default class MagicQuerier {\n public static lastQuery = 0;\n public static lastError: SearchError | undefined;\n public static lastRetries = 0;\n public static retry: RetryStrategy = { attempts: 1 };\n\n protected async query<T>(\n apiPath: TOrArrayOfT<string | number | undefined>,\n query?: { [key: string]: any },\n post?: any,\n requestOptions?: AxiosRequestConfig\n ): Promise<T> {\n if (Array.isArray(apiPath)) {\n apiPath = apiPath.join('/');\n }\n\n let lastError: SearchError | undefined;\n let result: AxiosResponse | undefined;\n let retries: number;\n for (retries = 0; retries < MagicQuerier.retry.attempts; retries++) {\n ({ result, lastError } = await this.tryQuery(\n `${apiPath}`,\n query,\n post,\n requestOptions\n ));\n if (result || (!this.canRetry(lastError!) && !MagicQuerier.retry.forced))\n break;\n await sleep(MagicQuerier.retry.timeout);\n }\n\n MagicQuerier.lastError = lastError;\n MagicQuerier.lastRetries = retries;\n\n return result ? result.data : { data: [], not_found: [] };\n }\n\n protected async queryPage<T>(\n emitter: MagicEmitter<T>,\n apiPath: string,\n query: any,\n page = 1\n ): Promise<void> {\n const results = await this.query<List<T>>(apiPath, { ...query, page });\n for (const card of results.data) {\n if (emitter.cancelled) break;\n emitter.emit('data', card);\n }\n\n if (results.has_more) {\n if (!emitter.cancelled) {\n if (emitter.willCancelAfterPage) emitter.cancel();\n else\n return this.queryPage(emitter, apiPath, query, page + 1).catch(\n (err) => {\n emitter.emit('error', err);\n }\n );\n }\n }\n\n if (!emitter.cancelled) emitter.emit('end');\n emitter.emit('done');\n }\n\n private async tryQuery(\n apiPath: string,\n query?: { [key: string]: any },\n post?: any,\n requestOptions?: AxiosRequestConfig\n ) {\n const now = Date.now();\n const timeSinceLastQuery = now - lastQuery;\n if (timeSinceLastQuery >= rateLimit) {\n lastQuery = now;\n } else {\n const timeUntilNextQuery = rateLimit - timeSinceLastQuery;\n lastQuery += timeUntilNextQuery;\n await sleep(timeUntilNextQuery);\n }\n\n let lastError: SearchError | undefined;\n\n const result =\n (await Axios.request({\n data: post,\n method: post ? 'POST' : 'GET',\n params: query,\n url: `${endpoint}/${apiPath}`,\n ...requestOptions,\n }).catch(({ response }: { response: { data: any } }) => {\n lastError = response.data;\n })) || undefined;\n\n return { result, lastError };\n }\n\n private canRetry(error: SearchError) {\n if (error.code == 'not_found' || error.code == 'bad_request') return false;\n return !MagicQuerier.retry.canRetry || MagicQuerier.retry.canRetry(error);\n }\n}\n","import Axios from 'axios';\nimport { Stream } from 'stream';\nimport MagicQuerier, { List } from '../util/MagicQuerier';\n\nenum BulkDataTypes {\n oracle_cards,\n unique_artwork,\n default_cards,\n all_cards,\n rulings,\n}\n\nexport type BulkDataType = keyof typeof BulkDataTypes;\n\nexport interface BulkDataDefinition {\n object: 'bulk_data';\n\n id: string;\n type: BulkDataType;\n updated_at: string;\n uri: string;\n name: string;\n description: string;\n compressed_size: number;\n download_uri: string;\n content_type: string;\n content_encoding: string;\n}\n\nclass BulkData extends MagicQuerier {\n /**\n * Returns a stream for the given bulk data if it has been updated since the last download time. If it hasn't, returns `undefined`\n * @param type The BulkDataType.\n * @param lastDownload The last time this bulk data was downloaded. If you want to re-download the data regardless of\n * the last time it was downloaded, set this to `0`.\n */\n public async downloadByType(\n type: BulkDataType,\n lastDownload: string | number | Date\n ) {\n return this.download(type, lastDownload);\n }\n\n /**\n * Returns a stream for the given bulk data if it has been updated since the last download time. If it hasn't, returns `undefined`\n * @param lastDownload The last time this bulk data was downloaded. If you want to re-download the data regardless of\n * the last time it was downloaded, set this to `0`.\n */\n public async downloadById(id: string, lastDownload: string | number | Date) {\n return this.download(id, lastDownload);\n }\n\n ////////////////////////////////////\n // Definitions\n //\n\n public async definitions() {\n return (await this.query<List<BulkDataDefinition>>('bulk-data')).data;\n }\n\n public async definitionByType(type: BulkDataType) {\n return this.definition(type);\n }\n\n public async definitionById(id: string) {\n return this.definition(id);\n }\n\n ////////////////////////////////////\n // Internals\n //\n\n private async download(\n idOrType: string,\n lastDownload: string | number | Date\n ) {\n const definition = await this.definition(idOrType);\n if (\n new Date(lastDownload).getTime() >\n new Date(definition.updated_at).getTime()\n )\n return undefined;\n\n const result = await Axios.request<Stream>({\n method: 'GET',\n url: definition.download_uri,\n responseType: 'stream',\n });\n\n return result.data;\n }\n\n private definition(idOrType: string) {\n return this.query<BulkDataDefinition>(['bulk-data', idOrType]);\n }\n}\n\nexport default new BulkData();\n","import { Color } from '..';\nimport MagicEmitter from '../util/MagicEmitter';\nimport MagicQuerier, { ApiCatalog, List } from '../util/MagicQuerier';\nimport { Set } from './Sets';\n\nenum UniqueStrategy {\n cards,\n art,\n prints,\n}\n\nenum Sort {\n name,\n set,\n released,\n rarity,\n color,\n usd,\n tix,\n eur,\n cmc,\n power,\n toughness,\n edhrec,\n artist,\n}\n\nenum SortDirection {\n auto,\n asc,\n desc,\n}\n\nexport interface SearchOptions {\n unique?: keyof typeof UniqueStrategy;\n order?: keyof typeof Sort;\n dir?: keyof typeof SortDirection;\n include_extras?: boolean;\n include_multilingual?: boolean;\n include_variations?: boolean;\n /**\n * The page to start on. Defaults to `1`, for first page. A page is 175 cards.\n */\n page?: number;\n}\n\nenum Rarity {\n common,\n uncommon,\n rare,\n mythic,\n}\n\nenum FrameEffect {\n legendary,\n miracle,\n nyxtouched,\n draft,\n devoid,\n tombstone,\n colorshifted,\n inverted,\n sunmoondfc,\n compasslanddfc,\n originpwdfc,\n mooneldrazidfc,\n moonreversemoondfc,\n showcase,\n extendedart,\n}\n\nenum Game {\n paper,\n arena,\n mtgo,\n}\n\nenum Legality {\n legal,\n not_legal,\n restricted,\n banned,\n}\n\nenum Border {\n black,\n borderless,\n gold,\n silver,\n white,\n}\n\nenum Layout {\n normal,\n split,\n flip,\n transform,\n meld,\n leveler,\n saga,\n adventure,\n planar,\n scheme,\n vanguard,\n token,\n double_faced_token,\n emblem,\n augment,\n host,\n art_series,\n double_sided,\n}\n\nenum Format {\n standard,\n future,\n historic,\n pioneer,\n modern,\n legacy,\n pauper,\n vintage,\n penny,\n commander,\n brawl,\n duel,\n oldschool,\n}\n\nexport type Legalities = {\n [key in keyof typeof Format]: keyof typeof Legality;\n};\n\nexport interface ImageUris {\n small: string;\n normal: string;\n large: string;\n png: string;\n art_crop: string;\n border_crop: string;\n}\n\nexport interface Prices {\n usd?: string | null;\n usd_foil?: string | null;\n eur?: string | null;\n tix?: string | null;\n}\n\nexport interface PurchaseUris {\n tcgplayer?: string | null;\n cardmarket?: string | null;\n cardhoarder?: string | null;\n [key: string]: string | null | undefined;\n}\n\nexport interface RelatedUris {\n gatherer?: string | null;\n tcgplayer_decks?: string | null;\n edhrec?: string | null;\n mtgtop8?: string | null;\n [key: string]: string | null | undefined;\n}\n\nenum RelatedCardComponent {\n token,\n meld_part,\n meld_result,\n combo_piece,\n}\n\nexport interface RelatedCard {\n object: 'related_card';\n\n id: string;\n component: keyof typeof RelatedCardComponent;\n name: string;\n type_line: string;\n uri: string;\n}\n\nexport interface CardFace {\n object: 'card_face';\n\n artist?: string | null;\n color_indicator?: Color[] | null;\n colors: Color[];\n flavor_text?: string | null;\n illustration_id?: string | null;\n image_uris?: ImageUris | null;\n loyalty?: string | null;\n mana_cost: string;\n name: string;\n oracle_text?: string | null;\n power?: string | null;\n printed_name?: string | null;\n printed_text?: string | null;\n printed_type_line?: string | null;\n toughness?: string | null;\n type_line: string;\n watermark?: string | null;\n}\n\nexport interface Preview {\n previewed_at?: string | null;\n source_uri?: string | null;\n source?: string | null;\n}\n\nenum PromoType {\n tourney,\n prerelease,\n datestamped,\n planeswalkerdeck,\n buyabox,\n judgegift,\n event,\n convention,\n starterdeck,\n instore,\n setpromo,\n fnm,\n openhouse,\n league,\n draftweekend,\n gameday,\n release,\n intropack,\n giftbox,\n duels,\n wizardsplaynetwork,\n premiereshop,\n playerrewards,\n gateway,\n arenaleague,\n}\n\nexport interface Card {\n object: 'card';\n\n // core fields\n arena_id?: number | null;\n id: string;\n lang: string;\n mtgo_id?: number | null;\n mtgo_foil_id?: number | null;\n multiverse_ids?: number[] | null;\n tcgplayer_id?: number | null;\n oracle_id: string;\n prints_search_uri: string;\n rulings_uri: string;\n scryfall_uri: string;\n uri: string;\n\n // gameplay fields\n all_parts?: RelatedCard[] | null;\n card_faces?: CardFace[] | null;\n cmc: number;\n colors?: Color[] | null;\n color_identity: Color[];\n color_indicator?: Color[] | null;\n edhrec_rank?: number | null;\n foil: boolean;\n hand_modifier?: string | null;\n layout: keyof typeof Layout;\n legalities: Legalities;\n life_modifier?: string | null;\n loyalty?: string | null;\n mana_cost?: string | null;\n name: string;\n nonfoil: boolean;\n oracle_text?: string | null;\n oversized: boolean;\n power?: string | null;\n reserved: boolean;\n toughness?: string | null;\n type_line: string;\n\n // print fields\n artist?: string | null;\n artist_ids?: string[] | null;\n booster: boolean;\n border_color: keyof typeof Border;\n card_back_id: string;\n collector_number: string;\n digital: boolean;\n flavor_text?: string | null;\n frame_effects?: (keyof typeof FrameEffect)[] | null;\n frame: '1993' | '1997' | '2003' | '2015' | 'Future';\n full_art: boolean;\n games: (keyof typeof Game)[];\n highres_image: boolean;\n illustration_id?: string | null;\n image_uris?: ImageUris | null;\n prices: Prices;\n printed_name?: string | null;\n printed_text?: string | null;\n printed_type_line?: string | null;\n promo: boolean;\n promo_types?: (keyof typeof PromoType)[] | null;\n purchase_uris: PurchaseUris;\n rarity: keyof typeof Rarity;\n related_uris: RelatedUris;\n released_at: string;\n reprint: boolean;\n scryfall_set_uri: string;\n set_name: string;\n set_search_uri: string;\n set_type: Set['set_type'];\n set_uri: string;\n set: string;\n story_spotlight: boolean;\n textless: boolean;\n variation: boolean;\n variation_of?: string | null;\n watermark?: string | null;\n preview?: Preview | null;\n}\n\nexport interface CardIdentifier {\n id?: string;\n mtgo_id?: number;\n multiverse_id?: number;\n oracle_id?: string;\n illustration_id?: string;\n name?: string;\n set?: string;\n collector_number?: string;\n}\n\nexport class CardIdentifier {\n static byId(id: string): CardIdentifier {\n return { id };\n }\n\n static byMtgoId(id: number): CardIdentifier {\n return { mtgo_id: id };\n }\n\n static byMultiverseId(id: number): CardIdentifier {\n return { multiverse_id: id };\n }\n\n static byOracleId(id: string): CardIdentifier {\n return { oracle_id: id };\n }\n\n static byIllustrationId(id: string): CardIdentifier {\n return { illustration_id: id };\n }\n\n static byName(name: string, set?: string): CardIdentifier {\n return { name, set };\n }\n\n static bySet(set: string, collectorNumber: string | number): CardIdentifier {\n return { collector_number: `${collectorNumber}`, set };\n }\n}\n\nclass Cards extends MagicQuerier {\n public async byName(name: string, fuzzy?: boolean): Promise<Card>;\n public async byName(\n name: string,\n set?: string,\n fuzzy?: boolean\n ): Promise<Card>;\n public async byName(name: string, set?: string | boolean, fuzzy = false) {\n if (typeof set === 'boolean') {\n fuzzy = set;\n set = undefined;\n }\n\n return this.query<Card>('cards/named', {\n [fuzzy ? 'fuzzy' : 'exact']: name,\n set,\n });\n }\n\n public async byId(id: string) {\n return this.query<Card>(['cards', id]);\n }\n\n public async bySet(setCode: string, collectorNumber: number, lang?: string) {\n const path = ['cards', setCode, collectorNumber];\n if (lang) path.push(lang);\n return this.query<Card>(path);\n }\n\n public async byMultiverseId(id: number) {\n return this.query<Card>(['cards/multiverse', id]);\n }\n\n public async byMtgoId(id: number) {\n return this.query<Card>(['cards/mtgo', id]);\n }\n\n public async byArenaId(id: number) {\n return this.query<Card>(['cards/arena', id]);\n }\n\n public async byTcgPlayerId(id: number) {\n return this.query<Card>(['cards/tcgplayer', id]);\n }\n\n public async random() {\n return this.query<Card>('cards/random');\n }\n\n /**\n * Returns a MagicEmitter of every card in the Scryfall database that matches the given query.\n */\n public search(query: string, options?: SearchOptions | number) {\n const emitter = new MagicEmitter<Card>();\n\n this.queryPage(emitter, 'cards/search', {\n q: query,\n ...(typeof options === 'number' ? { page: options } : options),\n }).catch((err) => emitter.emit('error', err));\n\n return emitter;\n }\n\n public async autoCompleteName(name: string) {\n return (await this.query<ApiCatalog>('cards/autocomplete', { q: name }))\n .data;\n }\n\n public collection(...identifiers: CardIdentifier[]) {\n const emitter = new MagicEmitter<Card, CardIdentifier>();\n\n void this.processCollection(emitter, identifiers);\n\n return emitter;\n }\n\n private async processCollection(\n emitter: MagicEmitter<Card, CardIdentifier>,\n identifiers: CardIdentifier[]\n ) {\n for (let i = 0; i < identifiers.length; i += 75) {\n if (emitter.cancelled) break;\n\n // the api only supports a max collection size of 75, so we take the list of identifiers (any length)\n // and split it into 75 card-max requests\n const collectionSection = { identifiers: identifiers.slice(i, i + 75) };\n\n const { data, not_found } = await this.query<List<Card, CardIdentifier>>(\n 'cards/collection',\n undefined,\n collectionSection\n );\n\n emitter.emitAll('not_found', ...(not_found ?? []));\n\n if (!emitter.cancelled) emitter.emitAll('data', ...data);\n\n if (emitter.willCancelAfterPage) emitter.cancel();\n }\n\n if (!emitter.cancelled) emitter.emit('end');\n\n emitter.emit('done');\n }\n}\n\nexport default new Cards();\n","import { EventEmitter } from 'eventemitter3';\n\nexport default class MagicEmitter<T, NOT_FOUND = never> extends EventEmitter {\n private _ended = false;\n public get ended(): boolean {\n return this._ended;\n }\n\n private _cancelled = false;\n public get cancelled(): boolean {\n return this._cancelled;\n }\n\n private _willCancelAfterPage = false;\n public get willCancelAfterPage(): boolean {\n return this._willCancelAfterPage;\n }\n\n public constructor() {\n super();\n this.on('end', () => {\n this._ended = true;\n });\n this.on('cancel', () => {\n this._ended = true;\n });\n }\n\n public on(event: 'data', listener: (data: T) => any): this;\n public on(event: 'not_found', listener: (data: NOT_FOUND) => any): this;\n public on(event: 'end', listener: (...args: any[]) => any): this;\n public on(event: 'cancel', listener: (...args: any[]) => any): this;\n public on(event: 'error', listener: (err: Error) => any): this;\n public on(event: 'done', listener: (...args: any[]) => any): this;\n public on(event: string, listener: (...args: any[]) => any): this {\n super.on(event, listener);\n return this;\n }\n\n public emit(event: 'data', data: T): boolean;\n public emit(event: 'not_found', data: NOT_FOUND): boolean;\n public emit(event: 'end'): boolean;\n public emit(event: 'cancel'): boolean;\n public emit(event: 'error', error: Error): boolean;\n public emit(event: 'done'): boolean;\n public emit(event: string, ...data: any[]): boolean {\n return super.emit(event, ...data);\n }\n\n public emitAll(event: 'data', ...data: T[]): void;\n public emitAll(event: 'not_found', ...data: NOT_FOUND[]): void;\n public emitAll(event: string, ...data: any[]): void {\n for (const item of data) {\n super.emit(event, item);\n if (this._cancelled) break;\n }\n }\n\n public cancel(): this {\n this._cancelled = true;\n this.emit('cancel');\n return this;\n }\n\n public cancelAfterPage(): this {\n this._willCancelAfterPage = true;\n return this;\n }\n\n public async waitForAll(): Promise<any> {\n type Result = T[] & { not_found: NOT_FOUND[] };\n return new Promise<Result>((resolve, reject) => {\n const results: Result = ([] as T[]) as Result;\n results.not_found = [];\n this.on('data', (result) => {\n results.push(result);\n });\n this.on('not_found', (notFound) => {\n results.not_found.push(notFound);\n });\n this.on('end', () => resolve(results));\n this.on('error', reject);\n });\n }\n\n public [Symbol.asyncIterator](): AsyncGenerator<T, void, unknown> {\n return this.generate('data');\n }\n\n public all(): AsyncGenerator<T, void, unknown> {\n return this.generate('data');\n }\n\n public notFound(): AsyncGenerator<NOT_FOUND, void, unknown> {\n return this.generate('not_found');\n }\n\n private generate(event: 'data'): AsyncGenerator<T, void, unknown>;\n private generate(\n event: 'not_found'\n ): AsyncGenerator<NOT_FOUND, void, unknown>;\n private async *generate(event: string) {\n // save the new data on each event\n const unYielded: any[] = [];\n this.on(event as never, (data) => unYielded.push(data));\n\n while (!this._ended) {\n // wait for the next event before yielding any new data\n await new Promise((resolve) => this.once(event as never, resolve));\n\n let data: T | NOT_FOUND | undefined;\n while ((data = unYielded.shift())) yield data;\n }\n }\n}\n","import MagicQuerier, { ApiCatalog } from '../util/MagicQuerier';\n\nclass Catalog extends MagicQuerier {\n public async cardNames() {\n return (await this.query<ApiCatalog>('catalog/card-names')).data;\n }\n\n public async artistNames() {\n return (await this.query<ApiCatalog>('catalog/artist-names')).data;\n }\n\n public async wordBank() {\n return (await this.query<ApiCatalog>('catalog/word-bank')).data;\n }\n\n public async creatureTypes() {\n return (await this.query<ApiCatalog>('catalog/creature-types')).data;\n }\n\n public async planeswalkerTypes() {\n return (await this.query<ApiCatalog>('catalog/planeswalker-types')).data;\n }\n\n public async landTypes() {\n return (await this.query<ApiCatalog>('catalog/land-types')).data;\n }\n\n public async artifactTypes() {\n return (await this.query<ApiCatalog>('catalog/artifact-types')).data;\n }\n\n public async enchantmentTypes() {\n return (await this.query<ApiCatalog>('catalog/enchantment-types')).data;\n }\n\n public async spellTypes() {\n return (await this.query<ApiCatalog>('catalog/spell-types')).data;\n }\n\n public async powers() {\n return (await this.query<ApiCatalog>('catalog/powers')).data;\n }\n\n public async toughnesses() {\n return (await this.query<ApiCatalog>('catalog/toughnesses')).data;\n }\n\n public async loyalties() {\n return (await this.query<ApiCatalog>('catalog/loyalties')).data;\n }\n\n public async watermarks() {\n return (await this.query<ApiCatalog>('catalog/watermarks')).data;\n }\n}\n\nexport default new Catalog();\n","import MagicQuerier, { List } from '../util/MagicQuerier';\n\nexport interface HomepageLink {\n id: number;\n created_at: string;\n updated_at: string;\n priority: number;\n text: string;\n uri: string;\n badge?: string | null;\n}\n\nclass Misc extends MagicQuerier {\n public async homepageLinks() {\n return (await this.query<List<HomepageLink>>('homepage-links')).data;\n }\n}\n\nexport default new Misc();\n","import MagicQuerier, { List } from '../util/MagicQuerier';\n\nexport interface Ruling {\n source: string;\n published_at: string;\n comment: string;\n}\n\nclass Rulings extends MagicQuerier {\n public async byId(id: string) {\n return (await this.query<List<Ruling>>(['cards', id, 'rulings'])).data;\n }\n\n public async bySet(setCode: string, collectorNumber: string | number) {\n return (\n await this.query<List<Ruling>>([\n 'cards',\n setCode,\n `${collectorNumber}`,\n 'rulings',\n ])\n ).data;\n }\n\n public async byMultiverseId(id: number) {\n return (await this.query<List<Ruling>>(['cards/multiverse', id, 'rulings']))\n .data;\n }\n\n public async byMtgoId(id: number) {\n return (await this.query<List<Ruling>>(['cards/mtgo', id, 'rulings'])).data;\n }\n\n public async byArenaId(id: number) {\n return (await this.query<List<Ruling>>(['cards/arena', id, 'rulings']))\n .data;\n }\n}\n\nexport default new Rulings();\n","import MagicQuerier, { List } from '../util/MagicQuerier';\n\nenum SetType {\n core,\n expansion,\n masters,\n masterpiece,\n from_the_vault,\n spellbook,\n premium_deck,\n duel_deck,\n draft_innovation,\n treasure_chest,\n commander,\n planechase,\n archenemy,\n vanguard,\n funny,\n starter,\n box,\n promo,\n token,\n memorabilia,\n}\n\nexport interface Set {\n id: string;\n code: string;\n mtgo_code?: string | null;\n tcgplayer_id?: number | null;\n name: string;\n set_type: keyof typeof SetType;\n released_at?: string | null;\n block_code?: string | null;\n block?: string | null;\n parent_set_code?: string | null;\n card_count: number;\n digital: boolean;\n foil_only: boolean;\n scryfall_uri: string;\n uri: string;\n icon_svg_uri: string;\n search_uri: string;\n}\n\nclass Sets extends MagicQuerier {\n public async all() {\n return (await this.query<List<Set>>('sets')).data;\n }\n\n public async byCode(code: string) {\n return this.query<Set>(['sets', code]);\n }\n\n public async byId(id: string) {\n return this.query<Set>(['sets', id]);\n }\n\n public async byTcgPlayerId(id: number) {\n return this.query<Set>(['sets/tcgplayer', id]);\n }\n}\n\nexport default new Sets();\n","import { Color } from '../util/Color';\nimport MagicQuerier, { List } from '../util/MagicQuerier';\n\nexport interface CardSymbol {\n symbol: string;\n loose_variant?: string | null;\n english: string;\n transposable: boolean;\n represents_mana: boolean;\n converted_mana_cost?: number | null;\n colors: Color[];\n appears_in_mana_costs: boolean;\n funny: boolean;\n gatherer_alternates?: string[] | null;\n}\n\nexport interface ManaCost {\n cost: string;\n cmc: number;\n colors: Color[];\n colorless: boolean;\n monocolored: boolean;\n multicolored: boolean;\n}\n\nclass Symbology extends MagicQuerier {\n public async all() {\n return (await this.query<List<CardSymbol>>('symbology')).data;\n }\n\n public async parseMana(shorthand: string) {\n return this.query<ManaCost>('symbology/parse-mana', { cost: shorthand });\n }\n}\n\nexport default new Symbology();\n","enum Colors {\n W,\n B,\n R,\n U,\n G,\n}\n\nexport type Color = keyof typeof Colors;\n","import MagicQuerier, { SearchError } from './util/MagicQuerier';\n\nexport { default as BulkData } from './api/BulkData';\nexport * from './api/Cards';\nexport { default as Cards } from './api/Cards';\nexport * from './api/Catalog';\nexport { default as Catalog } from './api/Catalog';\nexport * from './api/Misc';\nexport { default as Misc } from './api/Misc';\nexport * from './api/Rulings';\nexport { default as Rulings } from './api/Rulings';\nexport * from './api/Sets';\nexport { default as Sets } from './api/Sets';\nexport * from './api/Symbology';\nexport { default as Symbology } from './api/Symbology';\nexport * from './util/Color';\n\n/**\n * Returns the last error thrown while querying.\n */\nexport function error(): SearchError | undefined {\n return MagicQuerier.lastError;\n}\n\n/**\n * Sets the API calls to retry if they fail, for any reason.\n * @param attempts The number of attempts that can be made (includes the initial call).\n * @param timeout The time that the query should wait before attempting the request again.\n * @param canRetry The function.\n */\nexport function setRetry(\n attempts: number,\n timeout?: number,\n canRetry?: (error: SearchError) => boolean\n): void {\n MagicQuerier.retry = { attempts, timeout, canRetry };\n}\n"],"names":["lastQuery","sleep","ms","Promise","resolve","setTimeout","MagicQuerier","[object Object]","apiPath","query","post","requestOptions","lastError","result","retries","Array","isArray","join","retry","attempts","this","tryQuery","canRetry","forced","timeout","lastRetries","data","not_found","emitter","page","results","card","cancelled","emit","has_more","willCancelAfterPage","queryPage","catch","err","cancel","now","Date","timeSinceLastQuery","timeUntilNextQuery","Axios","request","method","params","url","response","undefined","error","code","BulkDataTypes","UniqueStrategy","Sort","SortDirection","Rarity","FrameEffect","Game","Legality","Border","Layout","Format","RelatedCardComponent","PromoType","type","lastDownload","download","id","definition","idOrType","getTime","updated_at","download_uri","responseType","MagicEmitter","EventEmitter","super","on","_ended","ended","_cancelled","_willCancelAfterPage","event","listener","item","reject","push","notFound","Symbol","asyncIterator","generate","unYielded","once","shift","CardIdentifier","mtgo_id","multiverse_id","oracle_id","illustration_id","name","set","collectorNumber","collector_number","fuzzy","setCode","lang","path","options","q","identifiers","processCollection","i","length","collectionSection","slice","emitAll","SetType","Colors","shorthand","cost","setRetry"],"mappings":";;;;;;;;;;;;;;q/BAQA,IAAIA,EAAY,EAEhB,SAASC,EAAMC,EAAK,GAClB,OAAO,IAAIC,SAASC,GAAYC,WAAWD,EAASF,WAuCjCI,EAMHC,MACdC,EACAC,EACAC,EACAC,4CAMA,IAAIC,EACAC,EACAC,EACJ,IAPIC,MAAMC,QAAQR,KAChBA,EAAUA,EAAQS,KAAK,MAMpBH,EAAU,EAAGA,EAAUR,EAAaY,MAAMC,aAC1CN,OAAAA,EAAQD,UAAAA,SAAoBQ,KAAKC,SAClC,GAAGb,IACHC,EACAC,EACAC,KAEEE,IAAYO,KAAKE,SAASV,IAAgBN,EAAaY,MAAMK,SAPVT,UASjDb,EAAMK,EAAaY,MAAMM,SAMjC,OAHAlB,EAAaM,UAAYA,EACzBN,EAAamB,YAAcX,EAEpBD,EAASA,EAAOa,KAAO,CAAEA,KAAM,GAAIC,UAAW,OAGvCpB,UACdqB,EACApB,EACAC,EACAoB,EAAO,4CAEP,MAAMC,QAAgBV,KAAKX,MAAeD,iCAAcC,IAAOoB,KAAAA,KAC/D,IAAK,MAAME,KAAQD,EAAQJ,KAAM,CAC/B,GAAIE,EAAQI,UAAW,MACvBJ,EAAQK,KAAK,OAAQF,GAGvB,GAAID,EAAQI,WACLN,EAAQI,UAAW,CACtB,IAAIJ,EAAQO,oBAEV,OAAOf,KAAKgB,UAAUR,EAASpB,EAASC,EAAOoB,EAAO,GAAGQ,OACtDC,IACCV,EAAQK,KAAK,QAASK,MAJKV,EAAQW,SAUxCX,EAAQI,WAAWJ,EAAQK,KAAK,OACrCL,EAAQK,KAAK,WAGD1B,SACZC,EACAC,EACAC,EACAC,4CAEA,MAAM6B,EAAMC,KAAKD,MACXE,EAAqBF,EAAMxC,EACjC,GAAI0C,GArHU,IAsHZ1C,EAAYwC,MACP,CACL,MAAMG,EAxHM,IAwH2BD,EACvC1C,GAAa2C,QACP1C,EAAM0C,GAGd,IAAI/B,EAaJ,MAAO,CAAEC,cAVA+B,EAAMC,uBACXnB,KAAMhB,EACNoC,OAAQpC,EAAO,OAAS,MACxBqC,OAAQtC,EACRuC,IAAK,4BAAexC,KACjBG,IACF0B,OAAM,EAAGY,SAAAA,MACVrC,EAAYqC,EAASvB,eAChBwB,EAEQtC,UAAAA,MAGXL,SAAS4C,GACf,MAAkB,aAAdA,EAAMC,MAAqC,eAAdD,EAAMC,QAC/B9C,EAAaY,MAAMI,UAAYhB,EAAaY,MAAMI,SAAS6B,KCjJvE,IAAKE,ED+CW/C,YAAY,EAEZA,cAAc,EACdA,QAAuB,CAAEa,SAAU,GClDnD,SAAKkC,GACHA,mCACAA,uCACAA,qCACAA,6BACAA,yBALF,CAAKA,IAAAA,OA6FL,IC5FKC,EAMAC,EAgBAC,EAmBAC,EAOAC,EAkBAC,EAMAC,EAOAC,EAQAC,EAqBAC,EAmDAC,EA6CAC,IDhHU,IApEf,cAAuB3D,EAORC,eACX2D,EACAC,4CAEA,OAAO/C,KAAKgD,SAASF,EAAMC,MAQhB5D,aAAa8D,EAAYF,4CACpC,OAAO/C,KAAKgD,SAASC,EAAIF,MAOd5D,uDACX,aAAca,KAAKX,MAAgC,cAAciB,QAGtDnB,iBAAiB2D,4CAC5B,OAAO9C,KAAKkD,WAAWJ,MAGZ3D,eAAe8D,4CAC1B,OAAOjD,KAAKkD,WAAWD,MAOX9D,SACZgE,EACAJ,4CAEA,MAAMG,QAAmBlD,KAAKkD,WAAWC,GACzC,GACE,IAAI9B,KAAK0B,GAAcK,UACvB,IAAI/B,KAAK6B,EAAWG,YAAYD,UAEhC,OAQF,aANqB5B,EAAMC,QAAgB,CACzCC,OAAQ,MACRE,IAAKsB,EAAWI,aAChBC,aAAc,YAGFjD,QAGRnB,WAAWgE,GACjB,OAAOnD,KAAKX,MAA0B,CAAC,YAAa8D,YE3FnCK,UAA2CC,EAgB9DtE,cACEuE,QAhBM1D,aAAS,EAKTA,iBAAa,EAKbA,2BAAuB,EAO7BA,KAAK2D,GAAG,OAAO,KACb3D,KAAK4D,QAAS,KAEhB5D,KAAK2D,GAAG,UAAU,KAChB3D,KAAK4D,QAAS,KApBlBC,YACE,OAAO7D,KAAK4D,OAIdhD,gBACE,OAAOZ,KAAK8D,WAId/C,0BACE,OAAOf,KAAK+D,qBAmBP5E,GAAG6E,EAAeC,GAEvB,OADAP,MAAMC,GAAGK,EAAOC,GACTjE,KASFb,KAAK6E,KAAkB1D,GAC5B,OAAOoD,MAAM7C,KAAKmD,KAAU1D,GAKvBnB,QAAQ6E,KAAkB1D,GAC/B,IAAK,MAAM4D,KAAQ5D,EAEjB,GADAoD,MAAM7C,KAAKmD,EAAOE,GACdlE,KAAK8D,WAAY,MAIlB3E,SAGL,OAFAa,KAAK8D,YAAa,EAClB9D,KAAKa,KAAK,UACHb,KAGFb,kBAEL,OADAa,KAAK+D,sBAAuB,EACrB/D,KAGIb,sDAEX,OAAO,IAAIJ,SAAgB,CAACC,EAASmF,KACnC,MAAMzD,EAAmB,GACzBA,EAAQH,UAAY,GACpBP,KAAK2D,GAAG,QAASlE,IACfiB,EAAQ0D,KAAK3E,MAEfO,KAAK2D,GAAG,aAAcU,IACpB3D,EAAQH,UAAU6D,KAAKC,MAEzBrE,KAAK2D,GAAG,OAAO,IAAM3E,EAAQ0B,KAC7BV,KAAK2D,GAAG,QAASQ,SAIdhF,CAACmF,OAAOC,iBACb,OAAOvE,KAAKwE,SAAS,QAGhBrF,MACL,OAAOa,KAAKwE,SAAS,QAGhBrF,WACL,OAAOa,KAAKwE,SAAS,aAORrF,SAAS6E,wCAEtB,MAAMS,EAAmB,GAGzB,IAFAzE,KAAK2D,GAAGK,GAAiB1D,GAASmE,EAAUL,KAAK9D,MAEzCN,KAAK4D,QAAQ,CAInB,IAAItD,EACJ,YAHM,IAAIvB,SAASC,GAAYgB,KAAK0E,KAAKV,EAAgBhF,MAGjDsB,EAAOmE,EAAUE,uBAAgBrE,SD1G/C,SAAK4B,GACHA,qBACAA,iBACAA,uBAHF,CAAKA,IAAAA,OAML,SAAKC,GACHA,mBACAA,iBACAA,2BACAA,uBACAA,qBACAA,iBACAA,iBACAA,iBACAA,iBACAA,qBACAA,8BACAA,wBACAA,wBAbF,CAAKA,IAAAA,OAgBL,SAAKC,GACHA,mBACAA,iBACAA,mBAHF,CAAKA,IAAAA,OAmBL,SAAKC,GACHA,uBACAA,2BACAA,mBACAA,uBAJF,CAAKA,IAAAA,OAOL,SAAKC,GACHA,6BACAA,yBACAA,+BACAA,qBACAA,uBACAA,6BACAA,mCACAA,2BACAA,+BACAA,uCACAA,kCACAA,wCACAA,gDACAA,4BACAA,kCAfF,CAAKA,IAAAA,OAkBL,SAAKC,GACHA,qBACAA,qBACAA,mBAHF,CAAKA,IAAAA,OAML,SAAKC,GACHA,qBACAA,6BACAA,+BACAA,uBAJF,CAAKA,IAAAA,OAOL,SAAKC,GACHA,qBACAA,+BACAA,mBACAA,uBACAA,qBALF,CAAKA,IAAAA,OAQL,SAAKC,GACHA,uBACAA,qBACAA,mBACAA,6BACAA,mBACAA,yBACAA,mBACAA,6BACAA,uBACAA,uBACAA,4BACAA,sBACAA,gDACAA,wBACAA,0BACAA,oBACAA,gCACAA,oCAlBF,CAAKA,IAAAA,OAqBL,SAAKC,GACHA,2BACAA,uBACAA,2BACAA,yBACAA,uBACAA,uBACAA,uBACAA,yBACAA,qBACAA,6BACAA,sBACAA,oBACAA,8BAbF,CAAKA,IAAAA,OAmDL,SAAKC,GACHA,qBACAA,6BACAA,iCACAA,iCAJF,CAAKA,IAAAA,OA6CL,SAAKC,GACHA,yBACAA,+BACAA,iCACAA,2CACAA,yBACAA,6BACAA,qBACAA,+BACAA,iCACAA,yBACAA,4BACAA,kBACAA,8BACAA,wBACAA,oCACAA,0BACAA,0BACAA,8BACAA,0BACAA,sBACAA,gDACAA,oCACAA,sCACAA,0BACAA,kCAzBF,CAAKA,IAAAA,aAyHQ+B,EACXzF,YAAY8D,GACV,MAAO,CAAEA,GAAAA,GAGX9D,gBAAgB8D,GACd,MAAO,CAAE4B,QAAS5B,GAGpB9D,sBAAsB8D,GACpB,MAAO,CAAE6B,cAAe7B,GAG1B9D,kBAAkB8D,GAChB,MAAO,CAAE8B,UAAW9B,GAGtB9D,wBAAwB8D,GACtB,MAAO,CAAE+B,gBAAiB/B,GAG5B9D,cAAc8F,EAAcC,GAC1B,MAAO,CAAED,KAAAA,EAAMC,IAAAA,GAGjB/F,aAAa+F,EAAaC,GACxB,MAAO,CAAEC,iBAAkB,GAAGD,IAAmBD,IAAAA,IA8GrD,MAAe,IA1Gf,cAAoBhG,EAOLC,OAAO8F,EAAcC,EAAwBG,GAAQ,4CAMhE,MALmB,kBAARH,IACTG,EAAQH,EACRA,OAAMpD,GAGD9B,KAAKX,MAAY,cAAe,CACrCF,CAACkG,EAAQ,QAAU,SAAUJ,EAC7BC,IAAAA,OAIS/F,KAAK8D,4CAChB,OAAOjD,KAAKX,MAAY,CAAC,QAAS4D,OAGvB9D,MAAMmG,EAAiBH,EAAyBI,4CAC3D,MAAMC,EAAO,CAAC,QAASF,EAASH,GAEhC,OADII,GAAMC,EAAKpB,KAAKmB,GACbvF,KAAKX,MAAYmG,MAGbrG,eAAe8D,4CAC1B,OAAOjD,KAAKX,MAAY,CAAC,mBAAoB4D,OAGlC9D,SAAS8D,4CACpB,OAAOjD,KAAKX,MAAY,CAAC,aAAc4D,OAG5B9D,UAAU8D,4CACrB,OAAOjD,KAAKX,MAAY,CAAC,cAAe4D,OAG7B9D,cAAc8D,4CACzB,OAAOjD,KAAKX,MAAY,CAAC,kBAAmB4D,OAGjC9D,kDACX,OAAOa,KAAKX,MAAY,mBAMnBF,OAAOE,EAAeoG,GAC3B,MAAMjF,EAAU,IAAIgD,EAOpB,OALAxD,KAAKgB,UAAUR,EAAS,8BACtBkF,EAAGrG,GACoB,iBAAZoG,EAAuB,CAAEhF,KAAMgF,GAAYA,IACrDxE,OAAOC,GAAQV,EAAQK,KAAK,QAASK,KAEjCV,EAGIrB,iBAAiB8F,4CAC5B,aAAcjF,KAAKX,MAAkB,qBAAsB,CAAEqG,EAAGT,KAC7D3E,QAGEnB,cAAcwG,GACnB,MAAMnF,EAAU,IAAIgD,EAIpB,OAFKxD,KAAK4F,kBAAkBpF,EAASmF,GAE9BnF,EAGKrB,kBACZqB,EACAmF,4CAEA,IAAK,IAAIE,EAAI,EAAGA,EAAIF,EAAYG,SAC1BtF,EAAQI,UAD0BiF,GAAK,GAAI,CAK/C,MAAME,EAAoB,CAAEJ,YAAaA,EAAYK,MAAMH,EAAGA,EAAI,MAE5DvF,KAAEA,EAAIC,UAAEA,SAAoBP,KAAKX,MACrC,wBACAyC,EACAiE,GAGFvF,EAAQyF,QAAQ,eAAiB1F,MAAAA,EAAAA,EAAa,IAEzCC,EAAQI,WAAWJ,EAAQyF,QAAQ,UAAW3F,GAE/CE,EAAQO,qBAAqBP,EAAQW,SAGtCX,EAAQI,WAAWJ,EAAQK,KAAK,OAErCL,EAAQK,KAAK,aEtZjB,MAAe,IAtDf,cAAsB3B,EACPC,qDACX,aAAca,KAAKX,MAAkB,uBAAuBiB,QAGjDnB,uDACX,aAAca,KAAKX,MAAkB,yBAAyBiB,QAGnDnB,oDACX,aAAca,KAAKX,MAAkB,sBAAsBiB,QAGhDnB,yDACX,aAAca,KAAKX,MAAkB,2BAA2BiB,QAGrDnB,6DACX,aAAca,KAAKX,MAAkB,+BAA+BiB,QAGzDnB,qDACX,aAAca,KAAKX,MAAkB,uBAAuBiB,QAGjDnB,yDACX,aAAca,KAAKX,MAAkB,2BAA2BiB,QAGrDnB,4DACX,aAAca,KAAKX,MAAkB,8BAA8BiB,QAGxDnB,sDACX,aAAca,KAAKX,MAAkB,wBAAwBiB,QAGlDnB,kDACX,aAAca,KAAKX,MAAkB,mBAAmBiB,QAG7CnB,uDACX,aAAca,KAAKX,MAAkB,wBAAwBiB,QAGlDnB,qDACX,aAAca,KAAKX,MAAkB,sBAAsBiB,QAGhDnB,sDACX,aAAca,KAAKX,MAAkB,uBAAuBiB,UClChE,MAAe,IANf,cAAmBpB,EACJC,yDACX,aAAca,KAAKX,MAA0B,mBAAmBiB,UCyBpE,ICrCK4F,IDqCU,IA/Bf,cAAsBhH,EACPC,KAAK8D,4CAChB,aAAcjD,KAAKX,MAAoB,CAAC,QAAS4D,EAAI,aAAa3C,QAGvDnB,MAAMmG,EAAiBH,4CAClC,aACQnF,KAAKX,MAAoB,CAC7B,QACAiG,EACA,GAAGH,IACH,aAEF7E,QAGSnB,eAAe8D,4CAC1B,aAAcjD,KAAKX,MAAoB,CAAC,mBAAoB4D,EAAI,aAC7D3C,QAGQnB,SAAS8D,4CACpB,aAAcjD,KAAKX,MAAoB,CAAC,aAAc4D,EAAI,aAAa3C,QAG5DnB,UAAU8D,4CACrB,aAAcjD,KAAKX,MAAoB,CAAC,cAAe4D,EAAI,aACxD3C,WCjCP,SAAK4F,GACHA,mBACAA,6BACAA,yBACAA,iCACAA,uCACAA,6BACAA,mCACAA,6BACAA,2CACAA,uCACAA,8BACAA,gCACAA,8BACAA,4BACAA,sBACAA,0BACAA,kBACAA,sBACAA,sBACAA,kCApBF,CAAKA,IAAAA,OA6DL,MAAe,IAlBf,cAAmBhH,EACJC,+CACX,aAAca,KAAKX,MAAiB,SAASiB,QAGlCnB,OAAO6C,4CAClB,OAAOhC,KAAKX,MAAW,CAAC,OAAQ2C,OAGrB7C,KAAK8D,4CAChB,OAAOjD,KAAKX,MAAW,CAAC,OAAQ4D,OAGrB9D,cAAc8D,4CACzB,OAAOjD,KAAKX,MAAW,CAAC,iBAAkB4D,SCxB9C,ICnCKkD,IDmCU,IAVf,cAAwBjH,EACTC,+CACX,aAAca,KAAKX,MAAwB,cAAciB,QAG9CnB,UAAUiH,4CACrB,OAAOpG,KAAKX,MAAgB,uBAAwB,CAAEgH,KAAMD,kBEXhDrE,IACd,OAAO7C,EAAaM,mBASN8G,EACdvG,EACAK,EACAF,GAEAhB,EAAaY,MAAQ,CAAEC,SAAAA,EAAUK,QAAAA,EAASF,SAAAA,IDnC5C,SAAKiG,GACHA,aACAA,aACAA,aACAA,aACAA,aALF,CAAKA,IAAAA"}
|
|
1
|
+
{"version":3,"file":"skryfall.es5.min.js","sources":["../src/query/MagicPageResult.ts","../src/error/MagicQueryError.ts","../src/query/MagicQuery.ts","../src/api/Cards.ts"],"sourcesContent":["import { PageQuery, ResultList } from '../types';\nimport MagicQuery from './MagicQuery';\n\nexport default class MagicPageResult<T, Q extends MagicQuery, P = unknown> {\n private hasMore: boolean;\n\n constructor(\n private readonly q: Q,\n private readonly apiPath: string,\n private readonly query: PageQuery,\n private readonly post?: P\n ) {\n this.hasMore = true;\n }\n\n private _count?: number;\n\n public get count() {\n return this._count;\n }\n\n public async all(): Promise<T[]> {\n const r: T[] = [];\n while (this.hasMore) {\n const result = await this.next();\n r.push(...result);\n }\n return r;\n }\n\n public async get(limit: number): Promise<T[]> {\n const r: T[] = [];\n while (this.hasMore) {\n const result = await this.next();\n r.push(...result);\n if (r.length == limit) {\n return r;\n } else if (r.length > limit) {\n return r.slice(0, limit);\n }\n }\n return r;\n }\n\n public async next(): Promise<T[]> {\n const results = await this.q.query<ResultList<T>, P>(\n this.apiPath,\n this.query,\n this.post\n );\n this.hasMore = results?.has_more || false;\n this._count = Number.parseInt((results?.total_cards || 0) + '');\n if (this.hasMore) {\n this.setNextPage();\n }\n return results?.data || [];\n }\n\n public async page(page: number): Promise<T[]> {\n this.query.page = page;\n return this.next();\n }\n\n private setNextPage(): void {\n this.query.page = this.query.page + 1;\n }\n}\n","import { SearchError } from '../types/SearchError';\n\nexport class MagicQueryError extends Error {\n constructor(readonly data?: SearchError) {\n super(data?.details);\n Object.setPrototypeOf(this, MagicQueryError.prototype);\n }\n}\n","import Axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios';\nimport { MagicQueryError } from '../error/MagicQueryError';\nimport { Query, RetryStrategy, SearchError, TOrArrayOfT } from '../types';\n\nexport default class MagicQuery {\n public static retry: RetryStrategy = { attempts: 1 };\n // the path to the api\n private static readonly endpoint = 'https://api.scryfall.com';\n // time where the last api call was made\n private static lastQuery = 100;\n // the api requests 50-100 ms between calls, we go on the generous side and never wait less than 100 ms between calls\n private static readonly rateLimit = 100;\n\n private static canRetry(error?: SearchError) {\n if (error?.code == 'not_found' || error?.code == 'bad_request')\n return false;\n return !MagicQuery.retry.canRetry || MagicQuery.retry.canRetry(error);\n }\n\n private static async debounce(): Promise<void> {\n const now = Date.now();\n const timeSinceLastQuery = now - MagicQuery.lastQuery;\n if (timeSinceLastQuery >= MagicQuery.rateLimit) {\n MagicQuery.lastQuery = now;\n } else {\n const timeUntilNextQuery = MagicQuery.rateLimit - timeSinceLastQuery;\n MagicQuery.lastQuery += timeUntilNextQuery;\n await MagicQuery.sleep(timeUntilNextQuery);\n }\n }\n\n private static sleep(ms = 0) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private static async tryQuery<T, Y>(\n apiPath: string,\n query?: Query,\n post?: Y,\n requestOptions?: AxiosRequestConfig\n ): Promise<AxiosResponse<T, Y>> {\n await MagicQuery.debounce();\n\n const config: AxiosRequestConfig<Y> = {\n data: post,\n method: post ? 'POST' : 'GET',\n params: query,\n url: `${MagicQuery.endpoint}/${apiPath}`,\n ...requestOptions,\n };\n\n try {\n return await Axios.request<T, AxiosResponse<T>, Y>(config);\n } catch (e: any) {\n if (e['isAxiosError']) {\n const error = e as AxiosError<SearchError>;\n throw new MagicQueryError(error.response?.data);\n } else {\n throw e;\n }\n }\n }\n\n public async query<T = unknown, Y = unknown>(\n apiPath: TOrArrayOfT<string | number | undefined>,\n query?: Query,\n post?: Y,\n requestOptions?: AxiosRequestConfig\n ): Promise<T | undefined> {\n if (Array.isArray(apiPath)) {\n apiPath = apiPath.join('/');\n }\n\n let retries: number;\n let result;\n\n for (retries = 0; retries < MagicQuery.retry.attempts; retries++) {\n let error: SearchError | undefined;\n try {\n result = await MagicQuery.tryQuery<T, Y>(\n `${apiPath}`,\n query,\n post,\n requestOptions\n );\n } catch (e: any) {\n if (e instanceof MagicQueryError) {\n error = e.data;\n } else {\n throw e;\n }\n }\n if (result || !MagicQuery.canRetry(error)) break;\n await MagicQuery.sleep(MagicQuery.retry.timeout);\n }\n\n return result?.data;\n }\n}\n","import MagicPageResult from '../query/MagicPageResult';\nimport MagicQuery from '../query/MagicQuery';\nimport {\n Card,\n CardIdentifier,\n ResultCatalog,\n ResultList,\n SearchOptions,\n} from '../types';\n\nclass Cards extends MagicQuery {\n public async autoCompleteName(name: string): Promise<string[]> {\n const result = await this.query<ResultCatalog>('cards/autocomplete', {\n q: name,\n });\n return result?.data || [];\n }\n\n public async byArenaId(id: number): Promise<Card | undefined> {\n return this.query<Card>(['cards/arena', id]);\n }\n\n public async byId(id: string): Promise<Card | undefined> {\n return this.query<Card>(['cards', id]);\n }\n\n public async byMtgoId(id: number): Promise<Card | undefined> {\n return this.query<Card>(['cards/mtgo', id]);\n }\n\n public async byMultiverseId(id: number): Promise<Card | undefined> {\n return this.query<Card>(['cards/multiverse', id]);\n }\n\n public async byName(name: string, fuzzy?: boolean): Promise<Card | undefined>;\n\n public async byName(\n name: string,\n set?: string,\n fuzzy?: boolean\n ): Promise<Card | undefined>;\n\n public async byName(\n name: string,\n set?: string | boolean,\n fuzzy = false\n ): Promise<Card | undefined> {\n if (typeof set === 'boolean') {\n fuzzy = set;\n set = undefined;\n }\n\n return this.query<Card>('cards/named', {\n [fuzzy ? 'fuzzy' : 'exact']: name,\n set,\n });\n }\n\n public async bySet(\n setCode: string,\n collectorNumber: number,\n lang?: string\n ): Promise<Card | undefined> {\n const path = ['cards', setCode, collectorNumber];\n if (lang) path.push(lang);\n return this.query<Card>(path);\n }\n\n public async byTcgPlayerId(id: number): Promise<Card | undefined> {\n return this.query<Card>(['cards/tcgplayer', id]);\n }\n\n public async collection(...identifiers: CardIdentifier[]): Promise<Card[]> {\n const cards: Card[] = [];\n for (let i = 0; i < identifiers.length; i += 75) {\n // the api only supports a max collection size of 75, so we take the list of identifiers (any length)\n // and split it into 75 card-max requests\n const collectionSection = { identifiers: identifiers.slice(i, i + 75) };\n\n const result = await this.query<ResultList<Card, CardIdentifier>>(\n 'cards/collection',\n undefined,\n collectionSection\n );\n cards.push(...(result?.data || []));\n }\n return cards;\n }\n\n public async random(): Promise<Card | undefined> {\n return this.query<Card>('cards/random');\n }\n\n public search(\n query: string,\n options?: SearchOptions | number\n ): MagicPageResult<Card, Cards> {\n return new MagicPageResult<Card, Cards>(this, 'cards/search', {\n q: query,\n ...(typeof options === 'number'\n ? { page: options }\n : { page: 1, ...options }),\n });\n }\n}\n\nexport default new Cards();\n"],"names":["MagicPageResult","constructor","q","apiPath","query","post","this","hasMore","count","_count","all","r","result","next","push","get","limit","length","slice","results","has_more","Number","parseInt","total_cards","setNextPage","data","page","MagicQueryError","Error","super","details","Object","setPrototypeOf","prototype","MagicQuery","static","error","code","retry","canRetry","now","Date","timeSinceLastQuery","lastQuery","rateLimit","timeUntilNextQuery","sleep","ms","Promise","resolve","setTimeout","requestOptions","debounce","config","method","params","url","endpoint","Axios","request","e","response","retries","Array","isArray","join","attempts","tryQuery","timeout","autoCompleteName","name","byArenaId","id","byId","byMtgoId","byMultiverseId","byName","set","fuzzy","undefined","bySet","setCode","collectorNumber","lang","path","byTcgPlayerId","collection","identifiers","cards","i","collectionSection","random","search","options"],"mappings":"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"}
|