Skip to content

Commit

Permalink
support classic era (#174)
Browse files Browse the repository at this point in the history
* update gitignore for jetbrains IDE

* support classic era namespace as well

* implement createEraInstance and WowClassicEra class to define new namespace in existing endpoints
  • Loading branch information
cosileone authored Jan 13, 2024
1 parent 529d60b commit 3f06626
Show file tree
Hide file tree
Showing 7 changed files with 66 additions and 25 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@
.DS_Store
node_modules
dist
coverage
coverage
.idea
4 changes: 2 additions & 2 deletions src/resources/classic.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { Resource } from './types'

type NamespaceOptions = 'dynamic-classic' | 'static-classic'
type NamespaceOptions = 'dynamic-classic' | 'static-classic' | 'dynamic-classic1x' | 'static-classic1x'

export type AuctionHouseOptions = { realm: number; auctionHouse?: number }

export const auctionHouse = (
namespace: Extract<NamespaceOptions, 'dynamic-classic'>,
namespace: Extract<NamespaceOptions, 'dynamic-classic' | 'dynamic-classic1x'>,
args: AuctionHouseOptions,
): Resource => {
if (args.auctionHouse === undefined) {
Expand Down
9 changes: 8 additions & 1 deletion src/resources/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,14 @@ export interface ProtectedResourceInterface<T = any, P = any> {

export type Resource<T = never> = {
path: string
namespace?: 'profile' | 'static' | 'dynamic' | 'static-classic' | 'dynamic-classic'
namespace?:
| 'profile'
| 'static'
| 'dynamic'
| 'static-classic'
| 'dynamic-classic'
| 'static-classic1x'
| 'dynamic-classic1x'
params?: T
}

Expand Down
45 changes: 27 additions & 18 deletions src/resources/wow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,14 @@ import { Resource } from './types'
* PROFILE DATA
*/

type NamespaceOptions = 'profile' | 'static' | 'dynamic' | 'static-classic' | 'dynamic-classic'
type NamespaceOptions =
| 'profile'
| 'static'
| 'dynamic'
| 'static-classic'
| 'dynamic-classic'
| 'static-classic1x'
| 'dynamic-classic1x'
type CharacterOptions = { realm: string; name: string }
type SearchOptions = { orderby?: string | string[]; page?: number }
type SearchParams = {
Expand Down Expand Up @@ -399,7 +406,7 @@ export const commodities = (namespace: Extract<NamespaceOptions, 'dynamic'>): Re
export type ConnectedRealmOptions = { id?: number }

export const connectedRealm = (
namespace: Extract<NamespaceOptions, 'dynamic' | 'dynamic-classic'>,
namespace: Extract<NamespaceOptions, 'dynamic' | 'dynamic-classic' | 'dynamic-classic1x'>,
args?: null | ConnectedRealmOptions,
): Resource => {
if (args?.id === undefined) {
Expand All @@ -418,7 +425,7 @@ export const connectedRealm = (
export type ConnectedRealmSearchOptions = SearchOptions & { status: 'UP' | 'DOWN'; timezone?: string }

export const connectedRealmSearch = (
namespace: Extract<NamespaceOptions, 'dynamic' | 'dynamic-classic'>,
namespace: Extract<NamespaceOptions, 'dynamic' | 'dynamic-classic' | 'dynamic-classic1x'>,
args: ConnectedRealmSearchOptions,
): Resource<SearchParams & { 'status.type': string; 'realms.timezone'?: string }> => {
return {
Expand Down Expand Up @@ -486,7 +493,7 @@ export const conduit = (namespace: Extract<NamespaceOptions, 'static'>, args?: n
export type CreatureOptions = { id: number; media?: boolean }

export const creature = (
namespace: Extract<NamespaceOptions, 'static' | 'static-classic'>,
namespace: Extract<NamespaceOptions, 'static' | 'static-classic' | 'static-classic1x'>,
args: CreatureOptions,
): Resource => {
return {
Expand All @@ -500,7 +507,7 @@ export const creature = (
export type CreatureFamilyOptions = { id?: number; media?: boolean }

export const creatureFamily = (
namespace: Extract<NamespaceOptions, 'static' | 'static-classic'>,
namespace: Extract<NamespaceOptions, 'static' | 'static-classic' | 'static-classic1x'>,
args?: null | CreatureFamilyOptions,
): Resource => {
if (args?.id === undefined) {
Expand All @@ -521,7 +528,7 @@ export const creatureFamily = (
export type CreatureTypeOptions = { id?: number }

export const creatureType = (
namespace: Extract<NamespaceOptions, 'static' | 'static-classic'>,
namespace: Extract<NamespaceOptions, 'static' | 'static-classic' | 'static-classic1x'>,
args?: null | CreatureTypeOptions,
): Resource => {
if (args?.id === undefined) {
Expand All @@ -540,7 +547,7 @@ export const creatureType = (
export type CreatureSearchOptions<T = string, P = Locales> = SearchOptions & { name: T; locale: P }

export const creatureSearch = <T extends string, P extends Locales>(
namespace: Extract<NamespaceOptions, 'static' | 'static-classic'>,
namespace: Extract<NamespaceOptions, 'static' | 'static-classic' | 'static-classic1x'>,
args: CreatureSearchOptions<T, P>,
): Resource<SearchParams & Record<`name.${P}`, T>> => {
return {
Expand All @@ -557,7 +564,7 @@ export const creatureSearch = <T extends string, P extends Locales>(
export type GuildCrestOptions = { resource: 'border' | 'emblem'; id: number }

export const guildCrest = (
namespace: Extract<NamespaceOptions, 'static' | 'static-classic'>,
namespace: Extract<NamespaceOptions, 'static' | 'static-classic' | 'static-classic1x'>,
args?: null | GuildCrestOptions,
): Resource => {
return {
Expand All @@ -575,7 +582,7 @@ export type ItemOptions =
| { resource: 'set'; id?: number; sub?: never; media?: never }

export const item = (
namespace: Extract<NamespaceOptions, 'static' | 'static-classic'>,
namespace: Extract<NamespaceOptions, 'static' | 'static-classic' | 'static-classic1x'>,
args: ItemOptions,
): Resource => {
if (args.resource === 'set') {
Expand Down Expand Up @@ -613,7 +620,7 @@ export const item = (
export type ItemSearchOptions<T = string, P = Locales> = SearchOptions & { name: T; locale: P }

export const itemSearch = <T extends string, P extends Locales>(
namespace: Extract<NamespaceOptions, 'static' | 'static-classic'>,
namespace: Extract<NamespaceOptions, 'static' | 'static-classic' | 'static-classic1x'>,
args: ItemSearchOptions<T, P>,
): Resource<SearchParams & Record<`name.${P}`, T>> => {
return {
Expand Down Expand Up @@ -651,7 +658,7 @@ export const journal = (namespace: Extract<NamespaceOptions, 'static'>, args: Jo
export type MediaSearchOptions = SearchOptions & { tag: string }

export const mediaSearch = (
namespace: Extract<NamespaceOptions, 'static' | 'static-classic'>,
namespace: Extract<NamespaceOptions, 'static' | 'static-classic' | 'static-classic1x'>,
args: MediaSearchOptions,
): Resource<SearchParams & { _tag: string }> => {
return {
Expand Down Expand Up @@ -839,7 +846,7 @@ export const pet = (namespace: Extract<NamespaceOptions, 'static'>, args?: null
export type PlayableClassOptions = { id?: number; media?: boolean; pvpTalents?: boolean }

export const playableClass = (
namespace: Extract<NamespaceOptions, 'static' | 'static-classic'>,
namespace: Extract<NamespaceOptions, 'static' | 'static-classic' | 'static-classic1x'>,
args?: null | PlayableClassOptions,
): Resource => {
if (args?.id === undefined) {
Expand Down Expand Up @@ -867,7 +874,7 @@ export const playableClass = (
export type PlayableRaceOptions = { id?: number }

export const playableRace = (
namespace: Extract<NamespaceOptions, 'static' | 'static-classic'>,
namespace: Extract<NamespaceOptions, 'static' | 'static-classic' | 'static-classic1x'>,
args?: null | PlayableRaceOptions,
): Resource => {
return {
Expand Down Expand Up @@ -901,7 +908,7 @@ export const playableSpecialization = (
export type PowerTypeOptions = { id?: number }

export const powerType = (
namespace: Extract<NamespaceOptions, 'static' | 'static-classic'>,
namespace: Extract<NamespaceOptions, 'static' | 'static-classic' | 'static-classic1x'>,
args?: null | PowerTypeOptions,
): Resource => {
return {
Expand Down Expand Up @@ -1047,7 +1054,7 @@ export const quest = (namespace: Extract<NamespaceOptions, 'static'>, args?: nul
export type RealmOptions = { slug?: string }

export const realm = (
namespace: Extract<NamespaceOptions, 'dynamic' | 'dynamic-classic'>,
namespace: Extract<NamespaceOptions, 'dynamic' | 'dynamic-classic' | 'dynamic-classic1x'>,
args?: null | RealmOptions,
): Resource => {
return {
Expand All @@ -1059,7 +1066,7 @@ export const realm = (
export type RealmSearchOptions = SearchOptions & { timezone?: string }

export const realmSearch = (
namespace: Extract<NamespaceOptions, 'dynamic' | 'dynamic-classic'>,
namespace: Extract<NamespaceOptions, 'dynamic' | 'dynamic-classic' | 'dynamic-classic1x'>,
args: RealmSearchOptions,
): Resource<SearchParams & { timezone?: string }> => {
return {
Expand All @@ -1076,7 +1083,7 @@ export const realmSearch = (
export type RegionOptions = { id?: number }

export const region = (
namespace: Extract<NamespaceOptions, 'dynamic' | 'dynamic-classic'>,
namespace: Extract<NamespaceOptions, 'dynamic' | 'dynamic-classic' | 'dynamic-classic1x'>,
args?: null | RegionOptions,
): Resource => {
return {
Expand Down Expand Up @@ -1185,7 +1192,9 @@ export const title = (namespace: Extract<NamespaceOptions, 'static'>, args?: nul

export type TokenOptions = Record<string, unknown>

export const token = (namespace: Extract<NamespaceOptions, 'dynamic' | 'dynamic-classic'>): Resource => {
export const token = (
namespace: Extract<NamespaceOptions, 'dynamic' | 'dynamic-classic' | 'dynamic-classic1x'>,
): Resource => {
return {
path: 'data/wow/token/index',
namespace,
Expand Down
21 changes: 21 additions & 0 deletions src/wow/classic/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,24 @@ export class WoWClassic extends Blizzard implements WoWClassicClient {
region = this.createClientResourceRequest(wow.region.bind(this, 'dynamic-classic'))
token = this.createClientResourceRequest(wow.token.bind(this, 'dynamic-classic'))
}

export class WoWClassicEra extends Blizzard implements WoWClassicClient {
auctionHouse = this.createClientResourceRequest(classic.auctionHouse.bind(this, 'dynamic-classic1x'))
connectedRealm = this.createClientResourceRequest(wow.connectedRealm.bind(this, 'dynamic-classic1x'))
connectedRealmSearch = this.createClientResourceRequest(wow.connectedRealmSearch.bind(this, 'dynamic-classic1x'))
creature = this.createClientResourceRequest(wow.creature.bind(this, 'static-classic1x'))
creatureFamily = this.createClientResourceRequest(wow.creatureFamily.bind(this, 'static-classic1x'))
creatureSearch = this.createClientResourceRequest(wow.creatureSearch.bind(this, 'static-classic1x'))
creatureType = this.createClientResourceRequest(wow.creatureType.bind(this, 'static-classic1x'))
guildCrest = this.createClientResourceRequest(wow.guildCrest.bind(this, 'static-classic1x'))
item = this.createClientResourceRequest(wow.item.bind(this, 'static-classic1x'))
itemSearch = this.createClientResourceRequest(wow.itemSearch.bind(this, 'static-classic1x'))
mediaSearch = this.createClientResourceRequest(wow.mediaSearch.bind(this, 'static-classic1x'))
playableClass = this.createClientResourceRequest(wow.playableClass.bind(this, 'static-classic1x'))
playableRace = this.createClientResourceRequest(wow.playableRace.bind(this, 'static-classic1x'))
powerType = this.createClientResourceRequest(wow.powerType.bind(this, 'static-classic1x'))
realm = this.createClientResourceRequest(wow.realm.bind(this, 'dynamic-classic1x'))
realmSearch = this.createClientResourceRequest(wow.realmSearch.bind(this, 'dynamic-classic1x'))
region = this.createClientResourceRequest(wow.region.bind(this, 'dynamic-classic1x'))
token = this.createClientResourceRequest(wow.token.bind(this, 'dynamic-classic1x'))
}
5 changes: 3 additions & 2 deletions src/wow/classic/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { createClient } from '../../create-client'
import { WoWClassic, WoWClassicClient } from './client'
import { WoWClassic, WoWClassicClient, WoWClassicEra } from './client'

export const createInstance = createClient<WoWClassicClient>(WoWClassic)
export { WoWClassic }
export const createEraInstance = createClient<WoWClassicClient>(WoWClassicEra)
export { WoWClassic, WoWClassicEra }
export type { WoWClassicClient }
4 changes: 3 additions & 1 deletion test/wow-classic.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ import { createInstance, WoWClassic, WoWClassicClient } from '../src/wow/classic
const headers = {
'User-Agent': expect.any(String),
'Content-Type': 'application/json',
'Battlenet-Namespace': expect.stringMatching(/^(static-classic|dynamic-classic)-(us|eu|sea|kr|tw)$/),
'Battlenet-Namespace': expect.stringMatching(
/^(static-classic|dynamic-classic|static-classic1x|dynamic-classic1x)-(us|eu|sea|kr|tw)$/,
),
Authorization: expect.any(String),
}
const params = { locale: expect.any(String) }
Expand Down

0 comments on commit 3f06626

Please sign in to comment.