diff --git a/README.md b/README.md index 715e0dd4..040ca225 100644 --- a/README.md +++ b/README.md @@ -397,10 +397,10 @@ const pages = seam.createPaginator( const devices = await pages.flattenToArray() ``` -### Interacting with Multiple Workspaces +### Requests without a Workspace in scope -Some Seam API endpoints interact with multiple workspaces. -The `SeamHttpMultiWorkspace` client is not bound to a specific workspace +Some Seam API endpoints do not require a workspace in scope. +The `SeamHttpWithoutWorkspace` client is not bound to a specific workspace and may use those endpoints with an appropriate authentication method. #### Personal Access Token @@ -410,15 +410,15 @@ Obtain one from the Seam Console. ```ts // Set the `SEAM_PERSONAL_ACCESS_TOKEN` environment variable -const seam = new SeamHttpMultiWorkspace() +const seam = new SeamHttpWithoutWorkspace() // Pass as an option to the constructor -const seam = new SeamHttpMultiWorkspace({ +const seam = new SeamHttpWithoutWorkspace({ personalAccessToken: 'your-personal-access-token', }) // Use the factory method -const seam = SeamHttpMultiWorkspace.fromPersonalAccessToken( +const seam = SeamHttpWithoutWorkspace.fromPersonalAccessToken( 'some-console-session-token', ) @@ -433,12 +433,12 @@ This authentication method is only used by internal Seam applications. ```ts // Pass as an option to the constructor -const seam = new SeamHttpMultiWorkspace({ +const seam = new SeamHttpWithoutWorkspace({ consoleSessionToken: 'some-console-session-token', }) // Use the factory method -const seam = SeamHttpMultiWorkspace.fromConsoleSessionToken( +const seam = SeamHttpWithoutWorkspace.fromConsoleSessionToken( 'some-console-session-token', ) diff --git a/codegen/layouts/endpoints.hbs b/codegen/layouts/endpoints.hbs index 48f23f44..0dfb08f6 100644 --- a/codegen/layouts/endpoints.hbs +++ b/codegen/layouts/endpoints.hbs @@ -4,6 +4,7 @@ */ {{> route-imports }} +{{> route-imports-without-workspace }} {{#each routeImports}} import { @@ -14,8 +15,12 @@ import { } from './{{fileName}}' {{/each}} -export class SeamHttpEndpoints { +export class {{className}} { +{{#if withoutWorkspace}} + {{> route-class-methods-without-workspace }} +{{else}} {{> route-class-methods }} +{{/if}} {{#each endpoints}} get['{{path}}'](): {{> endpont-method-signature isFnType=true }} @@ -36,8 +41,14 @@ export class SeamHttpEndpoints { {{/each}} } -export type SeamHttpEndpointQueryPaths = {{#each endpointReadPaths}}'{{.}}' {{#unless @last}} | {{/unless}}{{/each}} +{{#if endpointReadPaths.length}} +export type {{typeNamePrefix}}QueryPaths = {{#each endpointReadPaths}}'{{.}}' {{#unless @last}} | {{/unless}}{{/each}} +{{/if}} -export type SeamHttpEndpointPaginatedQueryPaths = {{#each endpointPaginatedPaths}}'{{.}}' {{#unless @last}} | {{/unless}}{{/each}} +{{#if endpointPaginatedPaths.length}} +export type {{typeNamePrefix}}PaginatedQueryPaths = {{#each endpointPaginatedPaths}}'{{.}}' {{#unless @last}} | {{/unless}}{{/each}} +{{/if}} -export type SeamHttpEndpointMutationPaths = {{#each endpointWritePaths}}'{{.}}' {{#unless @last}} | {{/unless}}{{/each}} +{{#if endpointWritePaths.length}} +export type {{typeNamePrefix}}MutationPaths = {{#each endpointWritePaths}}'{{.}}' {{#unless @last}} | {{/unless}}{{/each}} +{{/if}} diff --git a/codegen/layouts/partials/route-class-methods-without-workspace.hbs b/codegen/layouts/partials/route-class-methods-without-workspace.hbs new file mode 100644 index 00000000..895896a4 --- /dev/null +++ b/codegen/layouts/partials/route-class-methods-without-workspace.hbs @@ -0,0 +1,61 @@ +client: Client +readonly defaults: Required +readonly ltsVersion = seamApiLtsVersion +static ltsVersion = seamApiLtsVersion + +constructor(options: SeamHttpWithoutWorkspaceOptions = {}) { + const opts = parseOptions(options) + this.client = 'client' in opts ? opts.client : createClient(opts) + this.defaults = limitToSeamHttpRequestOptions(opts) +} + +static fromClient( + client: SeamHttpWithoutWorkspaceOptionsWithClient['client'], + options: Omit = {}, +): {{className}}{ + const constructorOptions = { ...options, client } + if (!isSeamHttpWithoutWorkspaceOptionsWithClient(constructorOptions)) { + throw new SeamHttpWithoutWorkspaceInvalidOptionsError('Missing client') + } + return new {{className}}(constructorOptions) +} + +static fromConsoleSessionToken( + consoleSessionToken: SeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken['consoleSessionToken'], + options: Omit< + SeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken, + 'consoleSessionToken' + > = {}, +): {{className}}{ + const constructorOptions = { ...options, consoleSessionToken } + if ( + !isSeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken( + constructorOptions, + ) + ) { + throw new SeamHttpWithoutWorkspaceInvalidOptionsError( + 'Missing consoleSessionToken', + ) + } + return new {{className}}(constructorOptions) +} + +static fromPersonalAccessToken( + personalAccessToken: SeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken['personalAccessToken'], + options: Omit< + SeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken, + 'personalAccessToken' + > = {}, +): {{className}}{ + const constructorOptions = { ...options, personalAccessToken } + if ( + !isSeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken( + constructorOptions, + ) + ) { + throw new SeamHttpWithoutWorkspaceInvalidOptionsError( + 'Missing personalAccessToken', + ) + } + return new {{className}}(constructorOptions) +} diff --git a/codegen/layouts/partials/route-imports-without-workspace.hbs b/codegen/layouts/partials/route-imports-without-workspace.hbs new file mode 100644 index 00000000..99c7fef8 --- /dev/null +++ b/codegen/layouts/partials/route-imports-without-workspace.hbs @@ -0,0 +1,14 @@ +import { seamApiLtsVersion } from 'lib/lts-version.js' +import { type Client, createClient } from 'lib/seam/connect/client.js' +import { + isSeamHttpWithoutWorkspaceOptionsWithClient, + isSeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken, + isSeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken, + type SeamHttpRequestOptions, + SeamHttpWithoutWorkspaceInvalidOptionsError, + type SeamHttpWithoutWorkspaceOptions, + type SeamHttpWithoutWorkspaceOptionsWithClient, + type SeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken, + type SeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken, +} from 'lib/seam/connect/options.js' +import { limitToSeamHttpRequestOptions, parseOptions } from 'lib/seam/connect/parse-options.js' diff --git a/codegen/layouts/without-workspace.hbs b/codegen/layouts/without-workspace.hbs new file mode 100644 index 00000000..17e079da --- /dev/null +++ b/codegen/layouts/without-workspace.hbs @@ -0,0 +1,21 @@ +/* + * Automatically generated by codegen/smith.ts. + * Do not edit this file or add other files to this directory. + */ + +{{> route-imports-without-workspace }} + +import { SeamHttpWorkspaces } from 'lib/seam/connect/routes/workspaces/index.js' + +export class SeamHttpWithoutWorkspace { + {{> route-class-methods-without-workspace }} + + get workspaces(): Pick { + return SeamHttpWorkspaces.fromClient(this.client, this.defaults) + } +} + +/** + * @deprecated Use SeamHttpWithoutWorkspace instead. + */ +export const SeamHttpMultiWorkspace = SeamHttpWithoutWorkspace diff --git a/codegen/lib/connect.ts b/codegen/lib/connect.ts index dd60cfb4..6d4b7a36 100644 --- a/codegen/lib/connect.ts +++ b/codegen/lib/connect.ts @@ -72,6 +72,24 @@ export const connect = ( setEndpointsLayoutContext(endpointFile, routes) routeIndexes['']?.add('seam-http-endpoints.js') + const withoutWorkspaceKey = `${rootPath}/seam-http-without-workspace.ts` + files[withoutWorkspaceKey] = { contents: Buffer.from('\n') } + const withoutWorkspaceFile = files[withoutWorkspaceKey] as unknown as File + withoutWorkspaceFile.layout = 'without-workspace.hbs' + withoutWorkspaceFile.className = 'SeamHttpWithoutWorkspace' + routeIndexes['']?.add('seam-http-without-workspace.js') + + const endpointsWithoutWorkspaceKey = `${rootPath}/seam-http-endpoints-without-workspace.ts` + files[endpointsWithoutWorkspaceKey] = { contents: Buffer.from('\n') } + const endpointWithoutWorkspaceFile = files[ + endpointsWithoutWorkspaceKey + ] as unknown as File + endpointWithoutWorkspaceFile.layout = 'endpoints.hbs' + setEndpointsLayoutContext(endpointWithoutWorkspaceFile, routes, { + withoutWorkspace: true, + }) + routeIndexes['']?.add('seam-http-endpoints-without-workspace.js') + for (const node of nodes) { const path = toFilePath(node.path) const name = kebabCase(node.name) diff --git a/codegen/lib/layouts/endpoints.ts b/codegen/lib/layouts/endpoints.ts index 70b17167..abe95fa5 100644 --- a/codegen/lib/layouts/endpoints.ts +++ b/codegen/lib/layouts/endpoints.ts @@ -1,4 +1,4 @@ -import type { Route } from '@seamapi/blueprint' +import type { Endpoint, Route } from '@seamapi/blueprint' import { type EndpointLayoutContext, @@ -9,6 +9,8 @@ import { export interface EndpointsLayoutContext { className: string + typeNamePrefix: string + withoutWorkspace: boolean endpoints: EndpointLayoutContext[] endpointReadPaths: string[] endpointPaginatedPaths: string[] @@ -26,21 +28,33 @@ interface RouteImportLayoutContext { export const setEndpointsLayoutContext = ( file: Partial, routes: Route[], + { withoutWorkspace = false }: { withoutWorkspace?: boolean } = {}, ): void => { - file.className = getClassName('Endpoints') + const endpointFilter = (endpoint: Endpoint): boolean => + withoutWorkspace ? endpoint.workspaceScope !== 'required' : true + + file.withoutWorkspace = withoutWorkspace + file.className = getClassName( + `Endpoints${withoutWorkspace ? 'WithoutWorkspace' : ''}`, + ) + file.typeNamePrefix = getClassName( + `Endpoint${withoutWorkspace ? 'WithoutWorkspace' : ''}`, + ) file.skipClientSessionImport = true file.endpoints = routes.flatMap((route) => - route.endpoints.map((endpoint) => - getEndpointLayoutContext(endpoint, route), - ), + route.endpoints + .filter(endpointFilter) + .map((endpoint) => getEndpointLayoutContext(endpoint, route)), ) file.endpointReadPaths = routes.flatMap((route) => route.endpoints + .filter(endpointFilter) .filter(({ request }) => request.semanticMethod === 'GET') .map(({ path }) => path), ) file.endpointPaginatedPaths = routes.flatMap((route) => route.endpoints + .filter(endpointFilter) .filter( ({ request, hasPagination }) => request.semanticMethod === 'GET' && hasPagination, @@ -49,21 +63,25 @@ export const setEndpointsLayoutContext = ( ) file.endpointWritePaths = routes.flatMap((route) => route.endpoints + .filter(endpointFilter) .filter(({ request }) => request.semanticMethod !== 'GET') .map(({ path }) => path), ) - file.routeImports = routes.map((route) => { - const endpoints = route.endpoints.map((endpoint) => - getEndpointLayoutContext(endpoint, route), - ) - return { - className: getClassName(route.path), - fileName: `${toFilePath(route.path)}/index.js`, - typeNames: endpoints.flatMap((endpoint) => [ - endpoint.parametersTypeName, - endpoint.optionsTypeName, - endpoint.requestTypeName, - ]), - } - }) + file.routeImports = routes + .filter((route) => route.endpoints.some(endpointFilter)) + .map((route) => { + const endpoints = route.endpoints + .filter(endpointFilter) + .map((endpoint) => getEndpointLayoutContext(endpoint, route)) + + return { + className: getClassName(route.path), + fileName: `${toFilePath(route.path)}/index.js`, + typeNames: endpoints.flatMap((endpoint) => [ + endpoint.parametersTypeName, + endpoint.optionsTypeName, + endpoint.requestTypeName, + ]), + } + }) } diff --git a/package-lock.json b/package-lock.json index 6d286349..21e4d441 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "axios-retry": "^4.4.2" }, "devDependencies": { - "@seamapi/blueprint": "^0.51.0", + "@seamapi/blueprint": "^0.51.1", "@seamapi/fake-seam-connect": "^1.77.0", "@seamapi/smith": "^0.4.4", "@seamapi/types": "1.420.2", @@ -1132,9 +1132,9 @@ "peer": true }, "node_modules/@seamapi/blueprint": { - "version": "0.51.0", - "resolved": "https://registry.npmjs.org/@seamapi/blueprint/-/blueprint-0.51.0.tgz", - "integrity": "sha512-431gXXk0N9Fws3igHXGIii6zoalrGVzUANH99VavOiU78a9vhLkIZ07jwWL27EZL3/mHPmH4M7NwO2eaC+5AqA==", + "version": "0.51.1", + "resolved": "https://registry.npmjs.org/@seamapi/blueprint/-/blueprint-0.51.1.tgz", + "integrity": "sha512-0YeekHoHwf3tQWgOqQjJgDo6uTh1S0Kelm4Uf1QHnNpdJ8gUM+1sU61bhwT1JRangb++Nyc/+biyH5hOSEejvQ==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 754ebd1e..87f415ff 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "axios-retry": "^4.4.2" }, "devDependencies": { - "@seamapi/blueprint": "^0.51.0", + "@seamapi/blueprint": "^0.51.1", "@seamapi/fake-seam-connect": "^1.77.0", "@seamapi/smith": "^0.4.4", "@seamapi/types": "1.420.2", diff --git a/src/lib/seam/connect/auth.ts b/src/lib/seam/connect/auth.ts index 8c87a6a3..606ec410 100644 --- a/src/lib/seam/connect/auth.ts +++ b/src/lib/seam/connect/auth.ts @@ -1,17 +1,17 @@ import { - isSeamHttpMultiWorkspaceOptionsWithConsoleSessionToken, - isSeamHttpMultiWorkspaceOptionsWithPersonalAccessToken, isSeamHttpOptionsWithApiKey, isSeamHttpOptionsWithClientSessionToken, isSeamHttpOptionsWithConsoleSessionToken, isSeamHttpOptionsWithPersonalAccessToken, + isSeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken, + isSeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken, SeamHttpInvalidOptionsError, - type SeamHttpMultiWorkspaceOptionsWithConsoleSessionToken, - type SeamHttpMultiWorkspaceOptionsWithPersonalAccessToken, type SeamHttpOptionsWithApiKey, type SeamHttpOptionsWithClientSessionToken, type SeamHttpOptionsWithConsoleSessionToken, type SeamHttpOptionsWithPersonalAccessToken, + type SeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken, + type SeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken, } from './options.js' import type { Options } from './parse-options.js' import { @@ -43,14 +43,14 @@ export const getAuthHeaders = (options: Options): Headers => { } if ( - isSeamHttpMultiWorkspaceOptionsWithConsoleSessionToken(options) || + isSeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken(options) || isSeamHttpOptionsWithConsoleSessionToken(options) ) { return getAuthHeadersForConsoleSessionToken(options) } if ( - isSeamHttpMultiWorkspaceOptionsWithPersonalAccessToken(options) || + isSeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken(options) || isSeamHttpOptionsWithPersonalAccessToken(options) ) { return getAuthHeadersForPersonalAccessToken(options) @@ -142,7 +142,7 @@ const getAuthHeadersForConsoleSessionToken = ({ consoleSessionToken, ...options }: - | SeamHttpMultiWorkspaceOptionsWithConsoleSessionToken + | SeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken | SeamHttpOptionsWithConsoleSessionToken): Headers => { const workspaceId = 'workspaceId' in options ? options.workspaceId : undefined @@ -180,7 +180,7 @@ const getAuthHeadersForPersonalAccessToken = ({ personalAccessToken, ...options }: - | SeamHttpMultiWorkspaceOptionsWithPersonalAccessToken + | SeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken | SeamHttpOptionsWithPersonalAccessToken): Headers => { const workspaceId = 'workspaceId' in options ? options.workspaceId : undefined diff --git a/src/lib/seam/connect/index.ts b/src/lib/seam/connect/index.ts index 818b2fab..b1ec5a75 100644 --- a/src/lib/seam/connect/index.ts +++ b/src/lib/seam/connect/index.ts @@ -12,7 +12,6 @@ export { } from './resolve-action-attempt.js' export * from './routes/index.js' export * from './seam-http-error.js' -export * from './seam-http-multi-workspace.js' export * from './seam-http-request.js' export * from './seam-paginator.js' export * from './seam-paginator.js' diff --git a/src/lib/seam/connect/options.ts b/src/lib/seam/connect/options.ts index e12d2356..caa61254 100644 --- a/src/lib/seam/connect/options.ts +++ b/src/lib/seam/connect/options.ts @@ -2,11 +2,11 @@ import type { Client, ClientOptions } from './client.js' import { isSeamHttpRequestOption } from './parse-options.js' import type { ResolveActionAttemptOptions } from './resolve-action-attempt.js' -export type SeamHttpMultiWorkspaceOptions = - | SeamHttpMultiWorkspaceOptionsFromEnv - | SeamHttpMultiWorkspaceOptionsWithClient - | SeamHttpMultiWorkspaceOptionsWithConsoleSessionToken - | SeamHttpMultiWorkspaceOptionsWithPersonalAccessToken +export type SeamHttpWithoutWorkspaceOptions = + | SeamHttpWithoutWorkspaceOptionsFromEnv + | SeamHttpWithoutWorkspaceOptionsWithClient + | SeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken + | SeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken export type SeamHttpOptions = | SeamHttpOptionsFromEnv @@ -30,17 +30,17 @@ export interface SeamHttpFromPublishableKeyOptions export interface SeamHttpOptionsFromEnv extends SeamHttpCommonOptions {} -export interface SeamHttpMultiWorkspaceOptionsFromEnv +export interface SeamHttpWithoutWorkspaceOptionsFromEnv extends SeamHttpCommonOptions {} -export interface SeamHttpMultiWorkspaceOptionsWithClient +export interface SeamHttpWithoutWorkspaceOptionsWithClient extends SeamHttpCommonOptions { client: Client } -export const isSeamHttpMultiWorkspaceOptionsWithClient = ( +export const isSeamHttpWithoutWorkspaceOptionsWithClient = ( options: SeamHttpOptions, -): options is SeamHttpMultiWorkspaceOptionsWithClient => +): options is SeamHttpWithoutWorkspaceOptionsWithClient => isSeamHttpOptionsWithClient(options) export interface SeamHttpOptionsWithClient extends SeamHttpRequestOptions { @@ -128,14 +128,14 @@ export const isSeamHttpOptionsWithClientSessionToken = ( return true } -export interface SeamHttpMultiWorkspaceOptionsWithConsoleSessionToken +export interface SeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken extends SeamHttpCommonOptions { consoleSessionToken: string } -export const isSeamHttpMultiWorkspaceOptionsWithConsoleSessionToken = ( +export const isSeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken = ( options: SeamHttpOptions, -): options is SeamHttpMultiWorkspaceOptionsWithConsoleSessionToken => { +): options is SeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken => { if (!('consoleSessionToken' in options)) return false if (options.consoleSessionToken == null) return false @@ -169,7 +169,7 @@ export interface SeamHttpOptionsWithConsoleSessionToken export const isSeamHttpOptionsWithConsoleSessionToken = ( options: SeamHttpOptions, ): options is SeamHttpOptionsWithConsoleSessionToken => { - if (!isSeamHttpMultiWorkspaceOptionsWithConsoleSessionToken(options)) { + if (!isSeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken(options)) { return false } @@ -182,14 +182,14 @@ export const isSeamHttpOptionsWithConsoleSessionToken = ( return true } -export interface SeamHttpMultiWorkspaceOptionsWithPersonalAccessToken +export interface SeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken extends SeamHttpCommonOptions { personalAccessToken: string } -export const isSeamHttpMultiWorkspaceOptionsWithPersonalAccessToken = ( +export const isSeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken = ( options: SeamHttpOptions, -): options is SeamHttpMultiWorkspaceOptionsWithPersonalAccessToken => { +): options is SeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken => { if (!('personalAccessToken' in options)) return false if (options.personalAccessToken == null) return false @@ -223,7 +223,7 @@ export interface SeamHttpOptionsWithPersonalAccessToken export const isSeamHttpOptionsWithPersonalAccessToken = ( options: SeamHttpOptions, ): options is SeamHttpOptionsWithPersonalAccessToken => { - if (!isSeamHttpMultiWorkspaceOptionsWithPersonalAccessToken(options)) { + if (!isSeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken(options)) { return false } @@ -243,9 +243,9 @@ export class SeamHttpInvalidOptionsError extends Error { } } -export class SeamHttpMultiWorkspaceInvalidOptionsError extends Error { +export class SeamHttpWithoutWorkspaceInvalidOptionsError extends Error { constructor(message: string) { - super(`SeamHttpMultiWorkspace received invalid options: ${message}`) + super(`SeamHttpWithoutWorkspace received invalid options: ${message}`) this.name = this.constructor.name } } diff --git a/src/lib/seam/connect/parse-options.ts b/src/lib/seam/connect/parse-options.ts index 9b6e8146..65c4755d 100644 --- a/src/lib/seam/connect/parse-options.ts +++ b/src/lib/seam/connect/parse-options.ts @@ -4,13 +4,13 @@ import version from 'lib/version.js' import { getAuthHeaders } from './auth.js' import type { Client, ClientOptions } from './client.js' import { - isSeamHttpMultiWorkspaceOptionsWithClient, isSeamHttpOptionsWithClient, isSeamHttpOptionsWithClientSessionToken, + isSeamHttpWithoutWorkspaceOptionsWithClient, SeamHttpInvalidOptionsError, - type SeamHttpMultiWorkspaceOptions, type SeamHttpOptions, type SeamHttpRequestOptions, + type SeamHttpWithoutWorkspaceOptions, } from './options.js' export const defaultEndpoint = 'https://connect.getseam.com' @@ -22,7 +22,7 @@ export const sdkHeaders = { } export type Options = - | SeamHttpMultiWorkspaceOptions + | SeamHttpWithoutWorkspaceOptions | (SeamHttpOptions & { publishableKey?: string }) type ParsedOptions = Required< @@ -35,7 +35,7 @@ export const parseOptions = ( const options = getNormalizedOptions(apiKeyOrOptions) if (isSeamHttpOptionsWithClient(options)) return options - if (isSeamHttpMultiWorkspaceOptionsWithClient(options)) return options + if (isSeamHttpWithoutWorkspaceOptionsWithClient(options)) return options return { ...options, diff --git a/src/lib/seam/connect/routes/index.ts b/src/lib/seam/connect/routes/index.ts index 7081bc6a..b7bec514 100644 --- a/src/lib/seam/connect/routes/index.ts +++ b/src/lib/seam/connect/routes/index.ts @@ -21,6 +21,8 @@ export * from './phones/index.js' export * from './seam/index.js' export * from './seam-http.js' export * from './seam-http-endpoints.js' +export * from './seam-http-endpoints-without-workspace.js' +export * from './seam-http-without-workspace.js' export * from './spaces/index.js' export * from './thermostats/index.js' export * from './unstable-access-grants/index.js' diff --git a/src/lib/seam/connect/routes/seam-http-endpoints-without-workspace.ts b/src/lib/seam/connect/routes/seam-http-endpoints-without-workspace.ts new file mode 100644 index 00000000..74ecf6e6 --- /dev/null +++ b/src/lib/seam/connect/routes/seam-http-endpoints-without-workspace.ts @@ -0,0 +1,126 @@ +/* + * Automatically generated by codegen/smith.ts. + * Do not edit this file or add other files to this directory. + */ + +import { seamApiLtsVersion } from 'lib/lts-version.js' +import { type Client, createClient } from 'lib/seam/connect/client.js' +import { + isSeamHttpWithoutWorkspaceOptionsWithClient, + isSeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken, + isSeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken, + type SeamHttpRequestOptions, + SeamHttpWithoutWorkspaceInvalidOptionsError, + type SeamHttpWithoutWorkspaceOptions, + type SeamHttpWithoutWorkspaceOptionsWithClient, + type SeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken, + type SeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken, +} from 'lib/seam/connect/options.js' +import { + limitToSeamHttpRequestOptions, + parseOptions, +} from 'lib/seam/connect/parse-options.js' + +import { + SeamHttpWorkspaces, + type WorkspacesCreateOptions, + type WorkspacesCreateParameters, + type WorkspacesCreateRequest, + type WorkspacesListOptions, + type WorkspacesListParameters, + type WorkspacesListRequest, +} from './workspaces/index.js' + +export class SeamHttpEndpointsWithoutWorkspace { + client: Client + readonly defaults: Required + readonly ltsVersion = seamApiLtsVersion + static ltsVersion = seamApiLtsVersion + + constructor(options: SeamHttpWithoutWorkspaceOptions = {}) { + const opts = parseOptions(options) + this.client = 'client' in opts ? opts.client : createClient(opts) + this.defaults = limitToSeamHttpRequestOptions(opts) + } + + static fromClient( + client: SeamHttpWithoutWorkspaceOptionsWithClient['client'], + options: Omit = {}, + ): SeamHttpEndpointsWithoutWorkspace { + const constructorOptions = { ...options, client } + if (!isSeamHttpWithoutWorkspaceOptionsWithClient(constructorOptions)) { + throw new SeamHttpWithoutWorkspaceInvalidOptionsError('Missing client') + } + return new SeamHttpEndpointsWithoutWorkspace(constructorOptions) + } + + static fromConsoleSessionToken( + consoleSessionToken: SeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken['consoleSessionToken'], + options: Omit< + SeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken, + 'consoleSessionToken' + > = {}, + ): SeamHttpEndpointsWithoutWorkspace { + const constructorOptions = { ...options, consoleSessionToken } + if ( + !isSeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken( + constructorOptions, + ) + ) { + throw new SeamHttpWithoutWorkspaceInvalidOptionsError( + 'Missing consoleSessionToken', + ) + } + return new SeamHttpEndpointsWithoutWorkspace(constructorOptions) + } + + static fromPersonalAccessToken( + personalAccessToken: SeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken['personalAccessToken'], + options: Omit< + SeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken, + 'personalAccessToken' + > = {}, + ): SeamHttpEndpointsWithoutWorkspace { + const constructorOptions = { ...options, personalAccessToken } + if ( + !isSeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken( + constructorOptions, + ) + ) { + throw new SeamHttpWithoutWorkspaceInvalidOptionsError( + 'Missing personalAccessToken', + ) + } + return new SeamHttpEndpointsWithoutWorkspace(constructorOptions) + } + + get ['/workspaces/create'](): ( + parameters?: WorkspacesCreateParameters, + options?: WorkspacesCreateOptions, + ) => WorkspacesCreateRequest { + const { client, defaults } = this + return function workspacesCreate( + ...args: Parameters + ): ReturnType { + const seam = SeamHttpWorkspaces.fromClient(client, defaults) + return seam.create(...args) + } + } + + get ['/workspaces/list'](): ( + parameters?: WorkspacesListParameters, + options?: WorkspacesListOptions, + ) => WorkspacesListRequest { + const { client, defaults } = this + return function workspacesList( + ...args: Parameters + ): ReturnType { + const seam = SeamHttpWorkspaces.fromClient(client, defaults) + return seam.list(...args) + } + } +} + +export type SeamHttpEndpointWithoutWorkspaceQueryPaths = '/workspaces/list' + +export type SeamHttpEndpointWithoutWorkspaceMutationPaths = '/workspaces/create' diff --git a/src/lib/seam/connect/routes/seam-http-without-workspace.ts b/src/lib/seam/connect/routes/seam-http-without-workspace.ts new file mode 100644 index 00000000..b199e640 --- /dev/null +++ b/src/lib/seam/connect/routes/seam-http-without-workspace.ts @@ -0,0 +1,96 @@ +/* + * Automatically generated by codegen/smith.ts. + * Do not edit this file or add other files to this directory. + */ + +import { seamApiLtsVersion } from 'lib/lts-version.js' +import { type Client, createClient } from 'lib/seam/connect/client.js' +import { + isSeamHttpWithoutWorkspaceOptionsWithClient, + isSeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken, + isSeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken, + type SeamHttpRequestOptions, + SeamHttpWithoutWorkspaceInvalidOptionsError, + type SeamHttpWithoutWorkspaceOptions, + type SeamHttpWithoutWorkspaceOptionsWithClient, + type SeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken, + type SeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken, +} from 'lib/seam/connect/options.js' +import { + limitToSeamHttpRequestOptions, + parseOptions, +} from 'lib/seam/connect/parse-options.js' +import { SeamHttpWorkspaces } from 'lib/seam/connect/routes/workspaces/index.js' + +export class SeamHttpWithoutWorkspace { + client: Client + readonly defaults: Required + readonly ltsVersion = seamApiLtsVersion + static ltsVersion = seamApiLtsVersion + + constructor(options: SeamHttpWithoutWorkspaceOptions = {}) { + const opts = parseOptions(options) + this.client = 'client' in opts ? opts.client : createClient(opts) + this.defaults = limitToSeamHttpRequestOptions(opts) + } + + static fromClient( + client: SeamHttpWithoutWorkspaceOptionsWithClient['client'], + options: Omit = {}, + ): SeamHttpWithoutWorkspace { + const constructorOptions = { ...options, client } + if (!isSeamHttpWithoutWorkspaceOptionsWithClient(constructorOptions)) { + throw new SeamHttpWithoutWorkspaceInvalidOptionsError('Missing client') + } + return new SeamHttpWithoutWorkspace(constructorOptions) + } + + static fromConsoleSessionToken( + consoleSessionToken: SeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken['consoleSessionToken'], + options: Omit< + SeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken, + 'consoleSessionToken' + > = {}, + ): SeamHttpWithoutWorkspace { + const constructorOptions = { ...options, consoleSessionToken } + if ( + !isSeamHttpWithoutWorkspaceOptionsWithConsoleSessionToken( + constructorOptions, + ) + ) { + throw new SeamHttpWithoutWorkspaceInvalidOptionsError( + 'Missing consoleSessionToken', + ) + } + return new SeamHttpWithoutWorkspace(constructorOptions) + } + + static fromPersonalAccessToken( + personalAccessToken: SeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken['personalAccessToken'], + options: Omit< + SeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken, + 'personalAccessToken' + > = {}, + ): SeamHttpWithoutWorkspace { + const constructorOptions = { ...options, personalAccessToken } + if ( + !isSeamHttpWithoutWorkspaceOptionsWithPersonalAccessToken( + constructorOptions, + ) + ) { + throw new SeamHttpWithoutWorkspaceInvalidOptionsError( + 'Missing personalAccessToken', + ) + } + return new SeamHttpWithoutWorkspace(constructorOptions) + } + + get workspaces(): Pick { + return SeamHttpWorkspaces.fromClient(this.client, this.defaults) + } +} + +/** + * @deprecated Use SeamHttpWithoutWorkspace instead. + */ +export const SeamHttpMultiWorkspace = SeamHttpWithoutWorkspace diff --git a/src/lib/seam/connect/seam-http-multi-workspace.ts b/src/lib/seam/connect/seam-http-multi-workspace.ts deleted file mode 100644 index c70c6ea8..00000000 --- a/src/lib/seam/connect/seam-http-multi-workspace.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { type Client, createClient } from './client.js' -import { - isSeamHttpMultiWorkspaceOptionsWithClient, - isSeamHttpMultiWorkspaceOptionsWithConsoleSessionToken, - isSeamHttpMultiWorkspaceOptionsWithPersonalAccessToken, - SeamHttpMultiWorkspaceInvalidOptionsError, - type SeamHttpMultiWorkspaceOptions, - type SeamHttpMultiWorkspaceOptionsWithClient, - type SeamHttpMultiWorkspaceOptionsWithConsoleSessionToken, - type SeamHttpMultiWorkspaceOptionsWithPersonalAccessToken, - type SeamHttpRequestOptions, -} from './options.js' -import { limitToSeamHttpRequestOptions, parseOptions } from './parse-options.js' -import { SeamHttpWorkspaces } from './routes/index.js' - -export class SeamHttpMultiWorkspace { - client: Client - readonly defaults: Required - - constructor(options: SeamHttpMultiWorkspaceOptions = {}) { - const opts = parseOptions(options) - this.client = 'client' in opts ? opts.client : createClient(opts) - this.defaults = limitToSeamHttpRequestOptions(opts) - } - - static fromClient( - client: SeamHttpMultiWorkspaceOptionsWithClient['client'], - options: Omit = {}, - ): SeamHttpMultiWorkspace { - const constructorOptions = { ...options, client } - if (!isSeamHttpMultiWorkspaceOptionsWithClient(constructorOptions)) { - throw new SeamHttpMultiWorkspaceInvalidOptionsError('Missing client') - } - return new SeamHttpMultiWorkspace(constructorOptions) - } - - static fromConsoleSessionToken( - consoleSessionToken: SeamHttpMultiWorkspaceOptionsWithConsoleSessionToken['consoleSessionToken'], - options: Omit< - SeamHttpMultiWorkspaceOptionsWithConsoleSessionToken, - 'consoleSessionToken' - > = {}, - ): SeamHttpMultiWorkspace { - const constructorOptions = { ...options, consoleSessionToken } - if ( - !isSeamHttpMultiWorkspaceOptionsWithConsoleSessionToken( - constructorOptions, - ) - ) { - throw new SeamHttpMultiWorkspaceInvalidOptionsError( - 'Missing consoleSessionToken', - ) - } - return new SeamHttpMultiWorkspace(constructorOptions) - } - - static fromPersonalAccessToken( - personalAccessToken: SeamHttpMultiWorkspaceOptionsWithPersonalAccessToken['personalAccessToken'], - options: Omit< - SeamHttpMultiWorkspaceOptionsWithPersonalAccessToken, - 'personalAccessToken' - > = {}, - ): SeamHttpMultiWorkspace { - const constructorOptions = { ...options, personalAccessToken } - if ( - !isSeamHttpMultiWorkspaceOptionsWithPersonalAccessToken( - constructorOptions, - ) - ) { - throw new SeamHttpMultiWorkspaceInvalidOptionsError( - 'Missing personalAccessToken', - ) - } - return new SeamHttpMultiWorkspace(constructorOptions) - } - - get workspaces(): Pick { - return SeamHttpWorkspaces.fromClient(this.client, this.defaults) - } -} diff --git a/test/seam/connect/client.test.ts b/test/seam/connect/client.test.ts index 9c1a7bcc..c94d54df 100644 --- a/test/seam/connect/client.test.ts +++ b/test/seam/connect/client.test.ts @@ -6,7 +6,7 @@ import { type DevicesListParams, type DevicesListResponse, SeamHttp, - SeamHttpMultiWorkspace, + SeamHttpWithoutWorkspace, type WorkspacesListResponse, } from '@seamapi/http/connect' @@ -108,10 +108,10 @@ test('SeamHttp: merges axios headers when creating client', async (t) => { t.is(device.device_id, seed.august_device_1) }) -test('SeamHttpMultiWorkspace: fromClient returns instance that uses client', async (t) => { +test('SeamHttpWithoutWorkspace: fromClient returns instance that uses client', async (t) => { const { seed, endpoint } = await getTestServer(t) - const seam = SeamHttpMultiWorkspace.fromClient( - SeamHttpMultiWorkspace.fromPersonalAccessToken(seed.seam_at1_token, { + const seam = SeamHttpWithoutWorkspace.fromClient( + SeamHttpWithoutWorkspace.fromPersonalAccessToken(seed.seam_at1_token, { endpoint, }).client, ) @@ -119,10 +119,10 @@ test('SeamHttpMultiWorkspace: fromClient returns instance that uses client', asy t.true(workspaces.length > 0) }) -test('SeamHttpMultiWorkspace: constructor returns instance that uses client', async (t) => { +test('SeamHttpWithoutWorkspace: constructor returns instance that uses client', async (t) => { const { seed, endpoint } = await getTestServer(t) - const seam = new SeamHttpMultiWorkspace({ - client: SeamHttpMultiWorkspace.fromPersonalAccessToken( + const seam = new SeamHttpWithoutWorkspace({ + client: SeamHttpWithoutWorkspace.fromPersonalAccessToken( seed.seam_at1_token, { endpoint, @@ -133,10 +133,10 @@ test('SeamHttpMultiWorkspace: constructor returns instance that uses client', as t.true(workspaces.length > 0) }) -test('SeamHttpMultiWorkspace: can use client to make requests', async (t) => { +test('SeamHttpWithoutWorkspace: can use client to make requests', async (t) => { const { seed, endpoint } = await getTestServer(t) - const seam = new SeamHttpMultiWorkspace({ - client: SeamHttpMultiWorkspace.fromPersonalAccessToken( + const seam = new SeamHttpWithoutWorkspace({ + client: SeamHttpWithoutWorkspace.fromPersonalAccessToken( seed.seam_at1_token, { endpoint, diff --git a/test/seam/connect/console-session-token.test.ts b/test/seam/connect/console-session-token.test.ts index 7fcf0414..309266a7 100644 --- a/test/seam/connect/console-session-token.test.ts +++ b/test/seam/connect/console-session-token.test.ts @@ -5,7 +5,7 @@ import jwt from 'jsonwebtoken' import { SeamHttp, SeamHttpInvalidTokenError, - SeamHttpMultiWorkspace, + SeamHttpWithoutWorkspace, } from '@seamapi/http/connect' test('SeamHttp: fromConsoleSessionToken returns instance authorized with consoleSessionToken', async (t) => { @@ -83,7 +83,7 @@ test('SeamHttp: checks consoleSessionToken format', (t) => { }) }) -test('SeamHttpMultiWorkspace: fromConsoleSessionToken returns instance authorized with consoleSessionToken', async (t) => { +test('SeamHttpWithoutWorkspace: fromConsoleSessionToken returns instance authorized with consoleSessionToken', async (t) => { const { seed, endpoint } = await getTestServer(t) const consoleSessionToken = jwt.sign( { @@ -93,7 +93,7 @@ test('SeamHttpMultiWorkspace: fromConsoleSessionToken returns instance authorize 'secret', ) - const seam = SeamHttpMultiWorkspace.fromConsoleSessionToken( + const seam = SeamHttpWithoutWorkspace.fromConsoleSessionToken( consoleSessionToken, { endpoint, @@ -103,7 +103,7 @@ test('SeamHttpMultiWorkspace: fromConsoleSessionToken returns instance authorize t.true(workspaces.length > 0) }) -test('SeamHttpMultiWorkspace: constructor returns instance authorized with consoleSessionToken', async (t) => { +test('SeamHttpWithoutWorkspace: constructor returns instance authorized with consoleSessionToken', async (t) => { const { seed, endpoint } = await getTestServer(t) const consoleSessionToken = jwt.sign( { @@ -113,7 +113,7 @@ test('SeamHttpMultiWorkspace: constructor returns instance authorized with conso 'secret', ) - const seam = new SeamHttpMultiWorkspace({ + const seam = new SeamHttpWithoutWorkspace({ consoleSessionToken, endpoint, }) @@ -121,27 +121,29 @@ test('SeamHttpMultiWorkspace: constructor returns instance authorized with conso t.true(workspaces.length > 0) }) -test('SeamHttpMultiWorkspace: checks consoleSessionToken format', (t) => { +test('SeamHttpWithoutWorkspace: checks consoleSessionToken format', (t) => { t.throws( () => - SeamHttpMultiWorkspace.fromConsoleSessionToken('some-invalid-key-format'), + SeamHttpWithoutWorkspace.fromConsoleSessionToken( + 'some-invalid-key-format', + ), { instanceOf: SeamHttpInvalidTokenError, message: /Unknown/, }, ) t.throws( - () => SeamHttpMultiWorkspace.fromConsoleSessionToken('seam_apikey_token'), + () => SeamHttpWithoutWorkspace.fromConsoleSessionToken('seam_apikey_token'), { instanceOf: SeamHttpInvalidTokenError, message: /Unknown/, }, ) - t.throws(() => SeamHttpMultiWorkspace.fromConsoleSessionToken('seam_cst'), { + t.throws(() => SeamHttpWithoutWorkspace.fromConsoleSessionToken('seam_cst'), { instanceOf: SeamHttpInvalidTokenError, message: /Client Session Token/, }) - t.throws(() => SeamHttpMultiWorkspace.fromConsoleSessionToken('seam_at'), { + t.throws(() => SeamHttpWithoutWorkspace.fromConsoleSessionToken('seam_at'), { instanceOf: SeamHttpInvalidTokenError, message: /Access Token/, }) diff --git a/test/seam/connect/env.test.ts b/test/seam/connect/env.test.ts index 7dfd64f6..6178fd9a 100644 --- a/test/seam/connect/env.test.ts +++ b/test/seam/connect/env.test.ts @@ -7,7 +7,7 @@ import jwt from 'jsonwebtoken' import { SeamHttp, SeamHttpInvalidOptionsError, - SeamHttpMultiWorkspace, + SeamHttpWithoutWorkspace, } from '@seamapi/http/connect' /* @@ -346,26 +346,26 @@ test.serial( ) test.serial( - 'SeamHttpMultiWorkspace: constructor uses SEAM_PERSONAL_ACCESS_TOKEN environment variable', + 'SeamHttpWithoutWorkspace: constructor uses SEAM_PERSONAL_ACCESS_TOKEN environment variable', async (t) => { const { seed, endpoint } = await getTestServer(t) env.SEAM_PERSONAL_ACCESS_TOKEN = seed.seam_at1_token - const multiWorkspace = new SeamHttpMultiWorkspace({ endpoint }) - const workspaces = await multiWorkspace.workspaces.list() + const seam = new SeamHttpWithoutWorkspace({ endpoint }) + const workspaces = await seam.workspaces.list() t.true(workspaces.length > 0) }, ) test.serial( - 'SeamHttpMultiWorkspace: personalAccessToken option overrides environment variables', + 'SeamHttpWithoutWorkspace: personalAccessToken option overrides environment variables', async (t) => { const { seed, endpoint } = await getTestServer(t) env.SEAM_PERSONAL_ACCESS_TOKEN = 'some-invalid-token' - const multiWorkspace = new SeamHttpMultiWorkspace({ + const seam = new SeamHttpWithoutWorkspace({ personalAccessToken: seed.seam_at1_token, endpoint, }) - const workspaces = await multiWorkspace.workspaces.list() + const workspaces = await seam.workspaces.list() t.true(workspaces.length > 0) }, ) diff --git a/test/seam/connect/personal-access-token.test.ts b/test/seam/connect/personal-access-token.test.ts index 04bef947..47e43220 100644 --- a/test/seam/connect/personal-access-token.test.ts +++ b/test/seam/connect/personal-access-token.test.ts @@ -4,7 +4,7 @@ import { getTestServer } from 'fixtures/seam/connect/api.js' import { SeamHttp, SeamHttpInvalidTokenError, - SeamHttpMultiWorkspace, + SeamHttpWithoutWorkspace, } from '@seamapi/http/connect' test('SeamHttp: fromPersonalAccessToken returns instance authorized with personalAccessToken', async (t) => { @@ -64,9 +64,9 @@ test('SeamHttp: checks personalAccessToken format', (t) => { }) }) -test('SeamHttpMultiWorkspace: fromPersonalAccessToken returns instance authorized with personalAccessToken', async (t) => { +test('SeamHttpWithoutWorkspace: fromPersonalAccessToken returns instance authorized with personalAccessToken', async (t) => { const { seed, endpoint } = await getTestServer(t) - const seam = SeamHttpMultiWorkspace.fromPersonalAccessToken( + const seam = SeamHttpWithoutWorkspace.fromPersonalAccessToken( seed.seam_at1_token, { endpoint, @@ -76,9 +76,9 @@ test('SeamHttpMultiWorkspace: fromPersonalAccessToken returns instance authorize t.true(workspaces.length > 0) }) -test('SeamHttpMultiWorkspace: constructor returns instance authorized with personalAccessToken', async (t) => { +test('SeamHttpWithoutWorkspace: constructor returns instance authorized with personalAccessToken', async (t) => { const { seed, endpoint } = await getTestServer(t) - const seam = new SeamHttpMultiWorkspace({ + const seam = new SeamHttpWithoutWorkspace({ personalAccessToken: seed.seam_at1_token, endpoint, }) @@ -86,27 +86,29 @@ test('SeamHttpMultiWorkspace: constructor returns instance authorized with perso t.true(workspaces.length > 0) }) -test('SeamHttpMultiWorkspace: checks personalAccessToken format', (t) => { +test('SeamHttpWithoutWorkspace: checks personalAccessToken format', (t) => { t.throws( () => - SeamHttpMultiWorkspace.fromPersonalAccessToken('some-invalid-key-format'), + SeamHttpWithoutWorkspace.fromPersonalAccessToken( + 'some-invalid-key-format', + ), { instanceOf: SeamHttpInvalidTokenError, message: /Unknown/, }, ) t.throws( - () => SeamHttpMultiWorkspace.fromPersonalAccessToken('seam_apikey_token'), + () => SeamHttpWithoutWorkspace.fromPersonalAccessToken('seam_apikey_token'), { instanceOf: SeamHttpInvalidTokenError, message: /Unknown/, }, ) - t.throws(() => SeamHttpMultiWorkspace.fromPersonalAccessToken('seam_cst'), { + t.throws(() => SeamHttpWithoutWorkspace.fromPersonalAccessToken('seam_cst'), { instanceOf: SeamHttpInvalidTokenError, message: /Client Session Token/, }) - t.throws(() => SeamHttpMultiWorkspace.fromPersonalAccessToken('ey'), { + t.throws(() => SeamHttpWithoutWorkspace.fromPersonalAccessToken('ey'), { instanceOf: SeamHttpInvalidTokenError, message: /JWT/, }) diff --git a/test/seam/connect/undocumented.test.ts b/test/seam/connect/undocumented.test.ts index 17512b2f..427946ba 100644 --- a/test/seam/connect/undocumented.test.ts +++ b/test/seam/connect/undocumented.test.ts @@ -89,8 +89,8 @@ test('SeamHttpEndpoints: cannot use undocumented endpoint', async (t) => { }) test.todo( - 'SeamHttpMultiWorkspace: must use isUndocumentedApiEnabled to use undocumented route', + 'SeamHttpWithoutWorkspace: must use isUndocumentedApiEnabled to use undocumented route', ) test.todo( - 'SeamHttpMultiWorkspace: must use isUndocumentedApiEnabled to use undocumented endpoint', + 'SeamHttpWithoutWorkspace: must use isUndocumentedApiEnabled to use undocumented endpoint', )