@seamapi/http 1.24.0 → 1.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -0
- package/dist/connect.cjs +391 -171
- package/dist/connect.cjs.map +1 -1
- package/dist/connect.d.cts +74 -4
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/lib/seam/connect/index.d.ts +2 -0
- package/lib/seam/connect/index.js +2 -0
- package/lib/seam/connect/index.js.map +1 -1
- package/lib/seam/connect/routes/access-codes-simulate.d.ts +2 -0
- package/lib/seam/connect/routes/access-codes-simulate.js +5 -1
- package/lib/seam/connect/routes/access-codes-simulate.js.map +1 -1
- package/lib/seam/connect/routes/access-codes-unmanaged.d.ts +2 -0
- package/lib/seam/connect/routes/access-codes-unmanaged.js +9 -5
- package/lib/seam/connect/routes/access-codes-unmanaged.js.map +1 -1
- package/lib/seam/connect/routes/access-codes.d.ts +2 -0
- package/lib/seam/connect/routes/access-codes.js +13 -9
- package/lib/seam/connect/routes/access-codes.js.map +1 -1
- package/lib/seam/connect/routes/acs-access-groups-unmanaged.d.ts +2 -0
- package/lib/seam/connect/routes/acs-access-groups-unmanaged.js +6 -2
- package/lib/seam/connect/routes/acs-access-groups-unmanaged.js.map +1 -1
- package/lib/seam/connect/routes/acs-access-groups.d.ts +2 -0
- package/lib/seam/connect/routes/acs-access-groups.js +10 -6
- package/lib/seam/connect/routes/acs-access-groups.js.map +1 -1
- package/lib/seam/connect/routes/acs-credential-pools.d.ts +2 -0
- package/lib/seam/connect/routes/acs-credential-pools.js +5 -1
- package/lib/seam/connect/routes/acs-credential-pools.js.map +1 -1
- package/lib/seam/connect/routes/acs-credential-provisioning-automations.d.ts +2 -0
- package/lib/seam/connect/routes/acs-credential-provisioning-automations.js +5 -1
- package/lib/seam/connect/routes/acs-credential-provisioning-automations.js.map +1 -1
- package/lib/seam/connect/routes/acs-credentials-unmanaged.d.ts +2 -0
- package/lib/seam/connect/routes/acs-credentials-unmanaged.js +6 -2
- package/lib/seam/connect/routes/acs-credentials-unmanaged.js.map +1 -1
- package/lib/seam/connect/routes/acs-credentials.d.ts +2 -0
- package/lib/seam/connect/routes/acs-credentials.js +13 -9
- package/lib/seam/connect/routes/acs-credentials.js.map +1 -1
- package/lib/seam/connect/routes/acs-encoders-simulate.d.ts +2 -0
- package/lib/seam/connect/routes/acs-encoders-simulate.js +8 -4
- package/lib/seam/connect/routes/acs-encoders-simulate.js.map +1 -1
- package/lib/seam/connect/routes/acs-encoders.d.ts +2 -0
- package/lib/seam/connect/routes/acs-encoders.js +7 -3
- package/lib/seam/connect/routes/acs-encoders.js.map +1 -1
- package/lib/seam/connect/routes/acs-entrances.d.ts +2 -0
- package/lib/seam/connect/routes/acs-entrances.js +8 -4
- package/lib/seam/connect/routes/acs-entrances.js.map +1 -1
- package/lib/seam/connect/routes/acs-systems.d.ts +2 -0
- package/lib/seam/connect/routes/acs-systems.js +7 -3
- package/lib/seam/connect/routes/acs-systems.js.map +1 -1
- package/lib/seam/connect/routes/acs-users-unmanaged.d.ts +2 -0
- package/lib/seam/connect/routes/acs-users-unmanaged.js +6 -2
- package/lib/seam/connect/routes/acs-users-unmanaged.js.map +1 -1
- package/lib/seam/connect/routes/acs-users.d.ts +2 -0
- package/lib/seam/connect/routes/acs-users.js +15 -11
- package/lib/seam/connect/routes/acs-users.js.map +1 -1
- package/lib/seam/connect/routes/acs.d.ts +3 -0
- package/lib/seam/connect/routes/acs.js +4 -0
- package/lib/seam/connect/routes/acs.js.map +1 -1
- package/lib/seam/connect/routes/action-attempts.d.ts +2 -0
- package/lib/seam/connect/routes/action-attempts.js +6 -2
- package/lib/seam/connect/routes/action-attempts.js.map +1 -1
- package/lib/seam/connect/routes/bridges.d.ts +2 -0
- package/lib/seam/connect/routes/bridges.js +6 -2
- package/lib/seam/connect/routes/bridges.js.map +1 -1
- package/lib/seam/connect/routes/client-sessions.d.ts +2 -0
- package/lib/seam/connect/routes/client-sessions.js +11 -7
- package/lib/seam/connect/routes/client-sessions.js.map +1 -1
- package/lib/seam/connect/routes/connect-webviews.d.ts +2 -0
- package/lib/seam/connect/routes/connect-webviews.js +8 -4
- package/lib/seam/connect/routes/connect-webviews.js.map +1 -1
- package/lib/seam/connect/routes/connected-accounts.d.ts +2 -0
- package/lib/seam/connect/routes/connected-accounts.js +8 -4
- package/lib/seam/connect/routes/connected-accounts.js.map +1 -1
- package/lib/seam/connect/routes/devices-simulate.d.ts +2 -0
- package/lib/seam/connect/routes/devices-simulate.js +7 -3
- package/lib/seam/connect/routes/devices-simulate.js.map +1 -1
- package/lib/seam/connect/routes/devices-unmanaged.d.ts +2 -0
- package/lib/seam/connect/routes/devices-unmanaged.js +7 -3
- package/lib/seam/connect/routes/devices-unmanaged.js.map +1 -1
- package/lib/seam/connect/routes/devices.d.ts +2 -0
- package/lib/seam/connect/routes/devices.js +9 -5
- package/lib/seam/connect/routes/devices.js.map +1 -1
- package/lib/seam/connect/routes/events.d.ts +2 -0
- package/lib/seam/connect/routes/events.js +6 -2
- package/lib/seam/connect/routes/events.js.map +1 -1
- package/lib/seam/connect/routes/locks.d.ts +2 -0
- package/lib/seam/connect/routes/locks.js +8 -4
- package/lib/seam/connect/routes/locks.js.map +1 -1
- package/lib/seam/connect/routes/networks.d.ts +2 -0
- package/lib/seam/connect/routes/networks.js +6 -2
- package/lib/seam/connect/routes/networks.js.map +1 -1
- package/lib/seam/connect/routes/noise-sensors-noise-thresholds.d.ts +2 -0
- package/lib/seam/connect/routes/noise-sensors-noise-thresholds.js +9 -5
- package/lib/seam/connect/routes/noise-sensors-noise-thresholds.js.map +1 -1
- package/lib/seam/connect/routes/noise-sensors-simulate.d.ts +2 -0
- package/lib/seam/connect/routes/noise-sensors-simulate.js +5 -1
- package/lib/seam/connect/routes/noise-sensors-simulate.js.map +1 -1
- package/lib/seam/connect/routes/noise-sensors.d.ts +2 -0
- package/lib/seam/connect/routes/noise-sensors.js +5 -1
- package/lib/seam/connect/routes/noise-sensors.js.map +1 -1
- package/lib/seam/connect/routes/phones-simulate.d.ts +2 -0
- package/lib/seam/connect/routes/phones-simulate.js +5 -1
- package/lib/seam/connect/routes/phones-simulate.js.map +1 -1
- package/lib/seam/connect/routes/phones.d.ts +2 -0
- package/lib/seam/connect/routes/phones.js +7 -3
- package/lib/seam/connect/routes/phones.js.map +1 -1
- package/lib/seam/connect/routes/thermostats-schedules.d.ts +2 -0
- package/lib/seam/connect/routes/thermostats-schedules.js +9 -5
- package/lib/seam/connect/routes/thermostats-schedules.js.map +1 -1
- package/lib/seam/connect/routes/thermostats-simulate.d.ts +2 -0
- package/lib/seam/connect/routes/thermostats-simulate.js +6 -2
- package/lib/seam/connect/routes/thermostats-simulate.js.map +1 -1
- package/lib/seam/connect/routes/thermostats.d.ts +2 -0
- package/lib/seam/connect/routes/thermostats.js +18 -14
- package/lib/seam/connect/routes/thermostats.js.map +1 -1
- package/lib/seam/connect/routes/user-identities-enrollment-automations.d.ts +2 -0
- package/lib/seam/connect/routes/user-identities-enrollment-automations.js +8 -4
- package/lib/seam/connect/routes/user-identities-enrollment-automations.js.map +1 -1
- package/lib/seam/connect/routes/user-identities.d.ts +2 -0
- package/lib/seam/connect/routes/user-identities.js +16 -12
- package/lib/seam/connect/routes/user-identities.js.map +1 -1
- package/lib/seam/connect/routes/webhooks.d.ts +2 -0
- package/lib/seam/connect/routes/webhooks.js +9 -5
- package/lib/seam/connect/routes/webhooks.js.map +1 -1
- package/lib/seam/connect/routes/workspaces.d.ts +2 -0
- package/lib/seam/connect/routes/workspaces.js +8 -4
- package/lib/seam/connect/routes/workspaces.js.map +1 -1
- package/lib/seam/connect/seam-http-request.d.ts +6 -3
- package/lib/seam/connect/seam-http-request.js +25 -14
- package/lib/seam/connect/seam-http-request.js.map +1 -1
- package/lib/seam/connect/seam-http.d.ts +3 -0
- package/lib/seam/connect/seam-http.js +4 -0
- package/lib/seam/connect/seam-http.js.map +1 -1
- package/lib/seam/connect/seam-paginator.d.ts +30 -0
- package/lib/seam/connect/seam-paginator.js +103 -0
- package/lib/seam/connect/seam-paginator.js.map +1 -0
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +2 -2
- package/src/lib/seam/connect/index.ts +2 -0
- package/src/lib/seam/connect/routes/access-codes-simulate.ts +8 -1
- package/src/lib/seam/connect/routes/access-codes-unmanaged.ts +12 -5
- package/src/lib/seam/connect/routes/access-codes.ts +16 -9
- package/src/lib/seam/connect/routes/acs-access-groups-unmanaged.ts +9 -2
- package/src/lib/seam/connect/routes/acs-access-groups.ts +13 -6
- package/src/lib/seam/connect/routes/acs-credential-pools.ts +8 -1
- package/src/lib/seam/connect/routes/acs-credential-provisioning-automations.ts +8 -1
- package/src/lib/seam/connect/routes/acs-credentials-unmanaged.ts +9 -2
- package/src/lib/seam/connect/routes/acs-credentials.ts +16 -9
- package/src/lib/seam/connect/routes/acs-encoders-simulate.ts +11 -4
- package/src/lib/seam/connect/routes/acs-encoders.ts +10 -3
- package/src/lib/seam/connect/routes/acs-entrances.ts +11 -4
- package/src/lib/seam/connect/routes/acs-systems.ts +10 -3
- package/src/lib/seam/connect/routes/acs-users-unmanaged.ts +9 -2
- package/src/lib/seam/connect/routes/acs-users.ts +18 -11
- package/src/lib/seam/connect/routes/acs.ts +8 -0
- package/src/lib/seam/connect/routes/action-attempts.ts +9 -2
- package/src/lib/seam/connect/routes/bridges.ts +9 -2
- package/src/lib/seam/connect/routes/client-sessions.ts +14 -7
- package/src/lib/seam/connect/routes/connect-webviews.ts +11 -4
- package/src/lib/seam/connect/routes/connected-accounts.ts +11 -4
- package/src/lib/seam/connect/routes/devices-simulate.ts +10 -3
- package/src/lib/seam/connect/routes/devices-unmanaged.ts +10 -3
- package/src/lib/seam/connect/routes/devices.ts +12 -5
- package/src/lib/seam/connect/routes/events.ts +9 -2
- package/src/lib/seam/connect/routes/locks.ts +11 -4
- package/src/lib/seam/connect/routes/networks.ts +9 -2
- package/src/lib/seam/connect/routes/noise-sensors-noise-thresholds.ts +12 -5
- package/src/lib/seam/connect/routes/noise-sensors-simulate.ts +8 -1
- package/src/lib/seam/connect/routes/noise-sensors.ts +8 -1
- package/src/lib/seam/connect/routes/phones-simulate.ts +8 -1
- package/src/lib/seam/connect/routes/phones.ts +10 -3
- package/src/lib/seam/connect/routes/thermostats-schedules.ts +12 -5
- package/src/lib/seam/connect/routes/thermostats-simulate.ts +9 -2
- package/src/lib/seam/connect/routes/thermostats.ts +21 -14
- package/src/lib/seam/connect/routes/user-identities-enrollment-automations.ts +11 -4
- package/src/lib/seam/connect/routes/user-identities.ts +19 -12
- package/src/lib/seam/connect/routes/webhooks.ts +12 -5
- package/src/lib/seam/connect/routes/workspaces.ts +11 -4
- package/src/lib/seam/connect/seam-http-request.ts +45 -23
- package/src/lib/seam/connect/seam-http.ts +8 -0
- package/src/lib/seam/connect/seam-paginator.ts +155 -0
- package/src/lib/version.ts +1 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ActionAttempt } from '@seamapi/types/connect'
|
|
1
2
|
import { serializeUrlSearchParams } from '@seamapi/url-search-params-serializer'
|
|
2
3
|
import type { Method } from 'axios'
|
|
3
4
|
|
|
@@ -12,7 +13,7 @@ interface SeamHttpRequestParent {
|
|
|
12
13
|
}
|
|
13
14
|
|
|
14
15
|
interface SeamHttpRequestConfig<TResponseKey> {
|
|
15
|
-
readonly
|
|
16
|
+
readonly pathname: string
|
|
16
17
|
readonly method: Method
|
|
17
18
|
readonly body?: unknown
|
|
18
19
|
readonly params?: undefined | Record<string, unknown>
|
|
@@ -47,7 +48,6 @@ export class SeamHttpRequest<
|
|
|
47
48
|
|
|
48
49
|
public get url(): URL {
|
|
49
50
|
const { client } = this.#parent
|
|
50
|
-
const { params } = this.#config
|
|
51
51
|
|
|
52
52
|
const serializer =
|
|
53
53
|
typeof client.defaults.paramsSerializer === 'function'
|
|
@@ -56,19 +56,28 @@ export class SeamHttpRequest<
|
|
|
56
56
|
|
|
57
57
|
const origin = getUrlPrefix(client.defaults.baseURL ?? '')
|
|
58
58
|
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const path = params == null ? pathname : `${pathname}?${serializer(params)}`
|
|
59
|
+
const path =
|
|
60
|
+
this.params == null
|
|
61
|
+
? this.pathname
|
|
62
|
+
: `${this.pathname}?${serializer(this.params)}`
|
|
64
63
|
|
|
65
64
|
return new URL(`${origin}${path}`)
|
|
66
65
|
}
|
|
67
66
|
|
|
67
|
+
public get pathname(): string {
|
|
68
|
+
return this.#config.pathname.startsWith('/')
|
|
69
|
+
? this.#config.pathname
|
|
70
|
+
: `/${this.#config.pathname}`
|
|
71
|
+
}
|
|
72
|
+
|
|
68
73
|
public get method(): Method {
|
|
69
74
|
return this.#config.method
|
|
70
75
|
}
|
|
71
76
|
|
|
77
|
+
public get params(): undefined | Record<string, unknown> {
|
|
78
|
+
return this.#config.params
|
|
79
|
+
}
|
|
80
|
+
|
|
72
81
|
public get body(): unknown {
|
|
73
82
|
return this.#config.body
|
|
74
83
|
}
|
|
@@ -76,37 +85,50 @@ export class SeamHttpRequest<
|
|
|
76
85
|
async execute(): Promise<
|
|
77
86
|
TResponseKey extends keyof TResponse ? TResponse[TResponseKey] : undefined
|
|
78
87
|
> {
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
})
|
|
88
|
+
const response = await this.fetchResponse()
|
|
89
|
+
|
|
90
|
+
type Response = TResponseKey extends keyof TResponse
|
|
91
|
+
? TResponse[TResponseKey]
|
|
92
|
+
: undefined
|
|
93
|
+
|
|
86
94
|
if (this.responseKey === undefined) {
|
|
87
|
-
return undefined as
|
|
88
|
-
? TResponse[TResponseKey]
|
|
89
|
-
: undefined
|
|
95
|
+
return undefined as Response
|
|
90
96
|
}
|
|
91
|
-
|
|
97
|
+
|
|
98
|
+
const data = response[this.responseKey] as unknown as Response
|
|
99
|
+
|
|
92
100
|
if (this.responseKey === 'action_attempt') {
|
|
93
101
|
const waitForActionAttempt =
|
|
94
102
|
this.#config.options?.waitForActionAttempt ??
|
|
95
103
|
this.#parent.defaults.waitForActionAttempt
|
|
104
|
+
|
|
96
105
|
if (waitForActionAttempt !== false) {
|
|
97
|
-
|
|
98
|
-
data,
|
|
99
|
-
SeamHttpActionAttempts.fromClient(client, {
|
|
106
|
+
const actionAttempt = await resolveActionAttempt(
|
|
107
|
+
data as unknown as ActionAttempt,
|
|
108
|
+
SeamHttpActionAttempts.fromClient(this.#parent.client, {
|
|
100
109
|
...this.#parent.defaults,
|
|
101
110
|
waitForActionAttempt: false,
|
|
102
111
|
}),
|
|
103
112
|
typeof waitForActionAttempt === 'boolean' ? {} : waitForActionAttempt,
|
|
104
113
|
)
|
|
114
|
+
return actionAttempt as Response
|
|
105
115
|
}
|
|
106
116
|
}
|
|
117
|
+
|
|
107
118
|
return data
|
|
108
119
|
}
|
|
109
120
|
|
|
121
|
+
async fetchResponse(): Promise<TResponse> {
|
|
122
|
+
const { client } = this.#parent
|
|
123
|
+
const response = await client.request({
|
|
124
|
+
url: this.pathname,
|
|
125
|
+
method: this.method,
|
|
126
|
+
data: this.body,
|
|
127
|
+
params: this.params,
|
|
128
|
+
})
|
|
129
|
+
return response.data as unknown as TResponse
|
|
130
|
+
}
|
|
131
|
+
|
|
110
132
|
async then<
|
|
111
133
|
TResult1 = TResponseKey extends keyof TResponse
|
|
112
134
|
? TResponse[TResponseKey]
|
|
@@ -122,7 +144,7 @@ export class SeamHttpRequest<
|
|
|
122
144
|
| null
|
|
123
145
|
| undefined,
|
|
124
146
|
onrejected?:
|
|
125
|
-
| ((reason:
|
|
147
|
+
| ((reason: unknown) => TResult2 | PromiseLike<TResult2>)
|
|
126
148
|
| null
|
|
127
149
|
| undefined,
|
|
128
150
|
): Promise<TResult1 | TResult2> {
|
|
@@ -131,7 +153,7 @@ export class SeamHttpRequest<
|
|
|
131
153
|
|
|
132
154
|
async catch<TResult = never>(
|
|
133
155
|
onrejected?:
|
|
134
|
-
| ((reason:
|
|
156
|
+
| ((reason: unknown) => TResult | PromiseLike<TResult>)
|
|
135
157
|
| null
|
|
136
158
|
| undefined,
|
|
137
159
|
): Promise<
|
|
@@ -40,6 +40,8 @@ import {
|
|
|
40
40
|
SeamHttpWebhooks,
|
|
41
41
|
SeamHttpWorkspaces,
|
|
42
42
|
} from './routes/index.js'
|
|
43
|
+
import type { SeamHttpRequest } from './seam-http-request.js'
|
|
44
|
+
import { SeamPaginator } from './seam-paginator.js'
|
|
43
45
|
|
|
44
46
|
export class SeamHttp {
|
|
45
47
|
client: Client
|
|
@@ -143,6 +145,12 @@ export class SeamHttp {
|
|
|
143
145
|
return new SeamHttp(constructorOptions)
|
|
144
146
|
}
|
|
145
147
|
|
|
148
|
+
createPaginator<const TResponse, const TResponseKey extends keyof TResponse>(
|
|
149
|
+
request: SeamHttpRequest<TResponse, TResponseKey>,
|
|
150
|
+
): SeamPaginator<TResponse, TResponseKey> {
|
|
151
|
+
return new SeamPaginator<TResponse, TResponseKey>(this, request)
|
|
152
|
+
}
|
|
153
|
+
|
|
146
154
|
async updateClientSessionToken(
|
|
147
155
|
clientSessionToken: SeamHttpOptionsWithClientSessionToken['clientSessionToken'],
|
|
148
156
|
): Promise<void> {
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import type { Client } from './client.js'
|
|
2
|
+
import type { SeamHttpRequestOptions } from './options.js'
|
|
3
|
+
import { SeamHttpRequest } from './seam-http-request.js'
|
|
4
|
+
|
|
5
|
+
interface SeamPaginatorParent {
|
|
6
|
+
readonly client: Client
|
|
7
|
+
readonly defaults: Required<SeamHttpRequestOptions>
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
declare const $brand: unique symbol
|
|
11
|
+
|
|
12
|
+
type PageCursor = string & { [$brand]: 'SeamPageCursor' }
|
|
13
|
+
|
|
14
|
+
interface Pagination {
|
|
15
|
+
readonly hasNextPage: boolean
|
|
16
|
+
readonly nextPageCursor: PageCursor | null
|
|
17
|
+
readonly nextPageUrl: string | null
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export class SeamPaginator<
|
|
21
|
+
const TResponse,
|
|
22
|
+
const TResponseKey extends keyof TResponse,
|
|
23
|
+
> implements AsyncIterable<EnsureReadonlyArray<TResponse[TResponseKey]>>
|
|
24
|
+
{
|
|
25
|
+
readonly #request: SeamHttpRequest<TResponse, TResponseKey>
|
|
26
|
+
readonly #parent: SeamPaginatorParent
|
|
27
|
+
|
|
28
|
+
constructor(
|
|
29
|
+
parent: SeamPaginatorParent,
|
|
30
|
+
request: SeamHttpRequest<TResponse, TResponseKey>,
|
|
31
|
+
) {
|
|
32
|
+
if (request.responseKey == null) {
|
|
33
|
+
throw new Error(
|
|
34
|
+
`The ${request.pathname} endpoint does not support pagination`,
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
this.#parent = parent
|
|
38
|
+
this.#request = request
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async firstPage(): Promise<
|
|
42
|
+
[EnsureReadonlyArray<TResponse[TResponseKey]>, Pagination]
|
|
43
|
+
> {
|
|
44
|
+
return await this.#fetch()
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async nextPage(
|
|
48
|
+
nextPageCursor: Pagination['nextPageCursor'],
|
|
49
|
+
): Promise<[EnsureReadonlyArray<TResponse[TResponseKey]>, Pagination]> {
|
|
50
|
+
if (nextPageCursor == null) {
|
|
51
|
+
throw new Error('Cannot get the next page with a null nextPageCursor')
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return await this.#fetch(nextPageCursor)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async #fetch(
|
|
58
|
+
nextPageCursor?: Pagination['nextPageCursor'],
|
|
59
|
+
): Promise<[EnsureReadonlyArray<TResponse[TResponseKey]>, Pagination]> {
|
|
60
|
+
const responseKey = this.#request.responseKey
|
|
61
|
+
|
|
62
|
+
if (responseKey == null) {
|
|
63
|
+
throw new Error('Cannot paginate a response without a responseKey')
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const request = new SeamHttpRequest<TResponse, TResponseKey>(this.#parent, {
|
|
67
|
+
pathname: this.#request.pathname,
|
|
68
|
+
method: this.#request.method,
|
|
69
|
+
responseKey,
|
|
70
|
+
params:
|
|
71
|
+
this.#request.params != null
|
|
72
|
+
? { ...this.#request.params, page_cursor: nextPageCursor }
|
|
73
|
+
: undefined,
|
|
74
|
+
body:
|
|
75
|
+
this.#request.body != null
|
|
76
|
+
? { ...this.#request.body, page_cursor: nextPageCursor }
|
|
77
|
+
: undefined,
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
const response = await request.fetchResponse()
|
|
81
|
+
const data = response[responseKey]
|
|
82
|
+
|
|
83
|
+
const paginationData =
|
|
84
|
+
response != null &&
|
|
85
|
+
typeof response === 'object' &&
|
|
86
|
+
'pagination' in response
|
|
87
|
+
? (response.pagination as PaginationData)
|
|
88
|
+
: null
|
|
89
|
+
|
|
90
|
+
const pagination: Pagination = {
|
|
91
|
+
hasNextPage: paginationData?.has_next_page ?? false,
|
|
92
|
+
nextPageCursor: paginationData?.next_page_cursor ?? null,
|
|
93
|
+
nextPageUrl: paginationData?.next_page_url ?? null,
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (!Array.isArray(data)) {
|
|
97
|
+
throw new Error(
|
|
98
|
+
`Expected an array response for ${String(responseKey)} but got ${String(typeof data)}`,
|
|
99
|
+
)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return [
|
|
103
|
+
data as EnsureReadonlyArray<TResponse[TResponseKey]>,
|
|
104
|
+
pagination,
|
|
105
|
+
] as const
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
async flattenToArray(): Promise<
|
|
109
|
+
EnsureReadonlyArray<TResponse[TResponseKey]>
|
|
110
|
+
> {
|
|
111
|
+
const items = [] as EnsureMutableArray<TResponse[TResponseKey]>
|
|
112
|
+
let [current, pagination] = await this.firstPage()
|
|
113
|
+
items.push(...current)
|
|
114
|
+
while (pagination.hasNextPage) {
|
|
115
|
+
;[current, pagination] = await this.nextPage(pagination.nextPageCursor)
|
|
116
|
+
items.push(...current)
|
|
117
|
+
}
|
|
118
|
+
return items as EnsureReadonlyArray<TResponse[TResponseKey]>
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
async *flatten(): AsyncGenerator<
|
|
122
|
+
EnsureReadonlyArray<TResponse[TResponseKey]>
|
|
123
|
+
> {
|
|
124
|
+
let [current, pagination] = await this.firstPage()
|
|
125
|
+
for (const item of current) {
|
|
126
|
+
yield item
|
|
127
|
+
}
|
|
128
|
+
while (pagination.hasNextPage) {
|
|
129
|
+
;[current, pagination] = await this.nextPage(pagination.nextPageCursor)
|
|
130
|
+
for (const item of current) {
|
|
131
|
+
yield item
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
async *[Symbol.asyncIterator](): AsyncGenerator<
|
|
137
|
+
EnsureReadonlyArray<TResponse[TResponseKey]>
|
|
138
|
+
> {
|
|
139
|
+
let [current, pagination] = await this.firstPage()
|
|
140
|
+
yield current
|
|
141
|
+
while (pagination.hasNextPage) {
|
|
142
|
+
;[current, pagination] = await this.nextPage(pagination.nextPageCursor)
|
|
143
|
+
yield current
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
type EnsureReadonlyArray<T> = T extends readonly any[] ? T : never
|
|
149
|
+
type EnsureMutableArray<T> = T extends any[] ? T : never
|
|
150
|
+
|
|
151
|
+
interface PaginationData {
|
|
152
|
+
has_next_page: boolean
|
|
153
|
+
next_page_cursor: PageCursor | null
|
|
154
|
+
next_page_url: string | null
|
|
155
|
+
}
|
package/src/lib/version.ts
CHANGED