Skip to content

Commit 2a9ad4a

Browse files
committed
Make route classes work stand alone
1 parent c2ad768 commit 2a9ad4a

File tree

5 files changed

+76
-54
lines changed

5 files changed

+76
-54
lines changed

src/lib/seam/connect/axios.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import axios, { type Axios } from 'axios'
2+
3+
import { getAuthHeaders } from './auth.js'
4+
import {
5+
isSeamHttpOptionsWithClientSessionToken,
6+
type SeamHttpOptions,
7+
} from './client-options.js'
8+
9+
export const createAxiosClient = (
10+
options: Required<SeamHttpOptions>,
11+
): Axios => {
12+
// TODO: axiosRetry? Allow options to configure this if so
13+
return axios.create({
14+
baseURL: options.endpoint,
15+
withCredentials: isSeamHttpOptionsWithClientSessionToken(options),
16+
...options.axiosOptions,
17+
headers: {
18+
...getAuthHeaders(options),
19+
...options.axiosOptions.headers,
20+
// TODO: User-Agent
21+
},
22+
})
23+
}

src/lib/seam/connect/client.ts

Lines changed: 9 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import axios, { type Axios } from 'axios'
1+
import type { Axios } from 'axios'
22

3-
import { getAuthHeaders } from './auth.js'
3+
import { createAxiosClient } from './axios.js'
44
import {
55
InvalidSeamHttpOptionsError,
66
isSeamHttpOptionsWithApiKey,
@@ -9,8 +9,9 @@ import {
99
type SeamHttpOptionsWithApiKey,
1010
type SeamHttpOptionsWithClientSessionToken,
1111
} from './client-options.js'
12-
import { LegacyWorkspaces } from './legacy/workspaces.js'
13-
import { Workspaces } from './routes/workspaces.js'
12+
import { LegacyWorkspacesHttp } from './legacy/workspaces.js'
13+
import { parseOptions } from './parse-options.js'
14+
import { WorkspacesHttp } from './routes/workspaces.js'
1415

1516
export class SeamHttp {
1617
client: Axios
@@ -20,18 +21,7 @@ export class SeamHttp {
2021
constructor(apiKeyOrOptions: string | SeamHttpOptions) {
2122
const options = parseOptions(apiKeyOrOptions)
2223
this.#legacy = options.enableLegacyMethodBehaivor
23-
24-
// TODO: axiosRetry? Allow options to configure this if so
25-
this.client = axios.create({
26-
baseURL: options.endpoint,
27-
withCredentials: isSeamHttpOptionsWithClientSessionToken(options),
28-
...options.axiosOptions,
29-
headers: {
30-
...getAuthHeaders(options),
31-
...options.axiosOptions.headers,
32-
// TODO: User-Agent
33-
},
34-
})
24+
this.client = createAxiosClient(options)
3525
}
3626

3727
static fromApiKey(
@@ -66,37 +56,8 @@ export class SeamHttp {
6656
// Better to implement error handling and wrapping in an error handler.
6757
// makeRequest
6858

69-
get workspaces(): Workspaces {
70-
const workspaces = new Workspaces(this.client)
71-
if (this.#legacy) return new LegacyWorkspaces(this.client)
72-
return workspaces
73-
}
74-
}
75-
76-
const parseOptions = (
77-
apiKeyOrOptions: string | SeamHttpOptions,
78-
): Required<SeamHttpOptions> => {
79-
const options =
80-
typeof apiKeyOrOptions === 'string'
81-
? { apiKey: apiKeyOrOptions }
82-
: apiKeyOrOptions
83-
84-
const endpoint =
85-
options.endpoint ??
86-
globalThis.process?.env?.['SEAM_ENDPOINT'] ??
87-
globalThis.process?.env?.['SEAM_API_URL'] ??
88-
'https://connect.getseam.com'
89-
90-
const apiKey =
91-
'apiKey' in options
92-
? options.apiKey
93-
: globalThis.process?.env?.['SEAM_API_KEY']
94-
95-
return {
96-
...options,
97-
...(apiKey != null ? { apiKey } : {}),
98-
endpoint,
99-
axiosOptions: options.axiosOptions ?? {},
100-
enableLegacyMethodBehaivor: false,
59+
get workspaces(): WorkspacesHttp {
60+
if (this.#legacy) return new LegacyWorkspacesHttp(this.client)
61+
return new WorkspacesHttp(this.client)
10162
}
10263
}

src/lib/seam/connect/legacy/workspaces.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import type { RouteRequestParams, RouteResponse } from '@seamapi/types/connect'
22
import type { SetNonNullable } from 'type-fest'
33

4-
import { Workspaces } from 'lib/seam/connect/routes/workspaces.js'
4+
import { WorkspacesHttp } from 'lib/seam/connect/routes/workspaces.js'
55

6-
export class LegacyWorkspaces extends Workspaces {
6+
export class LegacyWorkspacesHttp extends WorkspacesHttp {
77
override async get(
88
params: WorkspacesGetParams = {},
99
): Promise<WorkspacesGetResponse['workspace']> {

src/lib/seam/connect/parse-options.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import type { SeamHttpOptions } from './client-options.js'
2+
export const parseOptions = (
3+
apiKeyOrOptions: string | SeamHttpOptions,
4+
): Required<SeamHttpOptions> => {
5+
const options =
6+
typeof apiKeyOrOptions === 'string'
7+
? { apiKey: apiKeyOrOptions }
8+
: apiKeyOrOptions
9+
10+
const endpoint =
11+
options.endpoint ??
12+
globalThis.process?.env?.['SEAM_ENDPOINT'] ??
13+
globalThis.process?.env?.['SEAM_API_URL'] ??
14+
'https://connect.getseam.com'
15+
16+
const apiKey =
17+
'apiKey' in options
18+
? options.apiKey
19+
: globalThis.process?.env?.['SEAM_API_KEY']
20+
21+
return {
22+
...options,
23+
...(apiKey != null ? { apiKey } : {}),
24+
endpoint,
25+
axiosOptions: options.axiosOptions ?? {},
26+
enableLegacyMethodBehaivor: false,
27+
}
28+
}

src/lib/seam/connect/routes/workspaces.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,22 @@
11
import type { RouteRequestParams, RouteResponse } from '@seamapi/types/connect'
2-
import type { Axios } from 'axios'
2+
import { Axios } from 'axios'
33
import type { SetNonNullable } from 'type-fest'
44

5-
export class Workspaces {
5+
import { createAxiosClient } from 'lib/seam/connect/axios.js'
6+
import type { SeamHttpOptions } from 'lib/seam/connect/client-options.js'
7+
import { parseOptions } from 'lib/seam/connect/parse-options.js'
8+
9+
export class WorkspacesHttp {
610
client: Axios
711

8-
constructor(client: Axios) {
9-
this.client = client
12+
constructor(apiKeyOrOptionsOrClient: Axios | string | SeamHttpOptions) {
13+
if (apiKeyOrOptionsOrClient instanceof Axios) {
14+
this.client = apiKeyOrOptionsOrClient
15+
return
16+
}
17+
18+
const options = parseOptions(apiKeyOrOptionsOrClient)
19+
this.client = createAxiosClient(options)
1020
}
1121

1222
async get(

0 commit comments

Comments
 (0)