Compare commits

...

12 Commits

Author SHA1 Message Date
46b74170fa v2.3.1 2021-06-22 21:45:27 +02:00
de916e09eb Cleaned dist folder
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2021-06-22 21:45:04 +02:00
96bc9149c9 Added a version script
It automaticly update the version number without importing package.json

Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2021-06-22 21:40:28 +02:00
f858bd5c79 Updated documents
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2021-06-22 21:33:19 +02:00
8a0dac5e27 Changed back to master
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2021-06-22 21:03:38 +02:00
941fd925b8 Reworked Request (#10)
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2021-06-22 20:51:33 +02:00
3684c61812 Fixed not actions not running on the branch
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2021-06-22 20:39:52 +02:00
a2f7018aa4 Add Github actions (#9)
* First try

Signed-off-by: Avior <florian.bouillon@delta-wings.net>

* Removed Nodejs 15.x from tests

Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2021-06-22 20:27:25 +02:00
7014e0c511 Added ESLint
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2021-06-22 19:54:38 +02:00
b951f6d2d1 Added Tests :D
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2021-06-22 19:46:00 +02:00
babd4e5f85 v2.3.0-beta.2 2021-06-22 17:11:40 +02:00
efe5957946 Fixed browser context and header error
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2021-06-22 17:11:01 +02:00
19 changed files with 4422 additions and 1328 deletions

4
.eslintignore Normal file
View File

@ -0,0 +1,4 @@
dist/
src/tcgdex.browser.ts
__tests__
*.js

322
.eslintrc.js Normal file
View File

@ -0,0 +1,322 @@
/**
* ESLint custom configuration v1.0.0
* packages needed:
* eslint
* for Typescript
* @typescript-eslint/parser
* @typescript-eslint/eslint-plugin
*/
module.exports = {
env: {
browser: true,
es6: true,
node: true
},
extends: [
"eslint:all",
"plugin:@typescript-eslint/recommended",
],
globals: {
Atomics: "readonly",
SharedArrayBuffer: "readonly"
},
parser: "@typescript-eslint/parser",
parserOptions: {
project: "tsconfig.json"
},
plugins: [
"@typescript-eslint"
],
root: true,
rules: {
// Tab indent and force switch to have one too
indent: [
"error",
"tab",
{SwitchCase: 1}
],
// \n linebreak
"linebreak-style": [
"error",
"unix"
],
// Disable eslint default quote because Typescript replace it
quotes: "off",
"@typescript-eslint/quotes": [
"error",
"single",
{ avoidEscape: true }
],
// Simply diallow using ';' unless mandatory
semi: "off",
"@typescript-eslint/semi": [
"error",
"never",
{ "beforeStatementContinuationChars": "always"}
],
// Disallow things that do nothing in the end
"no-unused-expressions": "off",
"@typescript-eslint/no-unused-expressions": [
"error",
{ "enforceForJSX": true,}
],
// force overloads to be next to one another
"@typescript-eslint/adjacent-overload-signatures": "error",
// Force to use `Array<thing>
"@typescript-eslint/array-type": [
"error",
{ default: 'generic' }
],
// Warn when no return type is specified
"@typescript-eslint/explicit-module-boundary-types": "warn",
// disallow certain types not safe
"@typescript-eslint/ban-types": [
"error",
{
"types": {
"{}": false
}
}
],
"@typescript-eslint/consistent-type-assertions": "error",
"@typescript-eslint/consistent-type-definitions": "error",
"@typescript-eslint/explicit-member-accessibility": [
"error",
{
accessibility: "explicit"
}
],
"@typescript-eslint/interface-name-prefix": "off",
"@typescript-eslint/member-delimiter-style": [
"error",
{
multiline: {
delimiter: "none",
requireLast: true
},
singleline: {
delimiter: "comma",
requireLast: false
}
}
],
"@typescript-eslint/member-ordering": "error",
"@typescript-eslint/no-empty-function": "error",
"@typescript-eslint/no-empty-interface": "error",
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-misused-new": "error",
"@typescript-eslint/no-namespace": "error",
"@typescript-eslint/no-parameter-properties": "off",
"@typescript-eslint/no-use-before-define": "off",
"@typescript-eslint/prefer-for-of": "error",
"@typescript-eslint/prefer-function-type": "error",
"@typescript-eslint/prefer-namespace-keyword": "error",
"@typescript-eslint/triple-slash-reference": "error",
"@typescript-eslint/type-annotation-spacing": "error",
"@typescript-eslint/unified-signatures": "error",
"arrow-body-style": "error",
"arrow-parens": [
"error",
"always"
],
camelcase: "error",
complexity: "off",
"constructor-super": "error",
curly: "error",
"dot-notation": "error",
"eol-last": "error",
eqeqeq: [
"error",
"smart"
],
"guard-for-in": "warn",
"id-blacklist": [
"error",
"any",
"Number",
"number",
"String",
"string",
"Boolean",
"boolean",
"Undefined"
],
"id-match": "error",
"max-classes-per-file": [
"error",
1
],
"max-len": [
"warn",
{
code: 200
}
],
"@typescript-eslint/no-inferrable-types": "off",
"new-parens": "error",
"no-bitwise": "error",
"no-caller": "error",
"no-cond-assign": "error",
"no-debugger": "error",
"no-empty": "error",
"no-eval": "error",
"no-fallthrough": "off",
"no-invalid-this": "off",
"no-multiple-empty-lines": "error",
"no-new-wrappers": "error",
"no-shadow": [
"error",
{
hoist: "all"
}
],
"no-throw-literal": "error",
"no-trailing-spaces": "error",
"no-undef-init": "error",
"no-underscore-dangle": "error",
"no-unsafe-finally": "error",
"no-unused-labels": "error",
"no-unused-vars": "off",
"no-var": "error",
"object-shorthand": "error",
"one-var": [
"error",
"never"
],
"prefer-const": "error",
"quote-props": [
"error",
"consistent-as-needed"
],
"radix": "error",
"space-before-function-paren": "off",
"@typescript-eslint/space-before-function-paren": ["error", {
asyncArrow: "always",
anonymous: "never",
named: "never"
}],
"spaced-comment": "error",
"use-isnan": "error",
"valid-typeof": "off",
// some tests from eslint:all
"no-tabs": "off",
"padded-blocks": [
"error",
{
"blocks": "never",
"classes": "always",
"switches": "never"
}
],
"sort-imports": "off",
"no-console": "off",
"function-call-argument-newline": [
"error",
"consistent"
],
"dot-location": [
"error",
"property"
],
"object-curly-spacing": [
"error",
"always"
],
"array-element-newline": [
"error",
"consistent"
],
"function-paren-newline": [
"error",
"consistent"
],
"no-use-before-define": "off",
"@typescript-eslint/no-use-before-define": "error",
"capitalized-comments": "off",
"multiline-comment-style": "off",
"no-extra-parens": "off",
"@typescript-eslint/no-extra-parens": [
"error",
"all",
{ "ignoreJSX": "multi-line" }
],
"func-style": [
"error",
"declaration",
{ "allowArrowFunctions": true }
],
"no-ternary": "off",
"multiline-ternary": "off",
"no-magic-numbers": "off",
"max-lines-per-function": [
"warn",
{
"skipBlankLines": true,
"skipComments": true
}
],
"prefer-promise-reject-errors": "warn",
"object-property-newline": [
"error",
{ "allowAllPropertiesOnSameLine": true }
],
"no-await-in-loop": "warn",
"no-undefined": "off",
"id-length": "warn",
"class-methods-use-this": "off",
"array-bracket-newline": [
"error",
"consistent"
],
"no-confusing-arrow": "off",
"no-nested-ternary": "off",
"no-mixed-operators": "off",
"max-statements": [
"warn",
15
],
"semi-style": [
"error",
"first"
],
"no-useless-constructor": "off",
"@typescript-eslint/no-useless-constructor": "error",
"lines-between-class-members": "off",
"@typescript-eslint/lines-between-class-members": "error",
"max-lines": [
"warn",
{
"max": 500,
"skipBlankLines": true,
"skipComments": true
}
],
"no-plusplus": "off",
"id-length": [
"warn",
{ "exceptions": ["_"] }
],
"default-param-last": "off",
// "@typescript-eslint/default-param-last": "error",
// Temporary OFF
"@typescript-eslint/default-param-last": "off",
"no-continue": "off",
"require-atomic-updates": "off",
"require-await": "off",
"prefer-destructuring": "off",
"max-params": ["warn", 5]
}
};

47
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,47 @@
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
name: Build & Test
on:
push:
branches:
- master
# Run on any pull request
pull_request:
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [12.x, 14.x, 16.x]
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- run: yarn
- run: yarn build
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Use Node.js 12.x
uses: actions/setup-node@v1
with:
node-version: 12.x
- run: yarn && yarn build
- run: yarn test
# You may pin to the exact commit or the version.
# uses: codecov/codecov-action@6004246f47ab62d32be025ce173b241cd84ac58e
- uses: codecov/codecov-action@v1.0.13
with:
# Comma-separated list of files to upload
files: ./coverage/coverage-final.json

27
.github/workflows/code-quality.yml vendored Normal file
View File

@ -0,0 +1,27 @@
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
name: Code Quality Checks
on:
push:
branches:
- master
# Run on any pull request
pull_request:
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
persist-credentials: false
- name: Setup NodeJS
uses: actions/setup-node@v2
with:
node-version: '16.x'
- name: Lint
run: yarn && yarn lint

2
.gitignore vendored
View File

@ -1,6 +1,8 @@
# Dev Files
node_modules
test.ts
coverage
# Dist files
dist
src/version.json

View File

@ -6,3 +6,4 @@ webpack.config.js
tsconfig.*
yarn.lock
CHANGELOG.md
coverage

View File

@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
## 2.3.1 - 2021-06-22
### Fixed
- Cleaned dist folder
## 2.3.0-2.3.1 - 2021-06-22
### Added
- Browser specialized build
- [#9](https://github.com/tcgdex/javascript-sdk/pull/9) Build/Unit/ESLint tests and coverage with Codecov using Github Action
### Changed
- [#10](https://github.com/tcgdex/javascript-sdk/pull/10) Simplified Request/Cache manager
## [2.2.0] - 2021-06-19
### Added
@ -55,10 +72,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Functions now use `fetch` instead of `get` in their names
- URL Normalization is now done by the SDK
### Fixed
- `getSerie(s)` now point to the correct endpoint
### Removed
- TranslationUtil as now translation are managed by the API
@ -186,8 +199,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Constructor arg support for multiple langs
- TranslationUtil to go from the SDK value to a text value
[Unreleased]: https://github.com/tcgdex/javascript-sdk/compare/v2.1.1...HEAD
[Unreleased]: https://github.com/tcgdex/javascript-sdk/compare/v2.3.1...HEAD
[2.3.1]: https://github.com/tcgdex/javascript-sdk/releases/tag/v2.3.1
[2.3.0]: https://github.com/tcgdex/javascript-sdk/releases/tag/v2.3.0
[2.2.0]: https://github.com/tcgdex/javascript-sdk/releases/tag/v2.2.0
[2.1.1]: https://github.com/tcgdex/javascript-sdk/releases/tag/v2.1.1
[2.1.0]: https://github.com/tcgdex/javascript-sdk/releases/tag/v2.1.0
[2.0.2-2.0.3]: https://github.com/tcgdex/javascript-sdk/releases/tag/v2.0.3

View File

@ -1,11 +1,31 @@
<p align="center">
<a href="http://npmjs.com/@tcgdex/sdk">
<img src="https://img.shields.io/npm/v/@tcgdex/sdk?style=flat-square" alt="NOM Version">
</a>
<a href="http://npmjs.com/@tcgdex/sdk">
<img src="https://img.shields.io/npm/dw/@tcgdex/sdk?style=flat-square" alt="NPM Downloads">
</a>
<a href="https://app.codecov.io/gh/tcgdex/javascript-sdk/">
<img src="https://img.shields.io/codecov/c/github/tcgdex/javascript-sdk?style=flat-square&token=FR4BI94N4Q" alt="npm version">
</a>
<a href="https://github.com/tcgdex/javascript-sdk/blob/master/LICENSE.md">
<img src="https://img.shields.io/github/license/tcgdex/javascript-sdk?style=flat-square" alt="the TCGdex JAvascript SDK is released under the MIT license." />
</a>
<a href="https://github.com/tcgdex/javascript-sdk/blob/master/LICENSE.md">
<img src="https://img.shields.io/github/workflow/status/tcgdex/javascript-sdk/Build%20&%20Test?style=flat-square" alt="the TCGdex JAvascript SDK is released under the MIT license." />
</a>
</p>
# TCGdex JavaScript/TypeScript SDK
This is the SDK used to communicate with the Open source [TCGdex API](https://www.github.com/tcgdex/cards-database)
Communicate with the Open Source TCGdex API in Javascript/Typescript using the SDK
Full API/SDK documentation in progress at https://www.tcgdex.net/docs
## Install
## Getting Started
Install the SDK using:
```bash
yarn add @tcgdex/sdk
# or
@ -20,7 +40,7 @@ _Note: a complete documentation is in progress_
import TCGdex from '@tcgdex/sdk'
// initialize the SDK
const tcgdex = new TCGdex('en') // Lang code (Optionnal) (See interfaces.d.ts line 1 for supported languages)
const tcgdex = new TCGdex('en') // Lang code (Optionnal) (See interfaces.ts line 1 for supported languages)
// if you need to change the language
tcgdex.lang = 'fr'

66
__tests__/basic.test.js Normal file
View File

@ -0,0 +1,66 @@
const TCGdex = require("../src/tcgdex").default
const fetch = require('node-fetch')
const fakeFetch = (response, status = 200) => jest.fn(() =>
Promise.resolve({
status: status,
json: () => Promise.resolve(response),
})
);
test('Basic test', async () => {
const tcgdex = new TCGdex('en')
TCGdex.fetch = fakeFetch({ok: true})
const res = await tcgdex.fetch('cards', 'basic-test')
expect(res).toEqual({ok: true})
expect(TCGdex.fetch).toHaveBeenCalledTimes(1)
})
test('Cache test', async () => {
const tcgdex = new TCGdex('en')
TCGdex.fetch = fakeFetch({ok: 'a'})
const res1 = await tcgdex.fetch('cards', 'cache-test')
expect(res1).toEqual({ok: 'a'})
TCGdex.fetch = fakeFetch({ok: 'b'})
const res2 = await tcgdex.fetch('cards', 'cache-test')
expect(res2).toEqual({ok: 'a'})
})
test('endpoint errors', async () => {
const tcgdex = new TCGdex('en')
TCGdex.fetch = fakeFetch({ok: 'a'})
await expect(tcgdex.fetch('non existing endpoint')).rejects.toThrow()
await expect(tcgdex.fetch()).rejects.toThrow()
})
test('404 test', async () => {
const tcgdex = new TCGdex('en')
TCGdex.fetch = fakeFetch(undefined, 404)
expect(
await tcgdex.fetch('cards', '404-test')
).not.toBeDefined()
})
test('test real endpoints', async () => {
const tcgdex = new TCGdex('en')
TCGdex.fetch = fetch
const endpoints = [
{endpoint: 'fetchCard', params: ['swsh1-1']},
{endpoint: 'fetchCard', params: ['1', 'Sword & Shield']},
{endpoint: 'fetchCards', params: ['swsh1']},
{endpoint: 'fetchCards', params: []},
{endpoint: 'fetchSet', params: ['swsh1']},
{endpoint: 'fetchSets', params: ['swsh']},
{endpoint: 'fetchSets', params: []},
{endpoint: 'fetchSeries', params: []},
{endpoint: 'fetchSerie', params: ['swsh']},
]
for await (const item of endpoints) {
expect(
await tcgdex[item.endpoint](...item.params)
).toBeDefined()
}
})

7
babel.config.js Normal file
View File

@ -0,0 +1,7 @@
// Babel config for Jest
module.exports = {
presets: [
['@babel/preset-env', {targets: {node: 'current'}}],
'@babel/preset-typescript'
],
};

View File

@ -1,44 +1,58 @@
{
"name": "@tcgdex/sdk",
"version": "2.3.0-beta.1",
"main": "./dist/cjs/tcgdex.js",
"module": "./dist/modules/tcgdex.js",
"version": "2.3.1",
"main": "./dist/cjs/tcgdex.node.js",
"types": "./dist/types/tcgdex.d.ts",
"repository": "https://github.com/tcgdex/javascript-sdk.git",
"homepage": "https://github.com/tcgdex/javascript-sdk",
"author": "Aviortheking",
"keywords": [
"tcgdex",
"pokemon",
"trading",
"card",
"tcg",
"sdk",
"api",
"typescript",
"javascript",
"typing"
],
"license": "MIT",
"devDependencies": {
"@parcel/packager-ts": "2.0.0-beta.2",
"@babel/core": "^7.14.6",
"@babel/preset-env": "^7.14.7",
"@babel/preset-typescript": "^7.14.5",
"@types/node-fetch": "^2.5.10",
"awesome-typescript-loader": "^5.2.1",
"@typescript-eslint/eslint-plugin": "^4.28.0",
"@typescript-eslint/parser": "^4.28.0",
"eslint": "^7.29.0",
"jest": "^27.0.5",
"ts-loader": "^9.2.3",
"ts-node": "^10.0.0",
"typescript": "^4.1.3",
"webpack": "^5.40.0",
"webpack-nano": "^1.1.1"
},
"engines": {
"node": ">=12"
},
"dependencies": {
"node-fetch": "^2.6.1",
"isomorphic-unfetch": "^3.1.0",
"unfetch": "^4.2.0"
},
"scripts": {
"build": "yarn build:cjs && yarn build:browser && yarn build:es2015",
"prebuild": "node scripts/export-version-number.js",
"build": "yarn prebuild && yarn build:cjs && yarn build:browser && yarn build:es2015",
"build:cjs": "tsc --project tsconfig.json",
"build:es2015": "tsc --project tsconfig.es2015.json",
"build:browser": "wp --config webpack.config.js",
"prepublishOnly": "yarn build"
"prepublishOnly": "yarn build",
"lint": "eslint",
"test": "jest --coverage"
},
"files": [
"dist"
],
"sideEffects": false,
"targets": {
"browser": {
"context": "browser",
"engines": {
"browsers": "since 2017-06"
},
"includeNodeModules": true,
"optimize": false,
"scopeHoist": false
}
}
"sideEffects": false
}

View File

@ -0,0 +1,4 @@
const { version } = require('../package.json')
const fs = require('fs')
fs.writeFileSync('./src/version.json', JSON.stringify({version}))

View File

@ -1,51 +1,31 @@
import TCGdex from './tcgdex'
import { version } from './version.json'
export default class RequestWrapper {
private static cache: Array<Request<any>> = []
export default class Request {
public static getRequest<T>(url: string) {
let req = this.cache.find((req) => req.url === url) as Request<T>|undefined
if (!req) {
req = new Request<T>(url)
this.cache.push(req)
}
return req
}
}
// 1 hour of TTL by default
public static ttl = 1000 * 60 * 60
export class Request<T = any> {
public static ttl = 1000 * 60 * 60 // 1 hour
private static cache: Record<string, {response: any, time: number}> = {}
private response?: T
private fetched?: Date
public constructor(
public url: string // url is public for quick url test
) {}
public async get(): Promise<T | undefined> {
const now = new Date()
// if reponse was already fetched and TTL was not passed
if (
this.fetched &&
this.response &&
now.getTime() - this.fetched.getTime() < Request.ttl
) {
return this.response
}
// Fetch Response
const unfetch = TCGdex.fetch
const resp = await unfetch(this.url, {
headers: {
'user-agent': `@tcgdex/javascript-sdk/${TCGdex.VERSION}`
public static async fetch<T>(url: string): Promise<T | undefined> {
let request = this.cache[url]
const now = new Date().getTime()
if (!request || now - request.time > this.ttl) {
const unfetch = TCGdex.fetch
const resp = await unfetch(url, {
headers: {
'user-agent': `@tcgdex/javascript-sdk/${version}`
}
})
if (resp.status !== 200) {
return undefined
}
})
if (resp.status !== 200) {
return undefined
this.cache[url] = { response: await resp.json(), time: now }
request = this.cache[url]
}
this.response = await resp.json()
this.fetched = now
return this.response
return request.response
}
}

View File

@ -28,14 +28,16 @@ export interface SetResume {
logo?: string
symbol?: string
cardCount: {
/**
* total of number of cards
*/
total: number
/**
total: number
/**
* number of cards officialy (on the bottom of each cards)
*/
official: number
official: number
}
}
@ -53,6 +55,7 @@ export interface Set extends SetResume {
* card is banned from the set it will still be true
*/
legal: {
/**
* Ability to play in standard tournaments
*/
@ -65,26 +68,32 @@ export interface Set extends SetResume {
}
cardCount: {
/**
* total of number of cards
*/
total: number
/**
* number of cards officialy (on the bottom of each cards)
*/
official: number
/**
* number of cards having a normal version
*/
normal: number
/**
* number of cards having an reverse version
*/
reverse: number
/**
* number of cards having an holo version
*/
holo: number
/**
* Number of possible cards
*/
@ -159,8 +168,9 @@ export interface Card<SetType extends SetResume = SetResume> extends CardResume
/**
* Pokemon Types
* ex for multiple https://www.tcgdex.net/database/ex/ex13/17
*/
types?: Array<string> // ex for multiple https://www.tcgdex.net/database/ex/ex13/17
types?: Array<string>
/**
* Pokemon Sub Evolution
@ -257,7 +267,7 @@ export interface Card<SetType extends SetResume = SetResume> extends CardResume
retreat?: number
//Trainer/Energy
// Trainer/Energy
effect?: string
// Trainer Only
@ -277,6 +287,7 @@ export interface Card<SetType extends SetResume = SetResume> extends CardResume
* Note: all cards are avaialable to play in unlimited tournaments
*/
legal: {
/**
* Ability to play in standard tournaments
*/

View File

@ -1,7 +1,6 @@
import TCGdex from './tcgdex'
import unfetch from 'unfetch'
TCGdex.fetch = unfetch as any
TCGdex.fetch = window.fetch ?? unfetch as any
export default TCGdex
export * from './tcgdex'
module.exports = TCGdex

View File

@ -1,5 +1,5 @@
import TCGdex from './tcgdex'
import fetch from 'node-fetch'
import fetch from 'isomorphic-unfetch'
TCGdex.fetch = fetch as any

View File

@ -6,19 +6,16 @@ const ENDPOINTS: Array<Endpoint> = ['cards', 'categories', 'hp', 'illustrators',
const BASE_URL = 'https://api.tcgdex.net/v2'
export default class TCGdex {
public static fetch: typeof fetch
public static readonly VERSION = "2.2.0"
/**
* @deprecated to change the lang use `this.lang`
*/
public static defaultLang: SupportedLanguages = "en"
public static defaultLang: SupportedLanguages = 'en'
public constructor(public lang?: SupportedLanguages) {}
public getLang() {
public getLang(): SupportedLanguages {
return this.lang ?? TCGdex.defaultLang ?? 'en'
}
@ -50,7 +47,7 @@ export default class TCGdex {
/**
* @deprecated use `this.fetch('sets', set)`
*/
public async fetchSet(set: string) {
public async fetchSet(set: string): Promise<Set | undefined> {
return this.fetch('sets', set)
}
@ -87,11 +84,13 @@ export default class TCGdex {
* @param endpoint_1 {string} the card global ID
*/
public async fetch(...type: ['cards', string]): Promise<Card | undefined>
/**
* Fetch every cards in the database
* @param endpoint_0 'cards'
*/
public async fetch(type: 'cards'): Promise<Array<CardResume> | undefined>
/**
* Fetch a card using its local id and its set
* @param endpoint_0 'sets'
@ -99,28 +98,33 @@ export default class TCGdex {
* @param endpoint_2 {string} the card local ID
*/
public async fetch(...endpoint: ['sets', string, string]): Promise<Card | undefined>
/**
* Fetch a set
* @param endpoint_0 'sets'
* @param endpoint_1 {string} the set name or ID
*/
public async fetch(...endpoint: ['sets', string]): Promise<Set | undefined>
/**
* Fetch every sets
* @param endpoint_0 'sets'
*/
public async fetch(endpoint: 'sets'): Promise<SetList | undefined>
/**
* Fetch a serie
* @param endpoint_0 'series'
* @param endpoint_1 {string} the serie name or ID
*/
public async fetch(...endpoint: ['series', string]): Promise<Serie | undefined>
/**
* Fetch every series
* @param endpoint_0 'series'
*/
public async fetch(endpoint: 'series'): Promise<SerieList | undefined>
/**
* Fetch cards depending on a specific filter
* @param endpoint_0 {'categories' | 'hp' | 'illustrators' | 'rarities' | 'retreats' | 'types'}
@ -128,6 +132,7 @@ export default class TCGdex {
* @param endpoint_1 {string} the value set while fetching the index
*/
public async fetch(...endpoint: ['categories' | 'hp' | 'illustrators' | 'rarities' | 'retreats' | 'types', string]): Promise<StringEndpoint | undefined>
/**
* Fetch cards depending on a specific filter
* @param endpoint_0 {'hp' | 'retreats' | 'categories' | 'illustrators' | 'rarities' | 'types'}
@ -135,6 +140,7 @@ export default class TCGdex {
* @param endpoint_1 {string} Fetch the possible values to use depending on the endpoint
*/
public async fetch(endpoint: 'hp' | 'retreats' | 'categories' | 'illustrators' | 'rarities' | 'types'): Promise<Array<string> | undefined>
/**
* Fetch The differents endpoints depending on the first argument
* @param endpoint_0 {'hp' | 'retreats' | 'categories' | 'illustrators' | 'rarities' | 'types'}
@ -144,7 +150,7 @@ export default class TCGdex {
*/
public async fetch(...endpoint: Array<Endpoint | string>): Promise<any | undefined> {
if (endpoint.length === 0) {
throw new Error(`endpoint to fetch is empty!`)
throw new Error('endpoint to fetch is empty!')
}
// @ts-expect-error with the precedent check, we KNOW that type is not empty
const baseEndpoint = endpoint.shift().toLowerCase() as Endpoint
@ -159,8 +165,8 @@ export default class TCGdex {
*/
private makeRequest<T = any>(...url: Array<string | number>) {
// Normalize path
const path = url.map((v) => encodeURI(
v
const path = url.map((subPath) => encodeURI(
subPath
// Transform numbers to string
.toString()
// replace this special character with an escaped one
@ -168,10 +174,12 @@ export default class TCGdex {
// normalize the string
.normalize('NFC')
// remove some special chars by nothing
.replace(/["'\u0300-\u036f]/g, "")
// eslint-disable-next-line no-misleading-character-class
.replace(/["'\u0300-\u036f]/gu, '')
)).join('/')
return RequestWrapper.getRequest<T>(`${BASE_URL}/${this.getLang()}/${path}`).get()
return RequestWrapper.fetch<T>(`${BASE_URL}/${this.getLang()}/${path}`)
}
}
export * from './interfaces'

View File

@ -19,12 +19,15 @@ module.exports = {
module: {
rules: [{
test: /\.ts$/,
loader: 'awesome-typescript-loader',
loader: 'ts-loader',
exclude: /node_modules/,
options: {
sourceMap: false,
declarationDir: false,
target: 'ES2016'
compilerOptions: {
sourceMap: false,
declaration: false,
declarationDir: null,
target: 'ES2016'
}
}
}]
}

4121
yarn.lock

File diff suppressed because it is too large Load Diff