From 2e7f216d65338975e358e203d9803ec4d2c6488d Mon Sep 17 00:00:00 2001 From: Evan Sosenko Date: Tue, 18 Aug 2026 19:20:35 -0700 Subject: [PATCH 1/3] Update blueprint --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index e2823480..9e91cb64 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "axios-retry": "^4.4.2" }, "devDependencies": { - "@seamapi/blueprint": "^1.7.0", + "@seamapi/blueprint": "^1.8.0", "@seamapi/fake-seam-connect": "^2.0.4", "@seamapi/smith": "^1.1.0", "@seamapi/types": "1.1022.0", @@ -1025,9 +1025,9 @@ "license": "MIT" }, "node_modules/@seamapi/blueprint": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@seamapi/blueprint/-/blueprint-1.7.0.tgz", - "integrity": "sha512-on9pREQKyFgIaS99KLcck5K6AqLEO8Iy5h1heuJ2sEC2A7wXk5s/TL8iDOB3+4eeaAwuHRPgze9/Omo84KjJkw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@seamapi/blueprint/-/blueprint-1.8.0.tgz", + "integrity": "sha512-NUghBmYaKreBeBxwPIB2O9hjIFZtEjVj73tAsuKdJR8t4BxlKK1I0XDQXxo3ZsH2QezNlbdo9/0MoX/33VXuhQ==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 44ce0324..4c0f0dcf 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "axios-retry": "^4.4.2" }, "devDependencies": { - "@seamapi/blueprint": "^1.7.0", + "@seamapi/blueprint": "^1.8.0", "@seamapi/fake-seam-connect": "^2.0.4", "@seamapi/smith": "^1.1.0", "@seamapi/types": "1.1022.0", From a6159d82dd10f79d4fa82b2ff885a51af3177207 Mon Sep 17 00:00:00 2001 From: Seam Bot Date: Wed, 19 Aug 2026 02:21:35 +0000 Subject: [PATCH 2/3] ci: Generate code --- src/lib/routes/access-codes/access-codes.ts | 4 ++-- src/lib/routes/access-grants/access-grants.ts | 8 ++++---- src/lib/routes/access-methods/access-methods.ts | 4 ++-- src/lib/routes/acs/encoders/encoders.ts | 4 ++-- src/lib/routes/acs/entrances/entrances.ts | 8 ++++---- src/lib/routes/action-attempts/action-attempts.ts | 4 ++-- src/lib/routes/connect-webviews/connect-webviews.ts | 4 ++-- .../routes/connected-accounts/connected-accounts.ts | 4 ++-- src/lib/routes/customers/customers.ts | 4 ++-- src/lib/routes/devices/devices.ts | 4 ++-- src/lib/routes/devices/unmanaged/unmanaged.ts | 4 ++-- src/lib/routes/events/events.ts | 4 ++-- src/lib/routes/locks/locks.ts | 4 ++-- src/lib/routes/noise-sensors/noise-sensors.ts | 4 ++-- src/lib/routes/spaces/spaces.ts | 12 ++++++------ src/lib/routes/thermostats/thermostats.ts | 4 ++-- src/lib/routes/user-identities/user-identities.ts | 4 ++-- 17 files changed, 42 insertions(+), 42 deletions(-) diff --git a/src/lib/routes/access-codes/access-codes.ts b/src/lib/routes/access-codes/access-codes.ts index b0bdc4e3..4aead41d 100644 --- a/src/lib/routes/access-codes/access-codes.ts +++ b/src/lib/routes/access-codes/access-codes.ts @@ -288,8 +288,8 @@ export class SeamHttpAccessCodes { ): AccessCodesListRequest { return new SeamHttpRequest(this, { pathname: '/access_codes/list', - method: 'POST', - body: parameters, + method: 'GET', + params: parameters, parameters, hasRequiredParameters: true, requiredParameterNames: [], diff --git a/src/lib/routes/access-grants/access-grants.ts b/src/lib/routes/access-grants/access-grants.ts index 392ffe59..373116fb 100644 --- a/src/lib/routes/access-grants/access-grants.ts +++ b/src/lib/routes/access-grants/access-grants.ts @@ -232,8 +232,8 @@ export class SeamHttpAccessGrants { ): AccessGrantsGetRelatedRequest { return new SeamHttpRequest(this, { pathname: '/access_grants/get_related', - method: 'POST', - body: parameters, + method: 'GET', + params: parameters, parameters, hasRequiredParameters: true, requiredParameterNames: [], @@ -251,8 +251,8 @@ export class SeamHttpAccessGrants { ): AccessGrantsListRequest { return new SeamHttpRequest(this, { pathname: '/access_grants/list', - method: 'POST', - body: parameters, + method: 'GET', + params: parameters, parameters, hasRequiredParameters: false, requiredParameterNames: [], diff --git a/src/lib/routes/access-methods/access-methods.ts b/src/lib/routes/access-methods/access-methods.ts index d68836fa..7a5fd6db 100644 --- a/src/lib/routes/access-methods/access-methods.ts +++ b/src/lib/routes/access-methods/access-methods.ts @@ -261,8 +261,8 @@ export class SeamHttpAccessMethods { ): AccessMethodsGetRelatedRequest { return new SeamHttpRequest(this, { pathname: '/access_methods/get_related', - method: 'POST', - body: parameters, + method: 'GET', + params: parameters, parameters, hasRequiredParameters: true, requiredParameterNames: ['access_method_ids'], diff --git a/src/lib/routes/acs/encoders/encoders.ts b/src/lib/routes/acs/encoders/encoders.ts index 6805ff07..2ba60c79 100644 --- a/src/lib/routes/acs/encoders/encoders.ts +++ b/src/lib/routes/acs/encoders/encoders.ts @@ -217,8 +217,8 @@ export class SeamHttpAcsEncoders { ): AcsEncodersListRequest { return new SeamHttpRequest(this, { pathname: '/acs/encoders/list', - method: 'POST', - body: parameters, + method: 'GET', + params: parameters, parameters, hasRequiredParameters: false, requiredParameterNames: [], diff --git a/src/lib/routes/acs/entrances/entrances.ts b/src/lib/routes/acs/entrances/entrances.ts index e8697712..4eeb87b2 100644 --- a/src/lib/routes/acs/entrances/entrances.ts +++ b/src/lib/routes/acs/entrances/entrances.ts @@ -208,8 +208,8 @@ export class SeamHttpAcsEntrances { ): AcsEntrancesListRequest { return new SeamHttpRequest(this, { pathname: '/acs/entrances/list', - method: 'POST', - body: parameters, + method: 'GET', + params: parameters, parameters, hasRequiredParameters: false, requiredParameterNames: [], @@ -227,8 +227,8 @@ export class SeamHttpAcsEntrances { ): AcsEntrancesListCredentialsWithAccessRequest { return new SeamHttpRequest(this, { pathname: '/acs/entrances/list_credentials_with_access', - method: 'POST', - body: parameters, + method: 'GET', + params: parameters, parameters, hasRequiredParameters: true, requiredParameterNames: ['acs_entrance_id'], diff --git a/src/lib/routes/action-attempts/action-attempts.ts b/src/lib/routes/action-attempts/action-attempts.ts index 3bad19f1..a67895bd 100644 --- a/src/lib/routes/action-attempts/action-attempts.ts +++ b/src/lib/routes/action-attempts/action-attempts.ts @@ -190,8 +190,8 @@ export class SeamHttpActionAttempts { ): ActionAttemptsListRequest { return new SeamHttpRequest(this, { pathname: '/action_attempts/list', - method: 'POST', - body: parameters, + method: 'GET', + params: parameters, parameters, hasRequiredParameters: false, requiredParameterNames: [], diff --git a/src/lib/routes/connect-webviews/connect-webviews.ts b/src/lib/routes/connect-webviews/connect-webviews.ts index 03316012..a334bb63 100644 --- a/src/lib/routes/connect-webviews/connect-webviews.ts +++ b/src/lib/routes/connect-webviews/connect-webviews.ts @@ -234,8 +234,8 @@ export class SeamHttpConnectWebviews { ): ConnectWebviewsListRequest { return new SeamHttpRequest(this, { pathname: '/connect_webviews/list', - method: 'POST', - body: parameters, + method: 'GET', + params: parameters, parameters, hasRequiredParameters: false, requiredParameterNames: [], diff --git a/src/lib/routes/connected-accounts/connected-accounts.ts b/src/lib/routes/connected-accounts/connected-accounts.ts index 0a2e67b5..e0303078 100644 --- a/src/lib/routes/connected-accounts/connected-accounts.ts +++ b/src/lib/routes/connected-accounts/connected-accounts.ts @@ -219,8 +219,8 @@ export class SeamHttpConnectedAccounts { ): ConnectedAccountsListRequest { return new SeamHttpRequest(this, { pathname: '/connected_accounts/list', - method: 'POST', - body: parameters, + method: 'GET', + params: parameters, parameters, hasRequiredParameters: false, requiredParameterNames: [], diff --git a/src/lib/routes/customers/customers.ts b/src/lib/routes/customers/customers.ts index 7586a4cc..d640b8e5 100644 --- a/src/lib/routes/customers/customers.ts +++ b/src/lib/routes/customers/customers.ts @@ -187,8 +187,8 @@ export class SeamHttpCustomers { ): CustomersDeleteDataRequest { return new SeamHttpRequest(this, { pathname: '/customers/delete_data', - method: 'POST', - body: parameters, + method: 'DELETE', + params: parameters, parameters, hasRequiredParameters: false, requiredParameterNames: [], diff --git a/src/lib/routes/devices/devices.ts b/src/lib/routes/devices/devices.ts index 0ee3e541..4263b76e 100644 --- a/src/lib/routes/devices/devices.ts +++ b/src/lib/routes/devices/devices.ts @@ -201,8 +201,8 @@ export class SeamHttpDevices { ): DevicesListRequest { return new SeamHttpRequest(this, { pathname: '/devices/list', - method: 'POST', - body: parameters, + method: 'GET', + params: parameters, parameters, hasRequiredParameters: false, requiredParameterNames: [], diff --git a/src/lib/routes/devices/unmanaged/unmanaged.ts b/src/lib/routes/devices/unmanaged/unmanaged.ts index 9c34232e..e64cf8bc 100644 --- a/src/lib/routes/devices/unmanaged/unmanaged.ts +++ b/src/lib/routes/devices/unmanaged/unmanaged.ts @@ -193,8 +193,8 @@ export class SeamHttpDevicesUnmanaged { ): DevicesUnmanagedListRequest { return new SeamHttpRequest(this, { pathname: '/devices/unmanaged/list', - method: 'POST', - body: parameters, + method: 'GET', + params: parameters, parameters, hasRequiredParameters: false, requiredParameterNames: [], diff --git a/src/lib/routes/events/events.ts b/src/lib/routes/events/events.ts index 70e8c4e1..24b2c136 100644 --- a/src/lib/routes/events/events.ts +++ b/src/lib/routes/events/events.ts @@ -187,8 +187,8 @@ export class SeamHttpEvents { ): EventsListRequest { return new SeamHttpRequest(this, { pathname: '/events/list', - method: 'POST', - body: parameters, + method: 'GET', + params: parameters, parameters, hasRequiredParameters: true, requiredParameterNames: [], diff --git a/src/lib/routes/locks/locks.ts b/src/lib/routes/locks/locks.ts index 54580f45..aafbd73c 100644 --- a/src/lib/routes/locks/locks.ts +++ b/src/lib/routes/locks/locks.ts @@ -219,8 +219,8 @@ export class SeamHttpLocks { ): LocksListRequest { return new SeamHttpRequest(this, { pathname: '/locks/list', - method: 'POST', - body: parameters, + method: 'GET', + params: parameters, parameters, hasRequiredParameters: false, requiredParameterNames: [], diff --git a/src/lib/routes/noise-sensors/noise-sensors.ts b/src/lib/routes/noise-sensors/noise-sensors.ts index b7ba96fa..f73db2da 100644 --- a/src/lib/routes/noise-sensors/noise-sensors.ts +++ b/src/lib/routes/noise-sensors/noise-sensors.ts @@ -181,8 +181,8 @@ export class SeamHttpNoiseSensors { ): NoiseSensorsListRequest { return new SeamHttpRequest(this, { pathname: '/noise_sensors/list', - method: 'POST', - body: parameters, + method: 'GET', + params: parameters, parameters, hasRequiredParameters: false, requiredParameterNames: [], diff --git a/src/lib/routes/spaces/spaces.ts b/src/lib/routes/spaces/spaces.ts index 56d448ae..aaef4625 100644 --- a/src/lib/routes/spaces/spaces.ts +++ b/src/lib/routes/spaces/spaces.ts @@ -283,8 +283,8 @@ export class SeamHttpSpaces { ): SpacesGetRelatedRequest { return new SeamHttpRequest(this, { pathname: '/spaces/get_related', - method: 'POST', - body: parameters, + method: 'GET', + params: parameters, parameters, hasRequiredParameters: true, requiredParameterNames: [], @@ -321,8 +321,8 @@ export class SeamHttpSpaces { ): SpacesRemoveAcsEntrancesRequest { return new SeamHttpRequest(this, { pathname: '/spaces/remove_acs_entrances', - method: 'POST', - body: parameters, + method: 'DELETE', + params: parameters, parameters, hasRequiredParameters: true, requiredParameterNames: ['acs_entrance_ids', 'space_id'], @@ -359,8 +359,8 @@ export class SeamHttpSpaces { ): SpacesRemoveDevicesRequest { return new SeamHttpRequest(this, { pathname: '/spaces/remove_devices', - method: 'POST', - body: parameters, + method: 'DELETE', + params: parameters, parameters, hasRequiredParameters: true, requiredParameterNames: ['device_ids', 'space_id'], diff --git a/src/lib/routes/thermostats/thermostats.ts b/src/lib/routes/thermostats/thermostats.ts index 13d78c5e..c68f67d0 100644 --- a/src/lib/routes/thermostats/thermostats.ts +++ b/src/lib/routes/thermostats/thermostats.ts @@ -318,8 +318,8 @@ export class SeamHttpThermostats { ): ThermostatsListRequest { return new SeamHttpRequest(this, { pathname: '/thermostats/list', - method: 'POST', - body: parameters, + method: 'GET', + params: parameters, parameters, hasRequiredParameters: false, requiredParameterNames: [], diff --git a/src/lib/routes/user-identities/user-identities.ts b/src/lib/routes/user-identities/user-identities.ts index 1fc5fb2e..47ce2d5d 100644 --- a/src/lib/routes/user-identities/user-identities.ts +++ b/src/lib/routes/user-identities/user-identities.ts @@ -300,8 +300,8 @@ export class SeamHttpUserIdentities { ): UserIdentitiesListRequest { return new SeamHttpRequest(this, { pathname: '/user_identities/list', - method: 'POST', - body: parameters, + method: 'GET', + params: parameters, parameters, hasRequiredParameters: false, requiredParameterNames: [], From 2d7fbb6b8687b2e939c8ce6d99f7e6ebfc113896 Mon Sep 17 00:00:00 2001 From: Evan Sosenko Date: Tue, 18 Aug 2026 19:40:03 -0700 Subject: [PATCH 3/3] Update tests --- test/seam/connect/retry.test.ts | 9 +++--- test/seam/connect/seam-http-request.test.ts | 36 +++++++++------------ 2 files changed, 21 insertions(+), 24 deletions(-) diff --git a/test/seam/connect/retry.test.ts b/test/seam/connect/retry.test.ts index 95640e69..04735d68 100644 --- a/test/seam/connect/retry.test.ts +++ b/test/seam/connect/retry.test.ts @@ -55,9 +55,10 @@ test('SeamHttp: does not retry POST requests by default', async (t) => { routes: ['/devices/list'], }) - const err = await t.throwsAsync(async () => await seam.devices.list(), { - instanceOf: AxiosError, - }) + const err = await t.throwsAsync( + async () => await seam.client.post('/devices/list'), + { instanceOf: AxiosError }, + ) t.is(err?.response?.status, 503) }) @@ -94,7 +95,7 @@ test('SeamHttp: does not replay a POST after a mid-flight connection reset', asy endpoint: `http://127.0.0.1:${address.port}`, }) - await t.throwsAsync(async () => await seam.devices.list()) + await t.throwsAsync(async () => await seam.client.post('/devices/list')) t.is(attempts, 1) }) diff --git a/test/seam/connect/seam-http-request.test.ts b/test/seam/connect/seam-http-request.test.ts index 0d9d9e96..084e71c9 100644 --- a/test/seam/connect/seam-http-request.test.ts +++ b/test/seam/connect/seam-http-request.test.ts @@ -50,27 +50,23 @@ test('SeamHttpRequest: url is a URL for requests without query string', async (t ) }) -// UPSTREAM: The Seam API does not yet consistently support GET requests, so only POST is used. -test.failing( - 'SeamHttpRequest: url is a URL for requests with query string', - async (t) => { - const { seed, endpoint } = await getTestServer(t) - const seam = SeamHttp.fromApiKey(seed.seam_apikey1_token, { endpoint }) - const { url } = seam.devices.list({ - limit: 10, - device_ids: [seed.august_device_1, seed.ecobee_device_1], - }) - t.true(url instanceof URL) - t.deepEqual( - toPlainUrlObject(url), - toPlainUrlObject( - new URL( - `${endpoint}/devices/get?device_ids=${seed.august_device_1}&device_ids=${seed.ecobee_device_1}&limit=10&_strict=true`, - ), +test('SeamHttpRequest: url is a URL for requests with query string', async (t) => { + const { seed, endpoint } = await getTestServer(t) + const seam = SeamHttp.fromApiKey(seed.seam_apikey1_token, { endpoint }) + const { url } = seam.devices.list({ + limit: 10, + device_ids: [seed.august_device_1, seed.ecobee_device_1], + }) + t.true(url instanceof URL) + t.deepEqual( + toPlainUrlObject(url), + toPlainUrlObject( + new URL( + `${endpoint}/devices/list?device_ids=${seed.august_device_1}&device_ids=${seed.ecobee_device_1}&limit=10&_strict=true`, ), - ) - }, -) + ), + ) +}) test('SeamHttpRequest: url is a URL when endpoint is a url without a path', async (t) => { const { seed } = await getTestServer(t)