Initial commit.

Classes and interfaces in place. The QueryBuilder generics are still a work in progress
This commit is contained in:
Bradyn Glines
2018-01-18 17:19:41 -07:00
commit 92c2dea62f
25 changed files with 371 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
node_modules

43
package-lock.json generated Normal file
View File

@ -0,0 +1,43 @@
{
"name": "pokemon-tcg-sdk-typescript",
"version": "0.0.1",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"axios": {
"version": "0.17.1",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.17.1.tgz",
"integrity": "sha1-LY4+XQvb1zJ/kbyBT1xXZg+Bgk0=",
"requires": {
"follow-redirects": "1.3.0",
"is-buffer": "1.1.6"
}
},
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"requires": {
"ms": "2.0.0"
}
},
"follow-redirects": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.3.0.tgz",
"integrity": "sha1-9oSHH8EW0uMp/aVe9naH9Pq8kFw=",
"requires": {
"debug": "3.1.0"
}
},
"is-buffer": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
}
}
}

20
package.json Normal file
View File

@ -0,0 +1,20 @@
{
"name": "pokemon-tcg-sdk-typescript",
"version": "0.0.1",
"description": "Typescript SDK for the PokemonTCG API (https://api.pokemontcg.io)",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"PokemonTCG",
"Typescript",
"API",
"SDK"
],
"author": "Bradyn Glines",
"license": "MIT",
"dependencies": {
"axios": "^0.17.1"
}
}

9
src/classes/ability.ts Normal file
View File

@ -0,0 +1,9 @@
import { IAbility } from '../interfaces/ability';
export class Ability implements IAbility {
name: string;
text: string;
type: string;
constructor() {}
}

View File

@ -0,0 +1,8 @@
import { IAncientAbility } from '../interfaces/ancientAbility';
export class AncientAbility implements IAncientAbility {
name: string;
text: string;
constructor() {}
}

11
src/classes/attack.ts Normal file
View File

@ -0,0 +1,11 @@
import { IAttack } from '../interfaces/attack';
export class Attack implements IAttack {
cost: string;
name: string;
text: string;
damage: string;
convertedEnergyCost: string;
constructor() {}
}

52
src/classes/card.ts Normal file
View File

@ -0,0 +1,52 @@
import { ICard } from '../interfaces/card';
import { ISubType } from '../interfaces/subType';
import { ISuperType } from '../interfaces/superType';
import { IAbility } from '../interfaces/ability';
import { ISet } from '../interfaces/set';
import { IType } from '../interfaces/type';
import { IAttack } from '../interfaces/attack';
import { QueryBuilder } from '../queryBuilder';
export class Card implements ICard {
id: number;
name: string;
imageUrl: string;
imageUrlHighRes: string;
subType: ISubType;
superType: ISuperType;
ability: IAbility;
hp: number;
number: number;
artist: string;
rarity: string;
series: string;
set: ISet;
setCode: string;
retreatCost: string;
text: string;
types: IType[];
attacks: IAttack[];
weaknesses: string[];
resistances: string[];
nationalPokedexNumber: number;
ancientTrait: string;
evolvesFrom: string;
constructor() {}
static resource(): string {
return 'cards';
}
find(id: string): Card {
return QueryBuilder.find<Card>(id);
}
all(): ICard[] {
throw new Error("Method not implemented.");
}
where(args: object): ICard {
throw new Error("Method not implemented.");
}
}

32
src/classes/set.ts Normal file
View File

@ -0,0 +1,32 @@
import { ISet } from '../interfaces/set';
export class Set implements ISet {
code: string;
name: string;
series: string;
totalCards: number;
standardLegal: boolean;
expandedLegal: boolean;
releaseDate: string;
symbolUrl: string;
ptcgoCode: string;
constructor() {}
resource(): string {
return "sets";
}
find(id: number): ISet {
throw new Error("Method not implemented.");
}
all(): ISet[] {
throw new Error("Method not implemented.");
}
where(args: object): ISet {
throw new Error("Method not implemented.");
}
}

14
src/classes/subType.ts Normal file
View File

@ -0,0 +1,14 @@
import { ISubType } from '../interfaces/subType';
export class SubType implements ISubType {
constructor() {}
resource(): string {
return 'subtypes';
}
all(): ISubType[] {
throw new Error("Method not implemented.");
}
}

13
src/classes/superType.ts Normal file
View File

@ -0,0 +1,13 @@
import { ISuperType } from '../interfaces/superType';
export class SuperType implements ISuperType {
constructor () {}
resource(): string {
return 'supertypes';
}
all(): ISuperType[] {
throw new Error("Method not implemented.");
}
}

16
src/classes/type.ts Normal file
View File

