Skip to content

Commit fba650b

Browse files
authored
Merge pull request #17 from seamapi/optional-args
Optional args
2 parents 447fc95 + a5eb102 commit fba650b

24 files changed

+164
-170
lines changed

generate-routes.ts

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -53,18 +53,7 @@ const ignoredEndpointPaths = [
5353
'/noise_sensors/simulate/trigger_noise_threshold',
5454
] as const
5555

56-
const endpointResources: Partial<
57-
Record<
58-
keyof typeof openapi.paths,
59-
| 'action_attempt'
60-
| 'access_codes'
61-
| 'device_providers'
62-
| 'generated_code'
63-
| 'backup_access_code'
64-
| 'acs_users'
65-
| null
66-
>
67-
> = {
56+
const endpointResources: Partial<Record<keyof typeof openapi.paths, null>> = {
6857
'/access_codes/delete': null,
6958
'/access_codes/unmanaged/delete': null,
7059
'/access_codes/update': null,
@@ -89,6 +78,7 @@ interface Endpoint {
8978
resource: string | null
9079
method: Method
9180
requestFormat: 'params' | 'body'
81+
isRequestParamOptional: boolean
9282
}
9383

9484
type Method = 'GET' | 'POST'
@@ -158,6 +148,9 @@ const createEndpoint = (
158148
method,
159149
resource: deriveResource(endpointPath, method),
160150
requestFormat: ['GET', 'DELETE'].includes(method) ? 'params' : 'body',
151+
// UPSTREAM: This could be derived from the OpenAPI spec, however some endpoints require at least one param,
152+
// and in the spec this currently looks as if params are optional.
153+
isRequestParamOptional: true,
161154
}
162155
}
163156

@@ -309,14 +302,12 @@ const renderClassMethod = ({
309302
namespace,
310303
resource,
311304
path,
305+
isRequestParamOptional,
312306
}: Endpoint): string => `
313307
async ${camelCase(name)}(
314-
${requestFormat}${
315-
requestFormat === 'params' ? '?' : ''
316-
}: ${renderRequestType({
308+
${requestFormat}${isRequestParamOptional ? '?' : ''}: ${renderRequestType({
317309
name,
318310
namespace,
319-
requestFormat,
320311
})},
321312
): Promise<${
322313
resource === null
@@ -363,7 +354,6 @@ const renderEndpointExports = ({
363354
export type ${renderRequestType({
364355
name,
365356
namespace,
366-
requestFormat,
367357
})} = RouteRequest${pascalCase(requestFormat)}<'${path}'>
368358
369359
export type ${renderResponseType({ name, namespace })}= SetNonNullable<
@@ -374,9 +364,22 @@ export type ${renderResponseType({ name, namespace })}= SetNonNullable<
374364
const renderRequestType = ({
375365
name,
376366
namespace,
377-
requestFormat,
378-
}: Pick<Endpoint, 'name' | 'namespace' | 'requestFormat'>): string =>
379-
[pascalCase(namespace), pascalCase(name), pascalCase(requestFormat)].join('')
367+
}: Pick<Endpoint, 'name' | 'namespace'>): string =>
368+
[
369+
pascalCase(namespace),
370+
pascalCase(name),
371+
pascalCase(requestFormatToRequestType(name, namespace)),
372+
].join('')
373+
374+
// UPSTREAM: Should be just requestFormat, but blocked on https://github.com/seamapi/nextlove/issues/117
375+
const requestFormatToRequestType = (
376+
name: string,
377+
_namespace: string,
378+
): 'params' | 'body' => {
379+
if (['get', 'list', 'view'].includes(name)) return 'params'
380+
if (name.startsWith('list')) return 'params'
381+
return 'body'
382+
}
380383

381384
const renderResponseType = ({
382385
name,

package-lock.json

Lines changed: 8 additions & 24 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@
9090
"axios-retry": "^3.8.0"
9191
},
9292
"devDependencies": {
93-
"@seamapi/fake-seam-connect": "^1.22.0",
93+
"@seamapi/fake-seam-connect": "1.24.0",
9494
"@seamapi/types": "^1.24.0",
9595
"@types/eslint": "^8.44.2",
9696
"@types/node": "^18.11.18",

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import version from 'src/lib/version.js'
1+
import version from 'lib/version.js'
22

33
import { getAuthHeaders } from './auth.js'
44
import type { ClientOptions } from './client.js'

src/lib/seam/connect/routes/access-codes-unmanaged.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ export class SeamHttpAccessCodesUnmanaged {
8383
}
8484

8585
async convertToManaged(
86-
body: AccessCodesUnmanagedConvertToManagedBody,
86+
body?: AccessCodesUnmanagedConvertToManagedBody,
8787
): Promise<void> {
8888
await this.client.request<AccessCodesUnmanagedConvertToManagedResponse>({
8989
url: '/access_codes/unmanaged/convert_to_managed',
@@ -92,7 +92,7 @@ export class SeamHttpAccessCodesUnmanaged {
9292
})
9393
}
9494

95-
async delete(body: AccessCodesUnmanagedDeleteBody): Promise<void> {
95+
async delete(body?: AccessCodesUnmanagedDeleteBody): Promise<void> {
9696
await this.client.request<AccessCodesUnmanagedDeleteResponse>({
9797
url: '/access_codes/unmanaged/delete',
9898
method: 'post',
@@ -101,7 +101,7 @@ export class SeamHttpAccessCodesUnmanaged {
101101
}
102102

103103
async get(
104-
body: AccessCodesUnmanagedGetBody,
104+
body?: AccessCodesUnmanagedGetParams,
105105
): Promise<AccessCodesUnmanagedGetResponse['access_code']> {
106106
const { data } = await this.client.request<AccessCodesUnmanagedGetResponse>(
107107
{
@@ -114,7 +114,7 @@ export class SeamHttpAccessCodesUnmanaged {
114114
}
115115

116116
async list(
117-
body: AccessCodesUnmanagedListBody,
117+
body?: AccessCodesUnmanagedListParams,
118118
): Promise<AccessCodesUnmanagedListResponse['access_codes']> {
119119
const { data } =
120120
await this.client.request<AccessCodesUnmanagedListResponse>({
@@ -125,7 +125,7 @@ export class SeamHttpAccessCodesUnmanaged {
125125
return data.access_codes
126126
}
127127

128-
async update(body: AccessCodesUnmanagedUpdateBody): Promise<void> {
128+
async update(body?: AccessCodesUnmanagedUpdateBody): Promise<void> {
129129
await this.client.request<AccessCodesUnmanagedUpdateResponse>({
130130
url: '/access_codes/unmanaged/update',
131131
method: 'post',
@@ -148,14 +148,14 @@ export type AccessCodesUnmanagedDeleteResponse = SetNonNullable<
148148
Required<RouteResponse<'/access_codes/unmanaged/delete'>>
149149
>
150150

151-
export type AccessCodesUnmanagedGetBody =
151+
export type AccessCodesUnmanagedGetParams =
152152
RouteRequestBody<'/access_codes/unmanaged/get'>
153153

154154
export type AccessCodesUnmanagedGetResponse = SetNonNullable<
155155
Required<RouteResponse<'/access_codes/unmanaged/get'>>
156156
>
157157

158-
export type AccessCodesUnmanagedListBody =
158+
export type AccessCodesUnmanagedListParams =
159159
RouteRequestBody<'/access_codes/unmanaged/list'>
160160

161161
export type AccessCodesUnmanagedListResponse = SetNonNullable<

src/lib/seam/connect/routes/access-codes.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ export class SeamHttpAccessCodes {
8888
}
8989

9090
async create(
91-
body: AccessCodesCreateBody,
91+
body?: AccessCodesCreateBody,
9292
): Promise<AccessCodesCreateResponse['access_code']> {
9393
const { data } = await this.client.request<AccessCodesCreateResponse>({
9494
url: '/access_codes/create',
@@ -99,7 +99,7 @@ export class SeamHttpAccessCodes {
9999
}
100100

101101
async createMultiple(
102-
body: AccessCodesCreateMultipleBody,
102+
body?: AccessCodesCreateMultipleBody,
103103
): Promise<AccessCodesCreateMultipleResponse['access_codes']> {
104104
const { data } =
105105
await this.client.request<AccessCodesCreateMultipleResponse>({
@@ -110,7 +110,7 @@ export class SeamHttpAccessCodes {
110110
return data.access_codes
111111
}
112112

113-
async delete(body: AccessCodesDeleteBody): Promise<void> {
113+
async delete(body?: AccessCodesDeleteBody): Promise<void> {
114114
await this.client.request<AccessCodesDeleteResponse>({
115115
url: '/access_codes/delete',
116116
method: 'post',
@@ -119,7 +119,7 @@ export class SeamHttpAccessCodes {
119119
}
120120

121121
async generateCode(
122-
body: AccessCodesGenerateCodeBody,
122+
body?: AccessCodesGenerateCodeBody,
123123
): Promise<AccessCodesGenerateCodeResponse['generated_code']> {
124124
const { data } = await this.client.request<AccessCodesGenerateCodeResponse>(
125125
{
@@ -132,7 +132,7 @@ export class SeamHttpAccessCodes {
132132
}
133133

134134
async get(
135-
body: AccessCodesGetBody,
135+
body?: AccessCodesGetParams,
136136
): Promise<AccessCodesGetResponse['access_code']> {
137137
const { data } = await this.client.request<AccessCodesGetResponse>({
138138
url: '/access_codes/get',
@@ -143,7 +143,7 @@ export class SeamHttpAccessCodes {
143143
}
144144

145145
async list(
146-
body: AccessCodesListBody,
146+
body?: AccessCodesListParams,
147147
): Promise<AccessCodesListResponse['access_codes']> {
148148
const { data } = await this.client.request<AccessCodesListResponse>({
149149
url: '/access_codes/list',
@@ -154,7 +154,7 @@ export class SeamHttpAccessCodes {
154154
}
155155

156156
async pullBackupAccessCode(
157-
body: AccessCodesPullBackupAccessCodeBody,
157+
body?: AccessCodesPullBackupAccessCodeBody,
158158
): Promise<AccessCodesPullBackupAccessCodeResponse['backup_access_code']> {
159159
const { data } =
160160
await this.client.request<AccessCodesPullBackupAccessCodeResponse>({
@@ -165,7 +165,7 @@ export class SeamHttpAccessCodes {
165165
return data.backup_access_code
166166
}
167167

168-
async update(body: AccessCodesUpdateBody): Promise<void> {
168+
async update(body?: AccessCodesUpdateBody): Promise<void> {
169169
await this.client.request<AccessCodesUpdateResponse>({
170170
url: '/access_codes/update',
171171
method: 'post',
@@ -200,13 +200,13 @@ export type AccessCodesGenerateCodeResponse = SetNonNullable<
200200
Required<RouteResponse<'/access_codes/generate_code'>>
201201
>
202202

203-
export type AccessCodesGetBody = RouteRequestBody<'/access_codes/get'>
203+
export type AccessCodesGetParams = RouteRequestBody<'/access_codes/get'>
204204

205205
export type AccessCodesGetResponse = SetNonNullable<
206206
Required<RouteResponse<'/access_codes/get'>>
207207
>
208208

209-
export type AccessCodesListBody = RouteRequestBody<'/access_codes/list'>
209+
export type AccessCodesListParams = RouteRequestBody<'/access_codes/list'>
210210

211211
export type AccessCodesListResponse = SetNonNullable<
212212
Required<RouteResponse<'/access_codes/list'>>

0 commit comments

Comments
 (0)