diff --git a/codegen/layouts/partials/route-class-endpoint-export.hbs b/codegen/layouts/partials/route-class-endpoint-export.hbs index cf0f766a..3ecd1069 100644 --- a/codegen/layouts/partials/route-class-endpoint-export.hbs +++ b/codegen/layouts/partials/route-class-endpoint-export.hbs @@ -1,4 +1,4 @@ -export type {{parametersTypeName}} = {{> request-object parameters=parameters}} +export type {{parametersTypeName}} = {{#if requiresAtLeastOneParameter}}RequireAtLeastOne<{{/if}}{{> request-object parameters=parameters}}{{#if requiresAtLeastOneParameter}}>{{/if}} /** * @deprecated Use {{requestTypeName}} instead. diff --git a/codegen/layouts/partials/route-class-endpoint.hbs b/codegen/layouts/partials/route-class-endpoint.hbs index 707d31e3..61d2ef13 100644 --- a/codegen/layouts/partials/route-class-endpoint.hbs +++ b/codegen/layouts/partials/route-class-endpoint.hbs @@ -2,6 +2,8 @@ {{methodName}} {{> endpont-method-signature }} { + assertValidRequestParameters(parameters, '{{path}}', {{hasRequiredParameters}}) + return new SeamHttpRequest(this, { pathname: '{{path}}', method: '{{method}}', diff --git a/codegen/layouts/route.hbs b/codegen/layouts/route.hbs index 98a6d2ab..388d04d1 100644 --- a/codegen/layouts/route.hbs +++ b/codegen/layouts/route.hbs @@ -5,6 +5,13 @@ {{> route-imports }} +{{#if endpoints}} +import { assertValidRequestParameters } from 'lib/request-parameters.js' +{{/if}} +{{#if needsRequireAtLeastOneImport}} +import type { RequireAtLeastOne } from 'lib/request-parameters.js' +{{/if}} + export class {{className}} { {{> route-class-methods }} diff --git a/codegen/lib/layouts/route.ts b/codegen/lib/layouts/route.ts index 4b251bd1..5821c737 100644 --- a/codegen/lib/layouts/route.ts +++ b/codegen/lib/layouts/route.ts @@ -10,6 +10,7 @@ export interface RouteLayoutContext { subroutes: SubrouteLayoutContext[] skipClientSessionImport: boolean needsActionAttemptsImport: boolean + needsRequireAtLeastOneImport: boolean resourceTypeImports: ResourceTypeImport[] } @@ -35,6 +36,8 @@ export interface EndpointLayoutContext { returnsActionAttempt: boolean returnsVoid: boolean isOptionalParamsOk: boolean + hasRequiredParameters: boolean + requiresAtLeastOneParameter: boolean parameters: Parameter[] responseIsList: boolean responseResourceTypeName: string @@ -64,6 +67,10 @@ export const setRouteLayoutContext = ( node.path !== '/action_attempts' && 'endpoints' in node && node.endpoints.some(isActionAttemptEndpoint) + file.needsRequireAtLeastOneImport = + node != null && + 'endpoints' in node && + node.endpoints.some(requiresAtLeastOneParameter) file.resourceTypeImports = node != null && 'endpoints' in node ? [ @@ -140,9 +147,9 @@ export const getEndpointLayoutContext = ( responseTypeName: `${prefix}Response`, optionsTypeName: `${prefix}Options`, requestTypeName: `${prefix}Request`, - isOptionalParamsOk: endpoint.request.parameters.every( - (parameter) => !parameter.isRequired, - ), + isOptionalParamsOk: !endpoint.request.hasRequiredParameters, + hasRequiredParameters: endpoint.request.hasRequiredParameters, + requiresAtLeastOneParameter: requiresAtLeastOneParameter(endpoint), parameters: endpoint.request.parameters, responseIsList: endpoint.response.responseType === 'resource_list', responseResourceTypeName: @@ -155,6 +162,10 @@ export const getEndpointLayoutContext = ( } } +const requiresAtLeastOneParameter = (endpoint: Endpoint): boolean => + endpoint.request.hasRequiredParameters && + endpoint.request.parameters.every(({ isRequired }) => !isRequired) + const isActionAttemptEndpoint = (endpoint: Endpoint): boolean => endpoint.response.responseType === 'resource' && endpoint.response.resourceType === 'action_attempt' diff --git a/src/lib/request-parameters.ts b/src/lib/request-parameters.ts new file mode 100644 index 00000000..4c05d59d --- /dev/null +++ b/src/lib/request-parameters.ts @@ -0,0 +1,33 @@ +export type RequireAtLeastOne< + T, + Keys extends keyof T = keyof T, +> = Keys extends keyof T + ? Required> & Partial> + : never + +export const assertValidRequestParameters = ( + parameters: unknown, + path: string, + hasRequiredParameters: boolean, +): void => { + if (parameters === undefined) { + if (hasRequiredParameters) { + throw new TypeError(`Parameters are required for ${path}`) + } + return + } + + if ( + parameters === null || + typeof parameters !== 'object' || + Array.isArray(parameters) + ) { + throw new TypeError(`Parameters for ${path} must be an object`) + } + + if (hasRequiredParameters && Object.keys(parameters).length === 0) { + throw new TypeError( + `Parameters for ${path} must contain at least one property`, + ) + } +} diff --git a/src/lib/routes/access-codes/access-codes.ts b/src/lib/routes/access-codes/access-codes.ts index 972fbf57..27f583a1 100644 --- a/src/lib/routes/access-codes/access-codes.ts +++ b/src/lib/routes/access-codes/access-codes.ts @@ -28,6 +28,10 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { + assertValidRequestParameters, + type RequireAtLeastOne, +} from 'lib/request-parameters.js' import type { AccessCode } from 'lib/resources/access-code.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' @@ -176,6 +180,8 @@ export class SeamHttpAccessCodes { parameters: AccessCodesCreateParameters, options: AccessCodesCreateOptions = {}, ): AccessCodesCreateRequest { + assertValidRequestParameters(parameters, '/access_codes/create', true) + return new SeamHttpRequest(this, { pathname: '/access_codes/create', method: 'POST', @@ -202,6 +208,12 @@ export class SeamHttpAccessCodes { parameters: AccessCodesCreateMultipleParameters, options: AccessCodesCreateMultipleOptions = {}, ): AccessCodesCreateMultipleRequest { + assertValidRequestParameters( + parameters, + '/access_codes/create_multiple', + true, + ) + return new SeamHttpRequest(this, { pathname: '/access_codes/create_multiple', method: 'PUT', @@ -218,6 +230,8 @@ export class SeamHttpAccessCodes { parameters: AccessCodesDeleteParameters, options: AccessCodesDeleteOptions = {}, ): AccessCodesDeleteRequest { + assertValidRequestParameters(parameters, '/access_codes/delete', true) + return new SeamHttpRequest(this, { pathname: '/access_codes/delete', method: 'DELETE', @@ -234,6 +248,12 @@ export class SeamHttpAccessCodes { parameters: AccessCodesGenerateCodeParameters, options: AccessCodesGenerateCodeOptions = {}, ): AccessCodesGenerateCodeRequest { + assertValidRequestParameters( + parameters, + '/access_codes/generate_code', + true, + ) + return new SeamHttpRequest(this, { pathname: '/access_codes/generate_code', method: 'GET', @@ -249,9 +269,11 @@ export class SeamHttpAccessCodes { * You must specify either `access_code_id` or both `device_id` and `code`. */ get( - parameters?: AccessCodesGetParameters, + parameters: AccessCodesGetParameters, options: AccessCodesGetOptions = {}, ): AccessCodesGetRequest { + assertValidRequestParameters(parameters, '/access_codes/get', true) + return new SeamHttpRequest(this, { pathname: '/access_codes/get', method: 'GET', @@ -267,9 +289,11 @@ export class SeamHttpAccessCodes { * Specify `device_id`, `access_code_ids`, `access_method_id`, `access_grant_id`, or `access_grant_key`. */ list( - parameters?: AccessCodesListParameters, + parameters: AccessCodesListParameters, options: AccessCodesListOptions = {}, ): AccessCodesListRequest { + assertValidRequestParameters(parameters, '/access_codes/list', true) + return new SeamHttpRequest(this, { pathname: '/access_codes/list', method: 'POST', @@ -294,6 +318,12 @@ export class SeamHttpAccessCodes { parameters: AccessCodesPullBackupAccessCodeParameters, options: AccessCodesPullBackupAccessCodeOptions = {}, ): AccessCodesPullBackupAccessCodeRequest { + assertValidRequestParameters( + parameters, + '/access_codes/pull_backup_access_code', + true, + ) + return new SeamHttpRequest(this, { pathname: '/access_codes/pull_backup_access_code', method: 'POST', @@ -312,6 +342,12 @@ export class SeamHttpAccessCodes { parameters: AccessCodesReportDeviceConstraintsParameters, options: AccessCodesReportDeviceConstraintsOptions = {}, ): AccessCodesReportDeviceConstraintsRequest { + assertValidRequestParameters( + parameters, + '/access_codes/report_device_constraints', + true, + ) + return new SeamHttpRequest(this, { pathname: '/access_codes/report_device_constraints', method: 'POST', @@ -330,6 +366,8 @@ export class SeamHttpAccessCodes { parameters: AccessCodesUpdateParameters, options: AccessCodesUpdateOptions = {}, ): AccessCodesUpdateRequest { + assertValidRequestParameters(parameters, '/access_codes/update', true) + return new SeamHttpRequest(this, { pathname: '/access_codes/update', method: 'PUT', @@ -350,6 +388,12 @@ export class SeamHttpAccessCodes { parameters: AccessCodesUpdateMultipleParameters, options: AccessCodesUpdateMultipleOptions = {}, ): AccessCodesUpdateMultipleRequest { + assertValidRequestParameters( + parameters, + '/access_codes/update_multiple', + true, + ) + return new SeamHttpRequest(this, { pathname: '/access_codes/update_multiple', method: 'PATCH', @@ -555,7 +599,7 @@ export type AccessCodesGenerateCodeRequest = SeamHttpRequest< export interface AccessCodesGenerateCodeOptions {} -export type AccessCodesGetParameters = { +export type AccessCodesGetParameters = RequireAtLeastOne<{ /** * ID of the access code that you want to get. You must specify either `access_code_id` or both `device_id` and `code`. */ @@ -568,7 +612,7 @@ export type AccessCodesGetParameters = { * ID of the device containing the access code that you want to get. You must specify either `access_code_id` or both `device_id` and `code`. */ device_id?: string | undefined -} +}> /** * @deprecated Use AccessCodesGetRequest instead. @@ -582,7 +626,7 @@ export type AccessCodesGetRequest = SeamHttpRequest< export interface AccessCodesGetOptions {} -export type AccessCodesListParameters = { +export type AccessCodesListParameters = RequireAtLeastOne<{ /** * IDs of the access codes that you want to retrieve. Specify `device_id`, `access_code_ids`, `access_method_id`, `access_grant_id`, or `access_grant_key`. */ @@ -623,7 +667,7 @@ export type AccessCodesListParameters = { * Your user ID for the user by which to filter access codes. */ user_identifier_key?: string | undefined -} +}> /** * @deprecated Use AccessCodesListRequest instead. diff --git a/src/lib/routes/access-codes/simulate/simulate.ts b/src/lib/routes/access-codes/simulate/simulate.ts index 8de41e69..e79b7ae6 100644 --- a/src/lib/routes/access-codes/simulate/simulate.ts +++ b/src/lib/routes/access-codes/simulate/simulate.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import type { UnmanagedAccessCode } from 'lib/resources/unmanaged-access-code.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' @@ -165,6 +166,12 @@ export class SeamHttpAccessCodesSimulate { parameters: AccessCodesSimulateCreateUnmanagedAccessCodeParameters, options: AccessCodesSimulateCreateUnmanagedAccessCodeOptions = {}, ): AccessCodesSimulateCreateUnmanagedAccessCodeRequest { + assertValidRequestParameters( + parameters, + '/access_codes/simulate/create_unmanaged_access_code', + true, + ) + return new SeamHttpRequest(this, { pathname: '/access_codes/simulate/create_unmanaged_access_code', method: 'POST', diff --git a/src/lib/routes/access-codes/unmanaged/unmanaged.ts b/src/lib/routes/access-codes/unmanaged/unmanaged.ts index 9b6914f2..c31795b4 100644 --- a/src/lib/routes/access-codes/unmanaged/unmanaged.ts +++ b/src/lib/routes/access-codes/unmanaged/unmanaged.ts @@ -28,6 +28,10 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { + assertValidRequestParameters, + type RequireAtLeastOne, +} from 'lib/request-parameters.js' import type { UnmanagedAccessCode } from 'lib/resources/unmanaged-access-code.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' @@ -169,6 +173,12 @@ export class SeamHttpAccessCodesUnmanaged { parameters: AccessCodesUnmanagedConvertToManagedParameters, options: AccessCodesUnmanagedConvertToManagedOptions = {}, ): AccessCodesUnmanagedConvertToManagedRequest { + assertValidRequestParameters( + parameters, + '/access_codes/unmanaged/convert_to_managed', + true, + ) + return new SeamHttpRequest(this, { pathname: '/access_codes/unmanaged/convert_to_managed', method: 'PATCH', @@ -185,6 +195,12 @@ export class SeamHttpAccessCodesUnmanaged { parameters: AccessCodesUnmanagedDeleteParameters, options: AccessCodesUnmanagedDeleteOptions = {}, ): AccessCodesUnmanagedDeleteRequest { + assertValidRequestParameters( + parameters, + '/access_codes/unmanaged/delete', + true, + ) + return new SeamHttpRequest(this, { pathname: '/access_codes/unmanaged/delete', method: 'DELETE', @@ -200,9 +216,15 @@ export class SeamHttpAccessCodesUnmanaged { * You must specify either `access_code_id` or both `device_id` and `code`. */ get( - parameters?: AccessCodesUnmanagedGetParameters, + parameters: AccessCodesUnmanagedGetParameters, options: AccessCodesUnmanagedGetOptions = {}, ): AccessCodesUnmanagedGetRequest { + assertValidRequestParameters( + parameters, + '/access_codes/unmanaged/get', + true, + ) + return new SeamHttpRequest(this, { pathname: '/access_codes/unmanaged/get', method: 'GET', @@ -219,6 +241,12 @@ export class SeamHttpAccessCodesUnmanaged { parameters: AccessCodesUnmanagedListParameters, options: AccessCodesUnmanagedListOptions = {}, ): AccessCodesUnmanagedListRequest { + assertValidRequestParameters( + parameters, + '/access_codes/unmanaged/list', + true, + ) + return new SeamHttpRequest(this, { pathname: '/access_codes/unmanaged/list', method: 'GET', @@ -235,6 +263,12 @@ export class SeamHttpAccessCodesUnmanaged { parameters: AccessCodesUnmanagedUpdateParameters, options: AccessCodesUnmanagedUpdateOptions = {}, ): AccessCodesUnmanagedUpdateRequest { + assertValidRequestParameters( + parameters, + '/access_codes/unmanaged/update', + true, + ) + return new SeamHttpRequest(this, { pathname: '/access_codes/unmanaged/update', method: 'PATCH', @@ -293,7 +327,7 @@ export type AccessCodesUnmanagedDeleteRequest = SeamHttpRequest export interface AccessCodesUnmanagedDeleteOptions {} -export type AccessCodesUnmanagedGetParameters = { +export type AccessCodesUnmanagedGetParameters = RequireAtLeastOne<{ /** * ID of the unmanaged access code that you want to get. You must specify either `access_code_id` or both `device_id` and `code`. */ @@ -306,7 +340,7 @@ export type AccessCodesUnmanagedGetParameters = { * ID of the device containing the unmanaged access code that you want to get. You must specify either `access_code_id` or both `device_id` and `code`. */ device_id?: string | undefined -} +}> /** * @deprecated Use AccessCodesUnmanagedGetRequest instead. diff --git a/src/lib/routes/access-grants/access-grants.ts b/src/lib/routes/access-grants/access-grants.ts index 043e32c2..369cb530 100644 --- a/src/lib/routes/access-grants/access-grants.ts +++ b/src/lib/routes/access-grants/access-grants.ts @@ -28,6 +28,10 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { + assertValidRequestParameters, + type RequireAtLeastOne, +} from 'lib/request-parameters.js' import type { AccessGrant } from 'lib/resources/access-grant.js' import type { Batch } from 'lib/resources/batch.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' @@ -172,6 +176,8 @@ export class SeamHttpAccessGrants { parameters: AccessGrantsCreateParameters, options: AccessGrantsCreateOptions = {}, ): AccessGrantsCreateRequest { + assertValidRequestParameters(parameters, '/access_grants/create', true) + return new SeamHttpRequest(this, { pathname: '/access_grants/create', method: 'POST', @@ -188,6 +194,8 @@ export class SeamHttpAccessGrants { parameters: AccessGrantsDeleteParameters, options: AccessGrantsDeleteOptions = {}, ): AccessGrantsDeleteRequest { + assertValidRequestParameters(parameters, '/access_grants/delete', true) + return new SeamHttpRequest(this, { pathname: '/access_grants/delete', method: 'DELETE', @@ -201,9 +209,11 @@ export class SeamHttpAccessGrants { * Get an Access Grant. */ get( - parameters?: AccessGrantsGetParameters, + parameters: AccessGrantsGetParameters, options: AccessGrantsGetOptions = {}, ): AccessGrantsGetRequest { + assertValidRequestParameters(parameters, '/access_grants/get', true) + return new SeamHttpRequest(this, { pathname: '/access_grants/get', method: 'GET', @@ -217,9 +227,11 @@ export class SeamHttpAccessGrants { * Gets all related resources for one or more Access Grants. */ getRelated( - parameters?: AccessGrantsGetRelatedParameters, + parameters: AccessGrantsGetRelatedParameters, options: AccessGrantsGetRelatedOptions = {}, ): AccessGrantsGetRelatedRequest { + assertValidRequestParameters(parameters, '/access_grants/get_related', true) + return new SeamHttpRequest(this, { pathname: '/access_grants/get_related', method: 'POST', @@ -236,6 +248,8 @@ export class SeamHttpAccessGrants { parameters?: AccessGrantsListParameters, options: AccessGrantsListOptions = {}, ): AccessGrantsListRequest { + assertValidRequestParameters(parameters, '/access_grants/list', false) + return new SeamHttpRequest(this, { pathname: '/access_grants/list', method: 'POST', @@ -252,6 +266,12 @@ export class SeamHttpAccessGrants { parameters: AccessGrantsRequestAccessMethodsParameters, options: AccessGrantsRequestAccessMethodsOptions = {}, ): AccessGrantsRequestAccessMethodsRequest { + assertValidRequestParameters( + parameters, + '/access_grants/request_access_methods', + true, + ) + return new SeamHttpRequest(this, { pathname: '/access_grants/request_access_methods', method: 'POST', @@ -265,9 +285,11 @@ export class SeamHttpAccessGrants { * Updates an existing Access Grant's time window. */ update( - parameters?: AccessGrantsUpdateParameters, + parameters: AccessGrantsUpdateParameters, options: AccessGrantsUpdateOptions = {}, ): AccessGrantsUpdateRequest { + assertValidRequestParameters(parameters, '/access_grants/update', true) + return new SeamHttpRequest(this, { pathname: '/access_grants/update', method: 'PATCH', @@ -415,7 +437,7 @@ export type AccessGrantsDeleteRequest = SeamHttpRequest export interface AccessGrantsDeleteOptions {} -export type AccessGrantsGetParameters = { +export type AccessGrantsGetParameters = RequireAtLeastOne<{ /** * ID of Access Grant to get. */ @@ -424,7 +446,7 @@ export type AccessGrantsGetParameters = { * Unique key of Access Grant to get. */ access_grant_key?: string | undefined -} +}> /** * @deprecated Use AccessGrantsGetRequest instead. @@ -438,7 +460,7 @@ export type AccessGrantsGetRequest = SeamHttpRequest< export interface AccessGrantsGetOptions {} -export type AccessGrantsGetRelatedParameters = { +export type AccessGrantsGetRelatedParameters = RequireAtLeastOne<{ /** * IDs of the access grants that you want to get along with their related resources. */ @@ -473,7 +495,7 @@ export type AccessGrantsGetRelatedParameters = { | 'access_methods' > | undefined -} +}> /** * @deprecated Use AccessGrantsGetRelatedRequest instead. @@ -604,7 +626,7 @@ export type AccessGrantsRequestAccessMethodsRequest = SeamHttpRequest< export interface AccessGrantsRequestAccessMethodsOptions {} -export type AccessGrantsUpdateParameters = { +export type AccessGrantsUpdateParameters = RequireAtLeastOne<{ /** * ID of the Access Grant to update. Provide either `access_grant_id` or `access_grant_key`. */ @@ -625,7 +647,7 @@ export type AccessGrantsUpdateParameters = { * Date and time at which the validity of the grant starts, in [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format. */ starts_at?: string | undefined -} +}> /** * @deprecated Use AccessGrantsUpdateRequest instead. diff --git a/src/lib/routes/access-grants/unmanaged/unmanaged.ts b/src/lib/routes/access-grants/unmanaged/unmanaged.ts index f2306f53..4a52381a 100644 --- a/src/lib/routes/access-grants/unmanaged/unmanaged.ts +++ b/src/lib/routes/access-grants/unmanaged/unmanaged.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import type { UnmanagedAccessGrant } from 'lib/resources/unmanaged-access-grant.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' @@ -165,6 +166,12 @@ export class SeamHttpAccessGrantsUnmanaged { parameters: AccessGrantsUnmanagedGetParameters, options: AccessGrantsUnmanagedGetOptions = {}, ): AccessGrantsUnmanagedGetRequest { + assertValidRequestParameters( + parameters, + '/access_grants/unmanaged/get', + true, + ) + return new SeamHttpRequest(this, { pathname: '/access_grants/unmanaged/get', method: 'GET', @@ -181,6 +188,12 @@ export class SeamHttpAccessGrantsUnmanaged { parameters?: AccessGrantsUnmanagedListParameters, options: AccessGrantsUnmanagedListOptions = {}, ): AccessGrantsUnmanagedListRequest { + assertValidRequestParameters( + parameters, + '/access_grants/unmanaged/list', + false, + ) + return new SeamHttpRequest(this, { pathname: '/access_grants/unmanaged/list', method: 'GET', @@ -201,6 +214,12 @@ export class SeamHttpAccessGrantsUnmanaged { parameters: AccessGrantsUnmanagedUpdateParameters, options: AccessGrantsUnmanagedUpdateOptions = {}, ): AccessGrantsUnmanagedUpdateRequest { + assertValidRequestParameters( + parameters, + '/access_grants/unmanaged/update', + true, + ) + return new SeamHttpRequest(this, { pathname: '/access_grants/unmanaged/update', method: 'PATCH', diff --git a/src/lib/routes/access-methods/access-methods.ts b/src/lib/routes/access-methods/access-methods.ts index 459a80d7..30dd043a 100644 --- a/src/lib/routes/access-methods/access-methods.ts +++ b/src/lib/routes/access-methods/access-methods.ts @@ -28,6 +28,10 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { + assertValidRequestParameters, + type RequireAtLeastOne, +} from 'lib/request-parameters.js' import type { AccessMethod } from 'lib/resources/access-method.js' import type { ActionAttempt } from 'lib/resources/action-attempt.js' import type { Batch } from 'lib/resources/batch.js' @@ -174,6 +178,12 @@ export class SeamHttpAccessMethods { parameters: AccessMethodsAssignCardParameters, options: AccessMethodsAssignCardOptions = {}, ): AccessMethodsAssignCardRequest { + assertValidRequestParameters( + parameters, + '/access_methods/assign_card', + true, + ) + return new SeamHttpRequest(this, { pathname: '/access_methods/assign_card', method: 'POST', @@ -191,9 +201,11 @@ export class SeamHttpAccessMethods { * Deletes an access method. */ delete( - parameters?: AccessMethodsDeleteParameters, + parameters: AccessMethodsDeleteParameters, options: AccessMethodsDeleteOptions = {}, ): AccessMethodsDeleteRequest { + assertValidRequestParameters(parameters, '/access_methods/delete', true) + return new SeamHttpRequest(this, { pathname: '/access_methods/delete', method: 'DELETE', @@ -210,6 +222,8 @@ export class SeamHttpAccessMethods { parameters: AccessMethodsEncodeParameters, options: AccessMethodsEncodeOptions = {}, ): AccessMethodsEncodeRequest { + assertValidRequestParameters(parameters, '/access_methods/encode', true) + return new SeamHttpRequest(this, { pathname: '/access_methods/encode', method: 'POST', @@ -230,6 +244,8 @@ export class SeamHttpAccessMethods { parameters: AccessMethodsGetParameters, options: AccessMethodsGetOptions = {}, ): AccessMethodsGetRequest { + assertValidRequestParameters(parameters, '/access_methods/get', true) + return new SeamHttpRequest(this, { pathname: '/access_methods/get', method: 'GET', @@ -246,6 +262,12 @@ export class SeamHttpAccessMethods { parameters: AccessMethodsGetRelatedParameters, options: AccessMethodsGetRelatedOptions = {}, ): AccessMethodsGetRelatedRequest { + assertValidRequestParameters( + parameters, + '/access_methods/get_related', + true, + ) + return new SeamHttpRequest(this, { pathname: '/access_methods/get_related', method: 'POST', @@ -259,9 +281,11 @@ export class SeamHttpAccessMethods { * Lists all access methods, usually filtered by Access Grant. */ list( - parameters?: AccessMethodsListParameters, + parameters: AccessMethodsListParameters, options: AccessMethodsListOptions = {}, ): AccessMethodsListRequest { + assertValidRequestParameters(parameters, '/access_methods/list', true) + return new SeamHttpRequest(this, { pathname: '/access_methods/list', method: 'GET', @@ -278,6 +302,12 @@ export class SeamHttpAccessMethods { parameters: AccessMethodsUnlockDoorParameters, options: AccessMethodsUnlockDoorOptions = {}, ): AccessMethodsUnlockDoorRequest { + assertValidRequestParameters( + parameters, + '/access_methods/unlock_door', + true, + ) + return new SeamHttpRequest(this, { pathname: '/access_methods/unlock_door', method: 'POST', @@ -319,7 +349,7 @@ export type AccessMethodsAssignCardOptions = Pick< 'waitForActionAttempt' > -export type AccessMethodsDeleteParameters = { +export type AccessMethodsDeleteParameters = RequireAtLeastOne<{ /** * ID of access method to delete. */ @@ -332,7 +362,7 @@ export type AccessMethodsDeleteParameters = { * Reservation key of the access grant whose access methods should be deleted. */ reservation_key?: string | undefined -} +}> /** * @deprecated Use AccessMethodsDeleteRequest instead. @@ -445,7 +475,7 @@ export type AccessMethodsGetRelatedRequest = SeamHttpRequest< export interface AccessMethodsGetRelatedOptions {} -export type AccessMethodsListParameters = { +export type AccessMethodsListParameters = RequireAtLeastOne<{ /** * ID of the access code by which to filter the returned access methods. Must be combined with `access_grant_id`, `access_grant_key`, or `acs_entrance_id`. */ @@ -478,7 +508,7 @@ export type AccessMethodsListParameters = { * ID of the space by which to filter the returned access methods. Must be combined with `access_grant_id`, `access_grant_key`, or `acs_entrance_id`. */ space_id?: string | undefined -} +}> /** * @deprecated Use AccessMethodsListRequest instead. diff --git a/src/lib/routes/access-methods/unmanaged/unmanaged.ts b/src/lib/routes/access-methods/unmanaged/unmanaged.ts index cbbcbd61..c7911261 100644 --- a/src/lib/routes/access-methods/unmanaged/unmanaged.ts +++ b/src/lib/routes/access-methods/unmanaged/unmanaged.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import type { UnmanagedAccessMethod } from 'lib/resources/unmanaged-access-method.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' @@ -165,6 +166,12 @@ export class SeamHttpAccessMethodsUnmanaged { parameters: AccessMethodsUnmanagedGetParameters, options: AccessMethodsUnmanagedGetOptions = {}, ): AccessMethodsUnmanagedGetRequest { + assertValidRequestParameters( + parameters, + '/access_methods/unmanaged/get', + true, + ) + return new SeamHttpRequest(this, { pathname: '/access_methods/unmanaged/get', method: 'GET', @@ -181,6 +188,12 @@ export class SeamHttpAccessMethodsUnmanaged { parameters: AccessMethodsUnmanagedListParameters, options: AccessMethodsUnmanagedListOptions = {}, ): AccessMethodsUnmanagedListRequest { + assertValidRequestParameters( + parameters, + '/access_methods/unmanaged/list', + true, + ) + return new SeamHttpRequest(this, { pathname: '/access_methods/unmanaged/list', method: 'GET', diff --git a/src/lib/routes/acs/access-groups/access-groups.ts b/src/lib/routes/acs/access-groups/access-groups.ts index 44f7cfa9..8c7d8e04 100644 --- a/src/lib/routes/acs/access-groups/access-groups.ts +++ b/src/lib/routes/acs/access-groups/access-groups.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import type { AcsAccessGroup } from 'lib/resources/acs-access-group.js' import type { AcsEntrance } from 'lib/resources/acs-entrance.js' import type { AcsUser } from 'lib/resources/acs-user.js' @@ -167,6 +168,12 @@ export class SeamHttpAcsAccessGroups { parameters: AcsAccessGroupsAddUserParameters, options: AcsAccessGroupsAddUserOptions = {}, ): AcsAccessGroupsAddUserRequest { + assertValidRequestParameters( + parameters, + '/acs/access_groups/add_user', + true, + ) + return new SeamHttpRequest(this, { pathname: '/acs/access_groups/add_user', method: 'PUT', @@ -183,6 +190,8 @@ export class SeamHttpAcsAccessGroups { parameters: AcsAccessGroupsDeleteParameters, options: AcsAccessGroupsDeleteOptions = {}, ): AcsAccessGroupsDeleteRequest { + assertValidRequestParameters(parameters, '/acs/access_groups/delete', true) + return new SeamHttpRequest(this, { pathname: '/acs/access_groups/delete', method: 'DELETE', @@ -199,6 +208,8 @@ export class SeamHttpAcsAccessGroups { parameters: AcsAccessGroupsGetParameters, options: AcsAccessGroupsGetOptions = {}, ): AcsAccessGroupsGetRequest { + assertValidRequestParameters(parameters, '/acs/access_groups/get', true) + return new SeamHttpRequest(this, { pathname: '/acs/access_groups/get', method: 'GET', @@ -215,6 +226,8 @@ export class SeamHttpAcsAccessGroups { parameters?: AcsAccessGroupsListParameters, options: AcsAccessGroupsListOptions = {}, ): AcsAccessGroupsListRequest { + assertValidRequestParameters(parameters, '/acs/access_groups/list', false) + return new SeamHttpRequest(this, { pathname: '/acs/access_groups/list', method: 'GET', @@ -231,6 +244,12 @@ export class SeamHttpAcsAccessGroups { parameters: AcsAccessGroupsListAccessibleEntrancesParameters, options: AcsAccessGroupsListAccessibleEntrancesOptions = {}, ): AcsAccessGroupsListAccessibleEntrancesRequest { + assertValidRequestParameters( + parameters, + '/acs/access_groups/list_accessible_entrances', + true, + ) + return new SeamHttpRequest(this, { pathname: '/acs/access_groups/list_accessible_entrances', method: 'GET', @@ -247,6 +266,12 @@ export class SeamHttpAcsAccessGroups { parameters: AcsAccessGroupsListUsersParameters, options: AcsAccessGroupsListUsersOptions = {}, ): AcsAccessGroupsListUsersRequest { + assertValidRequestParameters( + parameters, + '/acs/access_groups/list_users', + true, + ) + return new SeamHttpRequest(this, { pathname: '/acs/access_groups/list_users', method: 'GET', @@ -263,6 +288,12 @@ export class SeamHttpAcsAccessGroups { parameters: AcsAccessGroupsRemoveUserParameters, options: AcsAccessGroupsRemoveUserOptions = {}, ): AcsAccessGroupsRemoveUserRequest { + assertValidRequestParameters( + parameters, + '/acs/access_groups/remove_user', + true, + ) + return new SeamHttpRequest(this, { pathname: '/acs/access_groups/remove_user', method: 'DELETE', diff --git a/src/lib/routes/acs/credentials/credentials.ts b/src/lib/routes/acs/credentials/credentials.ts index 58acb1ab..cfd3add1 100644 --- a/src/lib/routes/acs/credentials/credentials.ts +++ b/src/lib/routes/acs/credentials/credentials.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import type { AcsCredential } from 'lib/resources/acs-credential.js' import type { AcsEntrance } from 'lib/resources/acs-entrance.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' @@ -166,6 +167,8 @@ export class SeamHttpAcsCredentials { parameters: AcsCredentialsAssignParameters, options: AcsCredentialsAssignOptions = {}, ): AcsCredentialsAssignRequest { + assertValidRequestParameters(parameters, '/acs/credentials/assign', true) + return new SeamHttpRequest(this, { pathname: '/acs/credentials/assign', method: 'PATCH', @@ -182,6 +185,8 @@ export class SeamHttpAcsCredentials { parameters: AcsCredentialsCreateParameters, options: AcsCredentialsCreateOptions = {}, ): AcsCredentialsCreateRequest { + assertValidRequestParameters(parameters, '/acs/credentials/create', true) + return new SeamHttpRequest(this, { pathname: '/acs/credentials/create', method: 'POST', @@ -198,6 +203,8 @@ export class SeamHttpAcsCredentials { parameters: AcsCredentialsDeleteParameters, options: AcsCredentialsDeleteOptions = {}, ): AcsCredentialsDeleteRequest { + assertValidRequestParameters(parameters, '/acs/credentials/delete', true) + return new SeamHttpRequest(this, { pathname: '/acs/credentials/delete', method: 'DELETE', @@ -214,6 +221,8 @@ export class SeamHttpAcsCredentials { parameters: AcsCredentialsGetParameters, options: AcsCredentialsGetOptions = {}, ): AcsCredentialsGetRequest { + assertValidRequestParameters(parameters, '/acs/credentials/get', true) + return new SeamHttpRequest(this, { pathname: '/acs/credentials/get', method: 'GET', @@ -230,6 +239,8 @@ export class SeamHttpAcsCredentials { parameters?: AcsCredentialsListParameters, options: AcsCredentialsListOptions = {}, ): AcsCredentialsListRequest { + assertValidRequestParameters(parameters, '/acs/credentials/list', false) + return new SeamHttpRequest(this, { pathname: '/acs/credentials/list', method: 'GET', @@ -246,6 +257,12 @@ export class SeamHttpAcsCredentials { parameters: AcsCredentialsListAccessibleEntrancesParameters, options: AcsCredentialsListAccessibleEntrancesOptions = {}, ): AcsCredentialsListAccessibleEntrancesRequest { + assertValidRequestParameters( + parameters, + '/acs/credentials/list_accessible_entrances', + true, + ) + return new SeamHttpRequest(this, { pathname: '/acs/credentials/list_accessible_entrances', method: 'GET', @@ -262,6 +279,8 @@ export class SeamHttpAcsCredentials { parameters: AcsCredentialsUnassignParameters, options: AcsCredentialsUnassignOptions = {}, ): AcsCredentialsUnassignRequest { + assertValidRequestParameters(parameters, '/acs/credentials/unassign', true) + return new SeamHttpRequest(this, { pathname: '/acs/credentials/unassign', method: 'PATCH', @@ -278,6 +297,8 @@ export class SeamHttpAcsCredentials { parameters: AcsCredentialsUpdateParameters, options: AcsCredentialsUpdateOptions = {}, ): AcsCredentialsUpdateRequest { + assertValidRequestParameters(parameters, '/acs/credentials/update', true) + return new SeamHttpRequest(this, { pathname: '/acs/credentials/update', method: 'PATCH', diff --git a/src/lib/routes/acs/encoders/encoders.ts b/src/lib/routes/acs/encoders/encoders.ts index c875ec8f..44f39ef0 100644 --- a/src/lib/routes/acs/encoders/encoders.ts +++ b/src/lib/routes/acs/encoders/encoders.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import type { AcsEncoder } from 'lib/resources/acs-encoder.js' import type { ActionAttempt } from 'lib/resources/action-attempt.js' import { SeamHttpActionAttempts } from 'lib/routes/action-attempts/index.js' @@ -173,6 +174,12 @@ export class SeamHttpAcsEncoders { parameters: AcsEncodersEncodeCredentialParameters, options: AcsEncodersEncodeCredentialOptions = {}, ): AcsEncodersEncodeCredentialRequest { + assertValidRequestParameters( + parameters, + '/acs/encoders/encode_credential', + true, + ) + return new SeamHttpRequest(this, { pathname: '/acs/encoders/encode_credential', method: 'POST', @@ -193,6 +200,8 @@ export class SeamHttpAcsEncoders { parameters: AcsEncodersGetParameters, options: AcsEncodersGetOptions = {}, ): AcsEncodersGetRequest { + assertValidRequestParameters(parameters, '/acs/encoders/get', true) + return new SeamHttpRequest(this, { pathname: '/acs/encoders/get', method: 'GET', @@ -209,6 +218,8 @@ export class SeamHttpAcsEncoders { parameters?: AcsEncodersListParameters, options: AcsEncodersListOptions = {}, ): AcsEncodersListRequest { + assertValidRequestParameters(parameters, '/acs/encoders/list', false) + return new SeamHttpRequest(this, { pathname: '/acs/encoders/list', method: 'POST', @@ -225,6 +236,12 @@ export class SeamHttpAcsEncoders { parameters: AcsEncodersScanCredentialParameters, options: AcsEncodersScanCredentialOptions = {}, ): AcsEncodersScanCredentialRequest { + assertValidRequestParameters( + parameters, + '/acs/encoders/scan_credential', + true, + ) + return new SeamHttpRequest(this, { pathname: '/acs/encoders/scan_credential', method: 'POST', @@ -245,6 +262,12 @@ export class SeamHttpAcsEncoders { parameters: AcsEncodersScanToAssignCredentialParameters, options: AcsEncodersScanToAssignCredentialOptions = {}, ): AcsEncodersScanToAssignCredentialRequest { + assertValidRequestParameters( + parameters, + '/acs/encoders/scan_to_assign_credential', + true, + ) + return new SeamHttpRequest(this, { pathname: '/acs/encoders/scan_to_assign_credential', method: 'POST', diff --git a/src/lib/routes/acs/encoders/simulate/simulate.ts b/src/lib/routes/acs/encoders/simulate/simulate.ts index e7c26269..7956d433 100644 --- a/src/lib/routes/acs/encoders/simulate/simulate.ts +++ b/src/lib/routes/acs/encoders/simulate/simulate.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' import { SeamPaginator } from 'lib/seam-paginator.js' @@ -164,6 +165,12 @@ export class SeamHttpAcsEncodersSimulate { parameters: AcsEncodersSimulateNextCredentialEncodeWillFailParameters, options: AcsEncodersSimulateNextCredentialEncodeWillFailOptions = {}, ): AcsEncodersSimulateNextCredentialEncodeWillFailRequest { + assertValidRequestParameters( + parameters, + '/acs/encoders/simulate/next_credential_encode_will_fail', + true, + ) + return new SeamHttpRequest(this, { pathname: '/acs/encoders/simulate/next_credential_encode_will_fail', method: 'POST', @@ -180,6 +187,12 @@ export class SeamHttpAcsEncodersSimulate { parameters: AcsEncodersSimulateNextCredentialEncodeWillSucceedParameters, options: AcsEncodersSimulateNextCredentialEncodeWillSucceedOptions = {}, ): AcsEncodersSimulateNextCredentialEncodeWillSucceedRequest { + assertValidRequestParameters( + parameters, + '/acs/encoders/simulate/next_credential_encode_will_succeed', + true, + ) + return new SeamHttpRequest(this, { pathname: '/acs/encoders/simulate/next_credential_encode_will_succeed', method: 'POST', @@ -196,6 +209,12 @@ export class SeamHttpAcsEncodersSimulate { parameters: AcsEncodersSimulateNextCredentialScanWillFailParameters, options: AcsEncodersSimulateNextCredentialScanWillFailOptions = {}, ): AcsEncodersSimulateNextCredentialScanWillFailRequest { + assertValidRequestParameters( + parameters, + '/acs/encoders/simulate/next_credential_scan_will_fail', + true, + ) + return new SeamHttpRequest(this, { pathname: '/acs/encoders/simulate/next_credential_scan_will_fail', method: 'POST', @@ -212,6 +231,12 @@ export class SeamHttpAcsEncodersSimulate { parameters: AcsEncodersSimulateNextCredentialScanWillSucceedParameters, options: AcsEncodersSimulateNextCredentialScanWillSucceedOptions = {}, ): AcsEncodersSimulateNextCredentialScanWillSucceedRequest { + assertValidRequestParameters( + parameters, + '/acs/encoders/simulate/next_credential_scan_will_succeed', + true, + ) + return new SeamHttpRequest(this, { pathname: '/acs/encoders/simulate/next_credential_scan_will_succeed', method: 'POST', diff --git a/src/lib/routes/acs/entrances/entrances.ts b/src/lib/routes/acs/entrances/entrances.ts index 32a55745..c0f64e83 100644 --- a/src/lib/routes/acs/entrances/entrances.ts +++ b/src/lib/routes/acs/entrances/entrances.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import type { AcsCredential } from 'lib/resources/acs-credential.js' import type { AcsEntrance } from 'lib/resources/acs-entrance.js' import type { ActionAttempt } from 'lib/resources/action-attempt.js' @@ -168,6 +169,8 @@ export class SeamHttpAcsEntrances { parameters: AcsEntrancesGetParameters, options: AcsEntrancesGetOptions = {}, ): AcsEntrancesGetRequest { + assertValidRequestParameters(parameters, '/acs/entrances/get', true) + return new SeamHttpRequest(this, { pathname: '/acs/entrances/get', method: 'GET', @@ -184,6 +187,12 @@ export class SeamHttpAcsEntrances { parameters: AcsEntrancesGrantAccessParameters, options: AcsEntrancesGrantAccessOptions = {}, ): AcsEntrancesGrantAccessRequest { + assertValidRequestParameters( + parameters, + '/acs/entrances/grant_access', + true, + ) + return new SeamHttpRequest(this, { pathname: '/acs/entrances/grant_access', method: 'POST', @@ -200,6 +209,8 @@ export class SeamHttpAcsEntrances { parameters?: AcsEntrancesListParameters, options: AcsEntrancesListOptions = {}, ): AcsEntrancesListRequest { + assertValidRequestParameters(parameters, '/acs/entrances/list', false) + return new SeamHttpRequest(this, { pathname: '/acs/entrances/list', method: 'POST', @@ -216,6 +227,12 @@ export class SeamHttpAcsEntrances { parameters: AcsEntrancesListCredentialsWithAccessParameters, options: AcsEntrancesListCredentialsWithAccessOptions = {}, ): AcsEntrancesListCredentialsWithAccessRequest { + assertValidRequestParameters( + parameters, + '/acs/entrances/list_credentials_with_access', + true, + ) + return new SeamHttpRequest(this, { pathname: '/acs/entrances/list_credentials_with_access', method: 'POST', @@ -232,6 +249,8 @@ export class SeamHttpAcsEntrances { parameters: AcsEntrancesUnlockParameters, options: AcsEntrancesUnlockOptions = {}, ): AcsEntrancesUnlockRequest { + assertValidRequestParameters(parameters, '/acs/entrances/unlock', true) + return new SeamHttpRequest(this, { pathname: '/acs/entrances/unlock', method: 'POST', diff --git a/src/lib/routes/acs/systems/systems.ts b/src/lib/routes/acs/systems/systems.ts index 279aee5c..8b276a90 100644 --- a/src/lib/routes/acs/systems/systems.ts +++ b/src/lib/routes/acs/systems/systems.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import type { AcsSystem } from 'lib/resources/acs-system.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' @@ -165,6 +166,8 @@ export class SeamHttpAcsSystems { parameters: AcsSystemsGetParameters, options: AcsSystemsGetOptions = {}, ): AcsSystemsGetRequest { + assertValidRequestParameters(parameters, '/acs/systems/get', true) + return new SeamHttpRequest(this, { pathname: '/acs/systems/get', method: 'GET', @@ -183,6 +186,8 @@ export class SeamHttpAcsSystems { parameters?: AcsSystemsListParameters, options: AcsSystemsListOptions = {}, ): AcsSystemsListRequest { + assertValidRequestParameters(parameters, '/acs/systems/list', false) + return new SeamHttpRequest(this, { pathname: '/acs/systems/list', method: 'GET', @@ -201,6 +206,12 @@ export class SeamHttpAcsSystems { parameters: AcsSystemsListCompatibleCredentialManagerAcsSystemsParameters, options: AcsSystemsListCompatibleCredentialManagerAcsSystemsOptions = {}, ): AcsSystemsListCompatibleCredentialManagerAcsSystemsRequest { + assertValidRequestParameters( + parameters, + '/acs/systems/list_compatible_credential_manager_acs_systems', + true, + ) + return new SeamHttpRequest(this, { pathname: '/acs/systems/list_compatible_credential_manager_acs_systems', method: 'GET', @@ -217,6 +228,12 @@ export class SeamHttpAcsSystems { parameters: AcsSystemsReportDevicesParameters, options: AcsSystemsReportDevicesOptions = {}, ): AcsSystemsReportDevicesRequest { + assertValidRequestParameters( + parameters, + '/acs/systems/report_devices', + true, + ) + return new SeamHttpRequest(this, { pathname: '/acs/systems/report_devices', method: 'POST', diff --git a/src/lib/routes/acs/users/users.ts b/src/lib/routes/acs/users/users.ts index 3a74aa99..a773ec7f 100644 --- a/src/lib/routes/acs/users/users.ts +++ b/src/lib/routes/acs/users/users.ts @@ -28,6 +28,10 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { + assertValidRequestParameters, + type RequireAtLeastOne, +} from 'lib/request-parameters.js' import type { AcsEntrance } from 'lib/resources/acs-entrance.js' import type { AcsUser } from 'lib/resources/acs-user.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' @@ -166,6 +170,12 @@ export class SeamHttpAcsUsers { parameters: AcsUsersAddToAccessGroupParameters, options: AcsUsersAddToAccessGroupOptions = {}, ): AcsUsersAddToAccessGroupRequest { + assertValidRequestParameters( + parameters, + '/acs/users/add_to_access_group', + true, + ) + return new SeamHttpRequest(this, { pathname: '/acs/users/add_to_access_group', method: 'PUT', @@ -182,6 +192,8 @@ export class SeamHttpAcsUsers { parameters: AcsUsersCreateParameters, options: AcsUsersCreateOptions = {}, ): AcsUsersCreateRequest { + assertValidRequestParameters(parameters, '/acs/users/create', true) + return new SeamHttpRequest(this, { pathname: '/acs/users/create', method: 'POST', @@ -195,9 +207,11 @@ export class SeamHttpAcsUsers { * Deletes a specified [access system user](https://docs.seam.co/low-level-apis/access-systems/user-management) and invalidates the access system user's [credentials](https://docs.seam.co/low-level-apis/access-systems/managing-credentials). */ delete( - parameters?: AcsUsersDeleteParameters, + parameters: AcsUsersDeleteParameters, options: AcsUsersDeleteOptions = {}, ): AcsUsersDeleteRequest { + assertValidRequestParameters(parameters, '/acs/users/delete', true) + return new SeamHttpRequest(this, { pathname: '/acs/users/delete', method: 'DELETE', @@ -211,9 +225,11 @@ export class SeamHttpAcsUsers { * Returns a specified [access system user](https://docs.seam.co/low-level-apis/access-systems/user-management). */ get( - parameters?: AcsUsersGetParameters, + parameters: AcsUsersGetParameters, options: AcsUsersGetOptions = {}, ): AcsUsersGetRequest { + assertValidRequestParameters(parameters, '/acs/users/get', true) + return new SeamHttpRequest(this, { pathname: '/acs/users/get', method: 'GET', @@ -230,6 +246,8 @@ export class SeamHttpAcsUsers { parameters?: AcsUsersListParameters, options: AcsUsersListOptions = {}, ): AcsUsersListRequest { + assertValidRequestParameters(parameters, '/acs/users/list', false) + return new SeamHttpRequest(this, { pathname: '/acs/users/list', method: 'GET', @@ -243,9 +261,15 @@ export class SeamHttpAcsUsers { * Lists the [entrances](https://docs.seam.co/api/acs/entrances) to which a specified [access system user](https://docs.seam.co/low-level-apis/access-systems/user-management) has access. */ listAccessibleEntrances( - parameters?: AcsUsersListAccessibleEntrancesParameters, + parameters: AcsUsersListAccessibleEntrancesParameters, options: AcsUsersListAccessibleEntrancesOptions = {}, ): AcsUsersListAccessibleEntrancesRequest { + assertValidRequestParameters( + parameters, + '/acs/users/list_accessible_entrances', + true, + ) + return new SeamHttpRequest(this, { pathname: '/acs/users/list_accessible_entrances', method: 'GET', @@ -262,6 +286,12 @@ export class SeamHttpAcsUsers { parameters: AcsUsersRemoveFromAccessGroupParameters, options: AcsUsersRemoveFromAccessGroupOptions = {}, ): AcsUsersRemoveFromAccessGroupRequest { + assertValidRequestParameters( + parameters, + '/acs/users/remove_from_access_group', + true, + ) + return new SeamHttpRequest(this, { pathname: '/acs/users/remove_from_access_group', method: 'DELETE', @@ -275,9 +305,15 @@ export class SeamHttpAcsUsers { * Revokes access to all [entrances](https://docs.seam.co/api/acs/entrances) for a specified [access system user](https://docs.seam.co/low-level-apis/access-systems/user-management). */ revokeAccessToAllEntrances( - parameters?: AcsUsersRevokeAccessToAllEntrancesParameters, + parameters: AcsUsersRevokeAccessToAllEntrancesParameters, options: AcsUsersRevokeAccessToAllEntrancesOptions = {}, ): AcsUsersRevokeAccessToAllEntrancesRequest { + assertValidRequestParameters( + parameters, + '/acs/users/revoke_access_to_all_entrances', + true, + ) + return new SeamHttpRequest(this, { pathname: '/acs/users/revoke_access_to_all_entrances', method: 'POST', @@ -291,9 +327,11 @@ export class SeamHttpAcsUsers { * [Suspends](https://docs.seam.co/low-level-apis/access-systems/user-management/suspending-and-unsuspending-users#suspend-an-acs-user) a specified [access system user](https://docs.seam.co/low-level-apis/access-systems/user-management). Suspending an access system user revokes their access temporarily. To restore an access system user's access, you can [unsuspend](https://docs.seam.co/api/acs/users/unsuspend) them. */ suspend( - parameters?: AcsUsersSuspendParameters, + parameters: AcsUsersSuspendParameters, options: AcsUsersSuspendOptions = {}, ): AcsUsersSuspendRequest { + assertValidRequestParameters(parameters, '/acs/users/suspend', true) + return new SeamHttpRequest(this, { pathname: '/acs/users/suspend', method: 'POST', @@ -307,9 +345,11 @@ export class SeamHttpAcsUsers { * [Unsuspends](https://docs.seam.co/low-level-apis/access-systems/user-management/suspending-and-unsuspending-users#unsuspend-an-acs-user) a specified suspended [access system user](https://docs.seam.co/low-level-apis/access-systems/user-management). While [suspending an access system user](https://docs.seam.co/api/acs/users/suspend) revokes their access temporarily, unsuspending the access system user restores their access. */ unsuspend( - parameters?: AcsUsersUnsuspendParameters, + parameters: AcsUsersUnsuspendParameters, options: AcsUsersUnsuspendOptions = {}, ): AcsUsersUnsuspendRequest { + assertValidRequestParameters(parameters, '/acs/users/unsuspend', true) + return new SeamHttpRequest(this, { pathname: '/acs/users/unsuspend', method: 'POST', @@ -323,9 +363,11 @@ export class SeamHttpAcsUsers { * Updates the properties of a specified [access system user](https://docs.seam.co/low-level-apis/access-systems/user-management). */ update( - parameters?: AcsUsersUpdateParameters, + parameters: AcsUsersUpdateParameters, options: AcsUsersUpdateOptions = {}, ): AcsUsersUpdateRequest { + assertValidRequestParameters(parameters, '/acs/users/update', true) + return new SeamHttpRequest(this, { pathname: '/acs/users/update', method: 'PATCH', @@ -417,7 +459,7 @@ export type AcsUsersCreateRequest = SeamHttpRequest< export interface AcsUsersCreateOptions {} -export type AcsUsersDeleteParameters = { +export type AcsUsersDeleteParameters = RequireAtLeastOne<{ /** * ID of the access system that you want to delete. You must provide acs_system_id with user_identity_id. */ @@ -430,7 +472,7 @@ export type AcsUsersDeleteParameters = { * ID of the user identity that you want to delete. You must provide either acs_user_id or user_identity_id. If you provide user_identity_id, you must also provide acs_system_id. */ user_identity_id?: string | undefined -} +}> /** * @deprecated Use AcsUsersDeleteRequest instead. @@ -441,7 +483,7 @@ export type AcsUsersDeleteRequest = SeamHttpRequest export interface AcsUsersDeleteOptions {} -export type AcsUsersGetParameters = { +export type AcsUsersGetParameters = RequireAtLeastOne<{ /** * ID of the access system that you want to get. You can only provide acs_user_id or user_identity_id. */ @@ -454,7 +496,7 @@ export type AcsUsersGetParameters = { * ID of the user identity that you want to get. You can only provide acs_user_id or user_identity_id. */ user_identity_id?: string | undefined -} +}> /** * @deprecated Use AcsUsersGetRequest instead. @@ -515,7 +557,7 @@ export type AcsUsersListRequest = SeamHttpRequest< export interface AcsUsersListOptions {} -export type AcsUsersListAccessibleEntrancesParameters = { +export type AcsUsersListAccessibleEntrancesParameters = RequireAtLeastOne<{ /** * ID of the access system for which you want to list accessible entrances. You can only provide acs_system_id with user_identity_id. */ @@ -528,7 +570,7 @@ export type AcsUsersListAccessibleEntrancesParameters = { * ID of the user identity for whom you want to list accessible entrances. You can only provide acs_user_id or user_identity_id. */ user_identity_id?: string | undefined -} +}> /** * @deprecated Use AcsUsersListAccessibleEntrancesRequest instead. @@ -572,7 +614,7 @@ export type AcsUsersRemoveFromAccessGroupRequest = SeamHttpRequest< export interface AcsUsersRemoveFromAccessGroupOptions {} -export type AcsUsersRevokeAccessToAllEntrancesParameters = { +export type AcsUsersRevokeAccessToAllEntrancesParameters = RequireAtLeastOne<{ /** * ID of the access system for which you want to revoke access. You can only provide acs_system_id with user_identity_id. */ @@ -585,7 +627,7 @@ export type AcsUsersRevokeAccessToAllEntrancesParameters = { * ID of the user identity for whom you want to revoke access. You can only provide acs_user_id or user_identity_id. */ user_identity_id?: string | undefined -} +}> /** * @deprecated Use AcsUsersRevokeAccessToAllEntrancesRequest instead. @@ -599,7 +641,7 @@ export type AcsUsersRevokeAccessToAllEntrancesRequest = SeamHttpRequest< export interface AcsUsersRevokeAccessToAllEntrancesOptions {} -export type AcsUsersSuspendParameters = { +export type AcsUsersSuspendParameters = RequireAtLeastOne<{ /** * ID of the access system that you want to suspend. You can only provide acs_user_id or the combination of acs_system_id and user_identity_id. */ @@ -612,7 +654,7 @@ export type AcsUsersSuspendParameters = { * ID of the user identity that you want to suspend. You can only provide acs_user_id or the combination of acs_system_id and user_identity_id. */ user_identity_id?: string | undefined -} +}> /** * @deprecated Use AcsUsersSuspendRequest instead. @@ -623,7 +665,7 @@ export type AcsUsersSuspendRequest = SeamHttpRequest export interface AcsUsersSuspendOptions {} -export type AcsUsersUnsuspendParameters = { +export type AcsUsersUnsuspendParameters = RequireAtLeastOne<{ /** * ID of the access system of the user that you want to unsuspend. You can only provide acs_system_id with user_identity_id. */ @@ -636,7 +678,7 @@ export type AcsUsersUnsuspendParameters = { * ID of the user identity that you want to unsuspend. You can only provide acs_user_id or the combination of acs_system_id and user_identity_id. */ user_identity_id?: string | undefined -} +}> /** * @deprecated Use AcsUsersUnsuspendRequest instead. @@ -647,7 +689,7 @@ export type AcsUsersUnsuspendRequest = SeamHttpRequest export interface AcsUsersUnsuspendOptions {} -export type AcsUsersUpdateParameters = { +export type AcsUsersUpdateParameters = RequireAtLeastOne<{ /** * `starts_at` and `ends_at` timestamps for the access system user's access. If you specify an `access_schedule`, you may include both `starts_at` and `ends_at`. If you omit `starts_at`, it defaults to the current time. `ends_at` is optional and must be a time in the future and after `starts_at`. */ @@ -696,7 +738,7 @@ export type AcsUsersUpdateParameters = { * ID of the user identity that you want to update. You can only provide acs_user_id or user_identity_id. If you provide user_identity_id, you must also provide acs_system_id. */ user_identity_id?: string | undefined -} +}> /** * @deprecated Use AcsUsersUpdateRequest instead. diff --git a/src/lib/routes/action-attempts/action-attempts.ts b/src/lib/routes/action-attempts/action-attempts.ts index 8775e64f..19678edc 100644 --- a/src/lib/routes/action-attempts/action-attempts.ts +++ b/src/lib/routes/action-attempts/action-attempts.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import type { ActionAttempt } from 'lib/resources/action-attempt.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' @@ -165,6 +166,8 @@ export class SeamHttpActionAttempts { parameters: ActionAttemptsGetParameters, options: ActionAttemptsGetOptions = {}, ): ActionAttemptsGetRequest { + assertValidRequestParameters(parameters, '/action_attempts/get', true) + return new SeamHttpRequest(this, { pathname: '/action_attempts/get', method: 'GET', @@ -185,6 +188,8 @@ export class SeamHttpActionAttempts { parameters?: ActionAttemptsListParameters, options: ActionAttemptsListOptions = {}, ): ActionAttemptsListRequest { + assertValidRequestParameters(parameters, '/action_attempts/list', false) + return new SeamHttpRequest(this, { pathname: '/action_attempts/list', method: 'POST', diff --git a/src/lib/routes/client-sessions/client-sessions.ts b/src/lib/routes/client-sessions/client-sessions.ts index 74222b20..6444ea9c 100644 --- a/src/lib/routes/client-sessions/client-sessions.ts +++ b/src/lib/routes/client-sessions/client-sessions.ts @@ -28,6 +28,10 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { + assertValidRequestParameters, + type RequireAtLeastOne, +} from 'lib/request-parameters.js' import type { ClientSession } from 'lib/resources/client-session.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' import { SeamPaginator } from 'lib/seam-paginator.js' @@ -164,6 +168,8 @@ export class SeamHttpClientSessions { parameters?: ClientSessionsCreateParameters, options: ClientSessionsCreateOptions = {}, ): ClientSessionsCreateRequest { + assertValidRequestParameters(parameters, '/client_sessions/create', false) + return new SeamHttpRequest(this, { pathname: '/client_sessions/create', method: 'PUT', @@ -180,6 +186,8 @@ export class SeamHttpClientSessions { parameters: ClientSessionsDeleteParameters, options: ClientSessionsDeleteOptions = {}, ): ClientSessionsDeleteRequest { + assertValidRequestParameters(parameters, '/client_sessions/delete', true) + return new SeamHttpRequest(this, { pathname: '/client_sessions/delete', method: 'DELETE', @@ -196,6 +204,8 @@ export class SeamHttpClientSessions { parameters?: ClientSessionsGetParameters, options: ClientSessionsGetOptions = {}, ): ClientSessionsGetRequest { + assertValidRequestParameters(parameters, '/client_sessions/get', false) + return new SeamHttpRequest(this, { pathname: '/client_sessions/get', method: 'GET', @@ -212,6 +222,12 @@ export class SeamHttpClientSessions { parameters?: ClientSessionsGetOrCreateParameters, options: ClientSessionsGetOrCreateOptions = {}, ): ClientSessionsGetOrCreateRequest { + assertValidRequestParameters( + parameters, + '/client_sessions/get_or_create', + false, + ) + return new SeamHttpRequest(this, { pathname: '/client_sessions/get_or_create', method: 'POST', @@ -225,9 +241,15 @@ export class SeamHttpClientSessions { * Grants a [client session](https://docs.seam.co/core-concepts/authentication/client-session-tokens) access to one or more resources, such as [Connect Webviews](https://docs.seam.co/core-concepts/connect-webviews), [user identities](https://docs.seam.co/capability-guides/mobile-access/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity), and so on. */ grantAccess( - parameters?: ClientSessionsGrantAccessParameters, + parameters: ClientSessionsGrantAccessParameters, options: ClientSessionsGrantAccessOptions = {}, ): ClientSessionsGrantAccessRequest { + assertValidRequestParameters( + parameters, + '/client_sessions/grant_access', + true, + ) + return new SeamHttpRequest(this, { pathname: '/client_sessions/grant_access', method: 'PATCH', @@ -244,6 +266,8 @@ export class SeamHttpClientSessions { parameters?: ClientSessionsListParameters, options: ClientSessionsListOptions = {}, ): ClientSessionsListRequest { + assertValidRequestParameters(parameters, '/client_sessions/list', false) + return new SeamHttpRequest(this, { pathname: '/client_sessions/list', method: 'GET', @@ -262,6 +286,8 @@ export class SeamHttpClientSessions { parameters: ClientSessionsRevokeParameters, options: ClientSessionsRevokeOptions = {}, ): ClientSessionsRevokeRequest { + assertValidRequestParameters(parameters, '/client_sessions/revoke', true) + return new SeamHttpRequest(this, { pathname: '/client_sessions/revoke', method: 'POST', @@ -401,7 +427,7 @@ export type ClientSessionsGetOrCreateRequest = SeamHttpRequest< export interface ClientSessionsGetOrCreateOptions {} -export type ClientSessionsGrantAccessParameters = { +export type ClientSessionsGrantAccessParameters = RequireAtLeastOne<{ /** * ID of the client session to which you want to grant access to resources. */ @@ -427,7 +453,7 @@ export type ClientSessionsGrantAccessParameters = { * @deprecated Use `user_identity_id`. */ user_identity_ids?: Array | undefined -} +}> /** * @deprecated Use ClientSessionsGrantAccessRequest instead. diff --git a/src/lib/routes/connect-webviews/connect-webviews.ts b/src/lib/routes/connect-webviews/connect-webviews.ts index b28a4cb7..79249092 100644 --- a/src/lib/routes/connect-webviews/connect-webviews.ts +++ b/src/lib/routes/connect-webviews/connect-webviews.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import type { ConnectWebview } from 'lib/resources/connect-webview.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' @@ -171,6 +172,8 @@ export class SeamHttpConnectWebviews { parameters?: ConnectWebviewsCreateParameters, options: ConnectWebviewsCreateOptions = {}, ): ConnectWebviewsCreateRequest { + assertValidRequestParameters(parameters, '/connect_webviews/create', false) + return new SeamHttpRequest(this, { pathname: '/connect_webviews/create', method: 'POST', @@ -189,6 +192,8 @@ export class SeamHttpConnectWebviews { parameters: ConnectWebviewsDeleteParameters, options: ConnectWebviewsDeleteOptions = {}, ): ConnectWebviewsDeleteRequest { + assertValidRequestParameters(parameters, '/connect_webviews/delete', true) + return new SeamHttpRequest(this, { pathname: '/connect_webviews/delete', method: 'DELETE', @@ -207,6 +212,8 @@ export class SeamHttpConnectWebviews { parameters: ConnectWebviewsGetParameters, options: ConnectWebviewsGetOptions = {}, ): ConnectWebviewsGetRequest { + assertValidRequestParameters(parameters, '/connect_webviews/get', true) + return new SeamHttpRequest(this, { pathname: '/connect_webviews/get', method: 'GET', @@ -223,6 +230,8 @@ export class SeamHttpConnectWebviews { parameters?: ConnectWebviewsListParameters, options: ConnectWebviewsListOptions = {}, ): ConnectWebviewsListRequest { + assertValidRequestParameters(parameters, '/connect_webviews/list', false) + return new SeamHttpRequest(this, { pathname: '/connect_webviews/list', method: 'POST', diff --git a/src/lib/routes/connected-accounts/connected-accounts.ts b/src/lib/routes/connected-accounts/connected-accounts.ts index 4b899c74..0a127b49 100644 --- a/src/lib/routes/connected-accounts/connected-accounts.ts +++ b/src/lib/routes/connected-accounts/connected-accounts.ts @@ -28,6 +28,10 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { + assertValidRequestParameters, + type RequireAtLeastOne, +} from 'lib/request-parameters.js' import type { ConnectedAccount } from 'lib/resources/connected-account.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' @@ -178,6 +182,8 @@ export class SeamHttpConnectedAccounts { parameters: ConnectedAccountsDeleteParameters, options: ConnectedAccountsDeleteOptions = {}, ): ConnectedAccountsDeleteRequest { + assertValidRequestParameters(parameters, '/connected_accounts/delete', true) + return new SeamHttpRequest(this, { pathname: '/connected_accounts/delete', method: 'DELETE', @@ -191,9 +197,11 @@ export class SeamHttpConnectedAccounts { * Returns a specified [connected account](https://docs.seam.co/core-concepts/connected-accounts). */ get( - parameters?: ConnectedAccountsGetParameters, + parameters: ConnectedAccountsGetParameters, options: ConnectedAccountsGetOptions = {}, ): ConnectedAccountsGetRequest { + assertValidRequestParameters(parameters, '/connected_accounts/get', true) + return new SeamHttpRequest(this, { pathname: '/connected_accounts/get', method: 'GET', @@ -210,6 +218,8 @@ export class SeamHttpConnectedAccounts { parameters?: ConnectedAccountsListParameters, options: ConnectedAccountsListOptions = {}, ): ConnectedAccountsListRequest { + assertValidRequestParameters(parameters, '/connected_accounts/list', false) + return new SeamHttpRequest(this, { pathname: '/connected_accounts/list', method: 'POST', @@ -226,6 +236,8 @@ export class SeamHttpConnectedAccounts { parameters: ConnectedAccountsSyncParameters, options: ConnectedAccountsSyncOptions = {}, ): ConnectedAccountsSyncRequest { + assertValidRequestParameters(parameters, '/connected_accounts/sync', true) + return new SeamHttpRequest(this, { pathname: '/connected_accounts/sync', method: 'POST', @@ -242,6 +254,8 @@ export class SeamHttpConnectedAccounts { parameters: ConnectedAccountsUpdateParameters, options: ConnectedAccountsUpdateOptions = {}, ): ConnectedAccountsUpdateRequest { + assertValidRequestParameters(parameters, '/connected_accounts/update', true) + return new SeamHttpRequest(this, { pathname: '/connected_accounts/update', method: 'PATCH', @@ -268,7 +282,7 @@ export type ConnectedAccountsDeleteRequest = SeamHttpRequest export interface ConnectedAccountsDeleteOptions {} -export type ConnectedAccountsGetParameters = { +export type ConnectedAccountsGetParameters = RequireAtLeastOne<{ /** * ID of the connected account that you want to get. */ @@ -277,7 +291,7 @@ export type ConnectedAccountsGetParameters = { * Email address associated with the connected account that you want to get. */ email?: string | undefined -} +}> /** * @deprecated Use ConnectedAccountsGetRequest instead. diff --git a/src/lib/routes/connected-accounts/simulate/simulate.ts b/src/lib/routes/connected-accounts/simulate/simulate.ts index 61f2be0d..ffafeb59 100644 --- a/src/lib/routes/connected-accounts/simulate/simulate.ts +++ b/src/lib/routes/connected-accounts/simulate/simulate.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' import { SeamPaginator } from 'lib/seam-paginator.js' @@ -167,6 +168,12 @@ export class SeamHttpConnectedAccountsSimulate { parameters: ConnectedAccountsSimulateDisconnectParameters, options: ConnectedAccountsSimulateDisconnectOptions = {}, ): ConnectedAccountsSimulateDisconnectRequest { + assertValidRequestParameters( + parameters, + '/connected_accounts/simulate/disconnect', + true, + ) + return new SeamHttpRequest(this, { pathname: '/connected_accounts/simulate/disconnect', method: 'POST', diff --git a/src/lib/routes/customers/customers.ts b/src/lib/routes/customers/customers.ts index 33cfec51..132d0fda 100644 --- a/src/lib/routes/customers/customers.ts +++ b/src/lib/routes/customers/customers.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import type { CustomerPortal } from 'lib/resources/customer-portal.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' @@ -165,6 +166,8 @@ export class SeamHttpCustomers { parameters?: CustomersCreatePortalParameters, options: CustomersCreatePortalOptions = {}, ): CustomersCreatePortalRequest { + assertValidRequestParameters(parameters, '/customers/create_portal', false) + return new SeamHttpRequest(this, { pathname: '/customers/create_portal', method: 'POST', @@ -182,6 +185,8 @@ export class SeamHttpCustomers { parameters?: CustomersDeleteDataParameters, options: CustomersDeleteDataOptions = {}, ): CustomersDeleteDataRequest { + assertValidRequestParameters(parameters, '/customers/delete_data', false) + return new SeamHttpRequest(this, { pathname: '/customers/delete_data', method: 'POST', @@ -198,6 +203,8 @@ export class SeamHttpCustomers { parameters: CustomersPushDataParameters, options: CustomersPushDataOptions = {}, ): CustomersPushDataRequest { + assertValidRequestParameters(parameters, '/customers/push_data', true) + return new SeamHttpRequest(this, { pathname: '/customers/push_data', method: 'POST', diff --git a/src/lib/routes/devices/devices.ts b/src/lib/routes/devices/devices.ts index b014d969..4df90aee 100644 --- a/src/lib/routes/devices/devices.ts +++ b/src/lib/routes/devices/devices.ts @@ -28,6 +28,10 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { + assertValidRequestParameters, + type RequireAtLeastOne, +} from 'lib/request-parameters.js' import type { Device } from 'lib/resources/device.js' import type { DeviceProvider } from 'lib/resources/device-provider.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' @@ -176,9 +180,11 @@ export class SeamHttpDevices { * You must specify either `device_id` or `name`. */ get( - parameters?: DevicesGetParameters, + parameters: DevicesGetParameters, options: DevicesGetOptions = {}, ): DevicesGetRequest { + assertValidRequestParameters(parameters, '/devices/get', true) + return new SeamHttpRequest(this, { pathname: '/devices/get', method: 'GET', @@ -195,6 +201,8 @@ export class SeamHttpDevices { parameters?: DevicesListParameters, options: DevicesListOptions = {}, ): DevicesListRequest { + assertValidRequestParameters(parameters, '/devices/list', false) + return new SeamHttpRequest(this, { pathname: '/devices/list', method: 'POST', @@ -215,6 +223,12 @@ export class SeamHttpDevices { parameters?: DevicesListDeviceProvidersParameters, options: DevicesListDeviceProvidersOptions = {}, ): DevicesListDeviceProvidersRequest { + assertValidRequestParameters( + parameters, + '/devices/list_device_providers', + false, + ) + return new SeamHttpRequest(this, { pathname: '/devices/list_device_providers', method: 'GET', @@ -231,6 +245,12 @@ export class SeamHttpDevices { parameters: DevicesReportProviderMetadataParameters, options: DevicesReportProviderMetadataOptions = {}, ): DevicesReportProviderMetadataRequest { + assertValidRequestParameters( + parameters, + '/devices/report_provider_metadata', + true, + ) + return new SeamHttpRequest(this, { pathname: '/devices/report_provider_metadata', method: 'POST', @@ -249,6 +269,8 @@ export class SeamHttpDevices { parameters: DevicesUpdateParameters, options: DevicesUpdateOptions = {}, ): DevicesUpdateRequest { + assertValidRequestParameters(parameters, '/devices/update', true) + return new SeamHttpRequest(this, { pathname: '/devices/update', method: 'PATCH', @@ -259,7 +281,7 @@ export class SeamHttpDevices { } } -export type DevicesGetParameters = { +export type DevicesGetParameters = RequireAtLeastOne<{ /** * ID of the device that you want to get. */ @@ -268,7 +290,7 @@ export type DevicesGetParameters = { * Name of the device that you want to get. */ name?: string | undefined -} +}> /** * @deprecated Use DevicesGetRequest instead. diff --git a/src/lib/routes/devices/simulate/simulate.ts b/src/lib/routes/devices/simulate/simulate.ts index fba0ebca..6e328cc2 100644 --- a/src/lib/routes/devices/simulate/simulate.ts +++ b/src/lib/routes/devices/simulate/simulate.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' import { SeamPaginator } from 'lib/seam-paginator.js' @@ -164,6 +165,8 @@ export class SeamHttpDevicesSimulate { parameters: DevicesSimulateConnectParameters, options: DevicesSimulateConnectOptions = {}, ): DevicesSimulateConnectRequest { + assertValidRequestParameters(parameters, '/devices/simulate/connect', true) + return new SeamHttpRequest(this, { pathname: '/devices/simulate/connect', method: 'POST', @@ -183,6 +186,12 @@ export class SeamHttpDevicesSimulate { parameters: DevicesSimulateConnectToHubParameters, options: DevicesSimulateConnectToHubOptions = {}, ): DevicesSimulateConnectToHubRequest { + assertValidRequestParameters( + parameters, + '/devices/simulate/connect_to_hub', + true, + ) + return new SeamHttpRequest(this, { pathname: '/devices/simulate/connect_to_hub', method: 'POST', @@ -199,6 +208,12 @@ export class SeamHttpDevicesSimulate { parameters: DevicesSimulateDisconnectParameters, options: DevicesSimulateDisconnectOptions = {}, ): DevicesSimulateDisconnectRequest { + assertValidRequestParameters( + parameters, + '/devices/simulate/disconnect', + true, + ) + return new SeamHttpRequest(this, { pathname: '/devices/simulate/disconnect', method: 'POST', @@ -219,6 +234,12 @@ export class SeamHttpDevicesSimulate { parameters: DevicesSimulateDisconnectFromHubParameters, options: DevicesSimulateDisconnectFromHubOptions = {}, ): DevicesSimulateDisconnectFromHubRequest { + assertValidRequestParameters( + parameters, + '/devices/simulate/disconnect_from_hub', + true, + ) + return new SeamHttpRequest(this, { pathname: '/devices/simulate/disconnect_from_hub', method: 'POST', @@ -237,6 +258,12 @@ export class SeamHttpDevicesSimulate { parameters: DevicesSimulatePaidSubscriptionParameters, options: DevicesSimulatePaidSubscriptionOptions = {}, ): DevicesSimulatePaidSubscriptionRequest { + assertValidRequestParameters( + parameters, + '/devices/simulate/paid_subscription', + true, + ) + return new SeamHttpRequest(this, { pathname: '/devices/simulate/paid_subscription', method: 'POST', @@ -253,6 +280,8 @@ export class SeamHttpDevicesSimulate { parameters: DevicesSimulateRemoveParameters, options: DevicesSimulateRemoveOptions = {}, ): DevicesSimulateRemoveRequest { + assertValidRequestParameters(parameters, '/devices/simulate/remove', true) + return new SeamHttpRequest(this, { pathname: '/devices/simulate/remove', method: 'POST', diff --git a/src/lib/routes/devices/unmanaged/unmanaged.ts b/src/lib/routes/devices/unmanaged/unmanaged.ts index 3a782be7..ee0b303c 100644 --- a/src/lib/routes/devices/unmanaged/unmanaged.ts +++ b/src/lib/routes/devices/unmanaged/unmanaged.ts @@ -28,6 +28,10 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { + assertValidRequestParameters, + type RequireAtLeastOne, +} from 'lib/request-parameters.js' import type { UnmanagedDevice } from 'lib/resources/unmanaged-device.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' @@ -166,9 +170,11 @@ export class SeamHttpDevicesUnmanaged { * You must specify either `device_id` or `name`. */ get( - parameters?: DevicesUnmanagedGetParameters, + parameters: DevicesUnmanagedGetParameters, options: DevicesUnmanagedGetOptions = {}, ): DevicesUnmanagedGetRequest { + assertValidRequestParameters(parameters, '/devices/unmanaged/get', true) + return new SeamHttpRequest(this, { pathname: '/devices/unmanaged/get', method: 'GET', @@ -187,6 +193,8 @@ export class SeamHttpDevicesUnmanaged { parameters?: DevicesUnmanagedListParameters, options: DevicesUnmanagedListOptions = {}, ): DevicesUnmanagedListRequest { + assertValidRequestParameters(parameters, '/devices/unmanaged/list', false) + return new SeamHttpRequest(this, { pathname: '/devices/unmanaged/list', method: 'POST', @@ -205,6 +213,8 @@ export class SeamHttpDevicesUnmanaged { parameters: DevicesUnmanagedUpdateParameters, options: DevicesUnmanagedUpdateOptions = {}, ): DevicesUnmanagedUpdateRequest { + assertValidRequestParameters(parameters, '/devices/unmanaged/update', true) + return new SeamHttpRequest(this, { pathname: '/devices/unmanaged/update', method: 'PATCH', @@ -215,7 +225,7 @@ export class SeamHttpDevicesUnmanaged { } } -export type DevicesUnmanagedGetParameters = { +export type DevicesUnmanagedGetParameters = RequireAtLeastOne<{ /** * ID of the unmanaged device that you want to get. */ @@ -224,7 +234,7 @@ export type DevicesUnmanagedGetParameters = { * Name of the unmanaged device that you want to get. */ name?: string | undefined -} +}> /** * @deprecated Use DevicesUnmanagedGetRequest instead. diff --git a/src/lib/routes/events/events.ts b/src/lib/routes/events/events.ts index 072c3309..551ffc88 100644 --- a/src/lib/routes/events/events.ts +++ b/src/lib/routes/events/events.ts @@ -28,6 +28,10 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { + assertValidRequestParameters, + type RequireAtLeastOne, +} from 'lib/request-parameters.js' import type { SeamEvent } from 'lib/resources/event.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' @@ -162,9 +166,11 @@ export class SeamHttpEvents { * Returns a specified event. This endpoint returns the same event that would be sent to a [webhook](https://docs.seam.co/developer-tools/webhooks), but it enables you to retrieve an event that already took place. */ get( - parameters?: EventsGetParameters, + parameters: EventsGetParameters, options: EventsGetOptions = {}, ): EventsGetRequest { + assertValidRequestParameters(parameters, '/events/get', true) + return new SeamHttpRequest(this, { pathname: '/events/get', method: 'GET', @@ -178,9 +184,11 @@ export class SeamHttpEvents { * Returns a list of all events. This endpoint returns the same events that would be sent to a [webhook](https://docs.seam.co/developer-tools/webhooks), but it enables you to filter or see events that already took place. */ list( - parameters?: EventsListParameters, + parameters: EventsListParameters, options: EventsListOptions = {}, ): EventsListRequest { + assertValidRequestParameters(parameters, '/events/list', true) + return new SeamHttpRequest(this, { pathname: '/events/list', method: 'POST', @@ -191,7 +199,7 @@ export class SeamHttpEvents { } } -export type EventsGetParameters = { +export type EventsGetParameters = RequireAtLeastOne<{ /** * Unique identifier for the device that triggered the event that you want to get. */ @@ -204,7 +212,7 @@ export type EventsGetParameters = { * Type of the event that you want to get. */ event_type?: string | undefined -} +}> /** * @deprecated Use EventsGetRequest instead. @@ -215,7 +223,7 @@ export type EventsGetRequest = SeamHttpRequest export interface EventsGetOptions {} -export type EventsListParameters = { +export type EventsListParameters = RequireAtLeastOne<{ /** * ID of the access code for which you want to list events. */ @@ -550,7 +558,7 @@ export type EventsListParameters = { * ID of the user identity for which you want to list events. */ user_identity_id?: string | undefined -} +}> /** * @deprecated Use EventsListRequest instead. diff --git a/src/lib/routes/instant-keys/instant-keys.ts b/src/lib/routes/instant-keys/instant-keys.ts index 32dc2eee..83202768 100644 --- a/src/lib/routes/instant-keys/instant-keys.ts +++ b/src/lib/routes/instant-keys/instant-keys.ts @@ -28,6 +28,10 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { + assertValidRequestParameters, + type RequireAtLeastOne, +} from 'lib/request-parameters.js' import type { InstantKey } from 'lib/resources/instant-key.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' @@ -165,6 +169,8 @@ export class SeamHttpInstantKeys { parameters: InstantKeysDeleteParameters, options: InstantKeysDeleteOptions = {}, ): InstantKeysDeleteRequest { + assertValidRequestParameters(parameters, '/instant_keys/delete', true) + return new SeamHttpRequest(this, { pathname: '/instant_keys/delete', method: 'DELETE', @@ -178,9 +184,11 @@ export class SeamHttpInstantKeys { * Gets an [instant key](https://docs.seam.co/capability-guides/instant-keys). */ get( - parameters?: InstantKeysGetParameters, + parameters: InstantKeysGetParameters, options: InstantKeysGetOptions = {}, ): InstantKeysGetRequest { + assertValidRequestParameters(parameters, '/instant_keys/get', true) + return new SeamHttpRequest(this, { pathname: '/instant_keys/get', method: 'GET', @@ -197,6 +205,8 @@ export class SeamHttpInstantKeys { parameters?: InstantKeysListParameters, options: InstantKeysListOptions = {}, ): InstantKeysListRequest { + assertValidRequestParameters(parameters, '/instant_keys/list', false) + return new SeamHttpRequest(this, { pathname: '/instant_keys/list', method: 'GET', @@ -223,7 +233,7 @@ export type InstantKeysDeleteRequest = SeamHttpRequest export interface InstantKeysDeleteOptions {} -export type InstantKeysGetParameters = { +export type InstantKeysGetParameters = RequireAtLeastOne<{ /** * ID of the instant key to get. */ @@ -232,7 +242,7 @@ export type InstantKeysGetParameters = { * URL of the instant key to get. */ instant_key_url?: string | undefined -} +}> /** * @deprecated Use InstantKeysGetRequest instead. diff --git a/src/lib/routes/locks/locks.ts b/src/lib/routes/locks/locks.ts index ef903c4f..e27e2a94 100644 --- a/src/lib/routes/locks/locks.ts +++ b/src/lib/routes/locks/locks.ts @@ -28,6 +28,10 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { + assertValidRequestParameters, + type RequireAtLeastOne, +} from 'lib/request-parameters.js' import type { ActionAttempt } from 'lib/resources/action-attempt.js' import type { Device } from 'lib/resources/device.js' import { SeamHttpActionAttempts } from 'lib/routes/action-attempts/index.js' @@ -173,6 +177,8 @@ export class SeamHttpLocks { parameters: LocksConfigureAutoLockParameters, options: LocksConfigureAutoLockOptions = {}, ): LocksConfigureAutoLockRequest { + assertValidRequestParameters(parameters, '/locks/configure_auto_lock', true) + return new SeamHttpRequest(this, { pathname: '/locks/configure_auto_lock', method: 'POST', @@ -191,9 +197,11 @@ export class SeamHttpLocks { * @deprecated Use `/devices/get` instead. */ get( - parameters?: LocksGetParameters, + parameters: LocksGetParameters, options: LocksGetOptions = {}, ): LocksGetRequest { + assertValidRequestParameters(parameters, '/locks/get', true) + return new SeamHttpRequest(this, { pathname: '/locks/get', method: 'GET', @@ -210,6 +218,8 @@ export class SeamHttpLocks { parameters?: LocksListParameters, options: LocksListOptions = {}, ): LocksListRequest { + assertValidRequestParameters(parameters, '/locks/list', false) + return new SeamHttpRequest(this, { pathname: '/locks/list', method: 'POST', @@ -226,6 +236,8 @@ export class SeamHttpLocks { parameters: LocksLockDoorParameters, options: LocksLockDoorOptions = {}, ): LocksLockDoorRequest { + assertValidRequestParameters(parameters, '/locks/lock_door', true) + return new SeamHttpRequest(this, { pathname: '/locks/lock_door', method: 'POST', @@ -246,6 +258,8 @@ export class SeamHttpLocks { parameters: LocksUnlockDoorParameters, options: LocksUnlockDoorOptions = {}, ): LocksUnlockDoorRequest { + assertValidRequestParameters(parameters, '/locks/unlock_door', true) + return new SeamHttpRequest(this, { pathname: '/locks/unlock_door', method: 'POST', @@ -291,7 +305,7 @@ export type LocksConfigureAutoLockOptions = Pick< 'waitForActionAttempt' > -export type LocksGetParameters = { +export type LocksGetParameters = RequireAtLeastOne<{ /** * ID of the lock that you want to get. */ @@ -300,7 +314,7 @@ export type LocksGetParameters = { * Name of the lock that you want to get. */ name?: string | undefined -} +}> /** * @deprecated Use LocksGetRequest instead. diff --git a/src/lib/routes/locks/simulate/simulate.ts b/src/lib/routes/locks/simulate/simulate.ts index baeb5fd0..78e874c9 100644 --- a/src/lib/routes/locks/simulate/simulate.ts +++ b/src/lib/routes/locks/simulate/simulate.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import type { ActionAttempt } from 'lib/resources/action-attempt.js' import { SeamHttpActionAttempts } from 'lib/routes/action-attempts/index.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' @@ -166,6 +167,12 @@ export class SeamHttpLocksSimulate { parameters: LocksSimulateKeypadCodeEntryParameters, options: LocksSimulateKeypadCodeEntryOptions = {}, ): LocksSimulateKeypadCodeEntryRequest { + assertValidRequestParameters( + parameters, + '/locks/simulate/keypad_code_entry', + true, + ) + return new SeamHttpRequest(this, { pathname: '/locks/simulate/keypad_code_entry', method: 'POST', @@ -186,6 +193,12 @@ export class SeamHttpLocksSimulate { parameters: LocksSimulateManualLockViaKeypadParameters, options: LocksSimulateManualLockViaKeypadOptions = {}, ): LocksSimulateManualLockViaKeypadRequest { + assertValidRequestParameters( + parameters, + '/locks/simulate/manual_lock_via_keypad', + true, + ) + return new SeamHttpRequest(this, { pathname: '/locks/simulate/manual_lock_via_keypad', method: 'POST', diff --git a/src/lib/routes/noise-sensors/noise-sensors.ts b/src/lib/routes/noise-sensors/noise-sensors.ts index b12a6e30..7ad61463 100644 --- a/src/lib/routes/noise-sensors/noise-sensors.ts +++ b/src/lib/routes/noise-sensors/noise-sensors.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import type { Device } from 'lib/resources/device.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' @@ -179,6 +180,8 @@ export class SeamHttpNoiseSensors { parameters?: NoiseSensorsListParameters, options: NoiseSensorsListOptions = {}, ): NoiseSensorsListRequest { + assertValidRequestParameters(parameters, '/noise_sensors/list', false) + return new SeamHttpRequest(this, { pathname: '/noise_sensors/list', method: 'POST', diff --git a/src/lib/routes/noise-sensors/noise-thresholds/noise-thresholds.ts b/src/lib/routes/noise-sensors/noise-thresholds/noise-thresholds.ts index 4525401e..4392a287 100644 --- a/src/lib/routes/noise-sensors/noise-thresholds/noise-thresholds.ts +++ b/src/lib/routes/noise-sensors/noise-thresholds/noise-thresholds.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import type { NoiseThreshold } from 'lib/resources/noise-threshold.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' @@ -168,6 +169,12 @@ export class SeamHttpNoiseSensorsNoiseThresholds { parameters: NoiseSensorsNoiseThresholdsCreateParameters, options: NoiseSensorsNoiseThresholdsCreateOptions = {}, ): NoiseSensorsNoiseThresholdsCreateRequest { + assertValidRequestParameters( + parameters, + '/noise_sensors/noise_thresholds/create', + true, + ) + return new SeamHttpRequest(this, { pathname: '/noise_sensors/noise_thresholds/create', method: 'POST', @@ -184,6 +191,12 @@ export class SeamHttpNoiseSensorsNoiseThresholds { parameters: NoiseSensorsNoiseThresholdsDeleteParameters, options: NoiseSensorsNoiseThresholdsDeleteOptions = {}, ): NoiseSensorsNoiseThresholdsDeleteRequest { + assertValidRequestParameters( + parameters, + '/noise_sensors/noise_thresholds/delete', + true, + ) + return new SeamHttpRequest(this, { pathname: '/noise_sensors/noise_thresholds/delete', method: 'DELETE', @@ -200,6 +213,12 @@ export class SeamHttpNoiseSensorsNoiseThresholds { parameters: NoiseSensorsNoiseThresholdsGetParameters, options: NoiseSensorsNoiseThresholdsGetOptions = {}, ): NoiseSensorsNoiseThresholdsGetRequest { + assertValidRequestParameters( + parameters, + '/noise_sensors/noise_thresholds/get', + true, + ) + return new SeamHttpRequest(this, { pathname: '/noise_sensors/noise_thresholds/get', method: 'GET', @@ -216,6 +235,12 @@ export class SeamHttpNoiseSensorsNoiseThresholds { parameters: NoiseSensorsNoiseThresholdsListParameters, options: NoiseSensorsNoiseThresholdsListOptions = {}, ): NoiseSensorsNoiseThresholdsListRequest { + assertValidRequestParameters( + parameters, + '/noise_sensors/noise_thresholds/list', + true, + ) + return new SeamHttpRequest(this, { pathname: '/noise_sensors/noise_thresholds/list', method: 'GET', @@ -232,6 +257,12 @@ export class SeamHttpNoiseSensorsNoiseThresholds { parameters: NoiseSensorsNoiseThresholdsUpdateParameters, options: NoiseSensorsNoiseThresholdsUpdateOptions = {}, ): NoiseSensorsNoiseThresholdsUpdateRequest { + assertValidRequestParameters( + parameters, + '/noise_sensors/noise_thresholds/update', + true, + ) + return new SeamHttpRequest(this, { pathname: '/noise_sensors/noise_thresholds/update', method: 'PUT', diff --git a/src/lib/routes/noise-sensors/simulate/simulate.ts b/src/lib/routes/noise-sensors/simulate/simulate.ts index bb2ee06c..cb303a1b 100644 --- a/src/lib/routes/noise-sensors/simulate/simulate.ts +++ b/src/lib/routes/noise-sensors/simulate/simulate.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' import { SeamPaginator } from 'lib/seam-paginator.js' @@ -164,6 +165,12 @@ export class SeamHttpNoiseSensorsSimulate { parameters: NoiseSensorsSimulateTriggerNoiseThresholdParameters, options: NoiseSensorsSimulateTriggerNoiseThresholdOptions = {}, ): NoiseSensorsSimulateTriggerNoiseThresholdRequest { + assertValidRequestParameters( + parameters, + '/noise_sensors/simulate/trigger_noise_threshold', + true, + ) + return new SeamHttpRequest(this, { pathname: '/noise_sensors/simulate/trigger_noise_threshold', method: 'POST', diff --git a/src/lib/routes/phones/phones.ts b/src/lib/routes/phones/phones.ts index e3297939..e472b266 100644 --- a/src/lib/routes/phones/phones.ts +++ b/src/lib/routes/phones/phones.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import type { Phone } from 'lib/resources/phone.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' @@ -171,6 +172,8 @@ export class SeamHttpPhones { parameters: PhonesDeactivateParameters, options: PhonesDeactivateOptions = {}, ): PhonesDeactivateRequest { + assertValidRequestParameters(parameters, '/phones/deactivate', true) + return new SeamHttpRequest(this, { pathname: '/phones/deactivate', method: 'DELETE', @@ -187,6 +190,8 @@ export class SeamHttpPhones { parameters: PhonesGetParameters, options: PhonesGetOptions = {}, ): PhonesGetRequest { + assertValidRequestParameters(parameters, '/phones/get', true) + return new SeamHttpRequest(this, { pathname: '/phones/get', method: 'GET', @@ -203,6 +208,8 @@ export class SeamHttpPhones { parameters?: PhonesListParameters, options: PhonesListOptions = {}, ): PhonesListRequest { + assertValidRequestParameters(parameters, '/phones/list', false) + return new SeamHttpRequest(this, { pathname: '/phones/list', method: 'GET', diff --git a/src/lib/routes/phones/simulate/simulate.ts b/src/lib/routes/phones/simulate/simulate.ts index 668df9c3..56240298 100644 --- a/src/lib/routes/phones/simulate/simulate.ts +++ b/src/lib/routes/phones/simulate/simulate.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import type { Phone } from 'lib/resources/phone.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' @@ -165,6 +166,12 @@ export class SeamHttpPhonesSimulate { parameters: PhonesSimulateCreateSandboxPhoneParameters, options: PhonesSimulateCreateSandboxPhoneOptions = {}, ): PhonesSimulateCreateSandboxPhoneRequest { + assertValidRequestParameters( + parameters, + '/phones/simulate/create_sandbox_phone', + true, + ) + return new SeamHttpRequest(this, { pathname: '/phones/simulate/create_sandbox_phone', method: 'POST', diff --git a/src/lib/routes/seam-http-endpoints.ts b/src/lib/routes/seam-http-endpoints.ts index 782880e1..ed260485 100644 --- a/src/lib/routes/seam-http-endpoints.ts +++ b/src/lib/routes/seam-http-endpoints.ts @@ -963,7 +963,7 @@ export class SeamHttpEndpoints { * You must specify either `access_code_id` or both `device_id` and `code`. */ get '/access_codes/get'(): ( - parameters?: AccessCodesGetParameters, + parameters: AccessCodesGetParameters, options?: AccessCodesGetOptions, ) => AccessCodesGetRequest { const { client, defaults } = this @@ -981,7 +981,7 @@ export class SeamHttpEndpoints { * Specify `device_id`, `access_code_ids`, `access_method_id`, `access_grant_id`, or `access_grant_key`. */ get '/access_codes/list'(): ( - parameters?: AccessCodesListParameters, + parameters: AccessCodesListParameters, options?: AccessCodesListOptions, ) => AccessCodesListRequest { const { client, defaults } = this @@ -1133,7 +1133,7 @@ export class SeamHttpEndpoints { * You must specify either `access_code_id` or both `device_id` and `code`. */ get '/access_codes/unmanaged/get'(): ( - parameters?: AccessCodesUnmanagedGetParameters, + parameters: AccessCodesUnmanagedGetParameters, options?: AccessCodesUnmanagedGetOptions, ) => AccessCodesUnmanagedGetRequest { const { client, defaults } = this @@ -1213,7 +1213,7 @@ export class SeamHttpEndpoints { * Get an Access Grant. */ get '/access_grants/get'(): ( - parameters?: AccessGrantsGetParameters, + parameters: AccessGrantsGetParameters, options?: AccessGrantsGetOptions, ) => AccessGrantsGetRequest { const { client, defaults } = this @@ -1229,7 +1229,7 @@ export class SeamHttpEndpoints { * Gets all related resources for one or more Access Grants. */ get '/access_grants/get_related'(): ( - parameters?: AccessGrantsGetRelatedParameters, + parameters: AccessGrantsGetRelatedParameters, options?: AccessGrantsGetRelatedOptions, ) => AccessGrantsGetRelatedRequest { const { client, defaults } = this @@ -1277,7 +1277,7 @@ export class SeamHttpEndpoints { * Updates an existing Access Grant's time window. */ get '/access_grants/update'(): ( - parameters?: AccessGrantsUpdateParameters, + parameters: AccessGrantsUpdateParameters, options?: AccessGrantsUpdateOptions, ) => AccessGrantsUpdateRequest { const { client, defaults } = this @@ -1361,7 +1361,7 @@ export class SeamHttpEndpoints { * Deletes an access method. */ get '/access_methods/delete'(): ( - parameters?: AccessMethodsDeleteParameters, + parameters: AccessMethodsDeleteParameters, options?: AccessMethodsDeleteOptions, ) => AccessMethodsDeleteRequest { const { client, defaults } = this @@ -1425,7 +1425,7 @@ export class SeamHttpEndpoints { * Lists all access methods, usually filtered by Access Grant. */ get '/access_methods/list'(): ( - parameters?: AccessMethodsListParameters, + parameters: AccessMethodsListParameters, options?: AccessMethodsListOptions, ) => AccessMethodsListRequest { const { client, defaults } = this @@ -2069,7 +2069,7 @@ export class SeamHttpEndpoints { * Deletes a specified [access system user](https://docs.seam.co/low-level-apis/access-systems/user-management) and invalidates the access system user's [credentials](https://docs.seam.co/low-level-apis/access-systems/managing-credentials). */ get '/acs/users/delete'(): ( - parameters?: AcsUsersDeleteParameters, + parameters: AcsUsersDeleteParameters, options?: AcsUsersDeleteOptions, ) => AcsUsersDeleteRequest { const { client, defaults } = this @@ -2085,7 +2085,7 @@ export class SeamHttpEndpoints { * Returns a specified [access system user](https://docs.seam.co/low-level-apis/access-systems/user-management). */ get '/acs/users/get'(): ( - parameters?: AcsUsersGetParameters, + parameters: AcsUsersGetParameters, options?: AcsUsersGetOptions, ) => AcsUsersGetRequest { const { client, defaults } = this @@ -2117,7 +2117,7 @@ export class SeamHttpEndpoints { * Lists the [entrances](https://docs.seam.co/api/acs/entrances) to which a specified [access system user](https://docs.seam.co/low-level-apis/access-systems/user-management) has access. */ get '/acs/users/list_accessible_entrances'(): ( - parameters?: AcsUsersListAccessibleEntrancesParameters, + parameters: AcsUsersListAccessibleEntrancesParameters, options?: AcsUsersListAccessibleEntrancesOptions, ) => AcsUsersListAccessibleEntrancesRequest { const { client, defaults } = this @@ -2149,7 +2149,7 @@ export class SeamHttpEndpoints { * Revokes access to all [entrances](https://docs.seam.co/api/acs/entrances) for a specified [access system user](https://docs.seam.co/low-level-apis/access-systems/user-management). */ get '/acs/users/revoke_access_to_all_entrances'(): ( - parameters?: AcsUsersRevokeAccessToAllEntrancesParameters, + parameters: AcsUsersRevokeAccessToAllEntrancesParameters, options?: AcsUsersRevokeAccessToAllEntrancesOptions, ) => AcsUsersRevokeAccessToAllEntrancesRequest { const { client, defaults } = this @@ -2165,7 +2165,7 @@ export class SeamHttpEndpoints { * [Suspends](https://docs.seam.co/low-level-apis/access-systems/user-management/suspending-and-unsuspending-users#suspend-an-acs-user) a specified [access system user](https://docs.seam.co/low-level-apis/access-systems/user-management). Suspending an access system user revokes their access temporarily. To restore an access system user's access, you can [unsuspend](https://docs.seam.co/api/acs/users/unsuspend) them. */ get '/acs/users/suspend'(): ( - parameters?: AcsUsersSuspendParameters, + parameters: AcsUsersSuspendParameters, options?: AcsUsersSuspendOptions, ) => AcsUsersSuspendRequest { const { client, defaults } = this @@ -2181,7 +2181,7 @@ export class SeamHttpEndpoints { * [Unsuspends](https://docs.seam.co/low-level-apis/access-systems/user-management/suspending-and-unsuspending-users#unsuspend-an-acs-user) a specified suspended [access system user](https://docs.seam.co/low-level-apis/access-systems/user-management). While [suspending an access system user](https://docs.seam.co/api/acs/users/suspend) revokes their access temporarily, unsuspending the access system user restores their access. */ get '/acs/users/unsuspend'(): ( - parameters?: AcsUsersUnsuspendParameters, + parameters: AcsUsersUnsuspendParameters, options?: AcsUsersUnsuspendOptions, ) => AcsUsersUnsuspendRequest { const { client, defaults } = this @@ -2197,7 +2197,7 @@ export class SeamHttpEndpoints { * Updates the properties of a specified [access system user](https://docs.seam.co/low-level-apis/access-systems/user-management). */ get '/acs/users/update'(): ( - parameters?: AcsUsersUpdateParameters, + parameters: AcsUsersUpdateParameters, options?: AcsUsersUpdateOptions, ) => AcsUsersUpdateRequest { const { client, defaults } = this @@ -2309,7 +2309,7 @@ export class SeamHttpEndpoints { * Grants a [client session](https://docs.seam.co/core-concepts/authentication/client-session-tokens) access to one or more resources, such as [Connect Webviews](https://docs.seam.co/core-concepts/connect-webviews), [user identities](https://docs.seam.co/capability-guides/mobile-access/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity), and so on. */ get '/client_sessions/grant_access'(): ( - parameters?: ClientSessionsGrantAccessParameters, + parameters: ClientSessionsGrantAccessParameters, options?: ClientSessionsGrantAccessOptions, ) => ClientSessionsGrantAccessRequest { const { client, defaults } = this @@ -2453,7 +2453,7 @@ export class SeamHttpEndpoints { * Returns a specified [connected account](https://docs.seam.co/core-concepts/connected-accounts). */ get '/connected_accounts/get'(): ( - parameters?: ConnectedAccountsGetParameters, + parameters: ConnectedAccountsGetParameters, options?: ConnectedAccountsGetOptions, ) => ConnectedAccountsGetRequest { const { client, defaults } = this @@ -2587,7 +2587,7 @@ export class SeamHttpEndpoints { * You must specify either `device_id` or `name`. */ get '/devices/get'(): ( - parameters?: DevicesGetParameters, + parameters: DevicesGetParameters, options?: DevicesGetOptions, ) => DevicesGetRequest { const { client, defaults } = this @@ -2782,7 +2782,7 @@ export class SeamHttpEndpoints { * You must specify either `device_id` or `name`. */ get '/devices/unmanaged/get'(): ( - parameters?: DevicesUnmanagedGetParameters, + parameters: DevicesUnmanagedGetParameters, options?: DevicesUnmanagedGetOptions, ) => DevicesUnmanagedGetRequest { const { client, defaults } = this @@ -2834,7 +2834,7 @@ export class SeamHttpEndpoints { * Returns a specified event. This endpoint returns the same event that would be sent to a [webhook](https://docs.seam.co/developer-tools/webhooks), but it enables you to retrieve an event that already took place. */ get '/events/get'(): ( - parameters?: EventsGetParameters, + parameters: EventsGetParameters, options?: EventsGetOptions, ) => EventsGetRequest { const { client, defaults } = this @@ -2850,7 +2850,7 @@ export class SeamHttpEndpoints { * Returns a list of all events. This endpoint returns the same events that would be sent to a [webhook](https://docs.seam.co/developer-tools/webhooks), but it enables you to filter or see events that already took place. */ get '/events/list'(): ( - parameters?: EventsListParameters, + parameters: EventsListParameters, options?: EventsListOptions, ) => EventsListRequest { const { client, defaults } = this @@ -2882,7 +2882,7 @@ export class SeamHttpEndpoints { * Gets an [instant key](https://docs.seam.co/capability-guides/instant-keys). */ get '/instant_keys/get'(): ( - parameters?: InstantKeysGetParameters, + parameters: InstantKeysGetParameters, options?: InstantKeysGetOptions, ) => InstantKeysGetRequest { const { client, defaults } = this @@ -2931,7 +2931,7 @@ export class SeamHttpEndpoints { * @deprecated Use `/devices/get` instead. */ get '/locks/get'(): ( - parameters?: LocksGetParameters, + parameters: LocksGetParameters, options?: LocksGetOptions, ) => LocksGetRequest { const { client, defaults } = this @@ -3298,7 +3298,7 @@ export class SeamHttpEndpoints { * Gets a space. */ get '/spaces/get'(): ( - parameters?: SpacesGetParameters, + parameters: SpacesGetParameters, options?: SpacesGetOptions, ) => SpacesGetRequest { const { client, defaults } = this @@ -3314,7 +3314,7 @@ export class SeamHttpEndpoints { * Gets all related resources for one or more Spaces. */ get '/spaces/get_related'(): ( - parameters?: SpacesGetRelatedParameters, + parameters: SpacesGetRelatedParameters, options?: SpacesGetRelatedOptions, ) => SpacesGetRelatedRequest { const { client, defaults } = this @@ -3862,7 +3862,7 @@ export class SeamHttpEndpoints { * Returns a specified [user identity](https://docs.seam.co/capability-guides/mobile-access/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). */ get '/user_identities/get'(): ( - parameters?: UserIdentitiesGetParameters, + parameters: UserIdentitiesGetParameters, options?: UserIdentitiesGetOptions, ) => UserIdentitiesGetRequest { const { client, defaults } = this diff --git a/src/lib/routes/spaces/spaces.ts b/src/lib/routes/spaces/spaces.ts index 767261ae..7e0431fc 100644 --- a/src/lib/routes/spaces/spaces.ts +++ b/src/lib/routes/spaces/spaces.ts @@ -28,6 +28,10 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { + assertValidRequestParameters, + type RequireAtLeastOne, +} from 'lib/request-parameters.js' import type { Batch } from 'lib/resources/batch.js' import type { Space } from 'lib/resources/space.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' @@ -166,6 +170,8 @@ export class SeamHttpSpaces { parameters: SpacesAddAcsEntrancesParameters, options: SpacesAddAcsEntrancesOptions = {}, ): SpacesAddAcsEntrancesRequest { + assertValidRequestParameters(parameters, '/spaces/add_acs_entrances', true) + return new SeamHttpRequest(this, { pathname: '/spaces/add_acs_entrances', method: 'PUT', @@ -182,6 +188,12 @@ export class SeamHttpSpaces { parameters: SpacesAddConnectedAccountParameters, options: SpacesAddConnectedAccountOptions = {}, ): SpacesAddConnectedAccountRequest { + assertValidRequestParameters( + parameters, + '/spaces/add_connected_account', + true, + ) + return new SeamHttpRequest(this, { pathname: '/spaces/add_connected_account', method: 'PUT', @@ -198,6 +210,8 @@ export class SeamHttpSpaces { parameters: SpacesAddDevicesParameters, options: SpacesAddDevicesOptions = {}, ): SpacesAddDevicesRequest { + assertValidRequestParameters(parameters, '/spaces/add_devices', true) + return new SeamHttpRequest(this, { pathname: '/spaces/add_devices', method: 'PUT', @@ -214,6 +228,8 @@ export class SeamHttpSpaces { parameters: SpacesCreateParameters, options: SpacesCreateOptions = {}, ): SpacesCreateRequest { + assertValidRequestParameters(parameters, '/spaces/create', true) + return new SeamHttpRequest(this, { pathname: '/spaces/create', method: 'POST', @@ -230,6 +246,8 @@ export class SeamHttpSpaces { parameters: SpacesDeleteParameters, options: SpacesDeleteOptions = {}, ): SpacesDeleteRequest { + assertValidRequestParameters(parameters, '/spaces/delete', true) + return new SeamHttpRequest(this, { pathname: '/spaces/delete', method: 'DELETE', @@ -243,9 +261,11 @@ export class SeamHttpSpaces { * Gets a space. */ get( - parameters?: SpacesGetParameters, + parameters: SpacesGetParameters, options: SpacesGetOptions = {}, ): SpacesGetRequest { + assertValidRequestParameters(parameters, '/spaces/get', true) + return new SeamHttpRequest(this, { pathname: '/spaces/get', method: 'GET', @@ -259,9 +279,11 @@ export class SeamHttpSpaces { * Gets all related resources for one or more Spaces. */ getRelated( - parameters?: SpacesGetRelatedParameters, + parameters: SpacesGetRelatedParameters, options: SpacesGetRelatedOptions = {}, ): SpacesGetRelatedRequest { + assertValidRequestParameters(parameters, '/spaces/get_related', true) + return new SeamHttpRequest(this, { pathname: '/spaces/get_related', method: 'POST', @@ -278,6 +300,8 @@ export class SeamHttpSpaces { parameters?: SpacesListParameters, options: SpacesListOptions = {}, ): SpacesListRequest { + assertValidRequestParameters(parameters, '/spaces/list', false) + return new SeamHttpRequest(this, { pathname: '/spaces/list', method: 'GET', @@ -294,6 +318,12 @@ export class SeamHttpSpaces { parameters: SpacesRemoveAcsEntrancesParameters, options: SpacesRemoveAcsEntrancesOptions = {}, ): SpacesRemoveAcsEntrancesRequest { + assertValidRequestParameters( + parameters, + '/spaces/remove_acs_entrances', + true, + ) + return new SeamHttpRequest(this, { pathname: '/spaces/remove_acs_entrances', method: 'POST', @@ -310,6 +340,12 @@ export class SeamHttpSpaces { parameters: SpacesRemoveConnectedAccountParameters, options: SpacesRemoveConnectedAccountOptions = {}, ): SpacesRemoveConnectedAccountRequest { + assertValidRequestParameters( + parameters, + '/spaces/remove_connected_account', + true, + ) + return new SeamHttpRequest(this, { pathname: '/spaces/remove_connected_account', method: 'DELETE', @@ -326,6 +362,8 @@ export class SeamHttpSpaces { parameters: SpacesRemoveDevicesParameters, options: SpacesRemoveDevicesOptions = {}, ): SpacesRemoveDevicesRequest { + assertValidRequestParameters(parameters, '/spaces/remove_devices', true) + return new SeamHttpRequest(this, { pathname: '/spaces/remove_devices', method: 'POST', @@ -342,6 +380,8 @@ export class SeamHttpSpaces { parameters?: SpacesUpdateParameters, options: SpacesUpdateOptions = {}, ): SpacesUpdateRequest { + assertValidRequestParameters(parameters, '/spaces/update', false) + return new SeamHttpRequest(this, { pathname: '/spaces/update', method: 'PATCH', @@ -491,7 +531,7 @@ export type SpacesDeleteRequest = SeamHttpRequest export interface SpacesDeleteOptions {} -export type SpacesGetParameters = { +export type SpacesGetParameters = RequireAtLeastOne<{ /** * ID of the space that you want to get. */ @@ -500,7 +540,7 @@ export type SpacesGetParameters = { * Unique key of the space that you want to get. */ space_key?: string | undefined -} +}> /** * @deprecated Use SpacesGetRequest instead. @@ -511,7 +551,7 @@ export type SpacesGetRequest = SeamHttpRequest export interface SpacesGetOptions {} -export type SpacesGetRelatedParameters = { +export type SpacesGetRelatedParameters = RequireAtLeastOne<{ exclude?: | Array< | 'spaces' @@ -541,7 +581,7 @@ export type SpacesGetRelatedParameters = { * Keys of the spaces that you want to get along with their related resources. */ space_keys?: Array | undefined -} +}> /** * @deprecated Use SpacesGetRelatedRequest instead. diff --git a/src/lib/routes/thermostats/daily-programs/daily-programs.ts b/src/lib/routes/thermostats/daily-programs/daily-programs.ts index 2b380a36..e7755886 100644 --- a/src/lib/routes/thermostats/daily-programs/daily-programs.ts +++ b/src/lib/routes/thermostats/daily-programs/daily-programs.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import type { ActionAttempt } from 'lib/resources/action-attempt.js' import type { ThermostatDailyProgram } from 'lib/resources/thermostat-daily-program.js' import { SeamHttpActionAttempts } from 'lib/routes/action-attempts/index.js' @@ -170,6 +171,12 @@ export class SeamHttpThermostatsDailyPrograms { parameters: ThermostatsDailyProgramsCreateParameters, options: ThermostatsDailyProgramsCreateOptions = {}, ): ThermostatsDailyProgramsCreateRequest { + assertValidRequestParameters( + parameters, + '/thermostats/daily_programs/create', + true, + ) + return new SeamHttpRequest(this, { pathname: '/thermostats/daily_programs/create', method: 'POST', @@ -186,6 +193,12 @@ export class SeamHttpThermostatsDailyPrograms { parameters: ThermostatsDailyProgramsDeleteParameters, options: ThermostatsDailyProgramsDeleteOptions = {}, ): ThermostatsDailyProgramsDeleteRequest { + assertValidRequestParameters( + parameters, + '/thermostats/daily_programs/delete', + true, + ) + return new SeamHttpRequest(this, { pathname: '/thermostats/daily_programs/delete', method: 'DELETE', @@ -202,6 +215,12 @@ export class SeamHttpThermostatsDailyPrograms { parameters: ThermostatsDailyProgramsUpdateParameters, options: ThermostatsDailyProgramsUpdateOptions = {}, ): ThermostatsDailyProgramsUpdateRequest { + assertValidRequestParameters( + parameters, + '/thermostats/daily_programs/update', + true, + ) + return new SeamHttpRequest(this, { pathname: '/thermostats/daily_programs/update', method: 'PATCH', diff --git a/src/lib/routes/thermostats/schedules/schedules.ts b/src/lib/routes/thermostats/schedules/schedules.ts index 31a89446..202eede1 100644 --- a/src/lib/routes/thermostats/schedules/schedules.ts +++ b/src/lib/routes/thermostats/schedules/schedules.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import type { ThermostatSchedule } from 'lib/resources/thermostat-schedule.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' @@ -165,6 +166,12 @@ export class SeamHttpThermostatsSchedules { parameters: ThermostatsSchedulesCreateParameters, options: ThermostatsSchedulesCreateOptions = {}, ): ThermostatsSchedulesCreateRequest { + assertValidRequestParameters( + parameters, + '/thermostats/schedules/create', + true, + ) + return new SeamHttpRequest(this, { pathname: '/thermostats/schedules/create', method: 'POST', @@ -181,6 +188,12 @@ export class SeamHttpThermostatsSchedules { parameters: ThermostatsSchedulesDeleteParameters, options: ThermostatsSchedulesDeleteOptions = {}, ): ThermostatsSchedulesDeleteRequest { + assertValidRequestParameters( + parameters, + '/thermostats/schedules/delete', + true, + ) + return new SeamHttpRequest(this, { pathname: '/thermostats/schedules/delete', method: 'DELETE', @@ -197,6 +210,8 @@ export class SeamHttpThermostatsSchedules { parameters: ThermostatsSchedulesGetParameters, options: ThermostatsSchedulesGetOptions = {}, ): ThermostatsSchedulesGetRequest { + assertValidRequestParameters(parameters, '/thermostats/schedules/get', true) + return new SeamHttpRequest(this, { pathname: '/thermostats/schedules/get', method: 'GET', @@ -213,6 +228,12 @@ export class SeamHttpThermostatsSchedules { parameters: ThermostatsSchedulesListParameters, options: ThermostatsSchedulesListOptions = {}, ): ThermostatsSchedulesListRequest { + assertValidRequestParameters( + parameters, + '/thermostats/schedules/list', + true, + ) + return new SeamHttpRequest(this, { pathname: '/thermostats/schedules/list', method: 'GET', @@ -229,6 +250,12 @@ export class SeamHttpThermostatsSchedules { parameters: ThermostatsSchedulesUpdateParameters, options: ThermostatsSchedulesUpdateOptions = {}, ): ThermostatsSchedulesUpdateRequest { + assertValidRequestParameters( + parameters, + '/thermostats/schedules/update', + true, + ) + return new SeamHttpRequest(this, { pathname: '/thermostats/schedules/update', method: 'PATCH', diff --git a/src/lib/routes/thermostats/simulate/simulate.ts b/src/lib/routes/thermostats/simulate/simulate.ts index 8c0cd8bc..e21c4d25 100644 --- a/src/lib/routes/thermostats/simulate/simulate.ts +++ b/src/lib/routes/thermostats/simulate/simulate.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' import { SeamPaginator } from 'lib/seam-paginator.js' @@ -164,6 +165,12 @@ export class SeamHttpThermostatsSimulate { parameters: ThermostatsSimulateHvacModeAdjustedParameters, options: ThermostatsSimulateHvacModeAdjustedOptions = {}, ): ThermostatsSimulateHvacModeAdjustedRequest { + assertValidRequestParameters( + parameters, + '/thermostats/simulate/hvac_mode_adjusted', + true, + ) + return new SeamHttpRequest(this, { pathname: '/thermostats/simulate/hvac_mode_adjusted', method: 'POST', @@ -180,6 +187,12 @@ export class SeamHttpThermostatsSimulate { parameters: ThermostatsSimulateTemperatureReachedParameters, options: ThermostatsSimulateTemperatureReachedOptions = {}, ): ThermostatsSimulateTemperatureReachedRequest { + assertValidRequestParameters( + parameters, + '/thermostats/simulate/temperature_reached', + true, + ) + return new SeamHttpRequest(this, { pathname: '/thermostats/simulate/temperature_reached', method: 'POST', diff --git a/src/lib/routes/thermostats/thermostats.ts b/src/lib/routes/thermostats/thermostats.ts index 908b130d..9c7db633 100644 --- a/src/lib/routes/thermostats/thermostats.ts +++ b/src/lib/routes/thermostats/thermostats.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import type { ActionAttempt } from 'lib/resources/action-attempt.js' import type { Device } from 'lib/resources/device.js' import { SeamHttpActionAttempts } from 'lib/routes/action-attempts/index.js' @@ -186,6 +187,12 @@ export class SeamHttpThermostats { parameters: ThermostatsActivateClimatePresetParameters, options: ThermostatsActivateClimatePresetOptions = {}, ): ThermostatsActivateClimatePresetRequest { + assertValidRequestParameters( + parameters, + '/thermostats/activate_climate_preset', + true, + ) + return new SeamHttpRequest(this, { pathname: '/thermostats/activate_climate_preset', method: 'POST', @@ -206,6 +213,8 @@ export class SeamHttpThermostats { parameters: ThermostatsCoolParameters, options: ThermostatsCoolOptions = {}, ): ThermostatsCoolRequest { + assertValidRequestParameters(parameters, '/thermostats/cool', true) + return new SeamHttpRequest(this, { pathname: '/thermostats/cool', method: 'POST', @@ -226,6 +235,12 @@ export class SeamHttpThermostats { parameters: ThermostatsCreateClimatePresetParameters, options: ThermostatsCreateClimatePresetOptions = {}, ): ThermostatsCreateClimatePresetRequest { + assertValidRequestParameters( + parameters, + '/thermostats/create_climate_preset', + true, + ) + return new SeamHttpRequest(this, { pathname: '/thermostats/create_climate_preset', method: 'POST', @@ -242,6 +257,12 @@ export class SeamHttpThermostats { parameters: ThermostatsDeleteClimatePresetParameters, options: ThermostatsDeleteClimatePresetOptions = {}, ): ThermostatsDeleteClimatePresetRequest { + assertValidRequestParameters( + parameters, + '/thermostats/delete_climate_preset', + true, + ) + return new SeamHttpRequest(this, { pathname: '/thermostats/delete_climate_preset', method: 'DELETE', @@ -258,6 +279,8 @@ export class SeamHttpThermostats { parameters: ThermostatsHeatParameters, options: ThermostatsHeatOptions = {}, ): ThermostatsHeatRequest { + assertValidRequestParameters(parameters, '/thermostats/heat', true) + return new SeamHttpRequest(this, { pathname: '/thermostats/heat', method: 'POST', @@ -278,6 +301,8 @@ export class SeamHttpThermostats { parameters: ThermostatsHeatCoolParameters, options: ThermostatsHeatCoolOptions = {}, ): ThermostatsHeatCoolRequest { + assertValidRequestParameters(parameters, '/thermostats/heat_cool', true) + return new SeamHttpRequest(this, { pathname: '/thermostats/heat_cool', method: 'POST', @@ -298,6 +323,8 @@ export class SeamHttpThermostats { parameters?: ThermostatsListParameters, options: ThermostatsListOptions = {}, ): ThermostatsListRequest { + assertValidRequestParameters(parameters, '/thermostats/list', false) + return new SeamHttpRequest(this, { pathname: '/thermostats/list', method: 'POST', @@ -314,6 +341,8 @@ export class SeamHttpThermostats { parameters: ThermostatsOffParameters, options: ThermostatsOffOptions = {}, ): ThermostatsOffRequest { + assertValidRequestParameters(parameters, '/thermostats/off', true) + return new SeamHttpRequest(this, { pathname: '/thermostats/off', method: 'POST', @@ -334,6 +363,12 @@ export class SeamHttpThermostats { parameters: ThermostatsSetFallbackClimatePresetParameters, options: ThermostatsSetFallbackClimatePresetOptions = {}, ): ThermostatsSetFallbackClimatePresetRequest { + assertValidRequestParameters( + parameters, + '/thermostats/set_fallback_climate_preset', + true, + ) + return new SeamHttpRequest(this, { pathname: '/thermostats/set_fallback_climate_preset', method: 'POST', @@ -350,6 +385,8 @@ export class SeamHttpThermostats { parameters: ThermostatsSetFanModeParameters, options: ThermostatsSetFanModeOptions = {}, ): ThermostatsSetFanModeRequest { + assertValidRequestParameters(parameters, '/thermostats/set_fan_mode', true) + return new SeamHttpRequest(this, { pathname: '/thermostats/set_fan_mode', method: 'POST', @@ -370,6 +407,8 @@ export class SeamHttpThermostats { parameters: ThermostatsSetHvacModeParameters, options: ThermostatsSetHvacModeOptions = {}, ): ThermostatsSetHvacModeRequest { + assertValidRequestParameters(parameters, '/thermostats/set_hvac_mode', true) + return new SeamHttpRequest(this, { pathname: '/thermostats/set_hvac_mode', method: 'POST', @@ -390,6 +429,12 @@ export class SeamHttpThermostats { parameters: ThermostatsSetTemperatureThresholdParameters, options: ThermostatsSetTemperatureThresholdOptions = {}, ): ThermostatsSetTemperatureThresholdRequest { + assertValidRequestParameters( + parameters, + '/thermostats/set_temperature_threshold', + true, + ) + return new SeamHttpRequest(this, { pathname: '/thermostats/set_temperature_threshold', method: 'PATCH', @@ -406,6 +451,12 @@ export class SeamHttpThermostats { parameters: ThermostatsUpdateClimatePresetParameters, options: ThermostatsUpdateClimatePresetOptions = {}, ): ThermostatsUpdateClimatePresetRequest { + assertValidRequestParameters( + parameters, + '/thermostats/update_climate_preset', + true, + ) + return new SeamHttpRequest(this, { pathname: '/thermostats/update_climate_preset', method: 'PATCH', @@ -422,6 +473,12 @@ export class SeamHttpThermostats { parameters: ThermostatsUpdateWeeklyProgramParameters, options: ThermostatsUpdateWeeklyProgramOptions = {}, ): ThermostatsUpdateWeeklyProgramRequest { + assertValidRequestParameters( + parameters, + '/thermostats/update_weekly_program', + true, + ) + return new SeamHttpRequest(this, { pathname: '/thermostats/update_weekly_program', method: 'POST', diff --git a/src/lib/routes/user-identities/unmanaged/unmanaged.ts b/src/lib/routes/user-identities/unmanaged/unmanaged.ts index a401e0e9..b2d0cf7d 100644 --- a/src/lib/routes/user-identities/unmanaged/unmanaged.ts +++ b/src/lib/routes/user-identities/unmanaged/unmanaged.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import type { UnmanagedUserIdentity } from 'lib/resources/unmanaged-user-identity.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' @@ -168,6 +169,12 @@ export class SeamHttpUserIdentitiesUnmanaged { parameters: UserIdentitiesUnmanagedGetParameters, options: UserIdentitiesUnmanagedGetOptions = {}, ): UserIdentitiesUnmanagedGetRequest { + assertValidRequestParameters( + parameters, + '/user_identities/unmanaged/get', + true, + ) + return new SeamHttpRequest(this, { pathname: '/user_identities/unmanaged/get', method: 'GET', @@ -184,6 +191,12 @@ export class SeamHttpUserIdentitiesUnmanaged { parameters?: UserIdentitiesUnmanagedListParameters, options: UserIdentitiesUnmanagedListOptions = {}, ): UserIdentitiesUnmanagedListRequest { + assertValidRequestParameters( + parameters, + '/user_identities/unmanaged/list', + false, + ) + return new SeamHttpRequest(this, { pathname: '/user_identities/unmanaged/list', method: 'GET', @@ -202,6 +215,12 @@ export class SeamHttpUserIdentitiesUnmanaged { parameters: UserIdentitiesUnmanagedUpdateParameters, options: UserIdentitiesUnmanagedUpdateOptions = {}, ): UserIdentitiesUnmanagedUpdateRequest { + assertValidRequestParameters( + parameters, + '/user_identities/unmanaged/update', + true, + ) + return new SeamHttpRequest(this, { pathname: '/user_identities/unmanaged/update', method: 'PATCH', diff --git a/src/lib/routes/user-identities/user-identities.ts b/src/lib/routes/user-identities/user-identities.ts index e5f9de1b..360b5a55 100644 --- a/src/lib/routes/user-identities/user-identities.ts +++ b/src/lib/routes/user-identities/user-identities.ts @@ -28,6 +28,10 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { + assertValidRequestParameters, + type RequireAtLeastOne, +} from 'lib/request-parameters.js' import type { AcsEntrance } from 'lib/resources/acs-entrance.js' import type { AcsSystem } from 'lib/resources/acs-system.js' import type { AcsUser } from 'lib/resources/acs-user.js' @@ -183,6 +187,12 @@ export class SeamHttpUserIdentities { parameters: UserIdentitiesAddAcsUserParameters, options: UserIdentitiesAddAcsUserOptions = {}, ): UserIdentitiesAddAcsUserRequest { + assertValidRequestParameters( + parameters, + '/user_identities/add_acs_user', + true, + ) + return new SeamHttpRequest(this, { pathname: '/user_identities/add_acs_user', method: 'PUT', @@ -199,6 +209,8 @@ export class SeamHttpUserIdentities { parameters?: UserIdentitiesCreateParameters, options: UserIdentitiesCreateOptions = {}, ): UserIdentitiesCreateRequest { + assertValidRequestParameters(parameters, '/user_identities/create', false) + return new SeamHttpRequest(this, { pathname: '/user_identities/create', method: 'POST', @@ -215,6 +227,8 @@ export class SeamHttpUserIdentities { parameters: UserIdentitiesDeleteParameters, options: UserIdentitiesDeleteOptions = {}, ): UserIdentitiesDeleteRequest { + assertValidRequestParameters(parameters, '/user_identities/delete', true) + return new SeamHttpRequest(this, { pathname: '/user_identities/delete', method: 'DELETE', @@ -231,6 +245,12 @@ export class SeamHttpUserIdentities { parameters: UserIdentitiesGenerateInstantKeyParameters, options: UserIdentitiesGenerateInstantKeyOptions = {}, ): UserIdentitiesGenerateInstantKeyRequest { + assertValidRequestParameters( + parameters, + '/user_identities/generate_instant_key', + true, + ) + return new SeamHttpRequest(this, { pathname: '/user_identities/generate_instant_key', method: 'POST', @@ -244,9 +264,11 @@ export class SeamHttpUserIdentities { * Returns a specified [user identity](https://docs.seam.co/capability-guides/mobile-access/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). */ get( - parameters?: UserIdentitiesGetParameters, + parameters: UserIdentitiesGetParameters, options: UserIdentitiesGetOptions = {}, ): UserIdentitiesGetRequest { + assertValidRequestParameters(parameters, '/user_identities/get', true) + return new SeamHttpRequest(this, { pathname: '/user_identities/get', method: 'GET', @@ -263,6 +285,12 @@ export class SeamHttpUserIdentities { parameters: UserIdentitiesGrantAccessToDeviceParameters, options: UserIdentitiesGrantAccessToDeviceOptions = {}, ): UserIdentitiesGrantAccessToDeviceRequest { + assertValidRequestParameters( + parameters, + '/user_identities/grant_access_to_device', + true, + ) + return new SeamHttpRequest(this, { pathname: '/user_identities/grant_access_to_device', method: 'PUT', @@ -279,6 +307,8 @@ export class SeamHttpUserIdentities { parameters?: UserIdentitiesListParameters, options: UserIdentitiesListOptions = {}, ): UserIdentitiesListRequest { + assertValidRequestParameters(parameters, '/user_identities/list', false) + return new SeamHttpRequest(this, { pathname: '/user_identities/list', method: 'POST', @@ -295,6 +325,12 @@ export class SeamHttpUserIdentities { parameters: UserIdentitiesListAccessibleDevicesParameters, options: UserIdentitiesListAccessibleDevicesOptions = {}, ): UserIdentitiesListAccessibleDevicesRequest { + assertValidRequestParameters( + parameters, + '/user_identities/list_accessible_devices', + true, + ) + return new SeamHttpRequest(this, { pathname: '/user_identities/list_accessible_devices', method: 'GET', @@ -311,6 +347,12 @@ export class SeamHttpUserIdentities { parameters: UserIdentitiesListAccessibleEntrancesParameters, options: UserIdentitiesListAccessibleEntrancesOptions = {}, ): UserIdentitiesListAccessibleEntrancesRequest { + assertValidRequestParameters( + parameters, + '/user_identities/list_accessible_entrances', + true, + ) + return new SeamHttpRequest(this, { pathname: '/user_identities/list_accessible_entrances', method: 'GET', @@ -327,6 +369,12 @@ export class SeamHttpUserIdentities { parameters: UserIdentitiesListAcsSystemsParameters, options: UserIdentitiesListAcsSystemsOptions = {}, ): UserIdentitiesListAcsSystemsRequest { + assertValidRequestParameters( + parameters, + '/user_identities/list_acs_systems', + true, + ) + return new SeamHttpRequest(this, { pathname: '/user_identities/list_acs_systems', method: 'GET', @@ -343,6 +391,12 @@ export class SeamHttpUserIdentities { parameters: UserIdentitiesListAcsUsersParameters, options: UserIdentitiesListAcsUsersOptions = {}, ): UserIdentitiesListAcsUsersRequest { + assertValidRequestParameters( + parameters, + '/user_identities/list_acs_users', + true, + ) + return new SeamHttpRequest(this, { pathname: '/user_identities/list_acs_users', method: 'GET', @@ -359,6 +413,12 @@ export class SeamHttpUserIdentities { parameters: UserIdentitiesRemoveAcsUserParameters, options: UserIdentitiesRemoveAcsUserOptions = {}, ): UserIdentitiesRemoveAcsUserRequest { + assertValidRequestParameters( + parameters, + '/user_identities/remove_acs_user', + true, + ) + return new SeamHttpRequest(this, { pathname: '/user_identities/remove_acs_user', method: 'DELETE', @@ -375,6 +435,12 @@ export class SeamHttpUserIdentities { parameters: UserIdentitiesRevokeAccessToDeviceParameters, options: UserIdentitiesRevokeAccessToDeviceOptions = {}, ): UserIdentitiesRevokeAccessToDeviceRequest { + assertValidRequestParameters( + parameters, + '/user_identities/revoke_access_to_device', + true, + ) + return new SeamHttpRequest(this, { pathname: '/user_identities/revoke_access_to_device', method: 'DELETE', @@ -391,6 +457,8 @@ export class SeamHttpUserIdentities { parameters: UserIdentitiesUpdateParameters, options: UserIdentitiesUpdateOptions = {}, ): UserIdentitiesUpdateRequest { + assertValidRequestParameters(parameters, '/user_identities/update', true) + return new SeamHttpRequest(this, { pathname: '/user_identities/update', method: 'PATCH', @@ -503,14 +571,14 @@ export type UserIdentitiesGenerateInstantKeyRequest = SeamHttpRequest< export interface UserIdentitiesGenerateInstantKeyOptions {} -export type UserIdentitiesGetParameters = { +export type UserIdentitiesGetParameters = RequireAtLeastOne<{ /** * ID of the user identity that you want to get. */ user_identity_id?: string | undefined user_identity_key?: string | undefined -} +}> /** * @deprecated Use UserIdentitiesGetRequest instead. diff --git a/src/lib/routes/webhooks/webhooks.ts b/src/lib/routes/webhooks/webhooks.ts index bf30e3e5..c8676c0e 100644 --- a/src/lib/routes/webhooks/webhooks.ts +++ b/src/lib/routes/webhooks/webhooks.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import type { Webhook } from 'lib/resources/webhook.js' import { SeamHttpClientSessions } from 'lib/routes/client-sessions/index.js' import { SeamHttpRequest } from 'lib/seam-http-request.js' @@ -165,6 +166,8 @@ export class SeamHttpWebhooks { parameters: WebhooksCreateParameters, options: WebhooksCreateOptions = {}, ): WebhooksCreateRequest { + assertValidRequestParameters(parameters, '/webhooks/create', true) + return new SeamHttpRequest(this, { pathname: '/webhooks/create', method: 'POST', @@ -181,6 +184,8 @@ export class SeamHttpWebhooks { parameters: WebhooksDeleteParameters, options: WebhooksDeleteOptions = {}, ): WebhooksDeleteRequest { + assertValidRequestParameters(parameters, '/webhooks/delete', true) + return new SeamHttpRequest(this, { pathname: '/webhooks/delete', method: 'DELETE', @@ -197,6 +202,8 @@ export class SeamHttpWebhooks { parameters: WebhooksGetParameters, options: WebhooksGetOptions = {}, ): WebhooksGetRequest { + assertValidRequestParameters(parameters, '/webhooks/get', true) + return new SeamHttpRequest(this, { pathname: '/webhooks/get', method: 'GET', @@ -213,6 +220,8 @@ export class SeamHttpWebhooks { parameters?: WebhooksListParameters, options: WebhooksListOptions = {}, ): WebhooksListRequest { + assertValidRequestParameters(parameters, '/webhooks/list', false) + return new SeamHttpRequest(this, { pathname: '/webhooks/list', method: 'GET', @@ -229,6 +238,8 @@ export class SeamHttpWebhooks { parameters: WebhooksUpdateParameters, options: WebhooksUpdateOptions = {}, ): WebhooksUpdateRequest { + assertValidRequestParameters(parameters, '/webhooks/update', true) + return new SeamHttpRequest(this, { pathname: '/webhooks/update', method: 'PUT', diff --git a/src/lib/routes/workspaces/workspaces.ts b/src/lib/routes/workspaces/workspaces.ts index c2c08ea2..eabff583 100644 --- a/src/lib/routes/workspaces/workspaces.ts +++ b/src/lib/routes/workspaces/workspaces.ts @@ -28,6 +28,7 @@ import { limitToSeamHttpRequestOptions, parseOptions, } from 'lib/parse-options.js' +import { assertValidRequestParameters } from 'lib/request-parameters.js' import type { ActionAttempt } from 'lib/resources/action-attempt.js' import type { Workspace } from 'lib/resources/workspace.js' import { SeamHttpActionAttempts } from 'lib/routes/action-attempts/index.js' @@ -167,6 +168,8 @@ export class SeamHttpWorkspaces { parameters: WorkspacesCreateParameters, options: WorkspacesCreateOptions = {}, ): WorkspacesCreateRequest { + assertValidRequestParameters(parameters, '/workspaces/create', true) + return new SeamHttpRequest(this, { pathname: '/workspaces/create', method: 'POST', @@ -183,6 +186,8 @@ export class SeamHttpWorkspaces { parameters?: WorkspacesGetParameters, options: WorkspacesGetOptions = {}, ): WorkspacesGetRequest { + assertValidRequestParameters(parameters, '/workspaces/get', false) + return new SeamHttpRequest(this, { pathname: '/workspaces/get', method: 'GET', @@ -199,6 +204,8 @@ export class SeamHttpWorkspaces { parameters?: WorkspacesListParameters, options: WorkspacesListOptions = {}, ): WorkspacesListRequest { + assertValidRequestParameters(parameters, '/workspaces/list', false) + return new SeamHttpRequest(this, { pathname: '/workspaces/list', method: 'GET', @@ -215,6 +222,8 @@ export class SeamHttpWorkspaces { parameters?: WorkspacesResetSandboxParameters, options: WorkspacesResetSandboxOptions = {}, ): WorkspacesResetSandboxRequest { + assertValidRequestParameters(parameters, '/workspaces/reset_sandbox', false) + return new SeamHttpRequest(this, { pathname: '/workspaces/reset_sandbox', method: 'POST', @@ -235,6 +244,8 @@ export class SeamHttpWorkspaces { parameters?: WorkspacesUpdateParameters, options: WorkspacesUpdateOptions = {}, ): WorkspacesUpdateRequest { + assertValidRequestParameters(parameters, '/workspaces/update', false) + return new SeamHttpRequest(this, { pathname: '/workspaces/update', method: 'PATCH', diff --git a/test/seam/connect/request-parameters.test.ts b/test/seam/connect/request-parameters.test.ts new file mode 100644 index 00000000..e1125b5d --- /dev/null +++ b/test/seam/connect/request-parameters.test.ts @@ -0,0 +1,53 @@ +import test from 'ava' + +import { SeamHttp } from '@seamapi/http/connect' + +const seam = SeamHttp.fromApiKey('seam_apikey1_token') + +test('endpoint rejects missing required parameters', (t) => { + t.throws( + () => { + // @ts-expect-error Verify requiredness in the generated method signature. + seam.devices.get() + }, + { + instanceOf: TypeError, + message: 'Parameters are required for /devices/get', + }, + ) +}) + +test('endpoint rejects an empty required parameters object', (t) => { + t.throws( + () => { + // @ts-expect-error Verify RequireAtLeastOne in the generated parameter type. + seam.devices.get({}) + }, + { + instanceOf: TypeError, + message: 'Parameters for /devices/get must contain at least one property', + }, + ) +}) + +test('endpoint rejects non-object parameters', (t) => { + t.throws( + () => { + // @ts-expect-error Verify the generated parameter type rejects primitives. + seam.devices.list('invalid') + }, + { + instanceOf: TypeError, + message: 'Parameters for /devices/list must be an object', + }, + ) +}) + +test('endpoint accepts omitted optional parameters', (t) => { + t.notThrows(() => seam.devices.list()) +}) + +test('endpoint accepts required parameters', (t) => { + t.notThrows(() => seam.devices.get({ device_id: 'device-id' })) + t.notThrows(() => seam.devices.get({ name: 'Front Door' })) +}) diff --git a/test/seam/connect/seam-paginator.test.ts b/test/seam/connect/seam-paginator.test.ts index 888990ca..e3eba03a 100644 --- a/test/seam/connect/seam-paginator.test.ts +++ b/test/seam/connect/seam-paginator.test.ts @@ -14,10 +14,14 @@ test('SeamPaginator: cannot paginate a request with an empty response', async (t const { seed, endpoint } = await getTestServer(t) const seam = SeamHttp.fromApiKey(seed.seam_apikey1_token, { endpoint }) - // @ts-expect-error Testing validation - t.throws(() => seam.createPaginator(seam.devices.update()), { - message: /does not support pagination/, - }) + t.throws( + () => + seam.createPaginator( + // @ts-expect-error Testing validation of a non-paginated request. + seam.devices.update({ device_id: 'test-device-id' }), + ), + { message: /does not support pagination/ }, + ) }) // TODO: Validate the request supports pagination by extending SeamHttpRequest with this knowledge via codegen.