Compare commits

...

153 Commits

Author SHA1 Message Date
dependabot[bot]
c866b4022f
build: bump @babel/core from 7.20.12 to 7.26.7 (#293)
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.20.12 to 7.26.7.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.26.7/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-05 17:17:04 +01:00
dependabot[bot]
978a676a79
build: bump vite from 5.4.11 to 5.4.14 (#292)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-27 15:33:48 +01:00
dependabot[bot]
1f801f4a94
build: bump @typescript-eslint/eslint-plugin from 5.48.1 to 5.62.0 (#291)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-27 15:33:03 +01:00
4e4bcf9d26
2.6.0 2025-01-14 16:33:47 +01:00
0b14e8ddec
fix: export models (#290) 2025-01-14 16:27:21 +01:00
dependabot[bot]
fc4a31ef39
build: bump typescript from 5.1.5 to 5.7.3 (#289)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-14 10:28:26 +01:00
26acb1eb61
fix: test failing after 30s
Signed-off-by: Avior <git@avior.me>
2024-12-10 11:35:59 +01:00
c03183bd6f
fix: test failing after 30s
Signed-off-by: Avior <git@avior.me>
2024-12-10 11:32:19 +01:00
07403cb3ae
fix: update cachex deps
Signed-off-by: Avior <git@avior.me>
2024-12-02 16:39:16 +01:00
dependabot[bot]
f5dd4cb88c
build: bump json5 from 2.2.1 to 2.2.3 (#257)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-28 00:41:24 +01:00
dependabot[bot]
9b9ff2f028
build: bump @dzeio/config from 1.1.9 to 1.1.12 (#247)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-28 00:41:12 +01:00
dependabot[bot]
ce64a95f4e
build: bump eslint from 8.31.0 to 8.35.0 (#271)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-28 00:40:54 +01:00
dependabot[bot]
460f101026
build: bump @typescript-eslint/parser from 5.48.1 to 5.54.1 (#273)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-28 00:40:45 +01:00
b3ba7820a3
chore: remove unused tests
Signed-off-by: Avior <git@avior.me>
2024-11-11 22:35:49 +01:00
1f3aae5401
feat: Add CacheX for cache management (#281) 2024-11-11 16:50:45 +01:00
e501faa823
bump: BETA 3 2024-10-17 22:52:50 +02:00
e08fd98269
feat: Add random endpoints to the SDK (#277) 2024-10-17 22:52:19 +02:00
54a4b729b3 fix: build fail when dist folder dont exists 2024-10-16 22:33:22 +02:00
26af3b0779
bump: 2.6 BETA.2 (#276) 2024-10-16 22:31:45 +02:00
bf54ab3809
feat: Allow a user to filters elements on the API (#275) 2024-10-10 14:56:11 +02:00
f2621890e1
chore: enable cache on CI/CD 2024-08-30 11:05:02 +02:00
4364da480f
chore: Publish on Github Packages 2023-12-28 03:53:52 +01:00
0cc8577fe0
chore: Upgrade tested NodeJS versions 2023-12-28 02:15:49 +01:00
0f2ad36e8c bump: 2.5.1
Signed-off-by: Florian BOUILLON <f.bouillon@aptatio.com>
2023-07-18 12:59:21 +02:00
74de8961ef fix: update README
Signed-off-by: Florian BOUILLON <f.bouillon@aptatio.com>
2023-07-18 12:54:06 +02:00
98c80fcd20 fix: module exports not working
Signed-off-by: Florian BOUILLON <f.bouillon@aptatio.com>
2023-07-18 12:46:39 +02:00
c392b27cac bump: 2.5.0
Signed-off-by: Florian BOUILLON <f.bouillon@aptatio.com>
2023-06-28 14:22:05 +02:00
dc5e41a638 feat: Full support for ESM modules
Signed-off-by: Florian BOUILLON <f.bouillon@aptatio.com>
2023-06-28 14:21:17 +02:00
09d8b28a66
docs: Include HTML base for browser people :D
Signed-off-by: Avior <github@avior.me>
2023-01-11 20:54:16 +01:00
4507bbd651
misc: Upgraded deps
Signed-off-by: Avior <github@avior.me>
2023-01-11 20:41:55 +01:00
8a89aefe73 2.4.9 2023-01-11 20:33:00 +01:00
8df969c1db
fix: Issue regarding browser loading
Signed-off-by: Avior <github@avior.me>
2023-01-11 20:32:51 +01:00
2177e9c088
fix: Updated build versions 2022-12-11 01:38:54 +01:00
a32f42975a 2.4.8 2022-12-09 16:11:29 +01:00
0148979d7d
misc: Updated deps
Signed-off-by: Avior <f.bouillon@aptatio.com>
2022-12-09 16:11:24 +01:00
ea357c9080
fix: Version number not being correctly exported
Signed-off-by: Avior <f.bouillon@aptatio.com>
2022-12-09 16:08:10 +01:00
5e998d3658
bump: version 2.4.7
Signed-off-by: Avior <github@avior.me>
2022-09-26 19:51:44 +02:00
ed883c06eb
fix: Angular not liking JSON imports (#204) 2022-09-26 19:52:27 +02:00
1ecaa048eb
Create FUNDING.yml 2022-08-25 10:15:40 +02:00
39cd15ead3
refactor: Upgrade actions (#129) 2022-05-05 14:12:24 +02:00
ca5ae0aa57
refactor: Upgrade dependencies (#128)
* refactor: removed babel

Signed-off-by: Avior <github@avior.me>

* refactor: Upgrade deps

Signed-off-by: Avior <github@avior.me>

* refactor: Removed ts-node

Signed-off-by: Avior <github@avior.me>

* revert: refactor: removed babel

Signed-off-by: Avior <github@avior.me>

* build: Support for other nodejs versions

Signed-off-by: Avior <github@avior.me>
2022-05-05 11:45:42 +02:00
dependabot[bot]
cffae6cc28
build: bump @typescript-eslint/eslint-plugin from 5.12.0 to 5.12.1 (#86)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-23 15:29:09 +01:00
dependabot[bot]
5e03f38476
build: bump @typescript-eslint/eslint-plugin from 5.11.0 to 5.12.0 (#80)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-16 10:21:03 +01:00
dependabot[bot]
05134f5b12
build: bump @babel/core from 7.17.2 to 7.17.4 (#81)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-16 10:06:53 +01:00
dependabot[bot]
8a0dec867e
build: bump @typescript-eslint/parser from 5.10.2 to 5.11.0 (#72)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-14 09:55:13 +01:00
dependabot[bot]
75636a9195
build: bump @typescript-eslint/eslint-plugin from 5.10.2 to 5.11.0 (#73)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-14 09:53:13 +01:00
dependabot[bot]
bd33dafe8a
build: bump eslint from 8.8.0 to 8.9.0 (#77)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-14 09:51:11 +01:00
dependabot[bot]
39fb14070d
build: bump @babel/core from 7.17.0 to 7.17.2 (#76)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-14 09:48:48 +01:00
dependabot[bot]
6ae3b09dc9
build: bump ts-node from 10.4.0 to 10.5.0 (#70)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-14 09:46:45 +01:00
dependabot[bot]
8d13d1dba4
build: bump jest from 27.5.0 to 27.5.1 (#75)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-14 09:44:36 +01:00
dependabot[bot]
840c8c3106
build: bump esbuild from 0.14.19 to 0.14.21 (#74)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-11 15:13:39 +01:00
dependabot[bot]
ee4f1be353
build: bump @babel/preset-env from 7.16.8 to 7.16.11 (#52)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-07 12:05:57 +01:00
dependabot[bot]
7e4c0eae42
build: bump jest from 27.4.7 to 27.5.0 (#68)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-07 10:41:40 +01:00
dependabot[bot]
3d08ab4bfa
build: bump esbuild from 0.14.18 to 0.14.19 (#69)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-07 10:16:32 +01:00
dependabot[bot]
3441cc2c60
build: bump @babel/core from 7.16.12 to 7.17.0 (#66)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-03 10:38:38 +01:00
dependabot[bot]
9b2e09d766
build: bump esbuild from 0.14.17 to 0.14.18 (#67)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-03 10:27:09 +01:00
dependabot[bot]
3ebde59a84
build: bump @typescript-eslint/parser from 5.10.0 to 5.10.2 (#64)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-02 10:33:11 +01:00
dependabot[bot]
e18cbabf70
build: bump @typescript-eslint/eslint-plugin from 5.10.0 to 5.10.2 (#63)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-02 10:30:35 +01:00
dependabot[bot]
1c6c7dacc4
build: bump esbuild from 0.14.14 to 0.14.17 (#65)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-02 10:06:54 +01:00
dependabot[bot]
445b3a5ea6
build: bump eslint from 8.7.0 to 8.8.0 (#61)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-31 11:47:54 +01:00
dependabot[bot]
7148fc7522
build: bump typescript from 4.5.4 to 4.5.5 (#54)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-28 17:04:04 +01:00
dependabot[bot]
cde8b24230
build: bump @babel/core from 7.16.7 to 7.16.12 (#55)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-28 16:31:19 +01:00
dependabot[bot]
1d21ff650e
build: bump esbuild from 0.14.12 to 0.14.14 (#58)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-28 16:22:44 +01:00
749fba9878
Bump version (2.4.6) 2022-01-28 16:16:38 +01:00
4895c5b857
Updated CHANGELOG for latest releases 2022-01-28 16:15:23 +01:00
dependabot[bot]
eda53611b2
build: bump node-fetch from 2.6.6 to 2.6.7 (#59)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-28 16:08:08 +01:00
dependabot[bot]
76ab92a7db
build: bump esbuild from 0.14.11 to 0.14.12 (#53)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-24 00:05:16 +01:00
dependabot[bot]
585d893557
build: bump @typescript-eslint/parser from 5.9.1 to 5.10.0 (#48)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-18 11:04:24 +01:00
dependabot[bot]
157c27222e
build: bump @typescript-eslint/eslint-plugin from 5.9.1 to 5.10.0 (#49)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-18 11:02:03 +01:00
dependabot[bot]
026d4018f8
build: bump eslint from 8.6.0 to 8.7.0 (#47)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-17 09:59:56 +01:00
dependabot[bot]
ccfae56ced
build: bump @typescript-eslint/parser from 5.9.0 to 5.9.1 (#46)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-11 14:44:31 +01:00
dependabot[bot]
87be749603
build: bump @babel/preset-env from 7.16.7 to 7.16.8 (#45)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-11 12:09:25 +01:00
dependabot[bot]
f56e977900
build: bump @typescript-eslint/eslint-plugin from 5.9.0 to 5.9.1 (#44)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-11 11:58:17 +01:00
dependabot[bot]
e5550e474e
build: bump esbuild from 0.14.10 to 0.14.11 (#43)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-10 10:02:29 +01:00
dependabot[bot]
a7c24353a2
build: bump jest from 27.4.6 to 27.4.7 (#42)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-06 14:19:46 +01:00
dependabot[bot]
2e5fdd45e4
build: bump jest from 27.4.5 to 27.4.6 (#41)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-05 10:39:31 +01:00
dependabot[bot]
2ab0df81c1
build: bump @typescript-eslint/eslint-plugin from 5.8.1 to 5.9.0 (#40)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-04 10:03:12 +01:00
dependabot[bot]
5fbfa4d84a
build: bump @typescript-eslint/parser from 5.8.1 to 5.9.0 (#39)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-04 09:58:42 +01:00
dependabot[bot]
693160865c
build: bump @babel/core from 7.16.5 to 7.16.7 (#38)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-04 09:50:57 +01:00
dependabot[bot]
0e735f3a77
build: bump @babel/preset-env from 7.16.5 to 7.16.7 (#35)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-04 09:44:37 +01:00
dependabot[bot]
b97dfb4420
build: bump @babel/preset-typescript from 7.16.5 to 7.16.7 (#34)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-03 14:29:04 +01:00
dependabot[bot]
c18f933e40
build: bump @typescript-eslint/parser from 5.8.0 to 5.8.1 (#31)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-03 12:34:54 +01:00
dependabot[bot]
fb60710e5e
build: bump @typescript-eslint/eslint-plugin from 5.8.0 to 5.8.1 (#30)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-03 11:25:33 +01:00
dependabot[bot]
edf994c241
build: bump eslint from 8.5.0 to 8.6.0 (#37)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-03 11:10:16 +01:00
dependabot[bot]
eb905a866a
build: bump actions/setup-node from 2.5.0 to 2.5.1 (#33)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-03 10:48:31 +01:00
dependabot[bot]
5f41185d4f
build: bump esbuild from 0.14.8 to 0.14.10 (#36)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-03 09:40:50 +01:00
dependabot[bot]
183efdb51e
build: bump esbuild from 0.14.7 to 0.14.8 (#29)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-23 14:21:47 +01:00
dependabot[bot]
dbad45d71d
build: bump esbuild from 0.14.6 to 0.14.7 (#28)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-22 13:16:34 +01:00
dependabot[bot]
f733634499
build: bump @typescript-eslint/parser from 5.7.0 to 5.8.0 (#26)
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.7.0 to 5.8.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.8.0/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-21 12:04:33 +01:00
dependabot[bot]
9e636c407e
build: bump @typescript-eslint/eslint-plugin from 5.7.0 to 5.8.0 (#27)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-21 09:55:21 +01:00
dependabot[bot]
87531f14ff
build: bump esbuild from 0.14.5 to 0.14.6 (#25)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-20 15:27:35 +01:00
dependabot[bot]
52342f9dcf
build: bump eslint from 8.4.1 to 8.5.0 (#24)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-20 15:12:55 +01:00
dependabot[bot]
2eb68457f0
build: bump codecov/codecov-action from 1.0.13 to 2.1.0 (#17)
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 1.0.13 to 2.1.0.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/master/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/v1.0.13...v2.1.0)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-15 20:24:03 +00:00
dependabot[bot]
14b4aa7138
build: bump actions/setup-node from 1 to 2.5.0 (#18)
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 1 to 2.5.0.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v1...v2.5.0)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-12-15 18:35:16 +00:00
496c04fc4c
Bump deps
Signed-off-by: Avior <github@avior.me>
2021-12-15 16:08:37 +01:00
3d8ef329f7
docs: Update multiple documents (#16) 2021-12-15 12:20:36 +01:00
21088c4a02
Bump version 2021-10-11 17:05:41 +02:00
4fdde0a962
Added new Endpoints (#15) 2021-10-11 16:55:42 +02:00
02a8174509
2.4.4 2021-08-12 21:59:29 +02:00
ac570459a3
Added new logo field to serie
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2021-08-12 21:59:11 +02:00
093df107d2
Fixed Link 2021-07-19 15:07:41 +02:00
d166e0f5cf Fixed Changelogs
Signed-off-by: Florian BOUILLON <florian.bouillon@delta-wings.net>
2021-07-19 14:47:47 +02:00
ef102dc433 2.4.3 2021-07-19 14:46:12 +02:00
324be2a410 Updated docs
Signed-off-by: Florian BOUILLON <florian.bouillon@delta-wings.net>
2021-07-19 14:45:41 +02:00
ad4ad553a4 New try with ESM
Signed-off-by: Florian BOUILLON <florian.bouillon@delta-wings.net>
2021-07-19 14:44:58 +02:00
7c253c98d7 Moved to ESBuild
Signed-off-by: Florian BOUILLON <florian.bouillon@delta-wings.net>
2021-07-19 14:44:42 +02:00
e172465258
2.4.2 2021-07-11 17:48:56 +02:00
9940961e20
Downgraded to ES2015 to have better support browsers
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2021-07-11 17:48:42 +02:00
f25be8b5f5
2.4.1 2021-07-11 17:19:46 +02:00
641f7861b8
Updated dependencies (#12)
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2021-07-11 15:18:44 +00:00
3db69e0537
Code Cleanup and Deprecation of unused public things (#11)
* Cleanup

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

* Deprecated Languages interface

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

* Fixed babel

Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2021-07-11 14:52:17 +00:00
1c36d6b93e
Added auto publish on tag 2021-06-30 07:05:51 +00:00
10083223e2
Merge branch 'master' of github.com:tcgdex/javascript-sdk 2021-06-29 17:26:24 +02:00
95196ce551
2.4.0 2021-06-29 17:25:25 +02:00
81200aede7
Added SDK support for new languages
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2021-06-29 17:25:12 +02:00
35642ffd57
Moved to NPM
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2021-06-29 17:24:59 +02:00
4435f930ec
Update README.md 2021-06-24 01:06:06 +02:00
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
f19298e20d
v2.3.0-beta.1 2021-06-22 16:53:20 +02:00
4789c15c7d
File reorganisation
Signed-off-by: Avior <github@avior.me>
2021-06-22 16:51:27 +02:00
f28fa11710
v2.2.0 2021-06-19 01:03:32 +02:00
95c48e530e
v2.2.0-beta 2021-06-18 22:35:20 +02:00
c3791959be
Added a legal field to each cards
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2021-06-18 22:34:16 +02:00
a3537a1af7 Changed some compilation settings
Signed-off-by: Florian BOUILLON <florian.bouillon@delta-wings.net>
2021-05-31 15:59:48 +02:00
4da8131d11 Removed full import on package.json
Signed-off-by: Florian BOUILLON <florian.bouillon@delta-wings.net>
2021-05-31 15:59:26 +02:00
8405302286 Added JSDocs to the base fetch
Signed-off-by: Florian BOUILLON <florian.bouillon@delta-wings.net>
2021-05-31 15:59:05 +02:00
b1d97a4278 Updated Changelog
Signed-off-by: Florian BOUILLON <florian.bouillon@delta-wings.net>
2021-05-31 15:17:30 +02:00
b004321f40 v2.1.1 2021-05-31 15:16:28 +02:00
b3d34182a2 Fixed Package build
Signed-off-by: Florian BOUILLON <florian.bouillon@delta-wings.net>
2021-05-31 15:16:13 +02:00
1b1bcfbb84 Updated CHANGELOG
Signed-off-by: Florian BOUILLON <florian.bouillon@delta-wings.net>
2021-05-31 14:50:01 +02:00
a593271aba v2.1.0 2021-05-31 14:47:44 +02:00
6e93a70f1e Updated Title
Signed-off-by: Florian BOUILLON <florian.bouillon@delta-wings.net>
2021-05-31 14:46:25 +02:00
fbf6f2e2cd Updated Documentation
Signed-off-by: Florian BOUILLON <florian.bouillon@delta-wings.net>
2021-05-31 13:37:15 +02:00
8e3de78b00 Added a new function that globally fetch every endpoints
Signed-off-by: Florian BOUILLON <florian.bouillon@delta-wings.net>
2021-05-31 12:48:53 +02:00
b845e36784 Added a User-Agent
Signed-off-by: Florian BOUILLON <florian.bouillon@delta-wings.net>
2021-05-31 12:48:25 +02:00
23da33f81f Updated deps
Signed-off-by: Florian BOUILLON <florian.bouillon@delta-wings.net>
2021-05-31 12:48:18 +02:00
f7010d5f93
v2.0.3 2021-05-28 11:39:55 +02:00
ed3fbcf5db
Fixed regulation Mark name not being correct
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2021-05-28 11:37:23 +02:00
f62615814d
v2.0.2 2021-05-28 11:36:55 +02:00
eec10c548a
Fixed name
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2021-05-28 11:36:20 +02:00
720bc6b43a
v2.0.1 2021-05-28 11:28:24 +02:00
3557334076
removed hardcoded values as they depends on language
Signed-off-by: Avior <florian.bouillon@delta-wings.net>
2021-05-28 11:28:00 +02:00
45 changed files with 20987 additions and 414 deletions

View File

@ -5,4 +5,8 @@ indent_style = tab
indent_size = 4
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
insert_final_newline = true
[*.yml]
indent_size = 2
indent_style = space

4
.eslintignore Normal file
View File

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

5
.eslintrc.js Normal file
View File

@ -0,0 +1,5 @@
module.exports = {
extends: [
"./node_modules/@dzeio/config/eslint/typescript"
]
}

1
.gitattributes vendored Normal file
View File

@ -0,0 +1 @@
* text=auto eol=lf

3
.github/FUNDING.yml vendored Normal file
View File

@ -0,0 +1,3 @@
# These are supported funding model platforms
github: [tcgdex]

32
.github/ISSUE_TEMPLATE/bug.yml vendored Normal file
View File

@ -0,0 +1,32 @@
name: Bug
description: Use this template if you have found a bug in the SDK
title: "bug: "
labels: [bug]
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this Form!
- type: textarea
id: happening
attributes:
label: What is Hapening
placeholder: "Ex: When using this function the SDK crash..."
validations:
required: true
- type: textarea
id: happen
attributes:
label: Please explain what should happen
description: If you selected Other or new Data Type please put it as the first line
placeholder: "Ex: The SDK should not crash"
validations:
required: true
- type: textarea
id: reproducre
attributes:
label: Please give us a way to reproduce
description: You can list a way or give us access to a minimal Github repo to reproduce it
placeholder: "Ex: https://github.com/tcgdex/javascript-sdk-error-idk"
validations:
required: true

16
.github/ISSUE_TEMPLATE/enhancement.yml vendored Normal file
View File

@ -0,0 +1,16 @@
name: Enhancement
description: Use this template if you have an Idea that will enhance the SDK
title: "enhancement: "
labels: [enhancement]
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this Form!
- type: textarea
id: explain
attributes:
label: Please explain in more details what idea you have
placeholder: "Ex: I would love to see this or this..."
validations:
required: true

5
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@ -0,0 +1,5 @@
<!--
Thanks for your Pull Request, Please provide the related Issue using "Fix #0" or describe the change(s) you made.
The issue title must follow Conventional Commit (verified by Github Actions) conventionalcommits.org.
More informations at https://github.com/tcgdex/cards-database/blob/master/CONTRIBUTING.md
-->

22
.github/dependabot.yml vendored Normal file
View File

@ -0,0 +1,22 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "daily"
versioning-strategy: lockfile-only
commit-message:
prefix: build
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"
commit-message:
prefix: build

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

@ -0,0 +1,46 @@
name: Build & Test
on:
push:
branches:
- master
# Run on any pull request
pull_request:
jobs:
build:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
# Follow current releases https://github.com/nodejs/release#release-schedule
node-version: [18.x, 20.x, 21.x, 22.x]
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build
run: npm run build
- name: Test
run: npm run test
- name: Upload Coverage
if: matrix.node-version == '22.x'
uses: codecov/codecov-action@v3
with:
# Comma-separated list of files to upload
files: ./coverage/coverage-final.json

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

@ -0,0 +1,26 @@
name: Code Quality Checks
on:
push:
branches:
- master
# Run on any pull request
pull_request:
jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup NodeJS
uses: actions/setup-node@v3
with:
node-version: '16.x'
- name: Install dependencies
run: npm ci
- name: Lint
run: npm run lint

41
.github/workflows/publish.yml vendored Normal file
View File

@ -0,0 +1,41 @@
name: Publish the Package
on:
push:
tags:
- v*
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Publishing to NPMJS
uses: actions/setup-node@v3
with:
node-version: '20.x'
registry-url: 'https://registry.npmjs.org'
- name: Install dependencies
run: npm ci
- name: Build
run: npm run build
- name: Publish on NPM
run: npm publish
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Setup Publishing to Github Packages
uses: actions/setup-node@v4
with:
registry-url: 'https://npm.pkg.github.com'
- name: Publish on Github
run: npm publish
env:
NODE_AUTH_TOKEN: ${{ secrets.REPO_TOKEN }}

16
.gitignore vendored
View File

@ -1,8 +1,8 @@
node_modules
# Dist files
*.js
*.d.ts
!interfaces.d.ts
!main.d.ts
test.ts
# Dev Files
node_modules
test.ts
coverage
# Dist files
dist
src/version.js

View File

@ -1,8 +1,9 @@
src
.editorconfig
.gitignore
.npmignore
tsconfig.json
*.ts
webpack.config.js
tsconfig.*
yarn.lock
test.js
test.d.ts
CHANGELOG.md
coverage

304
CHANGELOG.md Normal file
View File

@ -0,0 +1,304 @@
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
## 2.5.1 - 2023-07-18
### Fixed
- ModuleJS exports not working as intended
## 2.5.0 - 2023-06-28
### Added
- Support for both ModuleJS and CommonJS
## 2.4.9 - 2022-09-26
### Fixed
- package not loading on browser
## 2.4.8 - 2022-09-26
### Fixed
- fix version number not correctly exposting
## 2.4.7 - 2022-09-26
### Fixed
- Compatibility with Angular
## 2.4.6 - 2022-01-28
### Fixed
- Updated node-fetch for CVE-2022-0235
## 2.4.5 - 2021-10-11
### Added
- Added new endpoint
## 2.4.4 - 2021-08-12
### Added
- New logo field in serie
## 2.4.3 - 2021-07-19
### Added
- ESM exports are back
## 2.4.2 2021-07-11
### Fixed
- Downgraded to ES2015 to have better suport browsers
### Changed
- Moved browser export from `Webpack` to `esbuild`
## 2.4.1 - 2021-07-11
## Deprecated
- Deprecated `Languages` Type
## 2.4.0 - 2021-06-29
## Added
- Support for new languages
## 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
- Added new fields
## [2.1.1] - 2021-05-31
### Fixed
- Package building in the wrong version of ECMAScript
## [2.1.0] - 2021-05-31
### Added
- new `fetch` function that manage all the API endpoints
## [2.0.2-2.0.3] - 2021-05-28
### Fixed
- `rotationMark` should have been named `regulationMark`
## [2.0.1] - 2021-05-28
### Changed
- Hardcoded string values are now strings as they depends on the language
## [2.0.0] - 2021-05-28
### Added
- simple string endpoint typing
- Typing is exported through the main.d.ts file
- `cardCount` field in the set interface
- a `rotationMark` to the card interface
### Changed
- Support new incoming datas
- Point the SDK to the new V2
- Renamed `getExpansion(s)` to `getSerie(s)`
- Typing for the new SDK
- Functions now use `fetch` instead of `get` in their names
- URL Normalization is now done by the SDK
### Removed
- TranslationUtil as now translation are managed by the API
- the interfaces folder as every interfaces are now in `interfaces.d.ts`
- `this.gbu`
- Translation files as they are now in the Compiler
## [1.7.0] - 2021-01-31
### Added
- new Rarities
## [1.6.1] - 2021-01-31
### Changed
- tags are now optionnal
## [1.6.0] - 2021-01-08
### Changed
- Errors are now handled to return `undefined`
### Removed
- console.warn when using `getCards`
## [1.5.0] - 2021-01-08
### Added
- getSet can now not transform the API Date to a Javascript Date
## [1.4.2] - 2021-01-08
### Added
- new Tags
### Changed
- rarities to have less strange rarities
-
### Fixed
- CORS blocked
## [1.4.1] - 2020-04-24
### Changed
- Changed API url to the new one
## [1.4.0] - 2020-03-25
### Added
- a `defaultLang` static field to customize the default lang
- a `getLang` function to get the current lang for the SDK
### Fixed
- Warnings for translations
## [1.3.0] - 2020-03-18
### Added
- A cache system
- some informations about differents tags on a card
- lvl on the card interface
### Removed
- cardTypes on the card interface
## [1.2.1] - 2020-03-14
### Fixed
- Fix items datas not in the correct interface
## [1.2.0] - 2020-03-14
### Added
- Added The getCards endpoint to fetch the big list of card with an optionnal filter on the set
- Added The getExpansions endpoint to fetch the list of expansions
- Added Some informations about cardTypes
- Updated DB to add support for items
### Fixed
- Fix translation not getting the correct file
## [1.0.8] - 2020-03-11
### Changed
- Changed typing for some interfaces
## [1.0.1-1.0.7] - 2020-03-11
### Changed
- Renamed the class Name from `TCGDex` to `TCGdex`
- lang argument is now public so it can be changed while the SDK is active
### Added
- some typing for getCard and translationUtil
## [1.0.0] - 2020-03-11
### Added
- the getCard function to use with the fetch a card with it's id
- the getSet function to use with the fetch a set with it's id
- the getExpansion function to use with the fetch an expansion with it's id
- 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.4.3...HEAD
[2.4.3]: https://github.com/tcgdex/javascript-sdk/releases/tag/v2.4.3
[2.4.2]: https://github.com/tcgdex/javascript-sdk/releases/tag/v2.4.2
[2.4.1]: https://github.com/tcgdex/javascript-sdk/releases/tag/v2.4.1
[2.4.0]: https://github.com/tcgdex/javascript-sdk/releases/tag/v2.4.0
[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
[2.0.1]: https://github.com/tcgdex/javascript-sdk/releases/tag/v2.0.1
[2.0.0]: https://github.com/tcgdex/javascript-sdk/releases/tag/v2.0.0
[1.7.0]: https://github.com/tcgdex/javascript-sdk/releases/tag/v1.7.0
[1.6.1]: https://github.com/tcgdex/javascript-sdk/releases/tag/v1.6.1
[1.6.0]: https://github.com/tcgdex/javascript-sdk/releases/tag/1.6.0
[1.5.0]: https://github.com/tcgdex/javascript-sdk/releases/tag/1.5.0
[1.4.2]: https://github.com/tcgdex/javascript-sdk/releases/tag/1.4.2
[1.4.1]: https://github.com/tcgdex/javascript-sdk/releases/tag/1.4.1
[1.4.0]: https://github.com/tcgdex/javascript-sdk/releases/tag/1.4.0
[1.3.0]: https://github.com/tcgdex/javascript-sdk/releases/tag/1.3.0
[1.2.1]: https://github.com/tcgdex/javascript-sdk/releases/tag/1.2.1
[1.2.0]: https://github.com/tcgdex/javascript-sdk/releases/tag/1.2.0
[1.0.8]: https://github.com/tcgdex/javascript-sdk/releases/tag/1.0.8
[1.0.1-1.0.7]: https://github.com/tcgdex/javascript-sdk/releases/tag/1.0.7
[1.0.0]: https://github.com/tcgdex/javascript-sdk/releases/tag/v1.0.0

128
CODE_OF_CONDUCT.md Normal file
View File

@ -0,0 +1,128 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
the `contact@tcgdex.net` email or on Discord to `Avior#3872`.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.

191
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,191 @@
<!-- omit in toc -->
# Contributing to TCGdex
First off, thanks for taking the time to contribute! ❤️
All types of contributions are encouraged and valued. See the [Table of Contents](#table-of-contents) for different ways to help and details about how this project handles them. Please make sure to read the relevant section before making your contribution. It will make it a lot easier for us maintainers and smooth out the experience for all involved. The community looks forward to your contributions. 🎉
> And if you like the project, but just don't have time to contribute, that's fine. There are other easy ways to support the project and show your appreciation, which we would also be very happy about:
>
> - Star the project
> - Tweet about it
> - Refer this project in your project's readme
> - Mention the project at local meetups and tell your friends/colleagues
<!-- omit in toc -->
## Table of Contents
- [Code of Conduct](#code-of-conduct)
- [I Have a Question](#i-have-a-question)
- [I Want To Contribute](#i-want-to-contribute)
- [Reporting Issues](#reporting-issues)
- [Suggesting Enhancements](#suggesting-enhancements)
- [Your First Code Contribution](#your-first-code-contribution)
- [Improving The Documentation](#improving-the-documentation)
- [Styleguides](#styleguides)
- [Coding Guidlines](#coding-guidelines)
- [Commit Messages](#commit-messages)
- [Join The Project Team](#join-the-project-team)
## Code of Conduct
This project and everyone participating in it is governed by the
[TCGdex Code of Conduct](https://github.com/tcgdex/javascript-sdk/blob/master/CODE_OF_CONDUCT.md).
By participating, you are expected to uphold this code. Please report unacceptable behavior to <contact@tcgdex.net>.
## I Have a Question
> If you want to ask a question, we assume that you have read the available Documentation at <https://www.tcgdex.dev>.
The best way to ask questions is to join our Discord server at <https://discord.gg/NehYTAhsZE>.
You can also ask them on the Github Repository, it is best to search for existing [Issues](https://github.com/tcgdex/javascript-sdk/issues) that might help you. In case you have found a suitable issue and still need clarification, you can write your question in a new issue. It is also advisable to search the internet for answers first.
If you then still feel the need to ask a question and need clarification, we recommend the following:
- Open an [Issue](https://github.com/tcgdex/javascript-sdk/issues/new).
- Provide as much context as you can about what you're running into.
- Provide project and platform versions (nodejs, npm, etc), depending on what seems relevant.
We will then take care of the issue as soon as possible.
<!--
You might want to create a separate issue tag for questions and include it in this description. People should then tag their issues accordingly.
Depending on how large the project is, you may want to outsource the questioning, e.g. to Stack Overflow or Gitter. You may add additional contact and information possibilities:
- IRC
- Slack
- Gitter
- Stack Overflow tag
- Blog
- FAQ
- Roadmap
- E-Mail List
- Forum
-->
## I Want To Contribute
> ### Legal Notice <!-- omit in toc -->
>
> When contributing to this project, you must agree that you have authored 100% of the content, that you have the necessary rights to the content and that the content you contribute may be provided under the project license.
### Reporting Issues
<!-- omit in toc -->
#### Before Submitting an Issue Report
A good issue report shouldn't leave others needing to chase you up for more information. Therefore, we ask you to investigate carefully, collect information and describe the issue in detail in your report. Please complete the following steps in advance to help us fix any potential bug as fast as possible.
- Determine if your issue is not an error on your side e.g. using incompatible environment components/versions (Make sure that you have read the [documentation](https://www.tcgdex.dev). If you are looking for support, you might want to check [this section](#i-have-a-question)).
- To see if other users have experienced (and potentially already solved) the same issue you are having, check if there is not already an issue report existing for your bug or error in the [bug tracker](https://github.com/tcgdex/javascript-sdk/issues).
- Also make sure to search the internet (including Stack Overflow) to see if users outside of the GitHub community have discussed the issue.
- Collect information about the bug:
- Stack trace (Traceback)
- OS, Platform and Version (Windows, Linux, macOS, x86, ARM)
- Version of the interpreter, compiler, SDK, runtime environment, package manager, depending on what seems relevant.
- Possibly your input and the output
- Can you reliably reproduce the issue? And can you also reproduce it with older versions?
<!-- omit in toc -->
#### How Do I Submit a Good Bug Report?
> You must never report security related issues, vulnerabilities or bugs to the issue tracker, or elsewhere in public. Instead sensitive bugs must be sent by email to <security@tcgdex.net>.
<!-- You may add a PGP key to allow the messages to be sent encrypted as well. -->
We use GitHub issues to track bugs and errors. If you run into an issue with the project:
- Open an [Issue](https://github.com/tcgdex/javascript-sdk/issues/new). (Since we can't be sure at this point whether it is a bug or not, we ask you not to talk about a bug yet and not to label the issue.)
- Explain the behavior you would expect and the actual behavior.
- Please provide as much context as possible and describe the *reproduction steps* that someone else can follow to recreate the issue on their own. This usually includes your code. For good bug reports you should isolate the problem and create a reduced test case.
- Provide the information you collected in the previous section.
Once it's filed:
- The project team will label the issue accordingly.
- A team member will try to reproduce the issue with your provided steps. If there are no reproduction steps or no obvious way to reproduce the issue, the team will ask you for those steps and mark the issue as `needs-repro`. Bugs with the `needs-repro` tag will not be addressed until they are reproduced.
- If the team is able to reproduce the issue, it will be marked `needs-fix`, as well as possibly other tags (such as `critical`), and the issue will be left to be [implemented by someone](#your-first-code-contribution).
<!-- You might want to create an issue template for bugs and errors that can be used as a guide and that defines the structure of the information to be included. If you do so, reference it here in the description. -->
### Suggesting Enhancements
This section guides you through submitting an enhancement suggestion for TCGdex, **including completely new features and minor improvements to existing functionality**. Following these guidelines will help maintainers and the community to understand your suggestion and find related suggestions.
<!-- omit in toc -->
#### Before Submitting an Enhancement
- Make sure that you are using the latest version.
- Read the [documentation](https://www.tcgdex.dev) carefully and find out if the functionality is already covered, maybe by an individual configuration.
- Perform a [search](https://github.com/tcgdex/javascript-sdk/issues) to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one.
- Find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to convince the project's developers of the merits of this feature. Keep in mind that we want features that will be useful to the majority of our users and not just a small subset. If you're just targeting a minority of users, consider writing an add-on/plugin library.
<!-- omit in toc -->
#### How Do I Submit a Good Enhancement Suggestion?
Enhancement suggestions are tracked as [GitHub issues](https://github.com/tcgdex/javascript-sdk/issues).
- Use a **clear and descriptive title** for the issue to identify the suggestion.
- Provide a **step-by-step description of the suggested enhancement** in as many details as possible.
- **Describe the current behavior** and **explain which behavior you expected to see instead** and why. At this point you can also tell which alternatives do not work for you.
- You may want to **include screenshots and animated GIFs** which help you demonstrate the steps or point out the part which the suggestion is related to. You can use [this tool](https://www.cockos.com/licecap/) to record GIFs on macOS and Windows, and [this tool](https://github.com/colinkeenan/silentcast) or [this tool](https://github.com/GNOME/byzanz) on Linux. <!-- this should only be included if the project has a GUI -->
- **Explain why this enhancement would be useful** to most TCGdex users. You may also want to point out the other projects that solved it better and which could serve as inspiration.
<!-- You might want to create an issue template for enhancement suggestions that can be used as a guide and that defines the structure of the information to be included. If you do so, reference it here in the description. -->
### Your First Code Contribution
_note: Follow the different styleguides listed below when contributing_
- Fork 🍴 the project. _see the `fork` button at the top right of the screen_
- make the changes you want in your repository.
- Create a Pull request here https://github.com/tcgdex/javascript-sdk/compare by selecting your repository patch with our `master` branch _If it's not finished put WIP: before_
- we don't like ❌, so if your pull request has its automated checks ending with the red cross, please double check your changes until it show the awesome 🟢, or ask for help !
- If your pull request is ready for review remove WIP: put it s ready for review and we will handle the rest !
### Improving The Documentation
The documentation is updated in the Documentation repository at <https://github.com/tcgdex/documentation>
## Styleguides
### Coding Guidelines
Install the plugin `.editorconfig` in your dev environment if it's not already done and thats it !
for those who don't want to install it the basic are these:
- Respect PSR12
### Commit Messages
We follow the [Conventional Commit specification](conventionalcommits.org) and are using the [Angular format](https://github.com/angular/angular/blob/master/CONTRIBUTING.md#commit) with some changes.
In short, please name your Pull Requests/Commits following this format
```
<type>(<scope>): <short summary>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
```
- `type` MUST be one of
- build: Changes affecting the CI at `.github/workflows` or `Dockerfile`
- ci: same as build
- docs: Changes affecting the differents Documents
- feat: a new feature being added
- fix: fixes
- pref: Performance related fixes
- refactor: Misc code changes
- test: same as `ci`
- the field `(<scope>)` is optional
- `short summary` MUST follow thoses rules
- Capitalize the first letter
- use the imperative, present tense: "Change" not "Changed" nor "Changes"
- `<footer>` and `<body>` are both optional
## Attribution
This guide is based on [Contribution Gen]((https://github.com/bttger/contributing-gen)) and was adapted by the TCGdex community !

167
README.md
View File

@ -1,44 +1,157 @@
# TCGdex Javacript SDK
<p align="center">
<a href="https://www.tcgdex.net">
<img src="https://www.tcgdex.net/assets/og.png" width="90%" alt="TCGdex Main Image">
</a>
</p>
<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/dm/@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/stargazers">
<img src="https://img.shields.io/github/stars/tcgdex/javascript-sdk?style=flat-square" alt="Github stars">
</a>
<a href="https://github.com/tcgdex/javascript-sdk/actions/workflows/build.yml">
<img src="https://img.shields.io/github/actions/workflow/status/tcgdex/javascript-sdk/build.yml?style=flat-square" alt="the TCGdex JAvascript SDK is released under the MIT license." />
</a>
<a href="https://discord.gg/NehYTAhsZE">
<img src="https://img.shields.io/discord/857231041261076491?color=%235865F2&label=Discord&style=flat-square" alt="Discord Link">
</a>
</p>
## Install
# TCGdex JavaScript/TypeScript SDK
### Yarn/npm
The Javascript/Typescript SDK provides a convenient access with the Open Source TCGdex API.
```bash
yarn add @tcgdex/sdk
The SDK is available in ESM and CommonJS and should be automaticly chosen.
## Documentation
_The full API/SDK documentation in progress at [API Documentation - TCGdex](https://www.tcgdex.dev)_
### Getting Started
#### How To install
**In the browser**
To use the SDK in the browser, simply add the following script tag to your
HTML pages:
```html
<script src="https://cdn.jsdelivr.net/npm/@tcgdex/sdk@2/dist/tcgdex.browser.js"></script>
```
or with npm
You cna also download the script from [JSDelivr](https://cdn.jsdelivr.net/npm/@tcgdex/sdk@2/dist/tcgdex.browser.js) by right clicking the link and selecting save link as.
**In Node.js**
Simply type the following into a terminal window:
```bash
npm install @tcgdex/sdk
```
## Usage
#### Usage
_Note: a complete documentation is in progress_
_Note: a complete documentation is available at [TCGdex.dev](https://www.tcgdex.dev)_
**Example: Fetch a Card**
_in Browser_
```html
<script src="https://cdn.jsdelivr.net/npm/@tcgdex/sdk@2.4.9/dist/tcgdex.browser.js"></script>
<script>
// Instantiate the SDK
const tcgdex = new TCGdex('en');
// go into an async context
;(async () => {
// Card will be Furret from the Darkness Ablaze Set
const card = await tcgdex.fetch('cards', 'swsh3-136');
})();
</script>
```
_in NodeJS (in an async context)_
```typescript
// Import the SDK in Typescript or moduleJS
import TCGdex from '@tcgdex/sdk'
// import the SDK in commonJS
const TCGdex = require('@tcgdex/sdk').default
// Instantiate the SDK
const tcgdex = new TCGdex('en');
// go into an async context
(async () => {
// Card will be Furret from the Darkness Ablaze Set
const card = await tcgdex.fetch('cards', 'swsh3-136');
// You can also get the same result using
const card = await tcgdex.fetch('sets', 'Darkness Ablaze', 136);
})();
```
**Other Examples**
```javascript
import TCGdex from '@tcgdex/sdk'
import TranslationUtil from '@tcgdex/sdk/TranslationUtil'
import Tag from '@tcgdex/sdk/interfaces/Tag'
// fetch a Set's informations using the set's name or ID
await tcgdex.fetch('sets', 'Darkness Ablaze')
// init the class
const tcgdex = new TCGdex("en") // Lang code (Optionnal) (See TranslationUtil.ts line 3)
// Fetch a serie using the serie's name or ID
await tcgdex.fetch('series', 'Sword & Shield')
// change lang
tcgdex.lang = "fr"
// Fetch cards possible pokemon cards HP
await tcgdex.fetch('hp');
// get Card object wih global id
await tcgdex.getCard("base1-1")
// Fetch Cards with the specific number of HP
await tcgdex.fetch('hp', 110);
// get Card object with local id and set
await tcgdex.getCard(1, "base1")
// Fetch cards possible illustrators
await tcgdex.fetch('illustrators');
// get Set informations
await tcgdex.getSet("base1")
// get Expansion
await tcgdex.getExpansion("base")
// Translate information from code to the lang
TranslationUtil.translate("tag", Tag.STAGE2, "en")
// Fetch Cards with the specific illustrator
await tcgdex.fetch('illustrators', 'tetsuya koizumi');
```
**Other Endpoints**
_They work like the two (`hp` and `illustrators`) abose_
- categories: the the different cards categories
- energy-types: Fetch different types of energies
- hp: fetch the different cards possible HPs
- illustrators: fetch all the cards illustrators
- rarities: fetch the cards rarities
- retreats: fetch the cards using the retreat count
- stages: fetch differents cards stages
- suffixes: fetch differents cards suffixes
- trainer-types: fetch trainer cards types
- dex-ids: fetch pokemon Global Pokédex IDS
- types: fetch the cards using the Pokémon type(s)
## Contributing
See [CONTRIBUTING.md](https://github.com/tcgdex/javascript-sdk/blob/master/CONTRIBUTING.md)
TL::DR
- Fork
- Commit your changes
- Pull Request on this Repository
## License
This project is licensed under the IT License. A copy of the license is available at [LICENSE.md](https://github.com/tcgdex/javascript-sdk/blob/master/LICENSE.md)

View File

@ -1,50 +0,0 @@
import fetch from 'isomorphic-unfetch'
export default class RequestWrapper {
private static cache: Array<Request<any>> = []
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
}
}
export class Request<T = any> {
public static ttl = 1000 * 60 * 60 // 1 hour
private response?: T
private fetched?: Date
public url: string // url is public for quick url test
public constructor(url: string) {
this.url = url
}
public async get(): Promise<T | undefined> {
const now = new Date()
if (
this.fetched &&
this.response &&
now.getTime() - this.fetched.getTime() < Request.ttl
) {
return this.response
}
// Fetch Response
const resp = await fetch(this.url, {
headers: {
"Content-Type": "text/plain"
}
})
if (resp.status !== 200) {
return undefined
}
const response = await resp.json()
this.response = response
this.fetched = now
return response
}
}

151
__tests__/basic.test.ts Normal file
View File

@ -0,0 +1,151 @@
import { expect, test, vi } from 'vitest'
import TCGdex, { Query } from '../src/tcgdex'
// change timeout of execution
vi.setConfig({ testTimeout: 120000 })
const fakeFetch = (response: any, status = 200) => vi.fn(() =>
Promise.resolve({
status: status,
json: () => Promise.resolve(response)
})
)
test('Basic test', async () => {
const tcgdex = new TCGdex('en')
TCGdex.fetch = fakeFetch({ ok: true }) as any
const res = await tcgdex.fetch('cards', 'basic-test')
expect(res).toEqual({ ok: true })
expect(TCGdex.fetch).toHaveBeenCalledTimes(1)
})
test('endpoint errors', async () => {
const tcgdex = new TCGdex('en')
TCGdex.fetch = fakeFetch({ ok: 'a' }) as any
await expect(tcgdex.fetch('non existing endpoint')).rejects.toThrow()
await expect(tcgdex.fetch()).rejects.toThrow()
})
test(`404 error`, async () => {
const tcgdex = new TCGdex('en')
TCGdex.fetch = fetch
expect(
await tcgdex.card.get('404-error')
).toBeNull()
})
test(`test getting full set from list`, async () => {
const tcgdex = new TCGdex('en')
TCGdex.fetch = fetch
expect(
await (await tcgdex.set.list())[0].getSet()
).toBeTruthy()
})
test(`test getting full serie from list`, async () => {
const tcgdex = new TCGdex('en')
TCGdex.fetch = fetch
expect(
await (await tcgdex.serie.list())[0].getSerie()
).toBeTruthy()
})
test(`test getting full card from list`, async () => {
const tcgdex = new TCGdex('en')
TCGdex.fetch = fetch
expect(
await (await tcgdex.card.list())[0].getCard()
).toBeTruthy()
})
test(`test get set from card`, async () => {
const tcgdex = new TCGdex('en')
TCGdex.fetch = fetch
expect(
await (await tcgdex.card.get('swsh1-136'))!.getSet()
).toBeTruthy()
})
test(`test get serie from set`, async () => {
const tcgdex = new TCGdex('en')
TCGdex.fetch = fetch
expect(
await (await tcgdex.set.get('swsh1'))!.getSerie()
).toBeTruthy()
})
test(`advanced query system`, async () => {
const tcgdex = new TCGdex('en')
TCGdex.fetch = fetch
expect(
(await tcgdex.card.list(
Query.create()
.equal('name', 'Pikachu')
.greaterOrEqualThan('hp', 60)
.lesserThan('hp', 70)
.contains('localId', '5')
.not.contains('localId', 'tg')
.not.equal('id', 'cel25-5')
.sort('localId', 'ASC')
.paginate(3, 2)
)).length
).toBe(2)
})
const endpoints = [
{ endpoint: 'card', params: ['swsh1-136'] },
{ endpoint: 'set', params: ['swsh1'] },
{ endpoint: 'serie', params: ['swsh'] },
{ endpoint: 'type', params: ['fire'] },
{ endpoint: 'retreat', params: ['1'] },
{ endpoint: 'rarity', params: ['common'] },
{ endpoint: 'illustrator', params: [''] },
{ endpoint: 'hp', params: ['30'] },
{ endpoint: 'categorie', params: ['pokemon'] },
{ endpoint: 'dexID', params: ['1'] },
{ endpoint: 'energyType', params: ['normal'] },
{ endpoint: 'regulationMark', params: ['f'] },
{ endpoint: 'stage', params: ['basic'] },
{ endpoint: 'suffixe', params: ['ex'] },
{ endpoint: 'trainerType', params: ['item'] },
{ endpoint: 'variant', params: ['normal'] },
]
for (const endpoint of endpoints) {
test(`test real ${endpoint.endpoint} endpoint list`, async () => {
const tcgdex = new TCGdex('en')
TCGdex.fetch = fetch
expect(
await (tcgdex[endpoint.endpoint]).list()
).toBeTruthy()
})
test(`test real ${endpoint.endpoint} endpoint item`, async () => {
const tcgdex = new TCGdex('en')
TCGdex.fetch = fetch
expect(
await (tcgdex[endpoint.endpoint]).get(endpoint.params[0])
).toBeTruthy()
})
}
test(`random card/set/serie`, async () => {
const tcgdex = new TCGdex('en')
TCGdex.fetch = fetch
expect((await tcgdex.random.card())).toBeTruthy()
expect((await tcgdex.random.set())).toBeTruthy()
expect((await tcgdex.random.serie())).toBeTruthy()
})

View File

@ -0,0 +1,67 @@
import { expect, test, vi } from 'vitest'
import TCGdex from '../src/tcgdex'
// change timeout of execution
vi.setConfig({ testTimeout: 120000 })
const fakeFetch = (response, status = 200) => vi.fn(() =>
Promise.resolve({
status: status,
json: () => Promise.resolve(response),
})
)
test('Basic test', async () => {
const tcgdex = new TCGdex('en')
TCGdex.fetch = fakeFetch({ ok: true }) as any
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' }) as any
const res1 = await tcgdex.fetch('cards', 'cache-test')
expect(res1).toEqual({ ok: 'a' })
TCGdex.fetch = fakeFetch({ ok: 'b' }) as any
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' }) as any
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) as any
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'
],
};

18592
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,26 +1,77 @@
{
"name": "@tcgdex/sdk",
"version": "2.0.0",
"main": "./tcgdex.js",
"types": "./main.d.ts",
"version": "2.6.0",
"main": "./dist/tcgdex.node.js",
"module": "./dist/tcgdex.node.mjs",
"types": "./dist/tcgdex.node.d.ts",
"browser": "./dist/tcgdex.browser.global.js",
"exports": {
".": {
"require": {
"types": "./dist/tcgdex.node.d.ts",
"default": "./dist/tcgdex.node.js"
},
"import": {
"types": "./dist/tcgdex.node.d.mts",
"default": "./dist/tcgdex.node.mjs"
}
}
},
"description": "Communicate with the Open Source TCGdex API in Javascript/Typescript using the SDK",
"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",
"browser",
"node"
],
"license": "MIT",
"devDependencies": {
"@types/node-fetch": "2.5.7",
"ts-node": "^9.1.1",
"typescript": "^4.1.3"
"@babel/core": "^7",
"@babel/preset-env": "^7",
"@babel/preset-typescript": "^7",
"@dzeio/config": "^1",
"@types/node-fetch": "^2",
"@typescript-eslint/eslint-plugin": "^5",
"@typescript-eslint/parser": "^5",
"@vitest/coverage-v8": "^2.1.8",
"eslint": "^8",
"jest": "^29",
"tsup": "^7",
"typescript": "^5",
"vitest": "^2"
},
"engines": {
"node": ">=12"
},
"dependencies": {
"isomorphic-unfetch": "^3.1.0"
"@cachex/memory": "^1",
"@cachex/web-storage": "^1",
"@dzeio/object-util": "^1",
"isomorphic-unfetch": "^3"
},
"scripts": {
"build": "tsc --project tsconfig.json",
"prepublishOnly": "yarn build"
"prebuild": "node scripts/export-version-number.js",
"build": "rm -rf dist && tsup ./src/tcgdex.node.ts --format cjs,esm --dts --clean && tsup ./src/tcgdex.browser.ts --format iife --global-name TCGdex --sourcemap",
"prepublishOnly": "npm run build",
"lint": "eslint",
"test": "vitest run --coverage"
},
"files": [
"*.js",
"*.d.ts",
"**/*.js",
"**/*.d.ts"
]
"dist"
],
"sideEffects": false,
"jest": {
"testTimeout": 30000
}
}

View File

@ -0,0 +1,4 @@
const { version } = require('../package.json')
const fs = require('fs')
fs.writeFileSync('./src/version.js', `export const version = '${version}'`)

88
src/Query.ts Normal file
View File

@ -0,0 +1,88 @@
export default class Query {
public params: Array<{ key: string, value: string | number | boolean }> = []
public not: {
equal: (key: string, value: string) => Query
contains: (key: string, value: string) => Query
includes: (key: string, value: string) => Query
like: (key: string, value: string) => Query
isNull: (key: string) => Query
} = {
equal: (key: string, value: string) => {
this.params.push({ key: key, value: `neq:${value}` })
return this
},
contains: (key: string, value: string) => {
this.params.push({ key: key, value: `not:${value}` })
return this
},
includes: (key: string, value: string) => this.not.contains(key, value),
like: (key: string, value: string) => this.not.contains(key, value),
isNull: (key: string) => {
this.params.push({ key: key, value: 'notnull:' })
return this
}
}
public static create(): Query {
return new Query()
}
public includes(key: string, value: string): this {
return this.contains(key, value)
}
public like(key: string, value: string): this {
return this.contains(key, value)
}
public contains(key: string, value: string): this {
this.params.push({ key: key, value: value })
return this
}
public equal(key: string, value: string): this {
this.params.push({ key: key, value: `eq:${value}` })
return this
}
public sort(key: string, order: 'ASC' | 'DESC'): this {
this.params.push({ key: 'sort:field', value: key })
this.params.push({ key: 'sort:order', value: order })
return this
}
public greaterOrEqualThan(key: string, value: number) {
this.params.push({ key: key, value: `gte:${value}` })
return this
}
public lesserOrEqualThan(key: string, value: number) {
this.params.push({ key: key, value: `lte:${value}` })
return this
}
public greaterThan(key: string, value: number) {
this.params.push({ key: key, value: `gt:${value}` })
return this
}
public lesserThan(key: string, value: number) {
this.params.push({ key: key, value: `lt:${value}` })
return this
}
public isNull(key: string) {
this.params.push({ key: key, value: 'null:' })
return this
}
public paginate(page: number, itemsPerPage: number): this {
this.params.push({ key: 'pagination:page', value: page })
this.params.push({ key: 'pagination:itemsPerPage', value: itemsPerPage })
return this
}
}

26
src/endpoints/Endpoint.ts Normal file
View File

@ -0,0 +1,26 @@
import type { Endpoints } from '../interfaces'
import Model from '../models/Model'
import type Query from '../Query'
import type TCGdex from '../tcgdex'
export default class Endpoint<Item extends Model, List extends Model> {
public constructor(
protected readonly tcgdex: TCGdex,
protected readonly itemModel: new (sdk: TCGdex) => Item,
protected readonly listModel: new (sdk: TCGdex) => List,
protected readonly endpoint: Endpoints
) { }
public async get(id: string | number): Promise<Item | null> {
const res = await this.tcgdex.fetch(this.endpoint as 'cards', id as string)
if (!res) {
return null
}
return Model.build(new this.itemModel(this.tcgdex), res)
}
public async list(query?: Query): Promise<Array<List>> {
const res = await this.tcgdex.fetchWithQuery([this.endpoint], query?.params)
return (res as Array<object> ?? []).map((it) => Model.build(new this.listModel(this.tcgdex), it))
}
}

View File

@ -0,0 +1,24 @@
import type { Endpoints } from '../interfaces'
import Model from '../models/Model'
import type Query from '../Query'
import type TCGdex from '../tcgdex'
export default class SimpleEndpoint<Item extends Model, List extends string | number> {
public constructor(
protected readonly tcgdex: TCGdex,
protected readonly itemModel: new (sdk: TCGdex) => Item,
protected readonly endpoint: Endpoints
) {}
public async get(id: string | number): Promise<Item | null> {
const res = await this.tcgdex.fetch(this.endpoint as 'cards', id as string)
if (!res) {
return null
}
return Model.build(new this.itemModel(this.tcgdex), res)
}
public async list(query?: Query): Promise<Array<List>> {
return await this.tcgdex.fetchWithQuery([this.endpoint], query?.params) ?? []
}
}

View File

@ -1,10 +1,14 @@
export type SupportedLanguages = 'en' | 'fr'
export type SupportedLanguages = 'en' | 'fr' | 'es' | 'it' | 'pt' | 'de'
/**
* @deprecated This is not used anymore in the API V2
*/
export type Languages<T = string> = Partial<Record<SupportedLanguages, T>>
interface SerieResume {
export interface SerieResume {
id: string
name: string
logo?: string
}
export interface Serie extends SerieResume {
@ -18,29 +22,26 @@ interface variants {
firstEdition?: boolean
}
export type Types = 'Colorless' | 'Darkness' | 'Dragon' |
'Fairy' | 'Fightning' | 'Fire' |
'Grass' | 'Lightning' | 'Metal' |
'Psychic' | 'Water'
export type SetList = Array<SetResume>
export type SerieList = Array<SerieResume>
export type CardList = Array<CardResume>
interface SetResume {
export interface SetResume {
id: string
name: string
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
}
}
@ -51,32 +52,52 @@ export interface Set extends SetResume {
releaseDate: string
legal?: {
/**
* Designate if the set is usable in tournaments
*
* Note: this is specific to the set and if a
* card is banned from the set it will still be true
*/
legal: {
/**
* Ability to play in standard tournaments
*/
standard: boolean
/**
* Ability to play in expanded tournaments
*/
expanded: boolean
}
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
*/
@ -86,7 +107,7 @@ export interface Set extends SetResume {
cards: CardList
}
interface CardResume {
export interface CardResume {
id: string
localId: string
@ -114,7 +135,7 @@ export interface Card<SetType extends SetResume = SetResume> extends CardResume
* - Ultra Rare
* - Secret Rare
*/
rarity: 'None' | 'Common'| 'Uncommon' | 'Rare' | 'Ultra Rare' | 'Secret Rare'
rarity: string
/**
* Card Category
@ -123,7 +144,7 @@ export interface Card<SetType extends SetResume = SetResume> extends CardResume
* - Trainer
* - Energy
*/
category: 'Pokemon' | 'Trainer' | 'Energy'
category: string
/**
* Card Variants (Override Set Variants)
@ -151,8 +172,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<Types> // ex for multiple https://www.tcgdex.net/database/ex/ex13/17
types?: Array<string>
/**
* Pokemon Sub Evolution
@ -188,7 +210,7 @@ export interface Card<SetType extends SetResume = SetResume> extends CardResume
* - Stage2 https://www.tcgdex.net/database/xy/xy9/3
* - VMAX https://www.tcgdex.net/database/swsh/swsh1/50
*/
stage?: 'Basic' | 'BREAK' | 'LEVEL-UP' | 'MEGA' | 'RESTORED' | 'Stage1' | 'Stage2' | 'VMAX'
stage?: string
/**
* Card Suffix
@ -201,7 +223,7 @@ export interface Card<SetType extends SetResume = SetResume> extends CardResume
* - SP https://www.tcgdex.net/database/pl/pl1/7
* - TAG TEAM-GX https://www.tcgdex.net/database/sm/sm12/226
*/
suffix?: 'EX' | 'GX' | 'V' | 'Legend' | 'Prime' | 'SP' | 'TAG TEAM-GX'
suffix?: string
/**
* Pokemon Held Item
@ -219,7 +241,7 @@ export interface Card<SetType extends SetResume = SetResume> extends CardResume
* multi abilities ex https://www.tcgdex.net/database/ex/ex15/10
*/
abilities?: Array<{
type: 'Pokemon Power' | 'Poke-BODY' | 'Poke-POWER' | 'Ability' | 'Ancient Trait'
type: string
name: string
effect: string
}>
@ -228,7 +250,7 @@ export interface Card<SetType extends SetResume = SetResume> extends CardResume
* Pokemon Attacks
*/
attacks?: Array<{
cost?: Array<Types>
cost?: Array<string>
name: string
effect?: string
damage?: string | number
@ -238,38 +260,48 @@ export interface Card<SetType extends SetResume = SetResume> extends CardResume
* Pokemon Weaknesses
*/
weaknesses?: Array<{
type: Types
type: string
value?: string
}>
resistances?: Array<{
type: Types
type: string
value?: string
}>
retreat?: number
//Trainer/Energy
// Trainer/Energy
effect?: string
// Trainer Only
trainerType?: 'Supporter' | // https://www.tcgdex.net/database/ex/ex7/83
'Item' | // https://www.tcgdex.net/database/ex/ex7/89
'Stadium' | // https://www.tcgdex.net/database/ex/ex7/87
'Tool' | // https://www.tcgdex.net/database/neo/neo1/93
'Ace Spec' | // https://www.tcgdex.net/database/bw/bw7/139
'Technical Machine' | // https://www.tcgdex.net/database/ecard/ecard1/144
'Goldenred Game Corner' | // https://www.tcgdex.net/database/neo/neo1/83
'Rocket\'s Secret Machine' // https://www.tcgdex.net/database/ex/ex7/84
trainerType?: string
// Energy Only
energyType?: 'Normal' | // https://www.tcgdex.net/database/ecard/ecard1/160
'Special' // https://www.tcgdex.net/database/ecard/ecard1/158
energyType?: string
/**
* Define the rotation mark on cards >= Sword & Shield
*/
rotationMark?: string
regulationMark?: string
/**
* Card ability to be played in official tournaments
*
* Note: all cards are avaialable to play in unlimited tournaments
*/
legal: {
/**
* Ability to play in standard tournaments
*/
standard: boolean
/**
* Ability to play in expanded tournaments
*/
expanded: boolean
}
}
export type StringEndpointList = Array<string>
@ -278,3 +310,12 @@ export interface StringEndpoint {
name: string
cards: Array<CardResume>
}
export type Quality = 'low' | 'high'
export type Extension = 'jpg' | 'webp' | 'png'
export type Endpoints = 'cards' | 'categories' | 'dex-ids' | 'energy-types' |
'hp' | 'illustrators' | 'rarities' | 'regulation-marks' |
'retreats' | 'series' | 'sets' | 'stages' | 'suffixes' |
'trainer-types' | 'types' | 'variants' | 'random'

198
src/models/Card.ts Normal file
View File

@ -0,0 +1,198 @@
import CardResume from './CardResume'
import type { Variants } from './Other'
import type TCGdexSet from './Set'
import type SetResume from './SetResume'
// TODO: sort elements by alphabetical order
export default class Card extends CardResume {
/**
* Card illustrator
*/
public illustrator?: string
/**
* Card Rarity
*
* - None https://www.tcgdex.net/database/sm/smp/SM01
* - Common https://www.tcgdex.net/database/xy/xy9/1
* - Uncommon https://www.tcgdex.net/database/xy/xy9/2
* - Rare https://www.tcgdex.net/database/xy/xy9/3
* - Ultra Rare
* - Secret Rare
*/
public rarity!: string
/**
* Card Category
*
* - Pokemon
* - Trainer
* - Energy
*/
public category!: string
/**
* Card Variants (Override Set Variants)
*/
public variants?: Variants
/**
* Card Set
*/
public set!: SetResume
/**
* Pokemon only elements
*/
/**
* Pokemon Pokedex ID
*/
public dexId?: Array<number>
/**
* Pokemon HP
*/
public hp?: number
/**
* Pokemon Types
* ex for multiple https://www.tcgdex.net/database/ex/ex13/17
*/
public types?: Array<string>
/**
* Pokemon Sub Evolution
*/
public evolveFrom?: string
/**
* Pokemon Weight
*/
public weight?: string
/**
* Pokemon Description
*/
public description?: string
/**
* Level of the Pokemon
*
* NOTE: can be equal to 'X' when the pokemon is a LEVEL-UP one
*/
public level?: number | string
/**
* Pokemon Stage
*
* - Basic https://www.tcgdex.net/database/xy/xy9/1
* - BREAK https://www.tcgdex.net/database/xy/xy9/18
* - LEVEL-UP https://www.tcgdex.net/database/dp/dp1/121
* - MEGA https://www.tcgdex.net/database/xy/xy1/2
* - RESTORED https://www.tcgdex.net/database/bw/bw5/53
* - Stage1 https://www.tcgdex.net/database/xy/xy9/2
* - Stage2 https://www.tcgdex.net/database/xy/xy9/3
* - VMAX https://www.tcgdex.net/database/swsh/swsh1/50
*/
public stage?: string
/**
* Card Suffix
*
* - EX https://www.tcgdex.net/database/ex/ex2/94
* - GX https://www.tcgdex.net/database/sm/sm12/4
* - V https://www.tcgdex.net/database/swsh/swsh1/1
* - Legend https://www.tcgdex.net/database/hgss/hgss1/114
* - Prime https://www.tcgdex.net/database/hgss/hgss2/85
* - SP https://www.tcgdex.net/database/pl/pl1/7
* - TAG TEAM-GX https://www.tcgdex.net/database/sm/sm12/226
*/
public suffix?: string
/**
* Pokemon Held Item
*
* ex https://www.tcgdex.net/database/dp/dp2/75
*/
public item?: {
name: string
effect: string
}
/**
* Pokemon Abilities
*
* multi abilities ex https://www.tcgdex.net/database/ex/ex15/10
*/
public abilities?: Array<{
type: string
name: string
effect: string
}>
/**
* Pokemon Attacks
*/
public attacks?: Array<{
cost?: Array<string>
name: string
effect?: string
damage?: string | number
}>
/**
* Pokemon Weaknesses
*/
public weaknesses?: Array<{
type: string
value?: string
}>
public resistances?: Array<{
type: string
value?: string
}>
public retreat?: number
// Trainer/Energy
public effect?: string
// Trainer Only
public trainerType?: string
// Energy Only
public energyType?: string
/**
* Define the rotation mark on cards >= Sword & Shield
*/
public regulationMark?: string
/**
* Card ability to be played in official tournaments
*
* Note: all cards are avaialable to play in unlimited tournaments
*/
public legal!: {
/**
* Ability to play in standard tournaments
*/
standard: boolean
/**
* Ability to play in expanded tournaments
*/
expanded: boolean
}
public override async getCard(): Promise<Card> {
return this
}
public async getSet(): Promise<TCGdexSet> {
return (await this.sdk.set.get(this.set.id))!
}
}

47
src/models/CardResume.ts Normal file
View File

@ -0,0 +1,47 @@
import type { Extension, Quality } from '../interfaces'
import type Card from './Card'
import Model from './Model'
export default class CardResume extends Model {
/**
* Globally unique card ID based on the set ID and the cards ID within the set
*/
public id!: string
/**
* Card image url without the extension and quality
*
* @see {@link getImageURL}
*/
public image?: string
/**
* ID indexing this card within its set, usually just its number
*/
public localId!: string
/**
* Card Name (Including the suffix if next to card name)
*/
public name!: string
/**
* the the Card Image full URL
*
* @param {Quality} quality the quality you want your image to be in
* @param {Extension} extension extension you want you image to be
* @return the full card URL
*/
public getImageURL(quality: Quality = 'high', extension: Extension = 'png'): string {
return `${this.image}/${quality}.${extension}`
}
/**
* Get the full Card
*
* @return the full card if available
*/
public async getCard(): Promise<Card> {
return (await this.sdk.card.get(this.id))!
}
}

28
src/models/Model.ts Normal file
View File

@ -0,0 +1,28 @@
import { objectLoop } from '@dzeio/object-util'
import type TCGdex from '../tcgdex'
export default abstract class Model {
public constructor(
protected readonly sdk: TCGdex
) { }
/**
* build a model depending on the data given
* @param model the model to build
* @param data the data to fill it with
*/
public static build<T extends Model>(model: T, data?: object): T {
if (!data) {
throw new Error('data is necessary.')
}
model.fill(data)
return model
}
protected fill(obj: object) {
objectLoop(obj, (value, key) => {
(this as object)[key] = value
})
}
}

6
src/models/Other.d.ts vendored Normal file
View File

@ -0,0 +1,6 @@
export interface Variants {
normal?: boolean
reverse?: boolean
holo?: boolean
firstEdition?: boolean
}

21
src/models/Serie.ts Normal file
View File

@ -0,0 +1,21 @@
import { objectLoop } from '@dzeio/object-util'
import Model from './Model'
import SerieResume from './SerieResume'
import SetResume from './SetResume'
export default class Serie extends SerieResume {
public sets!: Array<SetResume>
protected fill(obj: object): void {
objectLoop(obj, (value, key) => {
switch (key) {
case 'sets':
this.sets = (value as Array<any>).map((it) => Model.build(new SetResume(this.sdk), it))
break
default:
this[key] = value
break
}
})
}
}

24
src/models/SerieResume.ts Normal file
View File

@ -0,0 +1,24 @@
import type { Extension } from '../interfaces'
import Model from './Model'
import type Serie from './Serie'
export default class SerieResume extends Model {
public id!: string
public name!: string
public logo?: string
/**
* the the Card Image full URL
*
* @param {Quality} quality the quality you want your image to be in
* @param {Extension} extension extension you want you image to be
* @return the full card URL
*/
public getImageURL(extension: Extension = 'png'): string {
return `${this.logo}.${extension}`
}
public async getSerie(): Promise<Serie> {
return (await this.sdk.serie.get(this.id))!
}
}

89
src/models/Set.ts Normal file
View File

@ -0,0 +1,89 @@
import { objectLoop } from '@dzeio/object-util'
import CardResume from './CardResume'
import Model from './Model'
import type { Variants } from './Other'
import type SerieResume from './SerieResume'
// biome-ignore lint/suspicious/noShadowRestrictedNames: <explanation>
export default class Set extends Model {
public id!: string
public name!: string
public logo?: string
public symbol?: string
public serie!: SerieResume
public tcgOnline?: string
public variants?: Variants
public releaseDate!: string
/**
* Designate if the set is usable in tournaments
*
* Note: this is specific to the set and if a
* card is banned from the set it will still be true
*/
public legal!: {
/**
* Ability to play in standard tournaments
*/
standard: boolean
/**
* Ability to play in expanded tournaments
*/
expanded: boolean
}
public 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
*/
firstEd?: number
}
public cards!: Array<CardResume>
public async getSerie() {
return this.sdk.serie.get(this.serie.id)
}
protected fill(obj: object): void {
objectLoop(obj, (value, key) => {
switch (key) {
case 'cards':
this.cards = (value as Array<any>).map((it) => Model.build(new CardResume(this.sdk), it))
break
default:
this[key] = value
break
}
})
}
}

25
src/models/SetResume.ts Normal file
View File

@ -0,0 +1,25 @@
import Model from './Model'
import type TCGdexSet from './Set'
export default class SetResume extends Model {
public id!: string
public name!: string
public logo?: string
public symbol?: string
public cardCount!: {
/**
* total of number of cards
*/
total: number
/**
* number of cards officialy (on the bottom of each cards)
*/
official: number
}
public async getSet(): Promise<TCGdexSet> {
return (await this.sdk.set.get(this.id))!
}
}

View File

@ -0,0 +1,21 @@
import { objectLoop } from '@dzeio/object-util'
import CardResume from './CardResume'
import Model from './Model'
export default class StringEndpoint extends Model {
public name!: string
public cards!: Array<CardResume>
protected fill(obj: object): void {
objectLoop(obj, (value, key) => {
switch (key) {
case 'cards':
this.cards = (value as Array<any>).map((it) => Model.build(new CardResume(this.sdk), it))
break
default:
this[key] = value
break
}
})
}
}

View File

@ -1,4 +1,5 @@
import TCGdex from './tcgdex'
export * from './interfaces'
TCGdex.fetch = window.fetch
export default TCGdex

7
src/tcgdex.node.ts Normal file
View File

@ -0,0 +1,7 @@
import TCGdex from './tcgdex'
import fetch from 'isomorphic-unfetch'
TCGdex.fetch = fetch as any
export default TCGdex
export * from './tcgdex'

410
src/tcgdex.ts Normal file
View File

@ -0,0 +1,410 @@
import type CacheInterface from '@cachex/core'
import MemoryCache from '@cachex/memory'
import LocalStorageCache from '@cachex/web-storage'
import Query from './Query'
import Endpoint from './endpoints/Endpoint'
import SimpleEndpoint from './endpoints/SimpleEndpoint'
import type {
Card,
CardResume,
Endpoints,
Serie,
SerieList,
SetList,
StringEndpoint,
SupportedLanguages,
Set as TCGdexSet
} from './interfaces'
import CardModel from './models/Card'
import CardResumeModel from './models/CardResume'
import Model from './models/Model'
import SerieModel from './models/Serie'
import SerieResume from './models/SerieResume'
import SetModel from './models/Set'
import SetResumeModel from './models/SetResume'
import StringEndpointModel from './models/StringEndpoint'
import { ENDPOINTS, detectContext } from './utils'
import { version } from './version'
export default class TCGdex {
/**
* How the remote data is going to be fetched
*/
public static fetch: typeof fetch = fetch
/**
* @deprecated to change the lang use {@link TCGdex.getLang} and {@link TCGdex.setLang}
*/
public static defaultLang: SupportedLanguages = 'en'
/**
* the previously hidden caching system used by TCGdex to not kill the API
*/
public cache: CacheInterface =
detectContext() === 'browser' ? new LocalStorageCache('tcgdex-cache') : new MemoryCache()
/**
* the default cache TTL, only subsequent requests will have their ttl changed
*/
public cacheTTL = 60 * 60
// random card/set/serie endpoints
public readonly random = {
card: async (): Promise<CardModel> => {
const res = await this.fetch('random', 'card')
return Model.build(new CardModel(this), res)
},
set: async (): Promise<SetModel> => {
const res = await this.fetch('random', 'set')
return Model.build(new SetModel(this), res)
},
serie: async (): Promise<SerieModel> => {
const res = await this.fetch('random', 'serie')
return Model.build(new SerieModel(this), res)
}
}
public readonly card = new Endpoint(this, CardModel, CardResumeModel, 'cards')
public readonly set = new Endpoint(this, SetModel, SetResumeModel, 'sets')
public readonly serie = new Endpoint(this, SerieModel, SerieResume, 'series')
public readonly type = new SimpleEndpoint(this, StringEndpointModel, 'types')
public readonly retreat = new SimpleEndpoint(this, StringEndpointModel, 'retreats')
public readonly rarity = new SimpleEndpoint(this, StringEndpointModel, 'rarities')
public readonly illustrator = new SimpleEndpoint(this, StringEndpointModel, 'illustrators')
public readonly hp = new SimpleEndpoint(this, StringEndpointModel, 'hp')
public readonly categorie = new SimpleEndpoint(this, StringEndpointModel, 'categories')
public readonly dexID = new SimpleEndpoint(this, StringEndpointModel, 'dex-ids')
public readonly energyType = new SimpleEndpoint(this, StringEndpointModel, 'energy-types')
public readonly regulationMark = new SimpleEndpoint(this, StringEndpointModel, 'regulation-marks')
public readonly stage = new SimpleEndpoint(this, StringEndpointModel, 'stages')
public readonly suffixe = new SimpleEndpoint(this, StringEndpointModel, 'suffixes')
public readonly trainerType = new SimpleEndpoint(this, StringEndpointModel, 'trainer-types')
public readonly variant = new SimpleEndpoint(this, StringEndpointModel, 'variants')
private lang: SupportedLanguages = 'en'
private endpointURL = 'https://api.tcgdex.net/v2'
public constructor(lang: SupportedLanguages = 'en') {
this.setLang(lang)
}
/**
* @deprecated use the constructor parameter or {@link TCGdex.setLang} when in an instance
*/
public static setDefaultLang(lang: SupportedLanguages) {
TCGdex.defaultLang = lang
}
/**
* @deprecated use {@link TCGdex.setLang} when in an instance
*/
public static getDefaultLang(): SupportedLanguages {
return TCGdex.defaultLang
}
/**
* the endpoint URL
* ex: `https://api.tcgdex.net/v2`
* @param endpoint the url
*/
public setEndpoint(endpoint: string) {
this.endpointURL = endpoint
}
public getEndpoint(): string {
return this.endpointURL
}
/**
* set the current cache methodology
* @param cache the cache to use
*/
public setCache(cache: CacheInterface) {
this.cache = cache
}
/**
* get the current cache methodology
* @param cache the cache to use
*/
public getCache(): CacheInterface {
return this.cache
}
/**
* the endpoint URL
* ex: `https://api.tcgdex.net/v2`
* @param endpoint the url
*/
public setCacheTTL(seconds: number) {
this.cacheTTL = seconds
}
/**
* get the current useed cache ttl in seconds
* @returns the cache ttl in seconds
*/
public getCacheTTL(): number {
return this.cacheTTL
}
public getLang(): SupportedLanguages {
return this.lang ?? TCGdex.defaultLang ?? 'en'
}
public setLang(lang: SupportedLanguages) {
this.lang = lang
}
/**
* Shortcut to easily fetch a card using both it's global id and it's local ID
* @param id the card global/local ID
* @param set the card set name/ID (optionnal)
* @returns the card object
*/
public async fetchCard(id: string | number, set?: string): Promise<Card | undefined> {
const path = set ? ['sets', set] : ['cards']
// @ts-expect-error the base endpoint is 'sets' or 'cards'
return this.fetch(...path, id)
}
/**
* Shortcut to easily fetch cards using an optionnal set name/ID
* @param set the card set name/ID (optionnal)
* @returns a card list
*/
public async fetchCards(set?: string): Promise<Array<CardResume> | undefined> {
if (set) {
const fSet = await this.fetch('sets', set)
return fSet ? fSet.cards : undefined
}
return this.fetch('cards')
}
/**
* @deprecated use `this.fetch('sets', set)`
*/
public async fetchSet(set: string): Promise<TCGdexSet | undefined> {
return this.fetch('sets', set)
}
/**
* @deprecated use `this.fetch('series', serie)`
*/
public async fetchSerie(serie: string): Promise<Serie | undefined> {
return this.fetch('series', serie)
}
/**
* @deprecated use `this.fetch('series')`
*/
public async fetchSeries(): Promise<SerieList | undefined> {
return this.fetch('series')
}
/**
* Shortcut to easily fetch sets using an optionnal serie name/ID
* @param serie the card set name/ID (optionnal)
* @returns a card list
*/
public async fetchSets(serie?: string): Promise<SetList | undefined> {
if (serie) {
const fSerie = await this.fetch('series', serie)
return fSerie ? fSerie.sets : undefined
}
return this.fetch('sets')
}
/**
* Fetch a card using its global id
* @param endpoint_0 'cards'
* @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'
* @param endpoint_1 {string} the set name or ID
* @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<TCGdexSet | undefined>
/**
* Fetch a random element
* @param endpoint_0 'random'
* @param endpoint_1 {'set' | 'card' | 'serie'} the type of random element you want to get
*/
public async fetch(...endpoint: ['random', 'set' | 'card' | 'serie']): Promise<Card | TCGdexSet | Serie | 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' | 'dex-ids' | 'energy-types' | 'hp' | 'illustrators' | 'rarities' | 'regulation-marks' | 'retreats' | 'stages' | 'suffixes' | 'trainer-types' | 'types' | 'variants'}
* Possible value 'categories' | 'dex-ids' | 'energy-types' | 'hp' | 'illustrators' | 'rarities' | 'regulation-marks' | 'retreats' | 'stages' | 'suffixes' | 'trainer-types' | 'types' | 'variants'
* @param endpoint_1 {string} the value set while fetching the index
*/
public async fetch(...endpoint: ['categories' | 'dex-ids' | 'energy-types' | 'hp' | 'illustrators' | 'rarities' | 'regulation-marks' | 'retreats' | 'stages' | 'suffixes' | 'trainer-types' | 'types' | 'variants', string]): Promise<StringEndpoint | undefined>
/**
* Fetch cards depending on a specific filter
* @param endpoint_0 {'categories' | 'dex-ids' | 'energy-types' | 'hp' | 'illustrators' | 'rarities' | 'regulation-marks' | 'retreats' | 'stages' | 'suffixes' | 'trainer-types' | 'types' | 'variants'}
* Possible value 'categories' | 'dex-ids' | 'energy-types' | 'hp' | 'illustrators' | 'rarities' | 'regulation-marks' | 'retreats' | 'stages' | 'suffixes' | 'trainer-types' | 'types' | 'variants'
* @param endpoint_1 {string} Fetch the possible values to use depending on the endpoint
*/
public async fetch(endpoint: 'categories' | 'dex-ids' | 'energy-types' | 'hp' | 'illustrators' | 'rarities' | 'regulation-marks' | 'retreats' | 'stages' | 'suffixes' | 'trainer-types' | 'types' | 'variants'): Promise<Array<string> | undefined>
/**
* Fetch The differents endpoints depending on the first argument
* @param endpoint_0 {'hp' | 'retreats' | 'categories' | 'illustrators' | 'rarities' | 'types'}
* Possible value 'cards' | 'categories' | 'hp' | 'illustrators' | 'rarities' | 'retreats' | 'series' | 'sets' | 'types'
* @param endpoint_1 {string} (Optionnal) some details to go from the index file to the item file (mostly the ID/name)
* @param endpoint_2 {string} (Optionnal) only for sets the card local ID to fetch the card through the set
*/
public async fetch<T = object>(...endpoint: Array<Endpoints | string>): Promise<T | undefined> {
if (endpoint.length === 0) {
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
if (!ENDPOINTS.includes(baseEndpoint)) {
throw new Error(`unknown endpoint to fetch! (${baseEndpoint})`)
}
return this.actualFetch<T>(this.getFullURL([baseEndpoint, ...endpoint]))
}
/**
* @param endpoint the endpoint to fetch
* @param query the query
*/
public async fetchWithQuery<T = object>(
endpoint: [Endpoints, ...Array<string>],
query?: Array<{ key: string, value: string | number | boolean }>
): Promise<T | undefined> {
if (endpoint.length === 0) {
throw new Error('endpoint to fetch is empty!')
}
const baseEndpoint = endpoint[0].toLowerCase() as Endpoints
if (!ENDPOINTS.includes(baseEndpoint)) {
throw new Error(`unknown endpoint to fetch! (${baseEndpoint})`)
}
return this.actualFetch<T>(this.getFullURL(endpoint, query))
}
/**
* format the final URL
*/
private getFullURL(
url: Array<string | number>,
searchParams?: Array<{ key: string, value: string | number | boolean }>
): string {
// Normalize path
let path = url.map(this.encode).join('/')
// handle the Search Params
if (searchParams) {
path += '?' + searchParams.map((it) => `${this.encode(it.key)}=${this.encode(it.value)}`).join('&')
}
// return with the endpoint and all the shit
return `${this.getEndpoint()}/${this.getLang()}/${path}`
}
private async actualFetch<T = object>(path: string): Promise<T | undefined> {
// get and return the cached value if available
const cached = this.cache.get(path)
if (cached) {
return cached as T
}
// the actual Fetch :D
const resp = await TCGdex.fetch(path, {
headers: {
'user-agent': `@tcgdex/javascript-sdk/${version}`
}
})
// throw if a server-side error is occured
if (resp.status >= 500) {
try {
const json = JSON.stringify(await resp.json())
throw new Error(json)
} catch {
throw new Error('TCGdex Server responded with an invalid error :(')
}
}
// response is not valid :O
if (resp.status !== 200) {
return undefined
}
// parse, put to cache and return
const json = await resp.json()
this.cache.set(path, json, this.cacheTTL)
return json as T
}
/**
* encode a string to be used in an url
* @param str the string to encode to URL
* @returns the encoded string
*/
private encode(str: string | number | boolean): string {
return encodeURI(
str
// Transform numbers to string
.toString()
// replace this special character with an escaped one
.replace('?', '%3F')
// normalize the string
.normalize('NFC')
// remove some special chars
// eslint-disable-next-line no-misleading-character-class
.replace(/["'\u0300-\u036f]/gu, '')
)
}
}
// export the old interfaces
export type * from './interfaces.d.ts'
// export the new models items and the Query
export {
CardModel, CardResumeModel, Endpoint, Model, Query, SerieModel,
SerieResume as SerieResumeModel,
SetModel,
SetResumeModel, SimpleEndpoint
}

20
src/utils.ts Normal file
View File

@ -0,0 +1,20 @@
import type { Endpoints } from './interfaces'
/**
* detect the current running context ofthe program
*/
export function detectContext(): 'browser' | 'server' {
try {
const isBrowser = !!window
return isBrowser ? 'browser' : 'server'
} catch {
return 'server'
}
}
export const ENDPOINTS: ReadonlyArray<Endpoints> = [
'cards', 'categories', 'dex-ids', 'energy-types',
'hp', 'illustrators', 'rarities', 'regulation-marks',
'retreats', 'series', 'sets', 'stages', 'suffixes',
'trainer-types', 'types', 'variants', 'random'
] as const

View File

@ -1,79 +0,0 @@
import RequestWrapper from './Request'
import { Serie, Set, Card, CardResume, SerieList, SetList, SupportedLanguages } from './interfaces'
export default class TCGdex {
public static defaultLang: SupportedLanguages = "en"
public constructor(public lang?: SupportedLanguages) {}
public getLang() {
return this.lang || TCGdex.defaultLang
}
private getBaseUrl() {
return `https://api.tcgdex.net/v2/${this.getLang()}`
}
public async fetchCard(id: string | number, set?: string): Promise<Card | undefined> {
const path = set ? ['sets', set] : ['cards']
return this.rwgr<Card>(...path, id).get()
}
public async fetchCards(set?: string): Promise<Array<CardResume> | undefined> {
if (set) {
const setSingle = await this.fetchSet(set)
if (!setSingle) {
return undefined
}
return setSingle.cards
}
const req = this.rwgr<Array<CardResume>>('cards')
const resp = await req.get()
if (!resp) {
return undefined
}
return resp
}
public async fetchSet(set: string): Promise<Set | undefined> {
const req = this.rwgr<Set>('sets', set)
const resp = await req.get()
if (!resp) {
return undefined
}
return resp
}
public async fetchSerie(expansion: string): Promise<Serie | undefined> {
const req = this.rwgr<Serie>('series', expansion)
return req.get()
}
public async fetchSeries(): Promise<SerieList | undefined> {
const req = this.rwgr<SerieList>('series')
return req.get()
}
public async fetchSets(expansion?: string): Promise<SetList | undefined> {
if (expansion) {
const expansionSingle = await this.fetchSerie(expansion)
if (!expansionSingle) {
return undefined
}
return expansionSingle.sets
}
const req = this.rwgr<SetList>('sets')
const list = await req.get()
if (!list) {
return undefined
}
return list
}
private rwgr<T = any>(...url: Array<string | number>) {
return RequestWrapper.getRequest<T>(`${this.getBaseUrl()}/${url.map((v) => encodeURI(
// Normalize URL
v.toString().replace('?', '%3F').normalize('NFC').replace(/["'\u0300-\u036f]/g, "")
)).join('/')}`)
}
}

View File

@ -1,66 +1,10 @@
{
"include": ["**/*.ts"],
"exclude": ["translations"],
"extends": "./node_modules/@dzeio/config/tsconfig.base",
"compilerOptions": {
/* Basic Options */
// "incremental": true, /* Enable incremental compilation */
"target": "ESNext", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
// "lib": [], /* Specify library files to be included in the compilation. */
// "allowJs": true, /* Allow javascript files to be compiled. */
// "checkJs": true, /* Report errors in .js files. */
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
"declaration": true, /* Generates corresponding '.d.ts' file. */
// "declarationDir": "types", /* Folder where the declarations are*/
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
// "sourceMap": true, /* Generates corresponding '.map' file. */
// "outFile": "./", /* Concatenate and emit output to single file. */
// "outDir": "./", /* Redirect output structure to the directory. */
// "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
// "composite": true, /* Enable project compilation */
// "tsBuildInfoFile": "", /* Specify file to store incremental compilation information */
"removeComments": true, /* Do not emit comments to output. */
// "noEmit": true, /* Do not emit outputs. */
// "importHelpers": true, /* Import emit helpers from 'tslib'. */
// "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
// "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
/* Strict Type-Checking Options */
"strict": true, /* Enable all strict type-checking options. */
// "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
// "strictNullChecks": true, /* Enable strict null checks. */
// "strictFunctionTypes": true, /* Enable strict checking of function types. */
// "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
// "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
// "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
// "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
/* Additional Checks */
"noUnusedLocals": true, /* Report errors on unused locals. */
"noUnusedParameters": true, /* Report errors on unused parameters. */
"noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
// "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
"forceConsistentCasingInFileNames": true,
/* Module Resolution Options */
// "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
// "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
// "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
// "typeRoots": [], /* List of folders to include type definitions from. */
// "types": [], /* Type declaration files to be included in compilation. */
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
/* Source Map Options */
// "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
// "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
/* Experimental Options */
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
}
}
"outDir": "dist",
"strictNullChecks": true
},
"exclude": [
"__tests__"
]
}

132
yarn.lock
View File

@ -1,132 +0,0 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@types/node-fetch@2.5.7":
version "2.5.7"
resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.7.tgz#20a2afffa882ab04d44ca786449a276f9f6bbf3c"
integrity sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==
dependencies:
"@types/node" "*"
form-data "^3.0.0"
"@types/node@*":
version "14.14.41"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.41.tgz#d0b939d94c1d7bd53d04824af45f1139b8c45615"
integrity sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g==
arg@^4.1.0:
version "4.1.3"
resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
buffer-from@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
combined-stream@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
dependencies:
delayed-stream "~1.0.0"
create-require@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
diff@^4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
form-data@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.8"
mime-types "^2.1.12"
isomorphic-unfetch@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f"
integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==
dependencies:
node-fetch "^2.6.1"
unfetch "^4.2.0"
make-error@^1.1.1:
version "1.3.6"
resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
mime-db@1.47.0:
version "1.47.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c"
integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==
mime-types@^2.1.12:
version "2.1.30"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d"
integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==
dependencies:
mime-db "1.47.0"
node-fetch@^2.6.1:
version "2.6.1"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
source-map-support@^0.5.17:
version "0.5.19"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
dependencies:
buffer-from "^1.0.0"
source-map "^0.6.0"
source-map@^0.6.0:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
ts-node@^9.1.1:
version "9.1.1"
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d"
integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==
dependencies:
arg "^4.1.0"
create-require "^1.1.0"
diff "^4.0.1"
make-error "^1.1.1"
source-map-support "^0.5.17"
yn "3.1.1"
typescript@^4.1.3:
version "4.2.4"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961"
integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==
unfetch@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be"
integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==
yn@3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==