Skip to content

Commit 2710e93

Browse files
committed
Resolve type errors
1 parent 1fe40fc commit 2710e93

22 files changed

+350
-332
lines changed

generate-routes.ts

Lines changed: 61 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,36 @@ const ignoredEndpointPaths = [
4141
'/noise_sensors/simulate/trigger_noise_threshold',
4242
]
4343

44+
const endpointResources: Partial<
45+
Record<
46+
keyof typeof openapi.paths,
47+
| 'action_attempt'
48+
| 'device_providers'
49+
| 'generated_code'
50+
| 'backup_access_code'
51+
| 'acs_users'
52+
| null
53+
>
54+
> = {
55+
'/access_codes/generate_code': 'generated_code',
56+
'/access_codes/pull_backup_access_code': 'backup_access_code',
57+
'/acs/users/add_to_access_group': null,
58+
'/acs/users/remove_from_access_group': null,
59+
'/acs/access_groups/list_users': 'acs_users',
60+
'/acs/access_groups/remove_user': null,
61+
'/connect_webviews/view': null,
62+
'/devices/list_device_providers': 'device_providers',
63+
'/locks/lock_door': null,
64+
'/locks/unlock_door': null,
65+
'/noise_sensors/noise_thresholds/create': null,
66+
'/thermostats/cool': null,
67+
'/thermostats/heat': null,
68+
'/thermostats/heat_cool': null,
69+
'/thermostats/off': null,
70+
'/thermostats/set_fan_mode': null,
71+
'/workspaces/reset_sandbox': null,
72+
}
73+
4474
interface Route {
4575
namespace: string
4676
endpoints: Endpoint[]
@@ -117,24 +147,48 @@ const createEndpoint = (
117147
namespace,
118148
path: endpointPath,
119149
method,
120-
resource: deriveResource(routePath, name, method),
150+
resource: deriveResource(endpointPath, routePath, name, method),
121151
requestFormat: ['GET', 'DELETE'].includes(method) ? 'params' : 'body',
122152
}
123153
}
124154

125155
const deriveResource = (
156+
endpointPath: string,
126157
routePath: string,
127158
name: string,
128159
method: Method,
129160
): string | null => {
161+
if (endpointPath in endpointResources) {
162+
return (
163+
endpointResources[endpointPath as keyof typeof endpointResources] ?? null
164+
)
165+
}
130166
if (['DELETE', 'PATCH', 'PUT'].includes(method)) return null
131167
if (['update', 'delete'].includes(name)) return null
132-
const group = routePath.split('/')[1]
168+
const group = deriveGroupFromRoutePath(routePath)
133169
if (group == null) throw new Error(`Could not parse group from ${routePath}`)
134170
if (name === 'list') return group
135171
return pluralize.singular(group)
136172
}
137173