@ -0,0 +1,16 @@
import { IType } from '../interfaces/type';
export class Type implements IType {
type: string;
value: string;
constructor() {}
resource(): string {
return 'types';
}
all(): IType[] {
throw new Error("Method not implemented.");
}
}

34
src/client.ts Normal file
View File

@ -0,0 +1,34 @@
import * as axios from 'axios';
import { PokemonTCG } from './sdk';
import { IQuery } from './interfaces/query';
import { ICard } from './interfaces/card';
import { IType } from './interfaces/type';
import { ISuperType } from './interfaces/superType';
import { ISubType } from './interfaces/subType';
import { ISet } from './interfaces/set';
export class Client {
static apiUrl: string = `${PokemonTCG.API_URL}/v${PokemonTCG.version}`;
static get(resource: string, params?: IQuery[]): axios.AxiosPromise<any> {
let config: axios.AxiosRequestConfig = {
headers: {
'Content-Type': 'application/json'
}
};
return axios.default.get<any>(`${Client.apiUrl}/${resource}?${Client.paramsToQuery(params)}`, config);
}
private static paramsToQuery(params?: IQuery[]): string {
let query: string = '';
if (params !== null) {
params.map((q: IQuery) => {
query += `${q.name}=${encodeURI(q.value)}`.concat('&');
});
}
return query;
}
}

View File

@ -0,0 +1,5 @@
export interface IAbility {
name: string;
text: string;
type: string;
}

View File

@ -0,0 +1,4 @@
export interface IAncientAbility {
name: string;
text: string;
}

7
src/interfaces/attack.ts Normal file
View File

@ -0,0 +1,7 @@
export interface IAttack {
cost: string;
name: string;
text: string;
damage: string;
convertedEnergyCost: string;
}

37
src/interfaces/card.ts Normal file
View File

@ -0,0 +1,37 @@
import { IAbility } from '../interfaces/ability';
import { IAttack } from '../interfaces/attack';
import { ISet } from '../interfaces/set';
import { ISubType } from '../interfaces/subType';
import { ISuperType } from '../interfaces/superType';
import { IType } from '../interfaces/type';
export interface ICard {
id: number;
name: string;
imageUrl: string;
imageUrlHighRes: string;
subType: ISubType;
superType: ISuperType;
ability: IAbility;
hp: number;
number: number;
artist: string;
rarity: string;
series: string;
set: ISet;
setCode: string;
retreatCost: string;
text: string;
types: IType[];
attacks: IAttack[];
weaknesses: string[];
resistances: string[];
nationalPokedexNumber: number;
ancientTrait: string;
evolvesFrom: string;
resource(): string;
find(id: number): ICard;
all(): ICard[];
where(args: object): ICard;
}

4
src/interfaces/query.ts Normal file
View File

@ -0,0 +1,4 @@
export interface IQuery {
name: string;
value: string;
}

16
src/interfaces/set.ts Normal file
View File

@ -0,0 +1,16 @@
export interface ISet {
code: string;
name: string;
series: string;
totalCards: number;
standardLegal: boolean;
expandedLegal: boolean;
releaseDate: string;
symbolUrl: string;
ptcgoCode: string;
resource(): string;
find(id: number): ISet;
all(): ISet[];
where(args: object): ISet;
}

View File

@ -0,0 +1,4 @@
export interface ISubType {
resource(): string;
all(): ISubType[];
}

View File

@ -0,0 +1,4 @@
export interface ISuperType {
resource(): string;
all(): ISuperType[];
}

7
src/interfaces/type.ts Normal file
View File

@ -0,0 +1,7 @@
export interface IType {
type: string;
value: string;
resource(): string;
all(): IType[];
}

1
src/playground/index.ts Normal file
View File

@ -0,0 +1 @@
import {}

14
src/queryBuilder.ts Normal file
View File

@ -0,0 +1,14 @@
import { Client } from './client';
import { Card } from "./classes/card";
import { Set } from "./classes/set";
import { Type } from "./classes/type";
import { SubType } from "./classes/subType";
import { SuperType } from "./classes/superType";
import { IQuery } from './interfaces/query';
import { AxiosResponse } from 'axios';
export class QueryBuilder {
static find<T>(type: (new() => T), id: string): T {
Client.get(type.resource())
}
}

4
src/sdk.ts Normal file
View File

@ -0,0 +1,4 @@
export namespace PokemonTCG {
export const API_URL: string = 'https://api.pokemontcg.io';
export const version: string = '1';
}

11
tsconfig.json Normal file
View File

@ -0,0 +1,11 @@
{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"declaration": true,
"outDir": "./dist"
},
"include": [
"src/**/*"
]
}