diff --git a/package-lock.json b/package-lock.json index ffcbc06..7c5e81c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "zod": "^3.23.8" }, "devDependencies": { - "@seamapi/types": "^1.768.0", + "@seamapi/types": "^1.804.0", "@swc/core": "^1.11.29", "@types/node": "^24.10.9", "ava": "^6.0.1", @@ -1307,9 +1307,9 @@ "license": "MIT" }, "node_modules/@seamapi/types": { - "version": "1.798.0", - "resolved": "https://registry.npmjs.org/@seamapi/types/-/types-1.798.0.tgz", - "integrity": "sha512-Wyh7wu1eEH+1Wo7i6KLELgqfAZB+7KmZhWJT68msNuWm7hs4GaiRjVDFg03jBcPhlzBXjo1fAKXi0zNdZN4UAg==", + "version": "1.804.0", + "resolved": "https://registry.npmjs.org/@seamapi/types/-/types-1.804.0.tgz", + "integrity": "sha512-bU2U/YdZTOzvC8Ol6KSyHONLDWAfBZycZ39qELZlGph9/7EB0B9PQ3fUhznwkngwQGeBPW2KoLeoF3BInGNm8w==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index 020ebc6..54082eb 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "zod": "^3.23.8" }, "devDependencies": { - "@seamapi/types": "^1.768.0", + "@seamapi/types": "^1.804.0", "@swc/core": "^1.11.29", "@types/node": "^24.10.9", "ava": "^6.0.1", diff --git a/src/lib/blueprint.ts b/src/lib/blueprint.ts index 08e6a30..7db592c 100644 --- a/src/lib/blueprint.ts +++ b/src/lib/blueprint.ts @@ -510,6 +510,11 @@ export const createBlueprint = async ( actionAttempts, }) + assertDocumentedEndpointsDontReferenceUndocumentedResources({ + routes, + resources, + }) + return { title: openapi.info.title, routes, @@ -577,6 +582,38 @@ const assertSeamPathsAreUndocumented = ({ } } +const assertDocumentedEndpointsDontReferenceUndocumentedResources = ({ + routes, + resources, +}: Pick): void => { + const undocumentedResourceTypes = new Set( + resources.filter((r) => r.isUndocumented).map((r) => r.resourceType), + ) + + const offenders: string[] = [] + + for (const route of routes) { + for (const endpoint of route.endpoints) { + if (endpoint.isUndocumented) continue + if (endpoint.response.responseType === 'void') continue + if (!('resourceType' in endpoint.response)) continue + + const { resourceType } = endpoint.response + if (undocumentedResourceTypes.has(resourceType)) { + offenders.push( + `${endpoint.path} references undocumented resource '${resourceType}'`, + ) + } + } + } + + if (offenders.length > 0) { + throw new Error( + `Documented endpoints must not reference undocumented resources. Found:\n${offenders.join('\n')}`, + ) + } +} + const extractValidActionAttemptTypes = ( schemas: Openapi['components']['schemas'], ): string[] => { diff --git a/test/blueprint.test.ts b/test/blueprint.test.ts index f7fa666..8e8f7cf 100644 --- a/test/blueprint.test.ts +++ b/test/blueprint.test.ts @@ -53,3 +53,55 @@ test('createBlueprint: throws when a /seam entry is documented', async (t) => { /All \/seam entries must be marked undocumented\. Found: .*\/seam\/widgets\/get/, }) }) + +test('createBlueprint: throws when a documented endpoint references an undocumented resource', async (t) => { + const typesModule = TypesModuleSchema.parse(types) + const openapi = structuredClone(typesModule.openapi) + + // Add an undocumented resource + openapi.components.schemas['secret_widget'] = { + type: 'object', + properties: { + secret_widget_id: { type: 'string', format: 'uuid' }, + }, + required: ['secret_widget_id'], + 'x-undocumented': 'This resource is not yet public.', + 'x-route-path': '/foos', + } + + // Add a documented endpoint that returns the undocumented resource + openapi.paths['/widgets/get'] = { + post: { + operationId: 'widgetsGetPost', + responses: { + 200: { + content: { + 'application/json': { + schema: { + properties: { + ok: { type: 'boolean' }, + secret_widget: { + $ref: '#/components/schemas/secret_widget', + }, + }, + required: ['ok', 'secret_widget'], + type: 'object', + }, + }, + }, + description: 'OK', + }, + }, + security: [], + summary: '/widgets/get', + tags: ['/widgets'], + 'x-response-key': 'secret_widget', + 'x-title': 'Get a widget', + }, + } + + await t.throwsAsync(() => createBlueprint({ ...typesModule, openapi }), { + message: + /Documented endpoints must not reference undocumented resources\. Found:\n.*\/widgets\/get.*secret_widget/, + }) +}) diff --git a/test/snapshots/seam-blueprint.test.ts.md b/test/snapshots/seam-blueprint.test.ts.md index 093e2e3..8a79bc6 100644 --- a/test/snapshots/seam-blueprint.test.ts.md +++ b/test/snapshots/seam-blueprint.test.ts.md @@ -9989,7 +9989,7 @@ Generated by [AVA](https://avajs.dev). }, { deprecationMessage: '', - description: 'ID of the affected [entrance](https://docs.seam.co/latest/capability-guides/retrieving-entrance-details).', + description: 'ID of the affected [entrance](https://docs.seam.co/latest/capability-guides/access-systems/retrieving-entrance-details).', draftMessage: '', format: 'id', isDeprecated: false, @@ -10108,7 +10108,7 @@ Generated by [AVA](https://avajs.dev). }, { deprecationMessage: '', - description: 'ID of the affected [entrance](https://docs.seam.co/latest/capability-guides/retrieving-entrance-details).', + description: 'ID of the affected [entrance](https://docs.seam.co/latest/capability-guides/access-systems/retrieving-entrance-details).', draftMessage: '', format: 'id', isDeprecated: false, @@ -13090,7 +13090,7 @@ Generated by [AVA](https://avajs.dev). }, { deprecationMessage: '', - description: 'An [access system entrance](https://docs.seam.co/latest/capability-guides/retrieving-entrance-details) was added.', + description: 'An [access system entrance](https://docs.seam.co/latest/capability-guides/access-systems/retrieving-entrance-details) was added.', draftMessage: '', eventType: 'acs_entrance.added', isDeprecated: false, @@ -13222,7 +13222,7 @@ Generated by [AVA](https://avajs.dev). }, { deprecationMessage: '', - description: 'An [access system entrance](https://docs.seam.co/latest/capability-guides/retrieving-entrance-details) was removed.', + description: 'An [access system entrance](https://docs.seam.co/latest/capability-guides/access-systems/retrieving-entrance-details) was removed.', draftMessage: '', eventType: 'acs_entrance.removed', isDeprecated: false, @@ -13737,7 +13737,7 @@ Generated by [AVA](https://avajs.dev). }, { deprecationMessage: 'Use `connect_webview.login_succeeded`.', - description: 'A [connected account](https://docs.seam.co/latest/core-concepts/connected-accounts) had a successful login using a [Connect Webview](https://docs.seam.co/latest/ui-components/connect-webviews).', + description: 'A [connected account](https://docs.seam.co/latest/core-concepts/connected-accounts) had a successful login using a [Connect Webview](https://docs.seam.co/latest/core-concepts/connect-webviews).', draftMessage: '', eventType: 'connected_account.successful_login', isDeprecated: true, @@ -15974,7 +15974,7 @@ Generated by [AVA](https://avajs.dev). }, { deprecationMessage: '', - description: 'A [Connect Webview](https://docs.seam.co/latest/ui-components/connect-webviews) login succeeded.', + description: 'A [Connect Webview](https://docs.seam.co/latest/core-concepts/connect-webviews) login succeeded.', draftMessage: '', eventType: 'connect_webview.login_succeeded', isDeprecated: false, @@ -15983,7 +15983,7 @@ Generated by [AVA](https://avajs.dev). properties: [ { deprecationMessage: '', - description: 'ID of the affected [Connect Webview](https://docs.seam.co/latest/ui-components/connect-webviews).', + description: 'ID of the affected [Connect Webview](https://docs.seam.co/latest/core-concepts/connect-webviews).', draftMessage: '', format: 'id', isDeprecated: false, @@ -16119,7 +16119,7 @@ Generated by [AVA](https://avajs.dev). }, { deprecationMessage: '', - description: 'A [Connect Webview](https://docs.seam.co/latest/ui-components/connect-webviews) login failed.', + description: 'A [Connect Webview](https://docs.seam.co/latest/core-concepts/connect-webviews) login failed.', draftMessage: '', eventType: 'connect_webview.login_failed', isDeprecated: false, @@ -16128,7 +16128,7 @@ Generated by [AVA](https://avajs.dev). properties: [ { deprecationMessage: '', - description: 'ID of the affected [Connect Webview](https://docs.seam.co/latest/ui-components/connect-webviews).', + description: 'ID of the affected [Connect Webview](https://docs.seam.co/latest/core-concepts/connect-webviews).', draftMessage: '', format: 'id', isDeprecated: false, @@ -24682,6 +24682,14 @@ Generated by [AVA](https://avajs.dev). parentPath: '/seam/bridge', path: '/seam/bridge/v1', }, + { + isDeprecated: false, + isDraft: false, + isUndocumented: true, + name: 'connect_webview', + parentPath: '/seam', + path: '/seam/connect_webview', + }, { isDeprecated: false, isDraft: false, @@ -28697,6 +28705,63 @@ Generated by [AVA](https://avajs.dev). ], variantGroupKey: null, }, + { + description: 'The Schlage device\'s timezone is ambiguous and this code\'s schedule crosses a daylight-saving transition in at least one plausible timezone. A 1-hour safety buffer has been applied to the side of the schedule affected by the transition (`ends_at` for spring-forward, `starts_at` for fall-back) so the code stays active through the shift — the code may be usable up to 1 hour beyond your requested window. Set the device\'s timezone via `/devices/report_provider_metadata` to clear the buffer and guarantee exact DST handling.', + properties: [ + { + deprecationMessage: '', + description: 'Date and time at which Seam created the warning.', + draftMessage: '', + format: 'datetime', + isDeprecated: false, + isDraft: false, + isUndocumented: false, + jsonType: 'string', + name: 'created_at', + propertyGroupKey: null, + undocumentedMessage: '', + }, + { + deprecationMessage: '', + description: 'Detailed description of the warning. Provides insights into the issue and potentially how to rectify it.', + draftMessage: '', + format: 'string', + isDeprecated: false, + isDraft: false, + isUndocumented: false, + jsonType: 'string', + name: 'message', + propertyGroupKey: null, + undocumentedMessage: '', + }, + { + deprecationMessage: '', + description: 'Unique identifier of the type of warning. Enables quick recognition and categorization of the issue.', + draftMessage: '', + format: 'enum', + isDeprecated: false, + isDraft: false, + isUndocumented: false, + jsonType: 'string', + name: 'warning_code', + propertyGroupKey: null, + undocumentedMessage: '', + values: [ + { + deprecationMessage: '', + description: '', + draftMessage: '', + isDeprecated: false, + isDraft: false, + isUndocumented: false, + name: 'schlage_access_code_ambiguous_timezone_dst_risk', + undocumentedMessage: '', + }, + ], + }, + ], + variantGroupKey: null, + }, { description: 'Code was modified or removed externally after Seam successfully set it on the device.', properties: [ @@ -30270,6 +30335,61 @@ Generated by [AVA](https://avajs.dev). propertyGroupKey: null, undocumentedMessage: '', }, + { + deprecationMessage: '', + description: 'Devices whose access codes could not be revoked during reconciliation. Present when the provider does not support revoking an offline access code (e.g. Dormakaba oracode with exhausted override budget).', + draftMessage: '', + format: 'list', + isDeprecated: false, + isDraft: false, + isUndocumented: false, + itemFormat: 'object', + itemProperties: [ + { + deprecationMessage: '', + description: 'Device whose access code could not be revoked.', + draftMessage: '', + format: 'id', + isDeprecated: false, + isDraft: false, + isUndocumented: false, + jsonType: 'string', + name: 'device_id', + propertyGroupKey: null, + undocumentedMessage: '', + }, + { + deprecationMessage: '', + description: 'Reason the access code could not be revoked (e.g. `offline_access_code_not_revocable`).', + draftMessage: '', + format: 'string', + isDeprecated: false, + isDraft: false, + isUndocumented: false, + jsonType: 'string', + name: 'error_code', + propertyGroupKey: null, + undocumentedMessage: '', + }, + { + deprecationMessage: '', + description: 'Human-readable description of why revocation failed.', + draftMessage: '', + format: 'string', + isDeprecated: false, + isDraft: false, + isUndocumented: false, + jsonType: 'string', + name: 'message', + propertyGroupKey: null, + undocumentedMessage: '', + }, + ], + jsonType: 'array', + name: 'failed_devices', + propertyGroupKey: null, + undocumentedMessage: '', + }, { deprecationMessage: '', description: 'Detailed description of the warning. Provides insights into the issue and potentially how to rectify it.', @@ -31395,7 +31515,7 @@ Generated by [AVA](https://avajs.dev). deprecationMessage: '', description: `Group that defines the entrances to which a set of users has access and, in some cases, the access schedule for these entrances and users.␊ ␊ - Some access control systems use [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups), which are sets of users, combined with sets of permissions. These permissions include both the set of areas or assets that the users can access and the schedule during which the users can access these areas or assets. Instead of assigning access rights individually to each access control system user, which can be time-consuming and error-prone, administrators can assign users to an access group, thereby ensuring that the users inherit all the permissions associated with the access group. Using access groups streamlines the process of managing large numbers of access control system users, especially in bigger organizations or complexes.␊ + Some access control systems use [access group](https://docs.seam.co/latest/capability-guides/access-systems/user-management/assigning-users-to-access-groups), which are sets of users, combined with sets of permissions. These permissions include both the set of areas or assets that the users can access and the schedule during which the users can access these areas or assets. Instead of assigning access rights individually to each access control system user, which can be time-consuming and error-prone, administrators can assign users to an access group, thereby ensuring that the users inherit all the permissions associated with the access group. Using access groups streamlines the process of managing large numbers of access control system users, especially in bigger organizations or complexes.␊ ␊ To learn whether your access control system supports access groups, see the corresponding [system integration guide](https://docs.seam.co/latest/device-and-system-integration-guides/overview#access-control-systems).`, draftMessage: '', @@ -31625,7 +31745,7 @@ Generated by [AVA](https://avajs.dev). variantGroups: [], variants: [ { - description: 'Indicates that the [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups) was not created on the [access system](https://docs.seam.co/latest/capability-guides/access-systems). This is likely due to an internal unexpected error. Contact Seam [support](mailto:support@seam.co).', + description: 'Indicates that the [access group](https://docs.seam.co/latest/capability-guides/access-systems/user-management/assigning-users-to-access-groups) was not created on the [access system](https://docs.seam.co/latest/capability-guides/access-systems). This is likely due to an internal unexpected error. Contact Seam [support](mailto:support@seam.co).', properties: [ { deprecationMessage: '', @@ -35380,7 +35500,7 @@ Generated by [AVA](https://avajs.dev). { description: `Indicates that [Seam Bridge](https://docs.seam.co/latest/capability-guides/seam-bridge) is functioning correctly and the Seam API can communicate with Seam Bridge, but the Seam API cannot connect to the on-premises [Visionline access control system](https://docs.seam.co/latest/device-and-system-integration-guides/assa-abloy-visionline-access-control-system).␊ For example, the IP address of the on-premises access control system may be set incorrectly within the Seam [workspace](https://docs.seam.co/latest/core-concepts/workspaces).␊ - See also [Troubleshooting Your Access Control System](https://docs.seam.co/latest/capability-guides/capability-guides/access-systems/troubleshooting-your-access-control-system#acs_system.errors.visionline_instance_unreachable).`, + See also [Troubleshooting Your Access Control System](https://docs.seam.co/latest/capability-guides/access-systems/troubleshooting-your-access-control-system#acs_system.errors.visionline_instance_unreachable).`, properties: [ { deprecationMessage: '', @@ -35551,7 +35671,7 @@ Generated by [AVA](https://avajs.dev). variantGroupKey: null, }, { - description: 'Indicates that the login credentials are invalid. Reconnect the account using a [Connect Webview](https://docs.seam.co/latest/ui-components/connect-webviews) to restore access.', + description: 'Indicates that the login credentials are invalid. Reconnect the account using a [Connect Webview](https://docs.seam.co/latest/core-concepts/connect-webviews) to restore access.', properties: [ { deprecationMessage: '', @@ -38270,7 +38390,7 @@ Generated by [AVA](https://avajs.dev). deprecationMessage: '', description: `Group that defines the entrances to which a set of users has access and, in some cases, the access schedule for these entrances and users.␊ ␊ - Some access control systems use [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups), which are sets of users, combined with sets of permissions. These permissions include both the set of areas or assets that the users can access and the schedule during which the users can access these areas or assets. Instead of assigning access rights individually to each access control system user, which can be time-consuming and error-prone, administrators can assign users to an access group, thereby ensuring that the users inherit all the permissions associated with the access group. Using access groups streamlines the process of managing large numbers of access control system users, especially in bigger organizations or complexes.␊ + Some access control systems use [access group](https://docs.seam.co/latest/capability-guides/access-systems/user-management/assigning-users-to-access-groups), which are sets of users, combined with sets of permissions. These permissions include both the set of areas or assets that the users can access and the schedule during which the users can access these areas or assets. Instead of assigning access rights individually to each access control system user, which can be time-consuming and error-prone, administrators can assign users to an access group, thereby ensuring that the users inherit all the permissions associated with the access group. Using access groups streamlines the process of managing large numbers of access control system users, especially in bigger organizations or complexes.␊ ␊ To learn whether your access control system supports access groups, see the corresponding [system integration guide](https://docs.seam.co/latest/device-and-system-integration-guides/overview#access-control-systems).`, draftMessage: '', @@ -51845,6 +51965,16 @@ Generated by [AVA](https://avajs.dev). name: 'ring', undocumentedMessage: '', }, + { + deprecationMessage: '', + description: '', + draftMessage: '', + isDeprecated: false, + isDraft: false, + isUndocumented: false, + name: 'ical', + undocumentedMessage: '', + }, ], }, { @@ -51952,6 +52082,16 @@ Generated by [AVA](https://avajs.dev). name: 'cameras', undocumentedMessage: '', }, + { + deprecationMessage: '', + description: '', + draftMessage: '', + isDeprecated: false, + isDraft: false, + isUndocumented: false, + name: 'connectors', + undocumentedMessage: '', + }, ], itemFormat: 'enum', jsonType: 'array', @@ -59966,6 +60106,63 @@ Generated by [AVA](https://avajs.dev). ], variantGroupKey: null, }, + { + description: 'The Schlage device\'s timezone is ambiguous and this code\'s schedule crosses a daylight-saving transition in at least one plausible timezone. A 1-hour safety buffer has been applied to the side of the schedule affected by the transition (`ends_at` for spring-forward, `starts_at` for fall-back) so the code stays active through the shift — the code may be usable up to 1 hour beyond your requested window. Set the device\'s timezone via `/devices/report_provider_metadata` to clear the buffer and guarantee exact DST handling.', + properties: [ + { + deprecationMessage: '', + description: 'Date and time at which Seam created the warning.', + draftMessage: '', + format: 'datetime', + isDeprecated: false, + isDraft: false, + isUndocumented: false, + jsonType: 'string', + name: 'created_at', + propertyGroupKey: null, + undocumentedMessage: '', + }, + { + deprecationMessage: '', + description: 'Detailed description of the warning. Provides insights into the issue and potentially how to rectify it.', + draftMessage: '', + format: 'string', + isDeprecated: false, + isDraft: false, + isUndocumented: false, + jsonType: 'string', + name: 'message', + propertyGroupKey: null, + undocumentedMessage: '', + }, + { + deprecationMessage: '', + description: 'Unique identifier of the type of warning. Enables quick recognition and categorization of the issue.', + draftMessage: '', + format: 'enum', + isDeprecated: false, + isDraft: false, + isUndocumented: false, + jsonType: 'string', + name: 'warning_code', + propertyGroupKey: null, + undocumentedMessage: '', + values: [ + { + deprecationMessage: '', + description: '', + draftMessage: '', + isDeprecated: false, + isDraft: false, + isUndocumented: false, + name: 'schlage_access_code_ambiguous_timezone_dst_risk', + undocumentedMessage: '', + }, + ], + }, + ], + variantGroupKey: null, + }, { description: 'Code was modified or removed externally after Seam successfully set it on the device.', properties: [ @@ -60902,7 +61099,7 @@ Generated by [AVA](https://avajs.dev). variantGroups: [], variants: [ { - description: 'Indicates that the [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups) was not created on the [access system](https://docs.seam.co/latest/capability-guides/access-systems). This is likely due to an internal unexpected error. Contact Seam [support](mailto:support@seam.co).', + description: 'Indicates that the [access group](https://docs.seam.co/latest/capability-guides/access-systems/user-management/assigning-users-to-access-groups) was not created on the [access system](https://docs.seam.co/latest/capability-guides/access-systems). This is likely due to an internal unexpected error. Contact Seam [support](mailto:support@seam.co).', properties: [ { deprecationMessage: '', @@ -69748,7 +69945,7 @@ Generated by [AVA](https://avajs.dev). }, { deprecationMessage: '', - description: 'Indicates whether to use a [backup access code pool](https://docs.seam.co/latest/core-concepts/access-codes#backup-access-codes) provided by Seam. If `true`, you can use [`/access_codes/pull_backup_access_code`](https://docs.seam.co/latest/api/access_codes/pull_backup_access_code).', + description: 'Indicates whether to use a [backup access code pool](https://docs.seam.co/latest/capability-guides/smart-locks/access-codes#backup-access-codes) provided by Seam. If `true`, you can use [`/access_codes/pull_backup_access_code`](https://docs.seam.co/latest/api/access_codes/pull_backup_access_code).', draftMessage: '', format: 'boolean', hasDefault: false, @@ -71182,7 +71379,7 @@ Generated by [AVA](https://avajs.dev). }, { deprecationMessage: '', - description: 'Indicates whether to use a [backup access code pool](https://docs.seam.co/latest/core-concepts/access-codes#backup-access-codes) provided by Seam. If `true`, you can use [`/access_codes/pull_backup_access_code`](https://docs.seam.co/latest/api/access_codes/pull_backup_access_code).', + description: 'Indicates whether to use a [backup access code pool](https://docs.seam.co/latest/capability-guides/smart-locks/access-codes#backup-access-codes) provided by Seam. If `true`, you can use [`/access_codes/pull_backup_access_code`](https://docs.seam.co/latest/api/access_codes/pull_backup_access_code).', draftMessage: '', format: 'boolean', hasDefault: false, @@ -74273,7 +74470,7 @@ Generated by [AVA](https://avajs.dev). ], codeSamples: [], deprecationMessage: '', - description: 'Adds a specified [access system user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) to a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups).', + description: 'Adds a specified [access system user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) to a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/user-management/assigning-users-to-access-groups).', draftMessage: '', hasPagination: false, isDeprecated: false, @@ -74350,7 +74547,7 @@ Generated by [AVA](https://avajs.dev). ], codeSamples: [], deprecationMessage: '', - description: 'Deletes a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups).', + description: 'Deletes a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/user-management/assigning-users-to-access-groups).', draftMessage: '', hasPagination: false, isDeprecated: false, @@ -74398,7 +74595,7 @@ Generated by [AVA](https://avajs.dev). ], codeSamples: [], deprecationMessage: '', - description: 'Returns a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups).', + description: 'Returns a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/user-management/assigning-users-to-access-groups).', draftMessage: '', hasPagination: false, isDeprecated: false, @@ -74450,7 +74647,7 @@ Generated by [AVA](https://avajs.dev). ], codeSamples: [], deprecationMessage: '', - description: 'Returns a list of all [access groups](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups).', + description: 'Returns a list of all [access groups](https://docs.seam.co/latest/capability-guides/access-systems/user-management/assigning-users-to-access-groups).', draftMessage: '', hasPagination: false, isDeprecated: false, @@ -74544,7 +74741,7 @@ Generated by [AVA](https://avajs.dev). ], codeSamples: [], deprecationMessage: '', - description: 'Returns a list of all accessible entrances for a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups).', + description: 'Returns a list of all accessible entrances for a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/user-management/assigning-users-to-access-groups).', draftMessage: '', hasPagination: false, isDeprecated: false, @@ -74596,7 +74793,7 @@ Generated by [AVA](https://avajs.dev). ], codeSamples: [], deprecationMessage: '', - description: 'Returns a list of all [access system users](https://docs.seam.co/latest/capability-guides/access-systems/user-management) in an [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups).', + description: 'Returns a list of all [access system users](https://docs.seam.co/latest/capability-guides/access-systems/user-management) in an [access group](https://docs.seam.co/latest/capability-guides/access-systems/user-management/assigning-users-to-access-groups).', draftMessage: '', hasPagination: false, isDeprecated: false, @@ -74648,7 +74845,7 @@ Generated by [AVA](https://avajs.dev). ], codeSamples: [], deprecationMessage: '', - description: 'Removes a specified [access system user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) from a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups).', + description: 'Removes a specified [access system user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) from a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/user-management/assigning-users-to-access-groups).', draftMessage: '', hasPagination: false, isDeprecated: false, @@ -74735,7 +74932,7 @@ Generated by [AVA](https://avajs.dev). ], codeSamples: [], deprecationMessage: '', - description: 'Returns a specified unmanaged [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups).', + description: 'Returns a specified unmanaged [access group](https://docs.seam.co/latest/capability-guides/access-systems/user-management/assigning-users-to-access-groups).', draftMessage: '', hasPagination: false, isDeprecated: false, @@ -74787,7 +74984,7 @@ Generated by [AVA](https://avajs.dev). ], codeSamples: [], deprecationMessage: '', - description: 'Returns a list of all unmanaged [access groups](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups).', + description: 'Returns a list of all unmanaged [access groups](https://docs.seam.co/latest/capability-guides/access-systems/user-management/assigning-users-to-access-groups).', draftMessage: '', hasPagination: false, isDeprecated: false, @@ -78008,7 +78205,7 @@ Generated by [AVA](https://avajs.dev). ], codeSamples: [], deprecationMessage: '', - description: 'Adds a specified [access system user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) to a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups).', + description: 'Adds a specified [access system user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) to a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/user-management/assigning-users-to-access-groups).', draftMessage: '', hasPagination: false, isDeprecated: false, @@ -78640,7 +78837,7 @@ Generated by [AVA](https://avajs.dev). ], codeSamples: [], deprecationMessage: '', - description: 'Removes a specified [access system user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) from a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups).', + description: 'Removes a specified [access system user](https://docs.seam.co/latest/capability-guides/access-systems/user-management) from a specified [access group](https://docs.seam.co/latest/capability-guides/access-systems/user-management/assigning-users-to-access-groups).', draftMessage: '', hasPagination: false, isDeprecated: false, @@ -80860,6 +81057,16 @@ Generated by [AVA](https://avajs.dev). name: 'ring', undocumentedMessage: '', }, + { + deprecationMessage: '', + description: '', + draftMessage: '', + isDeprecated: false, + isDraft: false, + isUndocumented: false, + name: 'ical', + undocumentedMessage: '', + }, { deprecationMessage: '', description: '', @@ -81111,6 +81318,16 @@ Generated by [AVA](https://avajs.dev). name: 'cameras', undocumentedMessage: '', }, + { + deprecationMessage: '', + description: '', + draftMessage: '', + isDeprecated: false, + isDraft: false, + isUndocumented: false, + name: 'connectors', + undocumentedMessage: '', + }, { deprecationMessage: '', description: '', @@ -84799,8 +85016,8 @@ Generated by [AVA](https://avajs.dev). actionAttemptType: null, batchResourceTypes: null, description: 'OK', - resourceType: 'magic_link', - responseKey: 'magic_link', + resourceType: 'unknown', + responseKey: 'customer_portal', responseType: 'resource', }, title: 'Create Customer Portal', @@ -89157,6 +89374,16 @@ Generated by [AVA](https://avajs.dev). name: 'ring', undocumentedMessage: '', }, + { + deprecationMessage: '', + description: '', + draftMessage: '', + isDeprecated: false, + isDraft: false, + isUndocumented: false, + name: 'ical', + undocumentedMessage: '', + }, ], }, { @@ -89356,6 +89583,16 @@ Generated by [AVA](https://avajs.dev). name: 'cameras', undocumentedMessage: '', }, + { + deprecationMessage: '', + description: '', + draftMessage: '', + isDeprecated: false, + isDraft: false, + isUndocumented: false, + name: 'connectors', + undocumentedMessage: '', + }, ], }, ], @@ -100433,6 +100670,16 @@ Generated by [AVA](https://avajs.dev). name: 'ring', undocumentedMessage: '', }, + { + deprecationMessage: '', + description: '', + draftMessage: '', + isDeprecated: false, + isDraft: false, + isUndocumented: false, + name: 'ical', + undocumentedMessage: '', + }, ], }, { @@ -103263,7 +103510,7 @@ Generated by [AVA](https://avajs.dev). ], codeSamples: [], deprecationMessage: '', - description: 'Gets an [instant key](https://docs.seam.co/latest/capability-guides/mobile-access/instant-keys).', + description: 'Gets an [instant key](https://docs.seam.co/latest/capability-guides/instant-keys).', draftMessage: '', hasPagination: false, isDeprecated: false, @@ -103329,7 +103576,7 @@ Generated by [AVA](https://avajs.dev). ], codeSamples: [], deprecationMessage: '', - description: 'Returns a list of all [instant keys](https://docs.seam.co/latest/capability-guides/mobile-access/instant-keys).', + description: 'Returns a list of all [instant keys](https://docs.seam.co/latest/capability-guides/instant-keys).', draftMessage: '', hasPagination: false, isDeprecated: false, @@ -107449,6 +107696,162 @@ Generated by [AVA](https://avajs.dev). parentPath: '/seam/bridge/v1', path: '/seam/bridge/v1/bridge_connected_systems', }, + { + endpoints: [ + { + authMethods: [], + codeSamples: [], + deprecationMessage: '', + description: 'Returns the current render pane for a [Connect Webview](https://docs.seam.co/latest/core-concepts/connect-webviews).', + draftMessage: '', + hasPagination: false, + isDeprecated: false, + isDraft: false, + isUndocumented: true, + name: 'get_current_pane', + parentPath: '/seam/connect_webview/v1', + path: '/seam/connect_webview/v1/get_current_pane', + request: { + methods: [ + 'GET', + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + draftMessage: '', + format: 'id', + hasDefault: false, + isDeprecated: false, + isDraft: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'connect_webview_id', + undocumentedMessage: '', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'GET', + }, + response: { + actionAttemptType: null, + batchResourceTypes: null, + description: 'OK', + resourceType: 'access_code', + responseKey: 'pane', + responseType: 'resource', + }, + title: 'Get Current Pane', + undocumentedMessage: 'Internal endpoint for driving Connect Webview flows programmatically.', + workspaceScope: 'none', + }, + { + authMethods: [], + codeSamples: [], + deprecationMessage: '', + description: 'Resets an errored [Connect Webview](https://docs.seam.co/latest/core-concepts/connect-webviews) so its login flow can be retried.', + draftMessage: '', + hasPagination: false, + isDeprecated: false, + isDraft: false, + isUndocumented: true, + name: 'reset', + parentPath: '/seam/connect_webview/v1', + path: '/seam/connect_webview/v1/reset', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + draftMessage: '', + format: 'id', + hasDefault: false, + isDeprecated: false, + isDraft: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'connect_webview_id', + undocumentedMessage: '', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + actionAttemptType: null, + batchResourceTypes: null, + description: 'OK', + resourceType: 'unknown', + responseKey: 'ok', + responseType: 'resource', + }, + title: 'Reset Connect Webview', + undocumentedMessage: 'Internal endpoint for driving Connect Webview flows programmatically.', + workspaceScope: 'none', + }, + { + authMethods: [], + codeSamples: [], + deprecationMessage: '', + description: 'Submits pane arguments to advance a [Connect Webview](https://docs.seam.co/latest/core-concepts/connect-webviews) login state machine.', + draftMessage: '', + hasPagination: false, + isDeprecated: false, + isDraft: false, + isUndocumented: true, + name: 'submit', + parentPath: '/seam/connect_webview/v1', + path: '/seam/connect_webview/v1/submit', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + draftMessage: '', + format: 'id', + hasDefault: false, + isDeprecated: false, + isDraft: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'connect_webview_id', + undocumentedMessage: '', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + actionAttemptType: null, + batchResourceTypes: null, + description: 'OK', + resourceType: 'unknown', + responseKey: 'ok', + responseType: 'resource', + }, + title: 'Submit Connect Webview Pane', + undocumentedMessage: 'Internal endpoint for driving Connect Webview flows programmatically.', + workspaceScope: 'none', + }, + ], + isDeprecated: false, + isDraft: false, + isUndocumented: true, + name: 'v1', + namespacePath: '/seam/connect_webview', + parentPath: '/seam/connect_webview', + path: '/seam/connect_webview/v1', + }, { endpoints: [ { @@ -122550,7 +122953,7 @@ Generated by [AVA](https://avajs.dev). ], codeSamples: [], deprecationMessage: '', - description: 'Deletes a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). This deletes the user identity and all associated resources, including any [credentials](https://docs.seam.co/latest/api/access-control-systems/credentials), [acs users](https://docs.seam.co/latest/api/access-control-systems/users) and [client sessions](https://docs.seam.co/latest/api/client_sessions).', + description: 'Deletes a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity). This deletes the user identity and all associated resources, including any [credentials](https://docs.seam.co/latest/api/acs/credentials), [acs users](https://docs.seam.co/latest/api/acs/users) and [client sessions](https://docs.seam.co/latest/api/client_sessions).', draftMessage: '', hasPagination: false, isDeprecated: false, @@ -122598,7 +123001,7 @@ Generated by [AVA](https://avajs.dev). ], codeSamples: [], deprecationMessage: '', - description: 'Generates a new [instant key](https://docs.seam.co/latest/capability-guides/mobile-access/instant-keys) for a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity).', + description: 'Generates a new [instant key](https://docs.seam.co/latest/capability-guides/instant-keys) for a specified [user identity](https://docs.seam.co/latest/capability-guides/mobile-access/managing-mobile-app-user-accounts-with-user-identities#what-is-a-user-identity).', draftMessage: '', hasPagination: false, isDeprecated: false, diff --git a/test/snapshots/seam-blueprint.test.ts.snap b/test/snapshots/seam-blueprint.test.ts.snap index 0edcc07..c62ada7 100644 Binary files a/test/snapshots/seam-blueprint.test.ts.snap and b/test/snapshots/seam-blueprint.test.ts.snap differ