174+
const deriveGroupFromRoutePath = (routePath: string): string | undefined => {
175+
const parts = routePath.split('/').slice(1)
176+
177+
if (routePath.endsWith('/unmanaged')) {
178+
return parts[0]
179+
}
180+
181+
if (routePath.startsWith('/acs')) {
182+
return [parts[0], parts[1]].join('_')
183+
}
184+
185+
if (parts.length === 2) {
186+
return parts[1]
187+
}
188+
189+
return parts[0]
190+
}
191+
138192
const deriveSemanticMethod = (methods: string[]): Method => {
139193
if (methods.includes('get')) return 'GET'
140194
if (methods.includes('delete')) return 'DELETE'
@@ -213,7 +267,9 @@ const renderClassMethod = ({
213267
path,
214268
}: Endpoint): string => `
215269
async ${camelCase(name)}(
216-
${requestFormat}: ${renderRequestType({
270+
${requestFormat}${
271+
requestFormat === 'params' ? '?' : ''
272+
}: ${renderRequestType({
217273
name,
218274
namespace,
219275
requestFormat,
@@ -247,15 +303,15 @@ const renderEndpointExports = ({
247303
namespace,
248304
requestFormat,
249305
}: Endpoint): string => `
250-
type ${renderRequestType({
306+
export type ${renderRequestType({
251307
name,
252308
namespace,
253309
requestFormat,
254310
})} = SetNonNullable<
255311
Required<RouteRequest${pascalCase(requestFormat)}<'${path}'>>
256312
>
257313
258-
type ${renderResponseType({ name, namespace })}= SetNonNullable<
314+
export type ${renderResponseType({ name, namespace })}= SetNonNullable<
259315
Required<RouteResponse<'${path}'>>
260316
>
261317
`

src/lib/seam/connect/client.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ export class SeamHttp {
6363
}
6464

6565
get workspaces(): SeamHttpWorkspaces {
66-
if (this.#legacy) return new SeamHttpLegacyWorkspaces(this.client)
66+
if (this.#legacy)
67+
return new SeamHttpLegacyWorkspaces({ client: this.client })
6768
return new SeamHttpWorkspaces({ client: this.client })
6869
}
6970
}
Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,3 @@
1-
import type { RouteRequestParams, RouteResponse } from '@seamapi/types/connect'
2-
import type { Axios } from 'axios'
3-
import type { SetNonNullable } from 'type-fest'
1+
import { SeamHttpWorkspaces } from 'lib/seam/connect/routes/workspaces.js'
42

5-
export class SeamHttpLegacyWorkspaces {
6-
client: Axios
7-
8-
constructor(client: Axios) {
9-
this.client = client
10-
}
11-
12-
async get(
13-
params: WorkspacesGetParams,
14-
): Promise<WorkspacesGetResponse['workspace']> {
15-
const { data } = await this.client.request<WorkspacesGetResponse>({
16-
url: '/workspaces/get',
17-
method: 'get',
18-
params,
19-
})
20-
return data.workspace
21-
}
22-
}
23-
24-
// TODO: Import from routes so no need to redefine here
25-
type WorkspacesGetParams = SetNonNullable<
26-
Required<RouteRequestParams<'/workspaces/get'>>
27-
>
28-
29-
type WorkspacesGetResponse = SetNonNullable<
30-
Required<RouteResponse<'/workspaces/get'>>
31-
>
3+
export class SeamHttpLegacyWorkspaces extends SeamHttpWorkspaces {}

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -116,42 +116,42 @@ export class SeamHttpAccessCodesUnmanaged {
116116
}
117117
}
118118

119-
type AccessCodesUnmanagedConvertToManagedBody = SetNonNullable<
119+
export type AccessCodesUnmanagedConvertToManagedBody = SetNonNullable<
120120
Required<RouteRequestBody<'/access_codes/unmanaged/convert_to_managed'>>
121121
>
122122

123-
type AccessCodesUnmanagedConvertToManagedResponse = SetNonNullable<
123+
export type AccessCodesUnmanagedConvertToManagedResponse = SetNonNullable<
124124
Required<RouteResponse<'/access_codes/unmanaged/convert_to_managed'>>
125125
>
126126

127-
type AccessCodesUnmanagedDeleteBody = SetNonNullable<
127+
export type AccessCodesUnmanagedDeleteBody = SetNonNullable<
128128
Required<RouteRequestBody<'/access_codes/unmanaged/delete'>>
129129
>
130130

131-
type AccessCodesUnmanagedDeleteResponse = SetNonNullable<
131+
export type AccessCodesUnmanagedDeleteResponse = SetNonNullable<
132132
Required<RouteResponse<'/access_codes/unmanaged/delete'>>
133133
>
134134

135-
type AccessCodesUnmanagedGetBody = SetNonNullable<
135+
export type AccessCodesUnmanagedGetBody = SetNonNullable<
136136
Required<RouteRequestBody<'/access_codes/unmanaged/get'>>
137137
>
138138

139-
type AccessCodesUnmanagedGetResponse = SetNonNullable<
139+
export type AccessCodesUnmanagedGetResponse = SetNonNullable<
140140
Required<RouteResponse<'/access_codes/unmanaged/get'>>
141141
>
142142

143-
type AccessCodesUnmanagedListBody = SetNonNullable<
143+
export type AccessCodesUnmanagedListBody = SetNonNullable<
144144
Required<RouteRequestBody<'/access_codes/unmanaged/list'>>
145145
>
146146

147-
type AccessCodesUnmanagedListResponse = SetNonNullable<
147+
export type AccessCodesUnmanagedListResponse = SetNonNullable<
148148
Required<RouteResponse<'/access_codes/unmanaged/list'>>
149149
>
150150

151-
type AccessCodesUnmanagedUpdateBody = SetNonNullable<
151+
export type AccessCodesUnmanagedUpdateBody = SetNonNullable<
152152
Required<RouteRequestBody<'/access_codes/unmanaged/update'>>
153153
>
154154

155-
type AccessCodesUnmanagedUpdateResponse = SetNonNullable<
155+
export type AccessCodesUnmanagedUpdateResponse = SetNonNullable<
156156
Required<RouteResponse<'/access_codes/unmanaged/update'>>
157157
>

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

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -96,16 +96,16 @@ export class SeamHttpAccessCodes {
9696
}
9797

9898
async generateCode(
99-
params: AccessCodesGenerateCodeParams,
100-
): Promise<AccessCodesGenerateCodeResponse['access_code']> {
99+
params?: AccessCodesGenerateCodeParams,
100+
): Promise<AccessCodesGenerateCodeResponse['generated_code']> {
101101
const { data } = await this.client.request<AccessCodesGenerateCodeResponse>(
102102
{
103103
url: '/access_codes/generate_code',
104104
method: 'get',
105105
params,
106106
},
107107
)
108-
return data.access_code
108+
return data.generated_code
109109
}
110110

111111
async get(
@@ -132,14 +132,14 @@ export class SeamHttpAccessCodes {
132132

133133
async pullBackupAccessCode(
134134
body: AccessCodesPullBackupAccessCodeBody,
135-
): Promise<AccessCodesPullBackupAccessCodeResponse['access_code']> {
135+
): Promise<AccessCodesPullBackupAccessCodeResponse['backup_access_code']> {
136136
const { data } =
137137
await this.client.request<AccessCodesPullBackupAccessCodeResponse>({
138138
url: '/access_codes/pull_backup_access_code',
139139
method: 'post',
140140
data: body,
141141
})
142-
return data.access_code
142+
return data.backup_access_code
143143
}
144144

145145
async update(body: AccessCodesUpdateBody): Promise<void> {
@@ -151,66 +151,66 @@ export class SeamHttpAccessCodes {
151151
}
152152
}
153153

154-
type AccessCodesCreateBody = SetNonNullable<
154+
export type AccessCodesCreateBody = SetNonNullable<
155155
Required<RouteRequestBody<'/access_codes/create'>>
156156
>
157157

158-
type AccessCodesCreateResponse = SetNonNullable<
158+
export type AccessCodesCreateResponse = SetNonNullable<
159159
Required<RouteResponse<'/access_codes/create'>>
160160
>
161161

162-
type AccessCodesCreateMultipleBody = SetNonNullable<
162+
export type AccessCodesCreateMultipleBody = SetNonNullable<
163163
Required<RouteRequestBody<'/access_codes/create_multiple'>>
164164
>
165165

166-
type AccessCodesCreateMultipleResponse = SetNonNullable<
166+
export type AccessCodesCreateMultipleResponse = SetNonNullable<
167167
Required<RouteResponse<'/access_codes/create_multiple'>>
168168
>
169169

170-
type AccessCodesDeleteBody = SetNonNullable<
170+
export type AccessCodesDeleteBody = SetNonNullable<
171171
Required<RouteRequestBody<'/access_codes/delete'>>
172172
>
173173

174-
type AccessCodesDeleteResponse = SetNonNullable<
174+
export type AccessCodesDeleteResponse = SetNonNullable<
175175
Required<RouteResponse<'/access_codes/delete'>>
176176
>
177177

178-
type AccessCodesGenerateCodeParams = SetNonNullable<
178+
export type AccessCodesGenerateCodeParams = SetNonNullable<
179179
Required<RouteRequestParams<'/access_codes/generate_code'>>
180180
>
181181

182-
type AccessCodesGenerateCodeResponse = SetNonNullable<
182+
export type AccessCodesGenerateCodeResponse = SetNonNullable<
183183
Required<RouteResponse<'/access_codes/generate_code'>>
184184
>
185185

186-
type AccessCodesGetBody = SetNonNullable<
186+
export type AccessCodesGetBody = SetNonNullable<
187187
Required<RouteRequestBody<'/access_codes/get'>>
188188
>
189189

190-
type AccessCodesGetResponse = SetNonNullable<
190+
export type AccessCodesGetResponse = SetNonNullable<
191191
Required<RouteResponse<'/access_codes/get'>>
192192
>
193193

194-
type AccessCodesListBody = SetNonNullable<
194+
export type AccessCodesListBody = SetNonNullable<
195195
Required<RouteRequestBody<'/access_codes/list'>>
196196
>
197197

198-
type AccessCodesListResponse = SetNonNullable<
198+
export type AccessCodesListResponse = SetNonNullable<
199199
Required<RouteResponse<'/access_codes/list'>>
200200
>
201201

202-
type AccessCodesPullBackupAccessCodeBody = SetNonNullable<
202+
export type AccessCodesPullBackupAccessCodeBody = SetNonNullable<
203203
Required<RouteRequestBody<'/access_codes/pull_backup_access_code'>>
204204
>
205205

206-
type AccessCodesPullBackupAccessCodeResponse = SetNonNullable<
206+
export type AccessCodesPullBackupAccessCodeResponse = SetNonNullable<
207207
Required<RouteResponse<'/access_codes/pull_backup_access_code'>>
208208
>
209209

210-
type AccessCodesUpdateBody = SetNonNullable<
210+
export type AccessCodesUpdateBody = SetNonNullable<
211211
Required<RouteRequestBody<'/access_codes/update'>>
212212
>
213213

214-
type AccessCodesUpdateResponse = SetNonNullable<
214+
export type AccessCodesUpdateResponse = SetNonNullable<
215215
Required<RouteResponse<'/access_codes/update'>>
216216
>

0 commit comments

Comments
 (0)