diff --git a/generate-routes.ts b/generate-routes.ts index 9d8cb281..3a2703e9 100644 --- a/generate-routes.ts +++ b/generate-routes.ts @@ -1,10 +1,44 @@ import { writeFile } from 'node:fs/promises' import { resolve } from 'node:path' -import { camelCase, pascalCase, snakeCase } from 'change-case' +import { openapi } from '@seamapi/types/connect' +import { camelCase, paramCase, pascalCase, snakeCase } from 'change-case' import { ESLint } from 'eslint' import { format, resolveConfig } from 'prettier' +const routeOutputPath = resolve('src', 'lib', 'seam', 'connect', 'routes') + +const routePaths: string[] = [ + '/access_codes', + '/access_codes/unmanaged', + '/acs/access_groups', + '/acs/credentials', + '/acs/systems', + '/acs/users', + '/action_attempts', + '/client_sessions', + '/connect_webviews', + '/connected_accounts', + '/devices', + '/devices/unmanaged', + '/events', + '/locks', + '/noise_sensors/noise_thresholds', + '/thermostats/climate_setting_schedules', + '/thermostats', + '/webhooks', + '/workspaces', +] + +const ignoredEndpointPaths = [ + '/access_codes/simulate/create_unmanaged_access_code', + '/health', + '/health/get_health', + '/health/get_service_health', + '/health/service/[service_name]', + '/noise_sensors/simulate/trigger_noise_threshold', +] + interface Route { namespace: string endpoints: Endpoint[] @@ -19,6 +53,58 @@ interface Endpoint { requestFormat: 'params' | 'body' } +const exampleRoute: Route = { + namespace: 'workspaces', + endpoints: [ + { + name: 'get', + namespace: 'workspaces', + path: '/workspaces/get', + method: 'GET', + resource: 'workspace', + requestFormat: ['GET', 'DELETE'].includes('GET') ? 'params' : 'body', + }, + ], +} + +const isEndpointUnderRoute = ( + endpointPath: string, + routePath: string, +): boolean => + endpointPath.startsWith(routePath) && + endpointPath.split('/').length - 1 === routePath.split('/').length + +const createRoutes = (): Route[] => { + const paths = Object.keys(openapi.paths) + + const unmatchedEndpointPaths = paths + .filter( + (path) => + !routePaths.some((routePath) => isEndpointUnderRoute(path, routePath)), + ) + .filter((path) => !ignoredEndpointPaths.includes(path)) + + if (unmatchedEndpointPaths.length > 0) { + // eslint-disable-next-line no-console + console.warn( + `The following endpoints will not be generated:\n${unmatchedEndpointPaths.join( + '\n', + )}`, + ) + } + + return routePaths.map(createRoute) +} + +const createRoute = (routePath: string): Route => { + return { + namespace: routePath.split('/').join('_').slice(1), + endpoints: [], + } +} + +const routes = createRoutes() + const renderRoute = (route: Route): string => ` /* * Automatically generated by generate-routes.ts. @@ -43,9 +129,9 @@ import type { SeamHttpOptions } from 'lib/seam/connect/client-options.js' import { parseOptions } from 'lib/seam/connect/parse-options.js' ` -const renderClass = ({ endpoints }: Route): string => +const renderClass = ({ namespace, endpoints }: Route): string => ` -export class SeamHttpWorkspaces { +export class SeamHttp${pascalCase(namespace)} { client: Axios constructor(apiKeyOrOptionsOrClient: Axios | string | SeamHttpOptions) { @@ -112,11 +198,6 @@ type ${renderResponseType({ name, namespace })}= SetNonNullable< > ` -const getRequestFormat = ( - method: Endpoint['method'], -): Endpoint['requestFormat'] => - ['GET', 'DELETE'].includes(method) ? 'params' : 'body' - const renderRequestType = ({ name, namespace, @@ -130,22 +211,12 @@ const renderResponseType = ({ }: Pick): string => [pascalCase(namespace), pascalCase(name), 'Response'].join('') -const exampleRoute: Route = { - namespace: 'workspaces', - endpoints: [ - { - name: 'get', - namespace: 'workspaces', - path: '/workspaces/get', - method: 'GET', - resource: 'workspace', - requestFormat: getRequestFormat('GET'), - }, - ], -} - const write = async (data: string, ...path: string[]): Promise => { const filePath = resolve(...path) + await writeFile( + filePath, + '// Generated empty file to allow ESLint parsing by filename', + ) const fixedOutput = await eslintFixOutput(data, filePath) const prettyOutput = await prettierOutput(fixedOutput, filePath) await writeFile(filePath, prettyOutput) @@ -187,11 +258,12 @@ const eslintFixOutput = async ( return linted.output ?? linted.source ?? data } -const routeRootPath = resolve('src', 'lib', 'seam', 'connect', 'routes') const writeRoute = async (route: Route): Promise => { - await write(renderRoute(route), routeRootPath, `${route.namespace}.ts`) + await write( + renderRoute(route), + routeOutputPath, + `${paramCase(route.namespace)}.ts`, + ) } -const routes = [exampleRoute] - await Promise.all(routes.map(writeRoute)) diff --git a/src/lib/seam/connect/routes/access-codes-unmanaged.ts b/src/lib/seam/connect/routes/access-codes-unmanaged.ts new file mode 100644 index 00000000..c4e903de --- /dev/null +++ b/src/lib/seam/connect/routes/access-codes-unmanaged.ts @@ -0,0 +1,24 @@ +/* + * Automatically generated by generate-routes.ts. + * Do not edit this file or add other files to this directory. + */ + +import { Axios } from 'axios' + +import { createAxiosClient } from 'lib/seam/connect/axios.js' +import type { SeamHttpOptions } from 'lib/seam/connect/client-options.js' +import { parseOptions } from 'lib/seam/connect/parse-options.js' + +export class SeamHttpAccessCodesUnmanaged { + client: Axios + + constructor(apiKeyOrOptionsOrClient: Axios | string | SeamHttpOptions) { + if (apiKeyOrOptionsOrClient instanceof Axios) { + this.client = apiKeyOrOptionsOrClient + return + } + + const options = parseOptions(apiKeyOrOptionsOrClient) + this.client = createAxiosClient(options) + } +} diff --git a/src/lib/seam/connect/routes/access-codes.ts b/src/lib/seam/connect/routes/access-codes.ts new file mode 100644 index 00000000..4d9f0e2f --- /dev/null +++ b/src/lib/seam/connect/routes/access-codes.ts @@ -0,0 +1,24 @@ +/* + * Automatically generated by generate-routes.ts. + * Do not edit this file or add other files to this directory. + */ + +import { Axios } from 'axios' + +import { createAxiosClient } from 'lib/seam/connect/axios.js' +import type { SeamHttpOptions } from 'lib/seam/connect/client-options.js' +import { parseOptions } from 'lib/seam/connect/parse-options.js' + +export class SeamHttpAccessCodes { + client: Axios + + constructor(apiKeyOrOptionsOrClient: Axios | string | SeamHttpOptions) { + if (apiKeyOrOptionsOrClient instanceof Axios) { + this.client = apiKeyOrOptionsOrClient + return + } + + const options = parseOptions(apiKeyOrOptionsOrClient) + this.client = createAxiosClient(options) + } +} diff --git a/src/lib/seam/connect/routes/acs-access-groups.ts b/src/lib/seam/connect/routes/acs-access-groups.ts new file mode 100644 index 00000000..82ac9fa6 --- /dev/null +++ b/src/lib/seam/connect/routes/acs-access-groups.ts @@ -0,0 +1,24 @@ +/* + * Automatically generated by generate-routes.ts. + * Do not edit this file or add other files to this directory. + */ + +import { Axios } from 'axios' + +import { createAxiosClient } from 'lib/seam/connect/axios.js' +import type { SeamHttpOptions } from 'lib/seam/connect/client-options.js' +import { parseOptions } from 'lib/seam/connect/parse-options.js' + +export class SeamHttpAcsAccessGroups { + client: Axios + + constructor(apiKeyOrOptionsOrClient: Axios | string | SeamHttpOptions) { + if (apiKeyOrOptionsOrClient instanceof Axios) { + this.client = apiKeyOrOptionsOrClient + return + } + + const options = parseOptions(apiKeyOrOptionsOrClient) + this.client = createAxiosClient(options) + } +} diff --git a/src/lib/seam/connect/routes/acs-credentials.ts b/src/lib/seam/connect/routes/acs-credentials.ts new file mode 100644 index 00000000..76877cfc --- /dev/null +++ b/src/lib/seam/connect/routes/acs-credentials.ts @@ -0,0 +1,24 @@ +/* + * Automatically generated by generate-routes.ts. + * Do not edit this file or add other files to this directory. + */ + +import { Axios } from 'axios' + +import { createAxiosClient } from 'lib/seam/connect/axios.js' +import type { SeamHttpOptions } from 'lib/seam/connect/client-options.js' +import { parseOptions } from 'lib/seam/connect/parse-options.js' + +export class SeamHttpAcsCredentials { + client: Axios + + constructor(apiKeyOrOptionsOrClient: Axios | string | SeamHttpOptions) { + if (apiKeyOrOptionsOrClient instanceof Axios) { + this.client = apiKeyOrOptionsOrClient + return + } + + const options = parseOptions(apiKeyOrOptionsOrClient) + this.client = createAxiosClient(options) + } +} diff --git a/src/lib/seam/connect/routes/acs-systems.ts b/src/lib/seam/connect/routes/acs-systems.ts new file mode 100644 index 00000000..95248c26 --- /dev/null +++ b/src/lib/seam/connect/routes/acs-systems.ts @@ -0,0 +1,24 @@ +/* + * Automatically generated by generate-routes.ts. + * Do not edit this file or add other files to this directory. + */ + +import { Axios } from 'axios' + +import { createAxiosClient } from 'lib/seam/connect/axios.js' +import type { SeamHttpOptions } from 'lib/seam/connect/client-options.js' +import { parseOptions } from 'lib/seam/connect/parse-options.js' + +export class SeamHttpAcsSystems { + client: Axios + + constructor(apiKeyOrOptionsOrClient: Axios | string | SeamHttpOptions) { + if (apiKeyOrOptionsOrClient instanceof Axios) { + this.client = apiKeyOrOptionsOrClient + return + } + + const options = parseOptions(apiKeyOrOptionsOrClient) + this.client = createAxiosClient(options) + } +} diff --git a/src/lib/seam/connect/routes/acs-users.ts b/src/lib/seam/connect/routes/acs-users.ts new file mode 100644 index 00000000..c8474896 --- /dev/null +++ b/src/lib/seam/connect/routes/acs-users.ts @@ -0,0 +1,24 @@ +/* + * Automatically generated by generate-routes.ts. + * Do not edit this file or add other files to this directory. + */ + +import { Axios } from 'axios' + +import { createAxiosClient } from 'lib/seam/connect/axios.js' +import type { SeamHttpOptions } from 'lib/seam/connect/client-options.js' +import { parseOptions } from 'lib/seam/connect/parse-options.js' + +export class SeamHttpAcsUsers { + client: Axios + + constructor(apiKeyOrOptionsOrClient: Axios | string | SeamHttpOptions) { + if (apiKeyOrOptionsOrClient instanceof Axios) { + this.client = apiKeyOrOptionsOrClient + return + } + + const options = parseOptions(apiKeyOrOptionsOrClient) + this.client = createAxiosClient(options) + } +} diff --git a/src/lib/seam/connect/routes/action-attempts.ts b/src/lib/seam/connect/routes/action-attempts.ts new file mode 100644 index 00000000..b3bdb2fc --- /dev/null +++ b/src/lib/seam/connect/routes/action-attempts.ts @@ -0,0 +1,24 @@ +/* + * Automatically generated by generate-routes.ts. + * Do not edit this file or add other files to this directory. + */ + +import { Axios } from 'axios' + +import { createAxiosClient } from 'lib/seam/connect/axios.js' +import type { SeamHttpOptions } from 'lib/seam/connect/client-options.js' +import { parseOptions } from 'lib/seam/connect/parse-options.js' + +export class SeamHttpActionAttempts { + client: Axios + + constructor(apiKeyOrOptionsOrClient: Axios | string | SeamHttpOptions) { + if (apiKeyOrOptionsOrClient instanceof Axios) { + this.client = apiKeyOrOptionsOrClient + return + } + + const options = parseOptions(apiKeyOrOptionsOrClient) + this.client = createAxiosClient(options) + } +} diff --git a/src/lib/seam/connect/routes/client-sessions.ts b/src/lib/seam/connect/routes/client-sessions.ts new file mode 100644 index 00000000..3510e416 --- /dev/null +++ b/src/lib/seam/connect/routes/client-sessions.ts @@ -0,0 +1,24 @@ +/* + * Automatically generated by generate-routes.ts. + * Do not edit this file or add other files to this directory. + */ + +import { Axios } from 'axios' + +import { createAxiosClient } from 'lib/seam/connect/axios.js' +import type { SeamHttpOptions } from 'lib/seam/connect/client-options.js' +import { parseOptions } from 'lib/seam/connect/parse-options.js' + +export class SeamHttpClientSessions { + client: Axios + + constructor(apiKeyOrOptionsOrClient: Axios | string | SeamHttpOptions) { + if (apiKeyOrOptionsOrClient instanceof Axios) { + this.client = apiKeyOrOptionsOrClient + return + } + + const options = parseOptions(apiKeyOrOptionsOrClient) + this.client = createAxiosClient(options) + } +} diff --git a/src/lib/seam/connect/routes/connect-webviews.ts b/src/lib/seam/connect/routes/connect-webviews.ts new file mode 100644 index 00000000..9f9feb3a --- /dev/null +++ b/src/lib/seam/connect/routes/connect-webviews.ts @@ -0,0 +1,24 @@ +/* + * Automatically generated by generate-routes.ts. + * Do not edit this file or add other files to this directory. + */ + +import { Axios } from 'axios' + +import { createAxiosClient } from 'lib/seam/connect/axios.js' +import type { SeamHttpOptions } from 'lib/seam/connect/client-options.js' +import { parseOptions } from 'lib/seam/connect/parse-options.js' + +export class SeamHttpConnectWebviews { + client: Axios + + constructor(apiKeyOrOptionsOrClient: Axios | string | SeamHttpOptions) { + if (apiKeyOrOptionsOrClient instanceof Axios) { + this.client = apiKeyOrOptionsOrClient + return + } + + const options = parseOptions(apiKeyOrOptionsOrClient) + this.client = createAxiosClient(options) + } +} diff --git a/src/lib/seam/connect/routes/connected-accounts.ts b/src/lib/seam/connect/routes/connected-accounts.ts new file mode 100644 index 00000000..a98cbfae --- /dev/null +++ b/src/lib/seam/connect/routes/connected-accounts.ts @@ -0,0 +1,24 @@ +/* + * Automatically generated by generate-routes.ts. + * Do not edit this file or add other files to this directory. + */ + +import { Axios } from 'axios' + +import { createAxiosClient } from 'lib/seam/connect/axios.js' +import type { SeamHttpOptions } from 'lib/seam/connect/client-options.js' +import { parseOptions } from 'lib/seam/connect/parse-options.js' + +export class SeamHttpConnectedAccounts { + client: Axios + + constructor(apiKeyOrOptionsOrClient: Axios | string | SeamHttpOptions) { + if (apiKeyOrOptionsOrClient instanceof Axios) { + this.client = apiKeyOrOptionsOrClient + return + } + + const options = parseOptions(apiKeyOrOptionsOrClient) + this.client = createAxiosClient(options) + } +} diff --git a/src/lib/seam/connect/routes/devices-unmanaged.ts b/src/lib/seam/connect/routes/devices-unmanaged.ts new file mode 100644 index 00000000..e00cd11f --- /dev/null +++ b/src/lib/seam/connect/routes/devices-unmanaged.ts @@ -0,0 +1,24 @@ +/* + * Automatically generated by generate-routes.ts. + * Do not edit this file or add other files to this directory. + */ + +import { Axios } from 'axios' + +import { createAxiosClient } from 'lib/seam/connect/axios.js' +import type { SeamHttpOptions } from 'lib/seam/connect/client-options.js' +import { parseOptions } from 'lib/seam/connect/parse-options.js' + +export class SeamHttpDevicesUnmanaged { + client: Axios + + constructor(apiKeyOrOptionsOrClient: Axios | string | SeamHttpOptions) { + if (apiKeyOrOptionsOrClient instanceof Axios) { + this.client = apiKeyOrOptionsOrClient + return + } + + const options = parseOptions(apiKeyOrOptionsOrClient) + this.client = createAxiosClient(options) + } +} diff --git a/src/lib/seam/connect/routes/devices.ts b/src/lib/seam/connect/routes/devices.ts new file mode 100644 index 00000000..9c9fe7fa --- /dev/null +++ b/src/lib/seam/connect/routes/devices.ts @@ -0,0 +1,24 @@ +/* + * Automatically generated by generate-routes.ts. + * Do not edit this file or add other files to this directory. + */ + +import { Axios } from 'axios' + +import { createAxiosClient } from 'lib/seam/connect/axios.js' +import type { SeamHttpOptions } from 'lib/seam/connect/client-options.js' +import { parseOptions } from 'lib/seam/connect/parse-options.js' + +export class SeamHttpDevices { + client: Axios + + constructor(apiKeyOrOptionsOrClient: Axios | string | SeamHttpOptions) { + if (apiKeyOrOptionsOrClient instanceof Axios) { + this.client = apiKeyOrOptionsOrClient + return + } + + const options = parseOptions(apiKeyOrOptionsOrClient) + this.client = createAxiosClient(options) + } +} diff --git a/src/lib/seam/connect/routes/events.ts b/src/lib/seam/connect/routes/events.ts new file mode 100644 index 00000000..fd0d68ee --- /dev/null +++ b/src/lib/seam/connect/routes/events.ts @@ -0,0 +1,24 @@ +/* + * Automatically generated by generate-routes.ts. + * Do not edit this file or add other files to this directory. + */ + +import { Axios } from 'axios' + +import { createAxiosClient } from 'lib/seam/connect/axios.js' +import type { SeamHttpOptions } from 'lib/seam/connect/client-options.js' +import { parseOptions } from 'lib/seam/connect/parse-options.js' + +export class SeamHttpEvents { + client: Axios + + constructor(apiKeyOrOptionsOrClient: Axios | string | SeamHttpOptions) { + if (apiKeyOrOptionsOrClient instanceof Axios) { + this.client = apiKeyOrOptionsOrClient + return + } + + const options = parseOptions(apiKeyOrOptionsOrClient) + this.client = createAxiosClient(options) + } +} diff --git a/src/lib/seam/connect/routes/locks.ts b/src/lib/seam/connect/routes/locks.ts new file mode 100644 index 00000000..3dc24356 --- /dev/null +++ b/src/lib/seam/connect/routes/locks.ts @@ -0,0 +1,24 @@ +/* + * Automatically generated by generate-routes.ts. + * Do not edit this file or add other files to this directory. + */ + +import { Axios } from 'axios' + +import { createAxiosClient } from 'lib/seam/connect/axios.js' +import type { SeamHttpOptions } from 'lib/seam/connect/client-options.js' +import { parseOptions } from 'lib/seam/connect/parse-options.js' + +export class SeamHttpLocks { + client: Axios + + constructor(apiKeyOrOptionsOrClient: Axios | string | SeamHttpOptions) { + if (apiKeyOrOptionsOrClient instanceof Axios) { + this.client = apiKeyOrOptionsOrClient + return + } + + const options = parseOptions(apiKeyOrOptionsOrClient) + this.client = createAxiosClient(options) + } +} diff --git a/src/lib/seam/connect/routes/noise-sensors-noise-thresholds.ts b/src/lib/seam/connect/routes/noise-sensors-noise-thresholds.ts new file mode 100644 index 00000000..0bdaac6b --- /dev/null +++ b/src/lib/seam/connect/routes/noise-sensors-noise-thresholds.ts @@ -0,0 +1,24 @@ +/* + * Automatically generated by generate-routes.ts. + * Do not edit this file or add other files to this directory. + */ + +import { Axios } from 'axios' + +import { createAxiosClient } from 'lib/seam/connect/axios.js' +import type { SeamHttpOptions } from 'lib/seam/connect/client-options.js' +import { parseOptions } from 'lib/seam/connect/parse-options.js' + +export class SeamHttpNoiseSensorsNoiseThresholds { + client: Axios + + constructor(apiKeyOrOptionsOrClient: Axios | string | SeamHttpOptions) { + if (apiKeyOrOptionsOrClient instanceof Axios) { + this.client = apiKeyOrOptionsOrClient + return + } + + const options = parseOptions(apiKeyOrOptionsOrClient) + this.client = createAxiosClient(options) + } +} diff --git a/src/lib/seam/connect/routes/thermostats-climate-setting-schedules.ts b/src/lib/seam/connect/routes/thermostats-climate-setting-schedules.ts new file mode 100644 index 00000000..516e7900 --- /dev/null +++ b/src/lib/seam/connect/routes/thermostats-climate-setting-schedules.ts @@ -0,0 +1,24 @@ +/* + * Automatically generated by generate-routes.ts. + * Do not edit this file or add other files to this directory. + */ + +import { Axios } from 'axios' + +import { createAxiosClient } from 'lib/seam/connect/axios.js' +import type { SeamHttpOptions } from 'lib/seam/connect/client-options.js' +import { parseOptions } from 'lib/seam/connect/parse-options.js' + +export class SeamHttpThermostatsClimateSettingSchedules { + client: Axios + + constructor(apiKeyOrOptionsOrClient: Axios | string | SeamHttpOptions) { + if (apiKeyOrOptionsOrClient instanceof Axios) { + this.client = apiKeyOrOptionsOrClient + return + } + + const options = parseOptions(apiKeyOrOptionsOrClient) + this.client = createAxiosClient(options) + } +} diff --git a/src/lib/seam/connect/routes/thermostats.ts b/src/lib/seam/connect/routes/thermostats.ts new file mode 100644 index 00000000..d9d2f216 --- /dev/null +++ b/src/lib/seam/connect/routes/thermostats.ts @@ -0,0 +1,24 @@ +/* + * Automatically generated by generate-routes.ts. + * Do not edit this file or add other files to this directory. + */ + +import { Axios } from 'axios' + +import { createAxiosClient } from 'lib/seam/connect/axios.js' +import type { SeamHttpOptions } from 'lib/seam/connect/client-options.js' +import { parseOptions } from 'lib/seam/connect/parse-options.js' + +export class SeamHttpThermostats { + client: Axios + + constructor(apiKeyOrOptionsOrClient: Axios | string | SeamHttpOptions) { + if (apiKeyOrOptionsOrClient instanceof Axios) { + this.client = apiKeyOrOptionsOrClient + return + } + + const options = parseOptions(apiKeyOrOptionsOrClient) + this.client = createAxiosClient(options) + } +} diff --git a/src/lib/seam/connect/routes/webhooks.ts b/src/lib/seam/connect/routes/webhooks.ts new file mode 100644 index 00000000..995647e5 --- /dev/null +++ b/src/lib/seam/connect/routes/webhooks.ts @@ -0,0 +1,24 @@ +/* + * Automatically generated by generate-routes.ts. + * Do not edit this file or add other files to this directory. + */ + +import { Axios } from 'axios' + +import { createAxiosClient } from 'lib/seam/connect/axios.js' +import type { SeamHttpOptions } from 'lib/seam/connect/client-options.js' +import { parseOptions } from 'lib/seam/connect/parse-options.js' + +export class SeamHttpWebhooks { + client: Axios + + constructor(apiKeyOrOptionsOrClient: Axios | string | SeamHttpOptions) { + if (apiKeyOrOptionsOrClient instanceof Axios) { + this.client = apiKeyOrOptionsOrClient + return + } + + const options = parseOptions(apiKeyOrOptionsOrClient) + this.client = createAxiosClient(options) + } +} diff --git a/src/lib/seam/connect/routes/workspaces.ts b/src/lib/seam/connect/routes/workspaces.ts index d5240570..323100da 100644 --- a/src/lib/seam/connect/routes/workspaces.ts +++ b/src/lib/seam/connect/routes/workspaces.ts @@ -1,11 +1,9 @@ /* - * Automaically generated by generate-routes.ts. + * Automatically generated by generate-routes.ts. * Do not edit this file or add other files to this directory. */ -import type { RouteRequestParams, RouteResponse } from '@seamapi/types/connect' import { Axios } from 'axios' -import type { SetNonNullable } from 'type-fest' import { createAxiosClient } from 'lib/seam/connect/axios.js' import type { SeamHttpOptions } from 'lib/seam/connect/client-options.js' @@ -23,23 +21,4 @@ export class SeamHttpWorkspaces { const options = parseOptions(apiKeyOrOptionsOrClient) this.client = createAxiosClient(options) } - - async get( - params: WorkspacesGetParams = {}, - ): Promise { - const { data } = await this.client.request({ - url: '/workspaces/get', - method: 'get', - params, - }) - return data.workspace - } } - -type WorkspacesGetParams = SetNonNullable< - Required> -> - -type WorkspacesGetResponse = SetNonNullable< - Required> ->