From 9081a6844426b120755d88e9851116dd03f60be9 Mon Sep 17 00:00:00 2001 From: Mike Wu Date: Tue, 10 Sep 2024 06:27:35 +0900 Subject: [PATCH 1/9] feat: generate all /acs routes and resources (#72) * feat: generate all /acs routes and resources * ci: Generate code * fix missing object parameters / properties * ci: Generate code --------- Co-authored-by: Seam Bot Co-authored-by: Evan Sosenko --- src/lib/blueprint.ts | 30 +- test/snapshots/seam-blueprint.test.ts.md | 3144 +++++++++++++++++++- test/snapshots/seam-blueprint.test.ts.snap | Bin 3907 -> 19347 bytes 3 files changed, 3025 insertions(+), 149 deletions(-) diff --git a/src/lib/blueprint.ts b/src/lib/blueprint.ts index ff4e7ba..b8c70a8 100644 --- a/src/lib/blueprint.ts +++ b/src/lib/blueprint.ts @@ -69,6 +69,11 @@ interface StringParameter extends BaseParameter { jsonType: 'string' } +interface NumberParameter extends BaseParameter { + format: 'number' + jsonType: 'number' +} + interface EnumParameter extends BaseParameter { format: 'enum' jsonType: 'string' @@ -108,6 +113,7 @@ interface IdParameter extends BaseParameter { export type Parameter = | StringParameter + | NumberParameter | EnumParameter | RecordParameter | ListParameter @@ -239,8 +245,16 @@ export const createBlueprint = async ( const openapi = typesModule.openapi as Openapi const isFakeData = openapi.info.title === 'Foo' - const targetPath = '/acs/systems/' - const targetSchema = 'acs_system' + const targetPath = '/acs' + const targetSchemas = [ + 'acs_access_group', + 'acs_credential', + 'acs_credential_pool', + 'acs_credential_provisioning_automation', + 'acs_entrance', + 'acs_system', + 'acs_user', + ] const context = { codeSampleDefinitions, @@ -253,7 +267,7 @@ export const createBlueprint = async ( resources: createResources( openapi.components.schemas, isFakeData, - targetSchema, + targetSchemas, ), } } @@ -494,6 +508,12 @@ const createParameters = ( } } return { ...baseParam, format: 'record', jsonType: 'object' } + case 'number': + return { + ...baseParam, + format: 'number', + jsonType: 'number', + } default: throw new Error(`Unsupported property type: ${parsedProp.type}`) } @@ -504,10 +524,10 @@ const createParameters = ( const createResources = ( schemas: Openapi['components']['schemas'], isFakeData: boolean, - targetSchema: string, + targetSchemas: string[], ): Record => { return Object.entries(schemas) - .filter(([schemaName]) => isFakeData || schemaName === targetSchema) + .filter(([schemaName]) => isFakeData || targetSchemas.includes(schemaName)) .reduce>((acc, [schemaName, schema]) => { if ( typeof schema === 'object' && diff --git a/test/snapshots/seam-blueprint.test.ts.md b/test/snapshots/seam-blueprint.test.ts.md index f07087d..0c5d28d 100644 --- a/test/snapshots/seam-blueprint.test.ts.md +++ b/test/snapshots/seam-blueprint.test.ts.md @@ -10,195 +10,310 @@ Generated by [AVA](https://avajs.dev). { resources: { - acs_system: { - description: 'Represents an [access control system](https://docs.seam.co/latest/capability-guides/access-systems).', + acs_access_group: { + description: '', properties: [ + { + deprecationMessage: 'use external_type', + description: '', + format: 'enum', + isDeprecated: true, + isUndocumented: false, + jsonType: 'string', + name: 'access_group_type', + values: [ + { + name: 'pti_unit', + }, + { + name: 'pti_access_level', + }, + { + name: 'salto_access_group', + }, + { + name: 'brivo_group', + }, + ], + }, + { + deprecationMessage: 'use external_type_display_name', + description: '', + format: 'string', + isDeprecated: true, + isUndocumented: false, + jsonType: 'string', + name: 'access_group_type_display_name', + }, { deprecationMessage: '', - description: 'ID of the `acs_system`.', + description: '', format: 'id', isDeprecated: false, isUndocumented: false, jsonType: 'string', - name: 'acs_system_id', + name: 'acs_access_group_id', }, { deprecationMessage: '', - description: 'Indicates whether the `acs_system` supports [adding users to access groups](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups#add-an-acs-user-to-an-access-group). See also [Access Group-based Access Control Systems](https://docs.seam.co/latest/capability-guides/access-systems/understanding-access-control-system-differences#access-group-based-access-control-systems).', - format: 'boolean', + description: '', + format: 'id', isDeprecated: false, isUndocumented: false, - jsonType: 'boolean', - name: 'can_add_acs_users_to_acs_access_groups', + jsonType: 'string', + name: 'acs_system_id', }, { deprecationMessage: '', - description: 'Indicates whether it is possible to [launch enrollment automations](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system#prepare-the-phones-for-a-user-identity-to-start-receiving-mobile-credentials-using-an-enrollment-aut) for the `acs_system`.', - format: 'boolean', + description: '', + format: 'datetime', isDeprecated: false, isUndocumented: false, - jsonType: 'boolean', - name: 'can_automate_enrollment', + jsonType: 'string', + name: 'created_at', }, { deprecationMessage: '', - description: 'Indicates whether the `acs_system` supports creating [access groups](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups). See also [Access Group-based Access Control Systems](https://docs.seam.co/latest/capability-guides/access-systems/understanding-access-control-system-differences#access-group-based-access-control-systems).', - format: 'boolean', + description: '', + format: 'string', isDeprecated: false, isUndocumented: false, - jsonType: 'boolean', - name: 'can_create_acs_access_groups', + jsonType: 'string', + name: 'display_name', }, { deprecationMessage: '', - description: 'Indicates whether the `acs_system` supports [removing users from access groups](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups#remove-an-acs-user-from-an-access-group). See also [Access Group-based Access Control Systems](https://docs.seam.co/latest/capability-guides/access-systems/understanding-access-control-system-differences#access-group-based-access-control-systems).', - format: 'boolean', + description: '', + format: 'enum', isDeprecated: false, isUndocumented: false, - jsonType: 'boolean', - name: 'can_remove_acs_users_from_acs_access_groups', + jsonType: 'string', + name: 'external_type', + values: [ + { + name: 'pti_unit', + }, + { + name: 'pti_access_level', + }, + { + name: 'salto_access_group', + }, + { + name: 'brivo_group', + }, + ], }, { deprecationMessage: '', - description: 'IDs of the [connected accounts](https://docs.seam.co/latest/core-concepts/connected-accounts) associated with the `acs_system`.', - format: 'list', + description: '', + format: 'string', isDeprecated: false, isUndocumented: false, - jsonType: 'array', - name: 'connected_account_ids', + jsonType: 'string', + name: 'external_type_display_name', }, { deprecationMessage: '', - description: 'Date and time at which the `acs_system` was created.', - format: 'datetime', + description: '', + format: 'string', isDeprecated: false, isUndocumented: false, jsonType: 'string', - name: 'created_at', + name: 'name', }, { deprecationMessage: '', - description: 'Errors associated with the `acs_system`.', - format: 'list', + description: '', + format: 'id', isDeprecated: false, isUndocumented: false, - jsonType: 'array', - name: 'errors', + jsonType: 'string', + name: 'workspace_id', }, + ], + resourceType: 'acs_access_group', + }, + acs_credential: { + description: '', + properties: [ { deprecationMessage: '', - description: 'Brand-specific terminology for the `acs_system` type.', + description: '', format: 'enum', isDeprecated: false, isUndocumented: false, jsonType: 'string', - name: 'external_type', + name: 'access_method', values: [ { - name: 'pti_site', - }, - { - name: 'alta_org', - }, - { - name: 'salto_site', - }, - { - name: 'brivo_account', - }, - { - name: 'hid_credential_manager_organization', - }, - { - name: 'visionline_system', + name: 'code', }, { - name: 'assa_abloy_credential_service', + name: 'card', }, { - name: 'latch_building', + name: 'mobile_key', }, ], }, { deprecationMessage: '', - description: 'Display name that corresponds to the brand-specific terminology for the `acs_system` type.', - format: 'string', + description: '', + format: 'id', isDeprecated: false, isUndocumented: false, jsonType: 'string', - name: 'external_type_display_name', + name: 'acs_credential_id', }, { deprecationMessage: '', - description: 'Alternative text for the `acs_system` image.', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'acs_credential_pool_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'acs_system_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'acs_user_id', + }, + { + deprecationMessage: '', + description: '', format: 'string', isDeprecated: false, isUndocumented: false, jsonType: 'string', - name: 'image_alt_text', + name: 'code', }, { deprecationMessage: '', - description: 'URL for the image that represents the `acs_system`.', + description: '', + format: 'datetime', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'created_at', + }, + { + deprecationMessage: '', + description: '', format: 'string', isDeprecated: false, isUndocumented: false, jsonType: 'string', - name: 'image_url', + name: 'display_name', }, { deprecationMessage: '', - description: 'Name of the `acs_system`.', + description: '', format: 'string', isDeprecated: false, isUndocumented: false, jsonType: 'string', - name: 'name', + name: 'ends_at', }, { - deprecationMessage: 'Use `external_type`.', + deprecationMessage: '', + description: '', + format: 'list', + isDeprecated: false, + isUndocumented: false, + jsonType: 'array', + name: 'errors', + }, + { + deprecationMessage: '', description: '', format: 'enum', - isDeprecated: true, + isDeprecated: false, isUndocumented: false, jsonType: 'string', - name: 'system_type', + name: 'external_type', values: [ { - name: 'pti_site', - }, - { - name: 'alta_org', - }, - { - name: 'salto_site', - }, - { - name: 'brivo_account', - }, - { - name: 'hid_credential_manager_organization', + name: 'pti_card', }, { - name: 'visionline_system', + name: 'brivo_credential', }, { - name: 'assa_abloy_credential_service', + name: 'hid_credential', }, { - name: 'latch_building', + name: 'visionline_card', }, ], }, { - deprecationMessage: 'Use `external_type_display_name`.', + deprecationMessage: '', description: '', format: 'string', - isDeprecated: true, + isDeprecated: false, isUndocumented: false, jsonType: 'string', - name: 'system_type_display_name', + name: 'external_type_display_name', + }, + { + deprecationMessage: '', + description: '', + format: 'boolean', + isDeprecated: false, + isUndocumented: false, + jsonType: 'boolean', + name: 'is_latest_desired_state_synced_with_provider', + }, + { + deprecationMessage: '', + description: '', + format: 'boolean', + isDeprecated: false, + isUndocumented: false, + jsonType: 'boolean', + name: 'is_multi_phone_sync_credential', + }, + { + deprecationMessage: '', + description: '', + format: 'datetime', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'latest_desired_state_synced_with_provider_at', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'parent_acs_credential_id', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'starts_at', }, { deprecationMessage: '', @@ -212,67 +327,2592 @@ Generated by [AVA](https://avajs.dev). { deprecationMessage: '', description: '', - format: 'string', + format: 'enum', isDeprecated: false, isUndocumented: false, jsonType: 'string', - name: 'lan_address', + name: 'card_function_type', + values: [ + { + name: 'guest', + }, + { + name: 'staff', + }, + ], }, { deprecationMessage: '', description: '', - format: 'string', + format: 'list', isDeprecated: false, isUndocumented: false, - jsonType: 'string', - name: 'mobile_access_uuid', + jsonType: 'array', + name: 'common_acs_entrance_ids', }, { deprecationMessage: '', description: '', - format: 'string', + format: 'list', isDeprecated: false, isUndocumented: false, - jsonType: 'string', - name: 'system_id', + jsonType: 'array', + name: 'guest_acs_entrance_ids', + }, + { + deprecationMessage: '', + description: '', + format: 'list', + isDeprecated: false, + isUndocumented: false, + jsonType: 'array', + name: 'joiner_acs_credential_ids', }, ], }, { deprecationMessage: '', - description: 'Warnings associated with the `acs_system`.', + description: '', + format: 'list', + isDeprecated: false, + isUndocumented: false, + jsonType: 'array', + name: 'warnings', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'workspace_id', + }, + ], + resourceType: 'acs_credential', + }, + acs_credential_pool: { + description: '', + properties: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'acs_credential_pool_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'acs_system_id', + }, + { + deprecationMessage: '', + description: '', + format: 'datetime', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'created_at', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'display_name', + }, + { + deprecationMessage: '', + description: '', + format: 'enum', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'external_type', + values: [ + { + name: 'hid_part_number', + }, + ], + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'external_type_display_name', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'workspace_id', + }, + ], + resourceType: 'acs_credential_pool', + }, + acs_credential_provisioning_automation: { + description: '', + properties: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'acs_credential_provisioning_automation_id', + }, + { + deprecationMessage: '', + description: '', + format: 'datetime', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'created_at', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'credential_manager_acs_system_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'user_identity_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'workspace_id', + }, + ], + resourceType: 'acs_credential_provisioning_automation', + }, + acs_entrance: { + description: '', + properties: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'acs_entrance_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'acs_system_id', + }, + { + deprecationMessage: '', + description: '', + format: 'datetime', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'created_at', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'display_name', + }, + { + deprecationMessage: '', + description: '', format: 'list', isDeprecated: false, isUndocumented: false, - jsonType: 'array', - name: 'warnings', + jsonType: 'array', + name: 'errors', + }, + { + deprecationMessage: '', + description: '', + format: 'object', + isDeprecated: false, + isUndocumented: false, + jsonType: 'object', + name: 'latch_metadata', + properties: [ + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'accessibility_type', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'door_name', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'door_type', + }, + { + deprecationMessage: '', + description: '', + format: 'boolean', + isDeprecated: false, + isUndocumented: false, + jsonType: 'boolean', + name: 'is_connected', + }, + ], + }, + { + deprecationMessage: '', + description: '', + format: 'object', + isDeprecated: false, + isUndocumented: false, + jsonType: 'object', + name: 'visionline_metadata', + properties: [ + { + deprecationMessage: '', + description: '', + format: 'enum', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'door_category', + values: [ + { + name: 'entrance', + }, + { + name: 'guest', + }, + { + name: 'elevator reader', + }, + { + name: 'common', + }, + { + name: 'common (PMS)', + }, + ], + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'door_name', + }, + { + deprecationMessage: '', + description: '', + format: 'list', + isDeprecated: false, + isUndocumented: false, + jsonType: 'array', + name: 'profiles', + }, + ], + }, + ], + resourceType: 'acs_entrance', + }, + acs_system: { + description: 'Represents an [access control system](https://docs.seam.co/latest/capability-guides/access-systems).', + properties: [ + { + deprecationMessage: '', + description: 'ID of the `acs_system`.', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'acs_system_id', + }, + { + deprecationMessage: '', + description: 'Indicates whether the `acs_system` supports [adding users to access groups](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups#add-an-acs-user-to-an-access-group). See also [Access Group-based Access Control Systems](https://docs.seam.co/latest/capability-guides/access-systems/understanding-access-control-system-differences#access-group-based-access-control-systems).', + format: 'boolean', + isDeprecated: false, + isUndocumented: false, + jsonType: 'boolean', + name: 'can_add_acs_users_to_acs_access_groups', + }, + { + deprecationMessage: '', + description: 'Indicates whether it is possible to [launch enrollment automations](https://docs.seam.co/latest/capability-guides/mobile-access-in-development/issuing-mobile-credentials-from-an-access-control-system#prepare-the-phones-for-a-user-identity-to-start-receiving-mobile-credentials-using-an-enrollment-aut) for the `acs_system`.', + format: 'boolean', + isDeprecated: false, + isUndocumented: false, + jsonType: 'boolean', + name: 'can_automate_enrollment', + }, + { + deprecationMessage: '', + description: 'Indicates whether the `acs_system` supports creating [access groups](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups). See also [Access Group-based Access Control Systems](https://docs.seam.co/latest/capability-guides/access-systems/understanding-access-control-system-differences#access-group-based-access-control-systems).', + format: 'boolean', + isDeprecated: false, + isUndocumented: false, + jsonType: 'boolean', + name: 'can_create_acs_access_groups', + }, + { + deprecationMessage: '', + description: 'Indicates whether the `acs_system` supports [removing users from access groups](https://docs.seam.co/latest/capability-guides/access-systems/assigning-users-to-access-groups#remove-an-acs-user-from-an-access-group). See also [Access Group-based Access Control Systems](https://docs.seam.co/latest/capability-guides/access-systems/understanding-access-control-system-differences#access-group-based-access-control-systems).', + format: 'boolean', + isDeprecated: false, + isUndocumented: false, + jsonType: 'boolean', + name: 'can_remove_acs_users_from_acs_access_groups', + }, + { + deprecationMessage: '', + description: 'IDs of the [connected accounts](https://docs.seam.co/latest/core-concepts/connected-accounts) associated with the `acs_system`.', + format: 'list', + isDeprecated: false, + isUndocumented: false, + jsonType: 'array', + name: 'connected_account_ids', + }, + { + deprecationMessage: '', + description: 'Date and time at which the `acs_system` was created.', + format: 'datetime', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'created_at', + }, + { + deprecationMessage: '', + description: 'Errors associated with the `acs_system`.', + format: 'list', + isDeprecated: false, + isUndocumented: false, + jsonType: 'array', + name: 'errors', + }, + { + deprecationMessage: '', + description: 'Brand-specific terminology for the `acs_system` type.', + format: 'enum', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'external_type', + values: [ + { + name: 'pti_site', + }, + { + name: 'alta_org', + }, + { + name: 'salto_site', + }, + { + name: 'brivo_account', + }, + { + name: 'hid_credential_manager_organization', + }, + { + name: 'visionline_system', + }, + { + name: 'assa_abloy_credential_service', + }, + { + name: 'latch_building', + }, + ], + }, + { + deprecationMessage: '', + description: 'Display name that corresponds to the brand-specific terminology for the `acs_system` type.', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'external_type_display_name', + }, + { + deprecationMessage: '', + description: 'Alternative text for the `acs_system` image.', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'image_alt_text', + }, + { + deprecationMessage: '', + description: 'URL for the image that represents the `acs_system`.', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'image_url', + }, + { + deprecationMessage: '', + description: 'Name of the `acs_system`.', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'name', + }, + { + deprecationMessage: 'Use `external_type`.', + description: '', + format: 'enum', + isDeprecated: true, + isUndocumented: false, + jsonType: 'string', + name: 'system_type', + values: [ + { + name: 'pti_site', + }, + { + name: 'alta_org', + }, + { + name: 'salto_site', + }, + { + name: 'brivo_account', + }, + { + name: 'hid_credential_manager_organization', + }, + { + name: 'visionline_system', + }, + { + name: 'assa_abloy_credential_service', + }, + { + name: 'latch_building', + }, + ], + }, + { + deprecationMessage: 'Use `external_type_display_name`.', + description: '', + format: 'string', + isDeprecated: true, + isUndocumented: false, + jsonType: 'string', + name: 'system_type_display_name', + }, + { + deprecationMessage: '', + description: '', + format: 'object', + isDeprecated: false, + isUndocumented: false, + jsonType: 'object', + name: 'visionline_metadata', + properties: [ + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'lan_address', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'mobile_access_uuid', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'system_id', + }, + ], + }, + { + deprecationMessage: '', + description: 'Warnings associated with the `acs_system`.', + format: 'list', + isDeprecated: false, + isUndocumented: false, + jsonType: 'array', + name: 'warnings', + }, + { + deprecationMessage: '', + description: 'ID of the [workspace](https://docs.seam.co/latest/core-concepts/workspaces) that contains the `acs_system`.', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'workspace_id', + }, + ], + resourceType: 'acs_system', + }, + acs_user: { + description: '', + properties: [ + { + deprecationMessage: '', + description: '', + format: 'object', + isDeprecated: false, + isUndocumented: false, + jsonType: 'object', + name: 'access_schedule', + properties: [ + { + deprecationMessage: '', + description: '', + format: 'datetime', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'ends_at', + }, + { + deprecationMessage: '', + description: '', + format: 'datetime', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'starts_at', + }, + ], + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'acs_system_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'acs_user_id', + }, + { + deprecationMessage: '', + description: '', + format: 'datetime', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'created_at', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'display_name', + }, + { + deprecationMessage: 'use email_address.', + description: '', + format: 'string', + isDeprecated: true, + isUndocumented: false, + jsonType: 'string', + name: 'email', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'email_address', + }, + { + deprecationMessage: '', + description: '', + format: 'enum', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'external_type', + values: [ + { + name: 'pti_user', + }, + { + name: 'brivo_user', + }, + { + name: 'hid_credential_manager_user', + }, + { + name: 'salto_site_user', + }, + { + name: 'latch_user', + }, + ], + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'external_type_display_name', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'full_name', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'hid_acs_system_id', + }, + { + deprecationMessage: '', + description: '', + format: 'boolean', + isDeprecated: false, + isUndocumented: false, + jsonType: 'boolean', + name: 'is_latest_desired_state_synced_with_provider', + }, + { + deprecationMessage: '', + description: '', + format: 'boolean', + isDeprecated: false, + isUndocumented: false, + jsonType: 'boolean', + name: 'is_suspended', + }, + { + deprecationMessage: '', + description: '', + format: 'datetime', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'latest_desired_state_synced_with_provider_at', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'phone_number', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'user_identity_email_address', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'user_identity_full_name', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'user_identity_id', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'user_identity_phone_number', + }, + { + deprecationMessage: '', + description: '', + format: 'list', + isDeprecated: false, + isUndocumented: false, + jsonType: 'array', + name: 'warnings', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'workspace_id', + }, + ], + resourceType: 'acs_user', + }, + }, + routes: [ + { + endpoints: [ + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'add_user', + path: '/acs/access_groups/add_user', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_access_group_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_user_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'add_user', + path: '/acs/access_groups/add_user', + request: { + methods: [ + 'PUT', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_access_group_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_user_id', + }, + ], + preferredMethod: 'PUT', + semanticMethod: 'PUT', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'get', + path: '/acs/access_groups/get', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_access_group_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'list', + path: '/acs/access_groups/list', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'acs_system_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'acs_user_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'list_accessible_entrances', + path: '/acs/access_groups/list_accessible_entrances', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_access_group_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'list_users', + path: '/acs/access_groups/list_users', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_access_group_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'remove_user', + path: '/acs/access_groups/remove_user', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_access_group_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_user_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + ], + name: 'access_groups', + namespace: { + path: '/acs', + }, + path: '/acs/access_groups', + subroutes: [], + }, + { + endpoints: [ + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'list', + path: '/acs/credential_pools/list', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_system_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + ], + name: 'credential_pools', + namespace: { + path: '/acs', + }, + path: '/acs/credential_pools', + subroutes: [], + }, + { + endpoints: [ + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'launch', + path: '/acs/credential_provisioning_automations/launch', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'acs_credential_pool_id', + }, + { + deprecationMessage: '', + description: '', + format: 'boolean', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'boolean', + name: 'create_credential_manager_user', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'credential_manager_acs_system_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'credential_manager_acs_user_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'user_identity_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + ], + name: 'credential_provisioning_automations', + namespace: { + path: '/acs', + }, + path: '/acs/credential_provisioning_automations', + subroutes: [], + }, + { + endpoints: [ + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'assign', + path: '/acs/credentials/assign', + request: { + methods: [ + 'PATCH', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_credential_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_user_id', + }, + ], + preferredMethod: 'PATCH', + semanticMethod: 'PATCH', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'assign', + path: '/acs/credentials/assign', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_credential_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_user_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'create', + path: '/acs/credentials/create', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'enum', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'access_method', + values: [ + { + name: 'code', + }, + { + name: 'card', + }, + { + name: 'mobile_key', + }, + ], + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_user_id', + }, + { + deprecationMessage: '', + description: '', + format: 'list', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'array', + name: 'allowed_acs_entrance_ids', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'code', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'credential_manager_acs_system_id', + }, + { + deprecationMessage: '', + description: '', + format: 'datetime', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'ends_at', + }, + { + deprecationMessage: '', + description: '', + format: 'boolean', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'boolean', + name: 'is_multi_phone_sync_credential', + }, + { + deprecationMessage: '', + description: '', + format: 'datetime', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'starts_at', + }, + { + deprecationMessage: '', + description: '', + format: 'object', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'object', + name: 'visionline_metadata', + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'assa_abloy_credential_service_mobile_endpoint_id', + }, + { + deprecationMessage: '', + description: '', + format: 'enum', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'card_format', + values: [ + { + name: 'TLCode', + }, + { + name: 'rfid48', + }, + ], + }, + { + deprecationMessage: '', + description: '', + format: 'enum', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'card_function_type', + values: [ + { + name: 'guest', + }, + { + name: 'staff', + }, + ], + }, + { + deprecationMessage: 'use override.', + description: '', + format: 'boolean', + isDeprecated: true, + isRequired: false, + isUndocumented: false, + jsonType: 'boolean', + name: 'is_override_key', + }, + { + deprecationMessage: '', + description: '', + format: 'list', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'array', + name: 'joiner_acs_credential_ids', + }, + { + deprecationMessage: '', + description: '', + format: 'boolean', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'boolean', + name: 'override', + }, + ], + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'delete', + path: '/acs/credentials/delete', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_credential_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'get', + path: '/acs/credentials/get', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_credential_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'list', + path: '/acs/credentials/list', + request: { + methods: [ + 'POST', + ], + parameters: [], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'list_accessible_entrances', + path: '/acs/credentials/list_accessible_entrances', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_credential_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'unassign', + path: '/acs/credentials/unassign', + request: { + methods: [ + 'PATCH', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_credential_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_user_id', + }, + ], + preferredMethod: 'PATCH', + semanticMethod: 'PATCH', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'unassign', + path: '/acs/credentials/unassign', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_credential_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_user_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'update', + path: '/acs/credentials/update', + request: { + methods: [ + 'PATCH', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_credential_id', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'code', + }, + { + deprecationMessage: '', + description: '', + format: 'datetime', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'ends_at', + }, + ], + preferredMethod: 'PATCH', + semanticMethod: 'PATCH', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'update', + path: '/acs/credentials/update', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_credential_id', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'code', + }, + { + deprecationMessage: '', + description: '', + format: 'datetime', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'ends_at', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + ], + name: 'credentials', + namespace: { + path: '/acs', + }, + path: '/acs/credentials', + subroutes: [], + }, + { + endpoints: [ + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'get', + path: '/acs/entrances/get', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_entrance_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'grant_access', + path: '/acs/entrances/grant_access', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_entrance_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_user_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'list', + path: '/acs/entrances/list', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'acs_credential_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'acs_system_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'list_credentials_with_access', + path: '/acs/entrances/list_credentials_with_access', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_entrance_id', + }, + { + deprecationMessage: '', + description: '', + format: 'list', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'array', + name: 'include_if', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + ], + name: 'entrances', + namespace: { + path: '/acs', + }, + path: '/acs/entrances', + subroutes: [], + }, + { + endpoints: [ + { + codeSamples: [], + deprecationMessage: '', + description: `Returns a specified [access control system](https://docs.seam.co/latest/capability-guides/access-systems).␊ + ␊ + Specify the desired access control system by including the corresponding \`acs_system_id\` in the request body.`, + isDeprecated: false, + isUndocumented: false, + name: 'get', + path: '/acs/systems/get', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: 'ID of the desired access control system.', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_system_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + resourceType: 'acs_system', + responseKey: 'acs_system', + responseType: 'resource', + }, + title: 'Get an ACS System', + }, + { + codeSamples: [], + deprecationMessage: '', + description: `Returns a list of all [access control systems](https://docs.seam.co/latest/capability-guides/access-systems).␊ + ␊ + To filter the list of returned access control systems by a specific connected account ID, include the ␊ + \`connected_account_id\` in the request body. If you omit the \`connected_account_id\` parameter, the ␊ + response includes all access control systems connected to your workspace.`, + isDeprecated: false, + isUndocumented: false, + name: 'list', + path: '/acs/systems/list', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: 'ID of the connected account by which to filter the list of returned access control systems.', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'connected_account_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + resourceType: 'acs_system', + responseKey: 'acs_systems', + responseType: 'resource_list', + }, + title: 'List ACS Systems', + }, + { + codeSamples: [], + deprecationMessage: '', + description: `Returns a list of all credential manager ACS systems that are compatible with a specified ␊ + [access control system](https://docs.seam.co/latest/capability-guides/access-systems).␊ + ␊ + Specify the ACS system for which you want to retrieve all compatible credential manager ACS ␊ + systems by including the corresponding \`acs_system_id\` in the request body.`, + isDeprecated: false, + isUndocumented: false, + name: 'list_compatible_credential_manager_acs_systems', + path: '/acs/systems/list_compatible_credential_manager_acs_systems', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: 'ID of the ACS system for which you want to retrieve all compatible credential manager ACS systems.', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_system_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + resourceType: 'acs_system', + responseKey: 'acs_systems', + responseType: 'resource_list', + }, + title: 'List Compatible Credential Manager ACS Systems', + }, + ], + name: 'systems', + namespace: { + path: '/acs', + }, + path: '/acs/systems', + subroutes: [], + }, + { + endpoints: [ + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'add_to_access_group', + path: '/acs/users/add_to_access_group', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_access_group_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_user_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'add_to_access_group', + path: '/acs/users/add_to_access_group', + request: { + methods: [ + 'PUT', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_access_group_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_user_id', + }, + ], + preferredMethod: 'PUT', + semanticMethod: 'PUT', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'create', + path: '/acs/users/create', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'object', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'object', + name: 'access_schedule', + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'datetime', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'ends_at', + }, + { + deprecationMessage: '', + description: '', + format: 'datetime', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'starts_at', + }, + ], + }, + { + deprecationMessage: '', + description: '', + format: 'list', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'array', + name: 'acs_access_group_ids', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_system_id', + }, + { + deprecationMessage: 'use email_address.', + description: '', + format: 'string', + isDeprecated: true, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'email', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'email_address', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'full_name', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'phone_number', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'user_identity_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'delete', + path: '/acs/users/delete', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_user_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'get', + path: '/acs/users/get', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_user_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'list', + path: '/acs/users/list', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'acs_system_id', + }, + { + deprecationMessage: '', + description: '', + format: 'datetime', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'created_before', + }, + { + deprecationMessage: '', + description: '', + format: 'number', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'number', + name: 'limit', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'user_identity_email_address', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'user_identity_id', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'user_identity_phone_number', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'list_accessible_entrances', + path: '/acs/users/list_accessible_entrances', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_user_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', }, { + codeSamples: [], deprecationMessage: '', - description: 'ID of the [workspace](https://docs.seam.co/latest/core-concepts/workspaces) that contains the `acs_system`.', - format: 'id', + description: '', isDeprecated: false, isUndocumented: false, - jsonType: 'string', - name: 'workspace_id', + name: 'remove_from_access_group', + path: '/acs/users/remove_from_access_group', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_access_group_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_user_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', }, - ], - resourceType: 'acs_system', - }, - }, - routes: [ - { - endpoints: [ { codeSamples: [], deprecationMessage: '', - description: `Returns a specified [access control system](https://docs.seam.co/latest/capability-guides/access-systems).␊ - ␊ - Specify the desired access control system by including the corresponding \`acs_system_id\` in the request body.`, + description: '', isDeprecated: false, isUndocumented: false, - name: 'get', - path: '/acs/systems/get', + name: 'revoke_access_to_all_entrances', + path: '/acs/users/revoke_access_to_all_entrances', request: { methods: [ 'POST', @@ -280,13 +2920,13 @@ Generated by [AVA](https://avajs.dev). parameters: [ { deprecationMessage: '', - description: 'ID of the desired access control system.', + description: '', format: 'id', isDeprecated: false, isRequired: true, isUndocumented: false, jsonType: 'string', - name: 'acs_system_id', + name: 'acs_user_id', }, ], preferredMethod: 'POST', @@ -294,24 +2934,18 @@ Generated by [AVA](https://avajs.dev). }, response: { description: 'OK', - resourceType: 'acs_system', - responseKey: 'acs_system', - responseType: 'resource', + responseType: 'void', }, - title: 'Get an ACS System', + title: '', }, { codeSamples: [], deprecationMessage: '', - description: `Returns a list of all [access control systems](https://docs.seam.co/latest/capability-guides/access-systems).␊ - ␊ - To filter the list of returned access control systems by a specific connected account ID, include the ␊ - \`connected_account_id\` in the request body. If you omit the \`connected_account_id\` parameter, the ␊ - response includes all access control systems connected to your workspace.`, + description: '', isDeprecated: false, isUndocumented: false, - name: 'list', - path: '/acs/systems/list', + name: 'suspend', + path: '/acs/users/suspend', request: { methods: [ 'POST', @@ -319,13 +2953,13 @@ Generated by [AVA](https://avajs.dev). parameters: [ { deprecationMessage: '', - description: 'ID of the connected account by which to filter the list of returned access control systems.', + description: '', format: 'id', isDeprecated: false, - isRequired: false, + isRequired: true, isUndocumented: false, jsonType: 'string', - name: 'connected_account_id', + name: 'acs_user_id', }, ], preferredMethod: 'POST', @@ -333,24 +2967,18 @@ Generated by [AVA](https://avajs.dev). }, response: { description: 'OK', - resourceType: 'acs_system', - responseKey: 'acs_systems', - responseType: 'resource_list', + responseType: 'void', }, - title: 'List ACS Systems', + title: '', }, { codeSamples: [], deprecationMessage: '', - description: `Returns a list of all credential manager ACS systems that are compatible with a specified ␊ - [access control system](https://docs.seam.co/latest/capability-guides/access-systems).␊ - ␊ - Specify the ACS system for which you want to retrieve all compatible credential manager ACS ␊ - systems by including the corresponding \`acs_system_id\` in the request body.`, + description: '', isDeprecated: false, isUndocumented: false, - name: 'list_compatible_credential_manager_acs_systems', - path: '/acs/systems/list_compatible_credential_manager_acs_systems', + name: 'unsuspend', + path: '/acs/users/unsuspend', request: { methods: [ 'POST', @@ -358,13 +2986,13 @@ Generated by [AVA](https://avajs.dev). parameters: [ { deprecationMessage: '', - description: 'ID of the ACS system for which you want to retrieve all compatible credential manager ACS systems.', + description: '', format: 'id', isDeprecated: false, isRequired: true, isUndocumented: false, jsonType: 'string', - name: 'acs_system_id', + name: 'acs_user_id', }, ], preferredMethod: 'POST', @@ -372,18 +3000,246 @@ Generated by [AVA](https://avajs.dev). }, response: { description: 'OK', - resourceType: 'acs_system', - responseKey: 'acs_systems', - responseType: 'resource_list', + responseType: 'void', }, - title: 'List Compatible Credential Manager ACS Systems', + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'update', + path: '/acs/users/update', + request: { + methods: [ + 'PATCH', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'object', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'object', + name: 'access_schedule', + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'datetime', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'ends_at', + }, + { + deprecationMessage: '', + description: '', + format: 'datetime', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'starts_at', + }, + ], + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_user_id', + }, + { + deprecationMessage: 'use email_address.', + description: '', + format: 'string', + isDeprecated: true, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'email', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'email_address', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'full_name', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'hid_acs_system_id', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'phone_number', + }, + ], + preferredMethod: 'PATCH', + semanticMethod: 'PATCH', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'update', + path: '/acs/users/update', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'object', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'object', + name: 'access_schedule', + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'datetime', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'ends_at', + }, + { + deprecationMessage: '', + description: '', + format: 'datetime', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'starts_at', + }, + ], + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_user_id', + }, + { + deprecationMessage: 'use email_address.', + description: '', + format: 'string', + isDeprecated: true, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'email', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'email_address', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'full_name', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'hid_acs_system_id', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'phone_number', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', }, ], - name: 'systems', + name: 'users', namespace: { path: '/acs', }, - path: '/acs/systems', + path: '/acs/users', subroutes: [], }, ], diff --git a/test/snapshots/seam-blueprint.test.ts.snap b/test/snapshots/seam-blueprint.test.ts.snap index 109804339bb988b2600dfe42a5834670152eab68..d6e606f5a4f118eb279f35327e43f3a36ff9b9dc 100644 GIT binary patch literal 19347 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 q=KgzDY7^*tM#T92>l<`Uo#>D`T+oJNtE&c literal 3907 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 R Date: Mon, 9 Sep 2024 21:28:21 +0000 Subject: [PATCH 2/9] 0.17.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7a4c037..5c1584c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@seamapi/blueprint", - "version": "0.16.1", + "version": "0.17.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@seamapi/blueprint", - "version": "0.16.1", + "version": "0.17.0", "license": "MIT", "dependencies": { "change-case": "^5.4.4", diff --git a/package.json b/package.json index 4557bbe..122f30f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@seamapi/blueprint", - "version": "0.16.1", + "version": "0.17.0", "description": "Build tools for the Seam API using this blueprint.", "type": "module", "main": "index.js", From bbd2fdb7970839403566ebeb2b1f855cc231fcae Mon Sep 17 00:00:00 2001 From: Evan Sosenko Date: Mon, 9 Sep 2024 22:12:19 +0000 Subject: [PATCH 3/9] fix: Filter undefined types and avoid bool enum error (#82) * Set path Zod parse to improve error message * Update @seamapi/types * Filter out undefined property types * Pass down parentPaths * Split createParameter from createParameters --- package-lock.json | 9 +- package.json | 2 +- src/lib/blueprint.test.ts | 2 + src/lib/blueprint.ts | 270 ++++++++++------- src/lib/openapi-schema.ts | 2 +- test/snapshots/seam-blueprint.test.ts.md | 324 +++++++++++++++++++++ test/snapshots/seam-blueprint.test.ts.snap | Bin 19347 -> 21096 bytes 7 files changed, 495 insertions(+), 114 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5c1584c..f2b8159 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "zod": "^3.23.8" }, "devDependencies": { - "@seamapi/types": "1.228.0", + "@seamapi/types": "1.240.0", "@types/node": "^20.8.10", "ava": "^6.0.1", "c8": "^10.1.2", @@ -1052,10 +1052,11 @@ ] }, "node_modules/@seamapi/types": { - "version": "1.228.0", - "resolved": "https://registry.npmjs.org/@seamapi/types/-/types-1.228.0.tgz", - "integrity": "sha512-p7ZKWMdKp36QIAA7ta3qa0Z1qzXcTpyzAU9rw2IptES5oI8wwpR5hxK+VzdccJW4/Z3kT/9+K3RxPhUIgEB0jQ==", + "version": "1.240.0", + "resolved": "https://registry.npmjs.org/@seamapi/types/-/types-1.240.0.tgz", + "integrity": "sha512-Yebt0M/92SgmNEjQrvPvc2NchdYqubcqUtTdYaTpoqGC3vpp76U0Q9D61aFtxKxAZ7Davc/H+EXhjkr64Im6RQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18.12.0", "npm": ">= 9.0.0" diff --git a/package.json b/package.json index 122f30f..4694c46 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "zod": "^3.23.8" }, "devDependencies": { - "@seamapi/types": "1.228.0", + "@seamapi/types": "1.240.0", "@types/node": "^20.8.10", "ava": "^6.0.1", "c8": "^10.1.2", diff --git a/src/lib/blueprint.test.ts b/src/lib/blueprint.test.ts index 7c51fb1..822e1fe 100644 --- a/src/lib/blueprint.test.ts +++ b/src/lib/blueprint.test.ts @@ -17,6 +17,7 @@ test('createProperties: assigns appropriate default values', (t) => { const properties = createProperties( minimalProperties as Record, + ['foo'], ) t.is(properties.length, 1, 'Should create one property') @@ -49,6 +50,7 @@ test('createProperties: uses provided values', (t) => { const properties = createProperties( fullProperties as Record, + ['foo'], ) t.is(properties.length, 1, 'Should create one property') diff --git a/src/lib/blueprint.ts b/src/lib/blueprint.ts index b8c70a8..629a2fa 100644 --- a/src/lib/blueprint.ts +++ b/src/lib/blueprint.ts @@ -361,7 +361,9 @@ const createEndpoint = async ( throw new Error(`Could not resolve name for endpoint at ${path}`) } - const parsedOperation = OpenapiOperationSchema.parse(operation) + const parsedOperation = OpenapiOperationSchema.parse(operation, { + path: pathParts, + }) const title = parsedOperation['x-title'] @@ -373,7 +375,7 @@ const createEndpoint = async ( const deprecationMessage = parsedOperation['x-deprecated'] - const request = createRequest(methods, operation) + const request = createRequest(methods, operation, path) const endpoint: Omit = { title, @@ -383,7 +385,7 @@ const createEndpoint = async ( isUndocumented, isDeprecated, deprecationMessage, - response: createResponse(operation), + response: createResponse(operation, path), request, } @@ -406,6 +408,7 @@ const createEndpoint = async ( export const createRequest = ( methods: Method[], operation: OpenapiOperation, + path: string, ): Request => { if (methods.length === 0) { // eslint-disable-next-line no-console @@ -429,11 +432,14 @@ export const createRequest = ( methods, semanticMethod, preferredMethod, - parameters: createRequestBody(operation), + parameters: createRequestBody(operation, path), } } -const createRequestBody = (operation: OpenapiOperation): Parameter[] => { +const createRequestBody = ( + operation: OpenapiOperation, + path: string, +): Parameter[] => { // This should be done by the createParameters but for some reason it's not // TODO: remove this in favour of using createParameters if (!('requestBody' in operation) || operation.requestBody === undefined) { @@ -453,72 +459,95 @@ const createRequestBody = (operation: OpenapiOperation): Parameter[] => { return [] } - return createParameters(schema.properties, schema.required) + return createParameters(schema.properties, path, schema.required) } const createParameters = ( properties: Record, + path: string, requiredParameters: string[] = [], ): Parameter[] => { - return Object.entries(properties).map( - ([name, property]: [string, any]): Parameter => { - const parsedProp = PropertySchema.parse(property) - - const baseParam: BaseParameter = { - name, - description: parsedProp.description, - isRequired: requiredParameters.includes(name), - isDeprecated: parsedProp['x-deprecated'].length > 0, - deprecationMessage: parsedProp['x-deprecated'], - isUndocumented: parsedProp['x-undocumented'].length > 0, + return Object.entries(properties) + .filter(([name, property]) => { + if (property.type == null) { + // eslint-disable-next-line no-console + console.warn( + `The ${name} property for ${path} will not be documented since it does not define a type.`, + ) + return false } + return true + }) + .map( + ([name, property]: [string, any]): Parameter => + createParameter(name, property, path, requiredParameters), + ) +} + +const createParameter = ( + name: string, + property: any, + path: string, + requiredParameters: string[], +): Parameter => { + const parsedProp = PropertySchema.parse(property, { + path: [...path.split('/'), name], + }) - switch (parsedProp.type) { - case 'string': - if (parsedProp.enum !== undefined) { - return { - ...baseParam, - format: 'enum', - jsonType: 'string', - values: parsedProp.enum.map((value: any) => ({ - name: value, - })), - } - } - if (parsedProp.format === 'date-time') { - return { ...baseParam, format: 'datetime', jsonType: 'string' } - } - if (parsedProp.format === 'uuid') { - return { ...baseParam, format: 'id', jsonType: 'string' } - } - return { ...baseParam, format: 'string', jsonType: 'string' } - case 'boolean': - return { ...baseParam, format: 'boolean', jsonType: 'boolean' } - case 'array': - return { ...baseParam, format: 'list', jsonType: 'array' } - case 'object': - if (property.properties !== undefined) { - return { - ...baseParam, - format: 'object', - jsonType: 'object', - parameters: createParameters( - property.properties as Record, - ), - } - } - return { ...baseParam, format: 'record', jsonType: 'object' } - case 'number': - return { - ...baseParam, - format: 'number', - jsonType: 'number', - } - default: - throw new Error(`Unsupported property type: ${parsedProp.type}`) + const baseParam: BaseParameter = { + name, + description: parsedProp.description, + isRequired: requiredParameters.includes(name), + isDeprecated: parsedProp['x-deprecated'].length > 0, + deprecationMessage: parsedProp['x-deprecated'], + isUndocumented: parsedProp['x-undocumented'].length > 0, + } + + switch (parsedProp.type) { + case 'string': + if (parsedProp.enum !== undefined) { + return { + ...baseParam, + format: 'enum', + jsonType: 'string', + values: parsedProp.enum.map((value: any) => ({ + name: value, + })), + } } - }, - ) + if (parsedProp.format === 'date-time') { + return { ...baseParam, format: 'datetime', jsonType: 'string' } + } + if (parsedProp.format === 'uuid') { + return { ...baseParam, format: 'id', jsonType: 'string' } + } + return { ...baseParam, format: 'string', jsonType: 'string' } + case 'boolean': + return { ...baseParam, format: 'boolean', jsonType: 'boolean' } + case 'array': + return { ...baseParam, format: 'list', jsonType: 'array' } + case 'object': + if (property.properties !== undefined) { + return { + ...baseParam, + format: 'object', + jsonType: 'object', + parameters: createParameters( + property.properties as Record, + path, + ), + } + } + return { ...baseParam, format: 'record', jsonType: 'object' } + case 'number': + return { + ...baseParam, + format: 'number', + jsonType: 'number', + } + default: + throw new Error(`Unsupported property type: ${parsedProp.type}`) + } } const createResources = ( @@ -540,7 +569,7 @@ const createResources = ( ...acc, [schemaName]: { resourceType: schemaName, - properties: createProperties(schema.properties), + properties: createProperties(schema.properties, [schemaName]), description: schema.description ?? '', }, } @@ -549,14 +578,19 @@ const createResources = ( }, {}) } -const createResponse = (operation: OpenapiOperation): Response => { +const createResponse = ( + operation: OpenapiOperation, + path: string, +): Response => { if (!('responses' in operation) || operation.responses == null) { throw new Error( `Missing responses in operation for ${operation.operationId}`, ) } - const parsedOperation = OpenapiOperationSchema.parse(operation) + const parsedOperation = OpenapiOperationSchema.parse(operation, { + path: [...path.split('/')], + }) const { responses } = operation const okResponse = responses['200'] @@ -632,53 +666,73 @@ const createResponse = (operation: OpenapiOperation): Response => { export const createProperties = ( properties: Record, + parentPaths: string[], ): Property[] => { - return Object.entries(properties).map(([name, prop]): Property => { - const parsedProp = PropertySchema.parse(prop) - - const baseProperty = { - name, - description: parsedProp.description, - isDeprecated: parsedProp['x-deprecated'].length > 0, - deprecationMessage: parsedProp['x-deprecated'], - isUndocumented: parsedProp['x-undocumented'].length > 0, - } + return Object.entries(properties) + .filter(([name, property]) => { + if (property.type == null) { + // eslint-disable-next-line no-console + console.warn( + `The ${name} property for ${parentPaths.join('.')} will not be documented since it does not define a type.`, + ) + return false + } + return true + }) + .map(([name, prop]) => createProperty(name, prop, [...parentPaths])) +} + +const createProperty = ( + name: string, + prop: OpenapiSchema, + parentPaths: string[], +): Property => { + const parsedProp = PropertySchema.parse(prop, { + path: [...parentPaths, name], + }) - switch (parsedProp.type) { - case 'string': - if (parsedProp.enum !== undefined) { - return { - ...baseProperty, - format: 'enum', - jsonType: 'string', - values: parsedProp.enum.map((value: any) => ({ name: value })), - } - } - if (parsedProp.format === 'date-time') { - return { ...baseProperty, format: 'datetime', jsonType: 'string' } - } - if (parsedProp.format === 'uuid') { - return { ...baseProperty, format: 'id', jsonType: 'string' } + const baseProperty = { + name, + description: parsedProp.description, + isDeprecated: parsedProp['x-deprecated'].length > 0, + deprecationMessage: parsedProp['x-deprecated'], + isUndocumented: parsedProp['x-undocumented'].length > 0, + } + + switch (parsedProp.type) { + case 'string': + if (parsedProp.enum !== undefined) { + return { + ...baseProperty, + format: 'enum', + jsonType: 'string', + values: parsedProp.enum.map((value: any) => ({ name: value })), } - return { ...baseProperty, format: 'string', jsonType: 'string' } - case 'boolean': - return { ...baseProperty, format: 'boolean', jsonType: 'boolean' } - case 'array': - return { ...baseProperty, format: 'list', jsonType: 'array' } - case 'object': - if (prop.properties !== undefined) { - return { - ...baseProperty, - format: 'object', - jsonType: 'object', - properties: createProperties(prop.properties), - } + } + if (parsedProp.format === 'date-time') { + return { ...baseProperty, format: 'datetime', jsonType: 'string' } + } + if (parsedProp.format === 'uuid') { + return { ...baseProperty, format: 'id', jsonType: 'string' } + } + return { ...baseProperty, format: 'string', jsonType: 'string' } + case 'boolean': + return { ...baseProperty, format: 'boolean', jsonType: 'boolean' } + case 'array': + return { ...baseProperty, format: 'list', jsonType: 'array' } + case 'object': + if (prop.properties !== undefined) { + return { + ...baseProperty, + format: 'object', + jsonType: 'object', + properties: createProperties(prop.properties, [...parentPaths, name]), } - return { ...baseProperty, format: 'record', jsonType: 'object' } - default: - throw new Error(`Unsupported property type: ${parsedProp.type}`) - } - }) + } + return { ...baseProperty, format: 'record', jsonType: 'object' } + default: + throw new Error(`Unsupported property type: ${parsedProp.type}`) + } } export const getSemanticMethod = (methods: Method[]): Method => { diff --git a/src/lib/openapi-schema.ts b/src/lib/openapi-schema.ts index 99a2439..4a830a4 100644 --- a/src/lib/openapi-schema.ts +++ b/src/lib/openapi-schema.ts @@ -71,7 +71,7 @@ export const PropertySchema: z.ZodSchema = z.object({ deprecated: z.boolean().default(false), 'x-undocumented': z.string().default(''), 'x-deprecated': z.string().default(''), - enum: z.array(z.string()).optional(), + enum: z.array(z.string().or(z.boolean())).optional(), $ref: z.string().optional(), format: z.string().optional(), }) diff --git a/test/snapshots/seam-blueprint.test.ts.md b/test/snapshots/seam-blueprint.test.ts.md index 0c5d28d..5fd409a 100644 --- a/test/snapshots/seam-blueprint.test.ts.md +++ b/test/snapshots/seam-blueprint.test.ts.md @@ -113,6 +113,15 @@ Generated by [AVA](https://avajs.dev). jsonType: 'string', name: 'external_type_display_name', }, + { + deprecationMessage: '', + description: '', + format: 'boolean', + isDeprecated: false, + isUndocumented: false, + jsonType: 'boolean', + name: 'is_managed', + }, { deprecationMessage: '', description: '', @@ -259,6 +268,9 @@ Generated by [AVA](https://avajs.dev). { name: 'visionline_card', }, + { + name: 'salto_ks_credential', + }, ], }, { @@ -279,6 +291,15 @@ Generated by [AVA](https://avajs.dev). jsonType: 'boolean', name: 'is_latest_desired_state_synced_with_provider', }, + { + deprecationMessage: '', + description: '', + format: 'boolean', + isDeprecated: false, + isUndocumented: false, + jsonType: 'boolean', + name: 'is_managed', + }, { deprecationMessage: '', description: '', @@ -341,6 +362,15 @@ Generated by [AVA](https://avajs.dev). }, ], }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'card_id', + }, { deprecationMessage: '', description: '', @@ -350,6 +380,15 @@ Generated by [AVA](https://avajs.dev). jsonType: 'array', name: 'common_acs_entrance_ids', }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'credential_id', + }, { deprecationMessage: '', description: '', @@ -359,6 +398,15 @@ Generated by [AVA](https://avajs.dev). jsonType: 'array', name: 'guest_acs_entrance_ids', }, + { + deprecationMessage: '', + description: '', + format: 'boolean', + isDeprecated: false, + isUndocumented: false, + jsonType: 'boolean', + name: 'is_valid', + }, { deprecationMessage: '', description: '', @@ -1066,6 +1114,15 @@ Generated by [AVA](https://avajs.dev). jsonType: 'boolean', name: 'is_latest_desired_state_synced_with_provider', }, + { + deprecationMessage: '', + description: '', + format: 'boolean', + isDeprecated: false, + isUndocumented: false, + jsonType: 'boolean', + name: 'is_managed', + }, { deprecationMessage: '', description: '', @@ -1433,6 +1490,92 @@ Generated by [AVA](https://avajs.dev). path: '/acs/access_groups', subroutes: [], }, + { + endpoints: [ + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'get', + path: '/acs/access_groups/unmanaged/get', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_access_group_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'list', + path: '/acs/access_groups/unmanaged/list', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'acs_system_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'acs_user_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + ], + name: 'unmanaged', + namespace: { + path: '/acs', + }, + path: '/acs/access_groups/unmanaged', + subroutes: [], + }, { endpoints: [ { @@ -2170,6 +2313,71 @@ Generated by [AVA](https://avajs.dev). path: '/acs/credentials', subroutes: [], }, + { + endpoints: [ + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'get', + path: '/acs/credentials/unmanaged/get', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_credential_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'list', + path: '/acs/credentials/unmanaged/list', + request: { + methods: [ + 'POST', + ], + parameters: [], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + ], + name: 'unmanaged', + namespace: { + path: '/acs', + }, + path: '/acs/credentials/unmanaged', + subroutes: [], + }, { endpoints: [ { @@ -3242,6 +3450,122 @@ Generated by [AVA](https://avajs.dev). path: '/acs/users', subroutes: [], }, + { + endpoints: [ + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'get', + path: '/acs/users/unmanaged/get', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: true, + isUndocumented: false, + jsonType: 'string', + name: 'acs_user_id', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'list', + path: '/acs/users/unmanaged/list', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'acs_system_id', + }, + { + deprecationMessage: '', + description: '', + format: 'number', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'number', + name: 'limit', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'user_identity_email_address', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'user_identity_id', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'user_identity_phone_number', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + ], + name: 'unmanaged', + namespace: { + path: '/acs', + }, + path: '/acs/users/unmanaged', + subroutes: [], + }, ], title: 'Seam Connect', } diff --git a/test/snapshots/seam-blueprint.test.ts.snap b/test/snapshots/seam-blueprint.test.ts.snap index d6e606f5a4f118eb279f35327e43f3a36ff9b9dc..bd223fc0521b899aec33e8301a6fbf7c2826058b 100644 GIT binary patch literal 21096 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 q=KgzDY7^*tM#T92>l<`Uo#>D`T+oJNtE&c From ad52671038c54975462450fdbbd3a2382f04ccc4 Mon Sep 17 00:00:00 2001 From: Seam Bot Date: Mon, 9 Sep 2024 22:13:13 +0000 Subject: [PATCH 4/9] 0.17.1 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index f2b8159..ad31a39 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@seamapi/blueprint", - "version": "0.17.0", + "version": "0.17.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@seamapi/blueprint", - "version": "0.17.0", + "version": "0.17.1", "license": "MIT", "dependencies": { "change-case": "^5.4.4", diff --git a/package.json b/package.json index 4694c46..57deece 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@seamapi/blueprint", - "version": "0.17.0", + "version": "0.17.1", "description": "Build tools for the Seam API using this blueprint.", "type": "module", "main": "index.js", From 08692e379d1b7130b1a6dfe313b992944e8f9a60 Mon Sep 17 00:00:00 2001 From: Mike Wu Date: Wed, 11 Sep 2024 22:21:28 +0900 Subject: [PATCH 5/9] feat: dynamically detect namespace (#83) * feat: dynamically detect namespace * update test * ci: Generate code * verify nested namespace * Revert "verify nested namespace" This reverts commit 5067c796668f923dd6cd1240d56c212ef8890200. * clean up and comments * typo * replace regex with endswith * add test fixture, and revert endsWith to regex * ci: Generate code --------- Co-authored-by: Seam Bot --- src/lib/blueprint.ts | 41 ++- .../fixtures/types/code-sample-definitions.ts | 18 ++ test/fixtures/types/openapi.ts | 48 ++++ test/fixtures/types/route-specs.ts | 7 + test/fixtures/types/route-types.ts | 14 + test/fixtures/types/schemas.ts | 5 + test/snapshots/blueprint.test.ts.md | 244 +++++++++++++++++- test/snapshots/blueprint.test.ts.snap | Bin 4034 -> 5159 bytes 8 files changed, 371 insertions(+), 6 deletions(-) diff --git a/src/lib/blueprint.ts b/src/lib/blueprint.ts index 629a2fa..83447ae 100644 --- a/src/lib/blueprint.ts +++ b/src/lib/blueprint.ts @@ -285,7 +285,9 @@ const createRoutes = async ( ) for (const [path, pathItem] of pathEntries) { - const route = await createRoute(path, pathItem, context) + const namespace = getNamespace(path, paths) + + const route = await createRoute(namespace, path, pathItem, context) const existingRoute = routeMap.get(route.path) if (existingRoute != null) { @@ -299,7 +301,42 @@ const createRoutes = async ( return Array.from(routeMap.values()) } +const getNamespace = (path: string, paths: OpenapiPaths): string | null => { + // Hold namespace in array to allow nested namespaces + // e.g. namespace for `/foo/bar/baz/get` = `/foo/bar` + const namespace: string[] = [] + + const pathParts = path.split('/').filter((path) => Boolean(path)) + + const pathKeys = Object.keys(paths) + + for (const [index, part] of pathParts.entries()) { + // Namespaces must be consecutive. If there was a path with an endpoint + // previously, then this part is not in the namespace. + if (namespace.length !== index) { + continue + } + + // An endpoint is a route that ends without further paths. i.e., ends in + // a letter (not slash). + const endpoints = pathKeys.filter((key) => { + return new RegExp(`^/${[...namespace, part].join('/')}/\\w+$`).test(key) + }) + + if (endpoints.length === 0) { + namespace.push(part) + } + } + + if (namespace.length === 0) { + return null + } + + return `/${namespace.join('/')}` +} + const createRoute = async ( + namespace: string | null, path: string, pathItem: OpenapiPathItem, context: Context, @@ -314,7 +351,7 @@ const createRoute = async ( return { path: routePath, name, - namespace: { path: `/${pathParts[1]}` }, + namespace: namespace != null ? { path: namespace } : null, endpoints: await createEndpoints(path, pathItem, context), subroutes: [], } diff --git a/test/fixtures/types/code-sample-definitions.ts b/test/fixtures/types/code-sample-definitions.ts index 83d2dd1..f79de66 100644 --- a/test/fixtures/types/code-sample-definitions.ts +++ b/test/fixtures/types/code-sample-definitions.ts @@ -37,4 +37,22 @@ export default [ }, }, }, + { + title: 'List planes', + description: 'This is the wya to get all plans', + request: { + path: '/transport/air/planes/list', + parameters: {}, + }, + response: { + body: { + planes: [ + { + plane_id: '9d3163f9-9185-40d3-a0ce-a03d3c7ce402', + name: 'Woosh', + }, + ], + }, + }, + }, ] diff --git a/test/fixtures/types/openapi.ts b/test/fixtures/types/openapi.ts index a48af70..0f79f9c 100644 --- a/test/fixtures/types/openapi.ts +++ b/test/fixtures/types/openapi.ts @@ -36,6 +36,22 @@ export default { }, required: ['foo_id', 'name'], }, + plane: { + type: 'object', + description: 'A plane resource.', + properties: { + plane_id: { + description: 'plane id', + format: 'uuid', + type: 'string', + }, + name: { + description: 'Planej name', + type: 'string', + }, + }, + required: ['plane_id', 'name'], + }, }, }, paths: { @@ -157,5 +173,37 @@ export default { 'x-title': 'List foos', }, }, + '/transport/air/planes/list': { + get: { + operationId: 'planesListGet', + responses: { + 200: { + content: { + 'application/json': { + schema: { + properties: { + ok: { type: 'boolean' }, + planes: { + items: { $ref: '#/components/schemas/plane' }, + type: 'array', + }, + }, + required: ['planes', 'ok'], + type: 'object', + }, + }, + }, + description: 'List all planes.', + }, + 400: { description: 'Bad Request' }, + 401: { description: 'Unauthorized' }, + }, + security: [], + summary: '/transport/air/planes/list', + tags: ['/transport/air/planes'], + 'x-response-key': 'planes', + 'x-title': 'List planes', + }, + }, }, } diff --git a/test/fixtures/types/route-specs.ts b/test/fixtures/types/route-specs.ts index 9901a5b..4bbbaaa 100644 --- a/test/fixtures/types/route-specs.ts +++ b/test/fixtures/types/route-specs.ts @@ -16,5 +16,12 @@ export const routes = { jsonResponse: z.object({ foos: z.array(schemas.foo), }), + '/transport/air/planes/list': { + auth: 'none', + methods: ['GET'], + jsonResponse: z.object({ + planes: z.array(schemas.plane), + }), + }, }, } as const diff --git a/test/fixtures/types/route-types.ts b/test/fixtures/types/route-types.ts index 55d89a7..9f3d55f 100644 --- a/test/fixtures/types/route-types.ts +++ b/test/fixtures/types/route-types.ts @@ -33,6 +33,20 @@ export interface Routes { } } } + '/transport/air/planes/list': { + route: '/transport/air/planes/list' + method: 'GET' + queryParams: Record + jsonBody: Record + commonParams: Record + formData: Record + jsonResponse: { + planes: { + plane_id: string + name: string + } + } + } } export type RouteResponse = diff --git a/test/fixtures/types/schemas.ts b/test/fixtures/types/schemas.ts index eb23fdc..1c1f4c3 100644 --- a/test/fixtures/types/schemas.ts +++ b/test/fixtures/types/schemas.ts @@ -7,3 +7,8 @@ export const foo = z.object({ undocumented_prop: z.string().optional(), nullable_property: z.string().optional().nullable(), }) + +export const plane = z.object({ + plane_id: z.string().uuid(), + name: z.string(), +}) diff --git a/test/snapshots/blueprint.test.ts.md b/test/snapshots/blueprint.test.ts.md index b4cb2f9..1b8f1a7 100644 --- a/test/snapshots/blueprint.test.ts.md +++ b/test/snapshots/blueprint.test.ts.md @@ -61,6 +61,30 @@ Generated by [AVA](https://avajs.dev). ], resourceType: 'foo', }, + plane: { + description: 'A plane resource.', + properties: [ + { + deprecationMessage: '', + description: 'plane id', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'plane_id', + }, + { + deprecationMessage: '', + description: 'Planej name', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'name', + }, + ], + resourceType: 'plane', + }, }, routes: [ { @@ -395,10 +419,99 @@ Generated by [AVA](https://avajs.dev). }, ], name: 'foos', + namespace: null, + path: '/foos', + subroutes: [], + }, + { + endpoints: [ + { + codeSamples: [ + { + code: { + javascript: { + request: 'await seam.transport.air.planes.list()', + request_syntax: 'javascript', + response: '[{"plane_id":"9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name":"Woosh"}]', + response_syntax: 'javascript', + title: 'JavaScript', + }, + php: { + request: `transport->air->planes->list()`, + request_syntax: 'php', + response: '[{"plane_id":"9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name":"Woosh"}]', + response_syntax: 'json', + title: 'PHP', + }, + python: { + request: 'seam.transport.air.planes.list()', + request_syntax: 'python', + response: '[Plane(plane_id="9d3163f9-9185-40d3-a0ce-a03d3c7ce402", name="Woosh")]', + response_syntax: 'python', + title: 'Python', + }, + ruby: { + request: 'seam.transport.air.planes.list()', + request_syntax: 'ruby', + response: '[{"plane_id" => "9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name" => "Woosh"}]', + response_syntax: 'ruby', + title: 'Ruby', + }, + seam_cli: { + request: 'seam transport air planes list ', + request_syntax: 'bash', + response: '[{"plane_id":"9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name":"Woosh"}]', + response_syntax: 'json', + title: 'Seam CLI', + }, + }, + description: 'This is the wya to get all plans', + request: { + parameters: {}, + path: '/transport/air/planes/list', + }, + response: { + body: { + planes: [ + { + name: 'Woosh', + plane_id: '9d3163f9-9185-40d3-a0ce-a03d3c7ce402', + }, + ], + }, + }, + title: 'List planes', + }, + ], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'list', + path: '/transport/air/planes/list', + request: { + methods: [ + 'GET', + ], + parameters: [], + preferredMethod: 'GET', + semanticMethod: 'GET', + }, + response: { + description: 'List all planes.', + resourceType: 'plane', + responseKey: 'planes', + responseType: 'resource_list', + }, + title: 'List planes', + }, + ], + name: 'planes', namespace: { - path: '/foos', + path: '/transport/air', }, - path: '/foos', + path: '/transport/air/planes', subroutes: [], }, ], @@ -462,6 +575,30 @@ Generated by [AVA](https://avajs.dev). ], resourceType: 'foo', }, + plane: { + description: 'A plane resource.', + properties: [ + { + deprecationMessage: '', + description: 'plane id', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'plane_id', + }, + { + deprecationMessage: '', + description: 'Planej name', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'name', + }, + ], + resourceType: 'plane', + }, }, routes: [ { @@ -836,10 +973,109 @@ Generated by [AVA](https://avajs.dev). }, ], name: 'foos', + namespace: null, + path: '/foos', + subroutes: [], + }, + { + endpoints: [ + { + codeSamples: [ + { + code: { + javascript: { + request: `// javascript␊ + await seam.transport.air.planes.list()`, + request_syntax: 'javascript', + response: `// javascript␊ + [{"plane_id":"9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name":"Woosh"}]`, + response_syntax: 'javascript', + title: 'JavaScript', + }, + php: { + request: `// php␊ + transport->air->planes->list()`, + request_syntax: 'php', + response: `// json␊ + [{"plane_id":"9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name":"Woosh"}]`, + response_syntax: 'json', + title: 'PHP', + }, + python: { + request: `// python␊ + seam.transport.air.planes.list()`, + request_syntax: 'python', + response: `// python␊ + [Plane(plane_id="9d3163f9-9185-40d3-a0ce-a03d3c7ce402", name="Woosh")]`, + response_syntax: 'python', + title: 'Python', + }, + ruby: { + request: `// ruby␊ + seam.transport.air.planes.list()`, + request_syntax: 'ruby', + response: `// ruby␊ + [{"plane_id" => "9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name" => "Woosh"}]`, + response_syntax: 'ruby', + title: 'Ruby', + }, + seam_cli: { + request: `// bash␊ + seam transport air planes list `, + request_syntax: 'bash', + response: `// json␊ + [{"plane_id":"9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name":"Woosh"}]`, + response_syntax: 'json', + title: 'Seam CLI', + }, + }, + description: 'This is the wya to get all plans', + request: { + parameters: {}, + path: '/transport/air/planes/list', + }, + response: { + body: { + planes: [ + { + name: 'Woosh', + plane_id: '9d3163f9-9185-40d3-a0ce-a03d3c7ce402', + }, + ], + }, + }, + title: 'List planes', + }, + ], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'list', + path: '/transport/air/planes/list', + request: { + methods: [ + 'GET', + ], + parameters: [], + preferredMethod: 'GET', + semanticMethod: 'GET', + }, + response: { + description: 'List all planes.', + resourceType: 'plane', + responseKey: 'planes', + responseType: 'resource_list', + }, + title: 'List planes', + }, + ], + name: 'planes', namespace: { - path: '/foos', + path: '/transport/air', }, - path: '/foos', + path: '/transport/air/planes', subroutes: [], }, ], diff --git a/test/snapshots/blueprint.test.ts.snap b/test/snapshots/blueprint.test.ts.snap index 2c55dbae3a9ec8c53b6983087abeaa002ff01370..6c1b44db5c1570f72448077361fa97b17ebdb076 100644 GIT binary patch literal 5159 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 E0W3NW(EtDd literal 4034 zcmZ9GcQhLe_s5Oegi^a`l^8K(OSsZmuiLljjrsE8P$f?737?NwWdgxV{pJsU;T zruJ@8kJ0}6d)~j^_nvdlx#!-`{hY6sxz?>`o=}*ti`VO0a5;KPve0jy-(5qBHi|FOV^7rXsnOcJknqU!~cHI3W>l%HrF@H>@Dto>BFT9{L5ZNf9+nLvHB+Lsh34 z!&hk@{+1jyj6=ladNnx7xnV*o7As+W4_veM5NOo+yW7|A;Gf*T;WMx7^SM*H#q_=dRb*Z_^w+GW9HKhRi~^PX zSl^SpITS<2oOp-3R(Mq;l3Dal$m2|v;lV-e!H2T9EQPj=ZYjaClO>A-*z;ZzRX?76 zH84io$|BX@|0V>0R7_1b-D9?2Zl*yC``BPYTkK1IU&4wW(L6CFS}u(hIEY>2bQ>R5_AW$fnMD5jvBSRSbLhF2l!%H*b93`bZ18!MQ%5Htam|3FQ_R%%3?F^WE{#&mujgN0hbS)_N zb>Q@9Xe|@ee(^i3>}k4C;Rsng^`;`hnQ~X20D16z#PD5X6Hu(@6!5b}V8X9|a_ zuMX$s&vbYkGYdKy!RgCCozLnmL$l-$^H3I-VCOReqsJCbgs(jvz+BW_{+c`&*fsIz z4C*bLuS}`vL6WZ8bpu?=&S zeIfuDlqF%qf@aS@mT%u?P;(8-vs|jAGPfw0rSCRZc8-XuJbVFab!D%pm@-SvrdpS< zNTbRdra*Dbo}{hemoE+1QhUT zw)ue*3{3SN)9SgcI$wi&k~BXE?FceCI?v|!zj@3)Y`%Fs@Qz!S^>fKdp~J+zo%8nl z^0DJY`a5Nrj0~%V?nuGH4Q+FHP3m(yJzCho&7B8 zl>*@wA2e3HMOF7!*`!9sf3zZQ#0tg4y%lA;VE01yn7KRH)(K+74d$z}d8z-L# zZVNG7t?){VH&v4#;ZyK5gFPJEz}9j0)@6}%WZW);b0N2LwaxW`T@QTvRcC-qi;E5%J&gw#G=(f5!jiE0aiN*oj*2im{ljqQgFozpQsi0s~R0;-c<_< z6BLzr(<|8NS>C(c+C~^N>W!F3go^Ye{i(q35?eAjR1xX5DynTc2i-vYCtJphx z@DXT(^`}5fnV=f3Q_k-2ovtAcyDghQZ{+IrFE1***IzqrY1GutJ&CMjcC zCqej+$l#=pnR~i#pjSXGXp=L|0>@)a| z;P4Hj*WjVZb#o57A?-o%A89bAUpnHWsS7A#uQ)%YE6KDV#>!B_PBJ1;f0+*NQVaYr zQG6I_QTd#0NWdUWR#ZIvT$W@?eKB~A6bk&{e1dYbc#tK|U~oyZOS9MMTnq`6-_3+N zxNEEbvx9rz8!h(7!X7>^_!wgzRcCSV{V)Z28iT6^<~ax~Dy{fbtiS)d(|~>Va_+is zh0FTS%V^k6H-Dd*#arp>cYF@;fD{&`G(F~{$R94ZH6Z+;&-wo>ru8Y>wF6`RnRok` z)!}9+|8uN5BMUkumA?EoBc3}3TorG46j_IV(dy}u!ev|;&%c^c_r*cNmQz9Zz2oKa zJyHuGqz3RikPiV``c1#A(m$o9Q7XRFL+@hCe0l;ys;7gfNU}_o6|CE!<$8TYGpkhv z;i)jeM;@1jSvnOz^I-oD?pB{Xw5cN-nj|b#MEX}ivzP!gOToPT3KSB?6XEWaVIB^6 z3PZfA>k`HRuN}|EJV_{2NVH?fa$OdwJB+d-ueYMKeonLI2Q%QyE(>o)HkLp_Q{C*R zr@QgUvtP)5m(VQUr6X$cdR@xECUS^d=)NwO8+uVm8~UEi8WZNHsD)w+s-?^IdJ{jg z z1KykN;lF0{D{Vs+TtnOTB=zEC8aI67JuXc8|*9 z+1E9x0*qv4$tg@En+5c0f)vuu7P3GmW;;%#Ld{Zj?6ca3^Q71D{%BtQ;i){w^s)u& zmq5l#Bt#@W$&VW#z^3 zNmUs|s1$Re=MEk2Z;$gcDvu&oi`3Gk(=?_B!k7nrrAOxQ0eUvaa2>^UdzX1SCqHL` zj1s;@38}_VYgdKs*aF-!pJJH}ZtAOg`>uCIp}90^n8*J~T6Fl_zRP!bKb@05lBB5A z@Ge6aJV9H)8E|N28zCrJd2OfrkS9M*ZI&*da|xp)(ftS?BGLYCn5Edx9FJ{whVz(1NhV@O|20-c zZ*WClps+KYD0o=2X!^h8@-n#?VqfeI!Gyd4OsM?{ z3cf6%Sipv2rn?PyZdb8pZh+4lYgn=6==Z6IM#4|bJN?(e=Ljr)h&dJ0B(9Wa)a*gK z2c$Sbk@uLiq^gMMq*irXiu@;4gTE}SBhzkcb&m&u3Mo$bWQCjR!doFKIgmR`-CW=V-xpKfTeajtOt4n+Da9^q?_UO>)WylOtjW_!y!K1J)Aw(@ z*2!xJ@|{@c#sY4NowV(T1Ar=GU#cX`km06R7|K1YtqN8uI#clc98tp_LZbgOP0#Le zc%^vOQ2$r=`z!V1z41xFC>&AEr~jW{dm8tx&_ce$X}<9px(l5;roTSP9GITSz zNUnU3tVGL&H4PwTv-JY(QKdFJpP9BPwMLl)kqYDUjjcnYtUao3T6A}Ou9s4!P$F!2 zOH*yLHJ+kggnIbx+CyZsGEyz`q}n`2cwODr2>BA?^PCQWwV?0g!p$Qp_Yw9qVFBgt z{_Ty(WF22g^))~`7Y7l=WStgEU#3PrA=V!n$Z&F$pkw&xzN@}#@NP* kgIXfB9eDa8mp Date: Wed, 11 Sep 2024 13:22:17 +0000 Subject: [PATCH 6/9] 0.18.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index ad31a39..a77e0b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@seamapi/blueprint", - "version": "0.17.1", + "version": "0.18.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@seamapi/blueprint", - "version": "0.17.1", + "version": "0.18.0", "license": "MIT", "dependencies": { "change-case": "^5.4.4", diff --git a/package.json b/package.json index 57deece..c947c08 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@seamapi/blueprint", - "version": "0.17.1", + "version": "0.18.0", "description": "Build tools for the Seam API using this blueprint.", "type": "module", "main": "index.js", From 2468558d3c98abbf8dc366d78fdf599ff02d6e74 Mon Sep 17 00:00:00 2001 From: Mike Wu Date: Wed, 11 Sep 2024 22:25:45 +0900 Subject: [PATCH 7/9] feat: generate /events and event resource (#79) * feat: generate /events and event resource * update test snapshot * ci: Generate code * ci: Generate code * ci: Format code --------- Co-authored-by: Seam Bot --- src/lib/blueprint.ts | 33 +- test/snapshots/blueprint.test.ts.md | 1118 +++++++++++++++++--- test/snapshots/blueprint.test.ts.snap | Bin 5159 -> 11065 bytes test/snapshots/seam-blueprint.test.ts.md | 502 +++++++++ test/snapshots/seam-blueprint.test.ts.snap | Bin 21096 -> 24515 bytes 5 files changed, 1513 insertions(+), 140 deletions(-) diff --git a/src/lib/blueprint.ts b/src/lib/blueprint.ts index 83447ae..725ad9f 100644 --- a/src/lib/blueprint.ts +++ b/src/lib/blueprint.ts @@ -245,7 +245,7 @@ export const createBlueprint = async ( const openapi = typesModule.openapi as Openapi const isFakeData = openapi.info.title === 'Foo' - const targetPath = '/acs' + const targetPaths = ['/acs', '/events'] const targetSchemas = [ 'acs_access_group', 'acs_credential', @@ -254,6 +254,7 @@ export const createBlueprint = async ( 'acs_entrance', 'acs_system', 'acs_user', + 'event', ] const context = { @@ -263,7 +264,7 @@ export const createBlueprint = async ( return { title: openapi.info.title, - routes: await createRoutes(openapi.paths, isFakeData, targetPath, context), + routes: await createRoutes(openapi.paths, isFakeData, targetPaths, context), resources: createResources( openapi.components.schemas, isFakeData, @@ -275,27 +276,29 @@ export const createBlueprint = async ( const createRoutes = async ( paths: OpenapiPaths, isFakeData: boolean, - targetPath: string, + targetPaths: string[], context: Context, ): Promise => { const routeMap = new Map() - const pathEntries = Object.entries(paths).filter( - ([path]) => isFakeData || path.startsWith(targetPath), - ) + for (const targetPath of targetPaths) { + const pathEntries = Object.entries(paths).filter( + ([path]) => isFakeData || path.startsWith(targetPath), + ) - for (const [path, pathItem] of pathEntries) { - const namespace = getNamespace(path, paths) + for (const [path, pathItem] of pathEntries) { + const namespace = getNamespace(path, paths) - const route = await createRoute(namespace, path, pathItem, context) + const route = await createRoute(namespace, path, pathItem, context) - const existingRoute = routeMap.get(route.path) - if (existingRoute != null) { - existingRoute.endpoints.push(...route.endpoints) - continue - } + const existingRoute = routeMap.get(route.path) + if (existingRoute != null) { + existingRoute.endpoints.push(...route.endpoints) + continue + } - routeMap.set(route.path, route) + routeMap.set(route.path, route) + } } return Array.from(routeMap.values()) diff --git a/test/snapshots/blueprint.test.ts.md b/test/snapshots/blueprint.test.ts.md index 1b8f1a7..c3dcf87 100644 --- a/test/snapshots/blueprint.test.ts.md +++ b/test/snapshots/blueprint.test.ts.md @@ -417,12 +417,599 @@ Generated by [AVA](https://avajs.dev). }, title: 'List foos', }, + { + codeSamples: [ + { + code: { + javascript: { + request: 'await seam.foos.get({"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33"})', + request_syntax: 'javascript', + response: '{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}', + response_syntax: 'javascript', + title: 'JavaScript', + }, + php: { + request: `foos->get(foo_id:"8d7e0b3a-b889-49a7-9164-4b71a0506a33")`, + request_syntax: 'php', + response: '{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}', + response_syntax: 'json', + title: 'PHP', + }, + python: { + request: 'seam.foos.get(foo_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33")', + request_syntax: 'python', + response: 'Foo(foo_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33", name="Best foo", nullable_property=None)', + response_syntax: 'python', + title: 'Python', + }, + ruby: { + request: 'seam.foos.get(foo_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33")', + request_syntax: 'ruby', + response: '{"foo_id" => "8d7e0b3a-b889-49a7-9164-4b71a0506a33","name" => "Best foo","nullable_property" => nil}', + response_syntax: 'ruby', + title: 'Ruby', + }, + seam_cli: { + request: 'seam foos get --foo_id "8d7e0b3a-b889-49a7-9164-4b71a0506a33"', + request_syntax: 'bash', + response: '{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}', + response_syntax: 'json', + title: 'Seam CLI', + }, + }, + description: 'This is the way to get a foo', + request: { + parameters: { + foo_id: '8d7e0b3a-b889-49a7-9164-4b71a0506a33', + }, + path: '/foos/get', + }, + response: { + body: { + foo: { + foo_id: '8d7e0b3a-b889-49a7-9164-4b71a0506a33', + name: 'Best foo', + nullable_property: null, + }, + }, + }, + title: 'Get a foo by ID', + }, + ], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'get', + path: '/foos/get', + request: { + methods: [ + 'GET', + ], + parameters: [], + preferredMethod: 'GET', + semanticMethod: 'GET', + }, + response: { + description: 'Get a foo by ID.', + resourceType: 'foo', + responseKey: 'foo', + responseType: 'resource', + }, + title: 'Get a foo', + }, + { + codeSamples: [ + { + code: { + javascript: { + request: 'await seam.foos.get({"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33"})', + request_syntax: 'javascript', + response: '{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}', + response_syntax: 'javascript', + title: 'JavaScript', + }, + php: { + request: `foos->get(foo_id:"8d7e0b3a-b889-49a7-9164-4b71a0506a33")`, + request_syntax: 'php', + response: '{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}', + response_syntax: 'json', + title: 'PHP', + }, + python: { + request: 'seam.foos.get(foo_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33")', + request_syntax: 'python', + response: 'Foo(foo_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33", name="Best foo", nullable_property=None)', + response_syntax: 'python', + title: 'Python', + }, + ruby: { + request: 'seam.foos.get(foo_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33")', + request_syntax: 'ruby', + response: '{"foo_id" => "8d7e0b3a-b889-49a7-9164-4b71a0506a33","name" => "Best foo","nullable_property" => nil}', + response_syntax: 'ruby', + title: 'Ruby', + }, + seam_cli: { + request: 'seam foos get --foo_id "8d7e0b3a-b889-49a7-9164-4b71a0506a33"', + request_syntax: 'bash', + response: '{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}', + response_syntax: 'json', + title: 'Seam CLI', + }, + }, + description: 'This is the way to get a foo', + request: { + parameters: { + foo_id: '8d7e0b3a-b889-49a7-9164-4b71a0506a33', + }, + path: '/foos/get', + }, + response: { + body: { + foo: { + foo_id: '8d7e0b3a-b889-49a7-9164-4b71a0506a33', + name: 'Best foo', + nullable_property: null, + }, + }, + }, + title: 'Get a foo by ID', + }, + ], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'get', + path: '/foos/get', + request: { + methods: [ + 'POST', + ], + parameters: [], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'Get a foo by ID.', + resourceType: 'foo', + responseKey: 'foo', + responseType: 'resource', + }, + title: 'Get a foo', + }, + { + codeSamples: [ + { + code: { + javascript: { + request: 'await seam.foos.list()', + request_syntax: 'javascript', + response: '[{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}]', + response_syntax: 'javascript', + title: 'JavaScript', + }, + php: { + request: `foos->list()`, + request_syntax: 'php', + response: '[{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}]', + response_syntax: 'json', + title: 'PHP', + }, + python: { + request: 'seam.foos.list()', + request_syntax: 'python', + response: '[Foo(foo_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33", name="Best foo", nullable_property=None)]', + response_syntax: 'python', + title: 'Python', + }, + ruby: { + request: 'seam.foos.list()', + request_syntax: 'ruby', + response: '[{"foo_id" => "8d7e0b3a-b889-49a7-9164-4b71a0506a33","name" => "Best foo","nullable_property" => nil}]', + response_syntax: 'ruby', + title: 'Ruby', + }, + seam_cli: { + request: 'seam foos list ', + request_syntax: 'bash', + response: '[{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}]', + response_syntax: 'json', + title: 'Seam CLI', + }, + }, + description: 'This is the way to list foos', + request: { + parameters: {}, + path: '/foos/list', + }, + response: { + body: { + foos: [ + { + foo_id: '8d7e0b3a-b889-49a7-9164-4b71a0506a33', + name: 'Best foo', + nullable_property: null, + }, + ], + }, + }, + title: 'List foos', + }, + ], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'list', + path: '/foos/list', + request: { + methods: [ + 'GET', + ], + parameters: [], + preferredMethod: 'GET', + semanticMethod: 'GET', + }, + response: { + description: 'List all foos.', + resourceType: 'foo', + responseKey: 'foos', + responseType: 'resource_list', + }, + title: 'List foos', + }, + { + codeSamples: [ + { + code: { + javascript: { + request: 'await seam.foos.list()', + request_syntax: 'javascript', + response: '[{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}]', + response_syntax: 'javascript', + title: 'JavaScript', + }, + php: { + request: `foos->list()`, + request_syntax: 'php', + response: '[{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}]', + response_syntax: 'json', + title: 'PHP', + }, + python: { + request: 'seam.foos.list()', + request_syntax: 'python', + response: '[Foo(foo_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33", name="Best foo", nullable_property=None)]', + response_syntax: 'python', + title: 'Python', + }, + ruby: { + request: 'seam.foos.list()', + request_syntax: 'ruby', + response: '[{"foo_id" => "8d7e0b3a-b889-49a7-9164-4b71a0506a33","name" => "Best foo","nullable_property" => nil}]', + response_syntax: 'ruby', + title: 'Ruby', + }, + seam_cli: { + request: 'seam foos list ', + request_syntax: 'bash', + response: '[{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}]', + response_syntax: 'json', + title: 'Seam CLI', + }, + }, + description: 'This is the way to list foos', + request: { + parameters: {}, + path: '/foos/list', + }, + response: { + body: { + foos: [ + { + foo_id: '8d7e0b3a-b889-49a7-9164-4b71a0506a33', + name: 'Best foo', + nullable_property: null, + }, + ], + }, + }, + title: 'List foos', + }, + ], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'list', + path: '/foos/list', + request: { + methods: [ + 'POST', + ], + parameters: [], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'List all foos.', + resourceType: 'foo', + responseKey: 'foos', + responseType: 'resource_list', + }, + title: 'List foos', + }, + ], + name: 'foos', + namespace: null, + path: '/foos', + subroutes: [], + }, + { + endpoints: [ + { + codeSamples: [ + { + code: { + javascript: { + request: 'await seam.transport.air.planes.list()', + request_syntax: 'javascript', + response: '[{"plane_id":"9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name":"Woosh"}]', + response_syntax: 'javascript', + title: 'JavaScript', + }, + php: { + request: `transport->air->planes->list()`, + request_syntax: 'php', + response: '[{"plane_id":"9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name":"Woosh"}]', + response_syntax: 'json', + title: 'PHP', + }, + python: { + request: 'seam.transport.air.planes.list()', + request_syntax: 'python', + response: '[Plane(plane_id="9d3163f9-9185-40d3-a0ce-a03d3c7ce402", name="Woosh")]', + response_syntax: 'python', + title: 'Python', + }, + ruby: { + request: 'seam.transport.air.planes.list()', + request_syntax: 'ruby', + response: '[{"plane_id" => "9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name" => "Woosh"}]', + response_syntax: 'ruby', + title: 'Ruby', + }, + seam_cli: { + request: 'seam transport air planes list ', + request_syntax: 'bash', + response: '[{"plane_id":"9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name":"Woosh"}]', + response_syntax: 'json', + title: 'Seam CLI', + }, + }, + description: 'This is the wya to get all plans', + request: { + parameters: {}, + path: '/transport/air/planes/list', + }, + response: { + body: { + planes: [ + { + name: 'Woosh', + plane_id: '9d3163f9-9185-40d3-a0ce-a03d3c7ce402', + }, + ], + }, + }, + title: 'List planes', + }, + ], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'list', + path: '/transport/air/planes/list', + request: { + methods: [ + 'GET', + ], + parameters: [], + preferredMethod: 'GET', + semanticMethod: 'GET', + }, + response: { + description: 'List all planes.', + resourceType: 'plane', + responseKey: 'planes', + responseType: 'resource_list', + }, + title: 'List planes', + }, + { + codeSamples: [ + { + code: { + javascript: { + request: 'await seam.transport.air.planes.list()', + request_syntax: 'javascript', + response: '[{"plane_id":"9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name":"Woosh"}]', + response_syntax: 'javascript', + title: 'JavaScript', + }, + php: { + request: `transport->air->planes->list()`, + request_syntax: 'php', + response: '[{"plane_id":"9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name":"Woosh"}]', + response_syntax: 'json', + title: 'PHP', + }, + python: { + request: 'seam.transport.air.planes.list()', + request_syntax: 'python', + response: '[Plane(plane_id="9d3163f9-9185-40d3-a0ce-a03d3c7ce402", name="Woosh")]', + response_syntax: 'python', + title: 'Python', + }, + ruby: { + request: 'seam.transport.air.planes.list()', + request_syntax: 'ruby', + response: '[{"plane_id" => "9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name" => "Woosh"}]', + response_syntax: 'ruby', + title: 'Ruby', + }, + seam_cli: { + request: 'seam transport air planes list ', + request_syntax: 'bash', + response: '[{"plane_id":"9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name":"Woosh"}]', + response_syntax: 'json', + title: 'Seam CLI', + }, + }, + description: 'This is the wya to get all plans', + request: { + parameters: {}, + path: '/transport/air/planes/list', + }, + response: { + body: { + planes: [ + { + name: 'Woosh', + plane_id: '9d3163f9-9185-40d3-a0ce-a03d3c7ce402', + }, + ], + }, + }, + title: 'List planes', + }, + ], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'list', + path: '/transport/air/planes/list', + request: { + methods: [ + 'GET', + ], + parameters: [], + preferredMethod: 'GET', + semanticMethod: 'GET', + }, + response: { + description: 'List all planes.', + resourceType: 'plane', + responseKey: 'planes', + responseType: 'resource_list', + }, + title: 'List planes', + }, ], - name: 'foos', - namespace: null, - path: '/foos', + name: 'planes', + namespace: { + path: '/transport/air', + }, + path: '/transport/air/planes', subroutes: [], }, + ], + title: 'Foo', + } + +## createBlueprint: with formatCode + +> blueprint + + { + resources: { + foo: { + description: 'A foo resource.', + properties: [ + { + deprecationMessage: '', + description: 'Foo id', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'foo_id', + }, + { + deprecationMessage: '', + description: 'Foo name', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'name', + }, + { + deprecationMessage: 'This prop will be removed in the next version', + description: 'This prop is deprecated', + format: 'string', + isDeprecated: true, + isUndocumented: false, + jsonType: 'string', + name: 'deprecated_prop', + }, + { + deprecationMessage: '', + description: 'This prop is undocumented', + format: 'string', + isDeprecated: false, + isUndocumented: true, + jsonType: 'string', + name: 'undocumented_prop', + }, + { + deprecationMessage: '', + description: 'This prop is nullable', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'nullable_property', + }, + ], + resourceType: 'foo', + }, + plane: { + description: 'A plane resource.', + properties: [ + { + deprecationMessage: '', + description: 'plane id', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'plane_id', + }, + { + deprecationMessage: '', + description: 'Planej name', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'name', + }, + ], + resourceType: 'plane', + }, + }, + routes: [ { endpoints: [ { @@ -430,58 +1017,345 @@ Generated by [AVA](https://avajs.dev). { code: { javascript: { - request: 'await seam.transport.air.planes.list()', + request: `// javascript␊ + await seam.foos.get({"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33"})`, + request_syntax: 'javascript', + response: `// javascript␊ + {"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}`, + response_syntax: 'javascript', + title: 'JavaScript', + }, + php: { + request: `// php␊ + foos->get(foo_id:"8d7e0b3a-b889-49a7-9164-4b71a0506a33")`, + request_syntax: 'php', + response: `// json␊ + {"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}`, + response_syntax: 'json', + title: 'PHP', + }, + python: { + request: `// python␊ + seam.foos.get(foo_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33")`, + request_syntax: 'python', + response: `// python␊ + Foo(foo_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33", name="Best foo", nullable_property=None)`, + response_syntax: 'python', + title: 'Python', + }, + ruby: { + request: `// ruby␊ + seam.foos.get(foo_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33")`, + request_syntax: 'ruby', + response: `// ruby␊ + {"foo_id" => "8d7e0b3a-b889-49a7-9164-4b71a0506a33","name" => "Best foo","nullable_property" => nil}`, + response_syntax: 'ruby', + title: 'Ruby', + }, + seam_cli: { + request: `// bash␊ + seam foos get --foo_id "8d7e0b3a-b889-49a7-9164-4b71a0506a33"`, + request_syntax: 'bash', + response: `// json␊ + {"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}`, + response_syntax: 'json', + title: 'Seam CLI', + }, + }, + description: 'This is the way to get a foo', + request: { + parameters: { + foo_id: '8d7e0b3a-b889-49a7-9164-4b71a0506a33', + }, + path: '/foos/get', + }, + response: { + body: { + foo: { + foo_id: '8d7e0b3a-b889-49a7-9164-4b71a0506a33', + name: 'Best foo', + nullable_property: null, + }, + }, + }, + title: 'Get a foo by ID', + }, + ], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'get', + path: '/foos/get', + request: { + methods: [ + 'GET', + ], + parameters: [], + preferredMethod: 'GET', + semanticMethod: 'GET', + }, + response: { + description: 'Get a foo by ID.', + resourceType: 'foo', + responseKey: 'foo', + responseType: 'resource', + }, + title: 'Get a foo', + }, + { + codeSamples: [ + { + code: { + javascript: { + request: `// javascript␊ + await seam.foos.get({"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33"})`, + request_syntax: 'javascript', + response: `// javascript␊ + {"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}`, + response_syntax: 'javascript', + title: 'JavaScript', + }, + php: { + request: `// php␊ + foos->get(foo_id:"8d7e0b3a-b889-49a7-9164-4b71a0506a33")`, + request_syntax: 'php', + response: `// json␊ + {"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}`, + response_syntax: 'json', + title: 'PHP', + }, + python: { + request: `// python␊ + seam.foos.get(foo_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33")`, + request_syntax: 'python', + response: `// python␊ + Foo(foo_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33", name="Best foo", nullable_property=None)`, + response_syntax: 'python', + title: 'Python', + }, + ruby: { + request: `// ruby␊ + seam.foos.get(foo_id: "8d7e0b3a-b889-49a7-9164-4b71a0506a33")`, + request_syntax: 'ruby', + response: `// ruby␊ + {"foo_id" => "8d7e0b3a-b889-49a7-9164-4b71a0506a33","name" => "Best foo","nullable_property" => nil}`, + response_syntax: 'ruby', + title: 'Ruby', + }, + seam_cli: { + request: `// bash␊ + seam foos get --foo_id "8d7e0b3a-b889-49a7-9164-4b71a0506a33"`, + request_syntax: 'bash', + response: `// json␊ + {"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}`, + response_syntax: 'json', + title: 'Seam CLI', + }, + }, + description: 'This is the way to get a foo', + request: { + parameters: { + foo_id: '8d7e0b3a-b889-49a7-9164-4b71a0506a33', + }, + path: '/foos/get', + }, + response: { + body: { + foo: { + foo_id: '8d7e0b3a-b889-49a7-9164-4b71a0506a33', + name: 'Best foo', + nullable_property: null, + }, + }, + }, + title: 'Get a foo by ID', + }, + ], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'get', + path: '/foos/get', + request: { + methods: [ + 'POST', + ], + parameters: [], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'Get a foo by ID.', + resourceType: 'foo', + responseKey: 'foo', + responseType: 'resource', + }, + title: 'Get a foo', + }, + { + codeSamples: [ + { + code: { + javascript: { + request: `// javascript␊ + await seam.foos.list()`, + request_syntax: 'javascript', + response: `// javascript␊ + [{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}]`, + response_syntax: 'javascript', + title: 'JavaScript', + }, + php: { + request: `// php␊ + foos->list()`, + request_syntax: 'php', + response: `// json␊ + [{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}]`, + response_syntax: 'json', + title: 'PHP', + }, + python: { + request: `// python␊ + seam.foos.list()`, + request_syntax: 'python', + response: `// python␊ + [Foo(foo_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33", name="Best foo", nullable_property=None)]`, + response_syntax: 'python', + title: 'Python', + }, + ruby: { + request: `// ruby␊ + seam.foos.list()`, + request_syntax: 'ruby', + response: `// ruby␊ + [{"foo_id" => "8d7e0b3a-b889-49a7-9164-4b71a0506a33","name" => "Best foo","nullable_property" => nil}]`, + response_syntax: 'ruby', + title: 'Ruby', + }, + seam_cli: { + request: `// bash␊ + seam foos list `, + request_syntax: 'bash', + response: `// json␊ + [{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}]`, + response_syntax: 'json', + title: 'Seam CLI', + }, + }, + description: 'This is the way to list foos', + request: { + parameters: {}, + path: '/foos/list', + }, + response: { + body: { + foos: [ + { + foo_id: '8d7e0b3a-b889-49a7-9164-4b71a0506a33', + name: 'Best foo', + nullable_property: null, + }, + ], + }, + }, + title: 'List foos', + }, + ], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'list', + path: '/foos/list', + request: { + methods: [ + 'GET', + ], + parameters: [], + preferredMethod: 'GET', + semanticMethod: 'GET', + }, + response: { + description: 'List all foos.', + resourceType: 'foo', + responseKey: 'foos', + responseType: 'resource_list', + }, + title: 'List foos', + }, + { + codeSamples: [ + { + code: { + javascript: { + request: `// javascript␊ + await seam.foos.list()`, request_syntax: 'javascript', - response: '[{"plane_id":"9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name":"Woosh"}]', + response: `// javascript␊ + [{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}]`, response_syntax: 'javascript', title: 'JavaScript', }, php: { - request: `transport->air->planes->list()`, + request: `// php␊ + foos->list()`, request_syntax: 'php', - response: '[{"plane_id":"9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name":"Woosh"}]', + response: `// json␊ + [{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}]`, response_syntax: 'json', title: 'PHP', }, python: { - request: 'seam.transport.air.planes.list()', + request: `// python␊ + seam.foos.list()`, request_syntax: 'python', - response: '[Plane(plane_id="9d3163f9-9185-40d3-a0ce-a03d3c7ce402", name="Woosh")]', + response: `// python␊ + [Foo(foo_id="8d7e0b3a-b889-49a7-9164-4b71a0506a33", name="Best foo", nullable_property=None)]`, response_syntax: 'python', title: 'Python', }, ruby: { - request: 'seam.transport.air.planes.list()', + request: `// ruby␊ + seam.foos.list()`, request_syntax: 'ruby', - response: '[{"plane_id" => "9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name" => "Woosh"}]', + response: `// ruby␊ + [{"foo_id" => "8d7e0b3a-b889-49a7-9164-4b71a0506a33","name" => "Best foo","nullable_property" => nil}]`, response_syntax: 'ruby', title: 'Ruby', }, seam_cli: { - request: 'seam transport air planes list ', + request: `// bash␊ + seam foos list `, request_syntax: 'bash', - response: '[{"plane_id":"9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name":"Woosh"}]', + response: `// json␊ + [{"foo_id":"8d7e0b3a-b889-49a7-9164-4b71a0506a33","name":"Best foo","nullable_property":null}]`, response_syntax: 'json', title: 'Seam CLI', }, }, - description: 'This is the wya to get all plans', + description: 'This is the way to list foos', request: { parameters: {}, - path: '/transport/air/planes/list', + path: '/foos/list', }, response: { body: { - planes: [ + foos: [ { - name: 'Woosh', - plane_id: '9d3163f9-9185-40d3-a0ce-a03d3c7ce402', + foo_id: '8d7e0b3a-b889-49a7-9164-4b71a0506a33', + name: 'Best foo', + nullable_property: null, }, ], }, }, - title: 'List planes', + title: 'List foos', }, ], deprecationMessage: '', @@ -489,120 +1363,23 @@ Generated by [AVA](https://avajs.dev). isDeprecated: false, isUndocumented: false, name: 'list', - path: '/transport/air/planes/list', + path: '/foos/list', request: { methods: [ - 'GET', + 'POST', ], parameters: [], - preferredMethod: 'GET', - semanticMethod: 'GET', + preferredMethod: 'POST', + semanticMethod: 'POST', }, response: { - description: 'List all planes.', - resourceType: 'plane', - responseKey: 'planes', + description: 'List all foos.', + resourceType: 'foo', + responseKey: 'foos', responseType: 'resource_list', }, - title: 'List planes', - }, - ], - name: 'planes', - namespace: { - path: '/transport/air', - }, - path: '/transport/air/planes', - subroutes: [], - }, - ], - title: 'Foo', - } - -## createBlueprint: with formatCode - -> blueprint - - { - resources: { - foo: { - description: 'A foo resource.', - properties: [ - { - deprecationMessage: '', - description: 'Foo id', - format: 'id', - isDeprecated: false, - isUndocumented: false, - jsonType: 'string', - name: 'foo_id', - }, - { - deprecationMessage: '', - description: 'Foo name', - format: 'string', - isDeprecated: false, - isUndocumented: false, - jsonType: 'string', - name: 'name', - }, - { - deprecationMessage: 'This prop will be removed in the next version', - description: 'This prop is deprecated', - format: 'string', - isDeprecated: true, - isUndocumented: false, - jsonType: 'string', - name: 'deprecated_prop', - }, - { - deprecationMessage: '', - description: 'This prop is undocumented', - format: 'string', - isDeprecated: false, - isUndocumented: true, - jsonType: 'string', - name: 'undocumented_prop', - }, - { - deprecationMessage: '', - description: 'This prop is nullable', - format: 'string', - isDeprecated: false, - isUndocumented: false, - jsonType: 'string', - name: 'nullable_property', - }, - ], - resourceType: 'foo', - }, - plane: { - description: 'A plane resource.', - properties: [ - { - deprecationMessage: '', - description: 'plane id', - format: 'id', - isDeprecated: false, - isUndocumented: false, - jsonType: 'string', - name: 'plane_id', - }, - { - deprecationMessage: '', - description: 'Planej name', - format: 'string', - isDeprecated: false, - isUndocumented: false, - jsonType: 'string', - name: 'name', + title: 'List foos', }, - ], - resourceType: 'plane', - }, - }, - routes: [ - { - endpoints: [ { codeSamples: [ { @@ -1070,6 +1847,97 @@ Generated by [AVA](https://avajs.dev). }, title: 'List planes', }, + { + codeSamples: [ + { + code: { + javascript: { + request: `// javascript␊ + await seam.transport.air.planes.list()`, + request_syntax: 'javascript', + response: `// javascript␊ + [{"plane_id":"9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name":"Woosh"}]`, + response_syntax: 'javascript', + title: 'JavaScript', + }, + php: { + request: `// php␊ + transport->air->planes->list()`, + request_syntax: 'php', + response: `// json␊ + [{"plane_id":"9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name":"Woosh"}]`, + response_syntax: 'json', + title: 'PHP', + }, + python: { + request: `// python␊ + seam.transport.air.planes.list()`, + request_syntax: 'python', + response: `// python␊ + [Plane(plane_id="9d3163f9-9185-40d3-a0ce-a03d3c7ce402", name="Woosh")]`, + response_syntax: 'python', + title: 'Python', + }, + ruby: { + request: `// ruby␊ + seam.transport.air.planes.list()`, + request_syntax: 'ruby', + response: `// ruby␊ + [{"plane_id" => "9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name" => "Woosh"}]`, + response_syntax: 'ruby', + title: 'Ruby', + }, + seam_cli: { + request: `// bash␊ + seam transport air planes list `, + request_syntax: 'bash', + response: `// json␊ + [{"plane_id":"9d3163f9-9185-40d3-a0ce-a03d3c7ce402","name":"Woosh"}]`, + response_syntax: 'json', + title: 'Seam CLI', + }, + }, + description: 'This is the wya to get all plans', + request: { + parameters: {}, + path: '/transport/air/planes/list', + }, + response: { + body: { + planes: [ + { + name: 'Woosh', + plane_id: '9d3163f9-9185-40d3-a0ce-a03d3c7ce402', + }, + ], + }, + }, + title: 'List planes', + }, + ], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'list', + path: '/transport/air/planes/list', + request: { + methods: [ + 'GET', + ], + parameters: [], + preferredMethod: 'GET', + semanticMethod: 'GET', + }, + response: { + description: 'List all planes.', + resourceType: 'plane', + responseKey: 'planes', + responseType: 'resource_list', + }, + title: 'List planes', + }, ], name: 'planes', namespace: { diff --git a/test/snapshots/blueprint.test.ts.snap b/test/snapshots/blueprint.test.ts.snap index 6c1b44db5c1570f72448077361fa97b17ebdb076..c86ad1969157d2633371b9394432e314942f3e7c 100644 GIT binary patch literal 11065 zcmd7YRa0Eeqp0!0-8DD~?h+t4gaEHNaCb`}1cJK;XMo@gHUj|y!F6D;f#5bF zSkUvn|JrBQ-gUmfSr<=N-*sQ~s#U*UipGj81|BvbA16;=7JpHE3;@AJ@XNCw9(dRb z7CFfyKlh{1pSyR>JFQtBaGXK*#d?{OZ~^~$Fir}CfEf$RR}oWe6tBsf6(UpP2yxYZ z6gAni;%OMOM8+B|s)?v!r)lQo0=|S<5BA};pIY=ATR)f|8C$e1m{^0`!u^iw;EMw0 z=A|y~M+1A~cJaAB4#RKAi9{Zw(t{@btgpjl_av_+_auEL`TZ7>C4~`{ep>CHHS@jK(K8tY_W<_~*aN10@yTR*|;(>vI z`t{m+0ekLj%k#RH={TM-?<&Cs{^S)0M)g!GvU)BYsyZ21;(052;(Mb*AFO*Lp?6qD zJTNu+8MP-r9(Y+ajuFcBTVSfG%%%ZV^*zfZ3H}4HhS}|k0%${i{E2yW3n%3-%uN0! zh574k_kf`^D1h0@LmdR3G_;-X$hnMnxC^jJf9Z!EGaMc<2Zm(+wVvg#9&&P;c{UMz zz?1-2^jR_YZCD9NlX;&u9BhJldud&`9-e(yS`BVL1vM|2ELkGnPfO%08$3>|a3tV8 zNyRAgO)u#~=gYv~GS81V>6~Wr=o#ef;C!(>W5or_THu8%$01}aPBzOrPd7yt3v_3v}`>2PPilEGt&DB>2@Fh+;H>$Y4X;|vRaX7})i ziF0A-tuQBUhMaZ}BKmmPny~rVnd8Hfk3GI0Sd*Fz!#3K+R7jH`ei8VJjF1Fp&;nLM zOqM6r2A{{`h*Jp0<-?6SVFl^n$}pqTyk@B_29Ts~c0H6-GZ!4=^q=A|U&rk0a^c58 zbkWvTqnYvI3`$XUT$Y4!WH!3g*vU4amzt3{>L|`Wu18H;OWc@WpqyvK!=P8sh*J^> zP<`b0t29GTWW?XdbeYg@apBBp*Q!ugGIW_Y(Gk>W;Sa1}dA?H;i`&7I2juc2sIMPz z#yJr40vo!CCgcF%V+2@WLr*X^m(ftC0NkY5uWxf0xN{OyH4k3ENb&AoAYpFY|jmYunNYhEFLm zSYA!s#M(nJ46o=Kv9y|{?M*j^P&ynurPB9YFNxy@m5@=Ts8e0tAtkq->GM-^i+Aju zY)q9yN=h;e9}}2|23>!n%wz}`pq4~0U4b1cO@8L543}i)?T>B$yqOwQTn~y34>dX5 zdu4ZKKNe{!)WAw+mhjmz4he@jz{`(S>O7=n5>x@xhc002+JU&|rNMKnyXHz-uIUZS zwxv)i4y6_!c`m4(_+kE0uRq%%VZ1$c3dHJ@LJ}=C&zX1U_3!+Q?;E?m*_e8>yD#^( z=rkmZT2waR)iv$Dj`@UjerRMOX{SMmO0TZ>dnIJ+>u_f5~U zvChu3$+on1_*jYKvO-EzV_rCLBUM*ay>CLsJFxt>D9yDb$#MdmoV;>4%zMh6+$7ys zZ|eqMq;Su12L{`V9f((jRO*ow*?;TZ!uMQ?saION6U&Z=z{KLstuotdD)jPfI{9GV zpRZB%YXHM9rCK`3%&m_M-^8~WR+sf`Q3f!Vdl=PC+I3F{z$*x%R0?Z`rrpTTnvXKx zZHN?_l`p^@L);+RwEljFwT!!pOSWs}N1_|lRuA--9E}6m%du@#1V$M?MH$J=>-P3l zM_LZa?kxz zO8%yOe`P0&#U&QUzAAY?D+{>&q0VR-A;W#=a?M3AbMB%izH$;$r=jkcd{NTsVP}#_ z+|J`3A-p?%i(S0PnD#iIzQ}A@xfqqmBaAjnZn<%NN%L;LW`t8g5q(?(V2d8gshAV@ zna1(+!W0{n0I!5?p!!WtCYM5d66r$x8+g|K;TY~r=9M5mgI4T6XETCxAfar{a5VFV zjW!pPARVYdzFNqpAi`!6o{rhCF=DT4b*lNZaCu)`uZL#rauaj_O^USi35ug`$7(8&hiF5iZzMOyE zf-HBV6{D+F8H}Gn-_=H=u(N&(+Hg8Tj|^Y*!^j%qEiYX8%Td?`({;7rCYKow3j4fR z?LM39ry@)d-$v`_CsnRzV&Oa_b^Bn??(?0^VOGpJf8v%dfZhEu^x)pEv)rJu#$(Qq zvMQ--{*Md03F7LznAXy6h3SXhoR%&H>4fy!kG7UZR#L+;wFm(XqbD=bIw@{f)fryP zrF={)>)&6GID5af$D2#btqiNUX7@>p`E`U&fU6&l*?zjoN+&eOj6is#ZR>IDwQNJ| zlTRjAm?&GrR?^!edimTNo5kCwUYQsXj0EYnIaoHhUkYrCEPgeJ5U2jRKFx@iovEpR)J3QT{=Ozx7Elp-Bi-AOq+pM zq9rUemA?iCEIV0gn100V`CzSoAwTQ)L6$-DcjF|iekG5`?92QZkI9mOr{i?&;Pot% zpZNr#>SRpTKfVj({Md8$3lCu~30%J>~$KH|r`NC2C3IsUhciy{PuYp5?ey16)yjqyp=z z5v~p;evdo(nKeH0tf8ltKaj)NoyyS-{XVh8lk7WwT{|+BMof%`As#hH|N0d$LUvkC4G98a&lyon!Xi%YxI|l4K$4X_7Kmlirw{% z^Z2h6V6S>V<+61ag7b;E*`Ro1GD2=x(meNWS&m*gv){nhSCk17sz4Grluiwc0O_%*H z>g*jb@?yQD*#rMa+q(M&<@A*R&P8TXWv?vx0!2|-aAiUnx#uE*tp447RUj^}lRAmK z7SbU2d69_DZ$tkOnJuE)TYNNUOLUhxsY9y~IE;E;PDk;f^QU50AJN%&cPWIe9+AKm z>B96@Q6i5n9<3Q6_mHkJVNw#zk}xDGF5Kd4s}b~M2-W*O(43Es-_L)NYEb_B`){*? zrx+S6t(a*VCDoX_*$M_90UDsVxbim^Pswe0a3k~+c90I9%sceP45;MHcPH+wNPS%H zxUc%9P7U|O-zawzht4ZZjk5-7^_>LcEHsc`^lvh8c{AUSwms&1iv51aUC{B$7<+Jx zrGwBR3y-6=XRK5ZL+RNuZ%qEr%~Fw@3a9s7CKM6eG5y(!x{}|s2XDNq`Dip>1`&Pj zW5^q`(UA=8U|`})*i)uh3K9EV<^9TpIEsqY1kIKgXdX8`vCiw)^59F=)Qs-`(Vk?~ z>U@NEbMJlE3;nK037*Xp{F_$v=amE1HM%d2pkX+|Obe{_Ptwr_7R{jAIlBq`6BjUe zr^y{_%Xgx&qI4+BqOgz9$yrpwG<@|+nP%Ik>g*vIyx`ux&^TAHLX@tJXsxf*J8O+l zEuZt7@=<1@`LGgR%T&vyT6lb8LhphocpYk&w?`_d=|k~;*7urKApcb0JH?!A9DGJC z=QMY{f0igLydosnwnF+ggr}GH-rqi(%HM2iKlSF1`V@Ie0a9{!NObjkpl|#gZE-$Q zK*hc?;G>U2aHYh!uTsRG=Jkc=q^~No>P9dBGJR2B}mnE{>f)K&-Q>@qZZk@4Os-y!}9X!0gh2ud1L*#c7N}f=!311$G&{M zw@$It2xHg@!&%BwvJd1wFv!a3AaIqbaQm;<-5|r1@W{9yh0lWJweVT~k-%=%E+kn} z7w^VSfa_05I8#9$4#u9+awzK;;tcXE8@blW1c}|4CvZwYwvM6(l! zWhX#h#!c@@p^2MDS6JehEy1FWHjzgqAhLQ>HfR|e{81TXN7mDiTShZDI)s{kk0$;` zedSCb{(9)Wu>QAW_SBX)T-2PBdR>^cSXUFDA!#nr-3l;6I+)fQ6K=3`Rse!xP)8zkw;s%-rNOtd<1>RCvY`zL zzo^jpR3p3IO{CYZ)KdxRycAK~@~}i3rUG5#2Zmwsnc{_*;5UijT|w0Yo!Bi+@r08> z5V9fo7y(BwM&h!w0vxGUJ;d-U3f5;2(C=rv=hBI&+i3i8@vf zBExzzAi=N75Te$GsEvlG)V3x^ei?{yq%%95d2yiI)kcNB-aRH|1qi=HuQ!j@>SG#f zOh7ayWH%&?`89bI0_wg1CBQM#i%~AJU%?4Di-Q(NSf*f1TMSIM$UGtt5ChXQ_BTCN zj&?NvGOidsGCmo#s!|QdJQBxia=`OPaCACS+=o-dy2Xe6v(|j99L4C~_GjxWgrycN z5d<Ids5so?hQTP9@rMl#sIgj;8luFFzJ49M!wqA?Kc~+s@)>)M zmvsFa@wG=n3&Q4r_*JV?Bsd*NauPWb03DGA!nHetIA!_`BEi|f2m~JUajdI9tlkRs z(+YJUfYz=!>EF$2BQcI3vhY{hWTI_Rjr`}E^3N4?OSZ|AM5YsG_!R5p9a_6u^vMdr zNeFVMce9`5;%;+X&L*`_hiO&5jihJ|=gVCwNPe}Q`Q57E=GD*6KX=IDI~z;s`PM<7 z6I7!=+LFNbdlD!LLpKbtLIUk4hJJ`aKaKpvD~mfvGSC-;+En}?iD{pJxvF@L*k2Z8 z&e~JRBaTvg>0?;A5r9j~9Bo3PxM|}gMJT~Y4cf@`nqr8jAy%3v%L&Cil|mO}CId-~ zc9Nt(BR(sv>s8C+_sifHGf{yge!iLze)|gBZ)6iCd~-p|#z+I|_|aK2VzcP=Dv*Im zlK3|#a0L%7psuGs)0{R4?&x(Ak?peNbm@>>VN&d2HE7f*$_b|TKv22_uA>T8enZ9& zXI5Gd3kp_Sg}YXMJ9n9F4}VRrVJfbeV91x$mJYr^5tV z8Z;VPmKC2>LPk9^htFSIMP+W+fwejsD9zpF{$uH`?W*H=Z_CKO-)yHviv0|8Y0QlP zTw-D5_bIoRpu2h=xK9^R>t|bt&S@i-)`TTWI3YEorvrgp&l@dAnlai-v3f*Fd;NL2 zR_ie`9uwg1%9v?vpbJ-f{2c6x6$pl8kx$%Cn!J-B?p8mRN0^tjpj%iwn{SL%R4kVr z+r<`AcAC4o-1xWRM;TFfRcbbZx^>(~cH^()Red>#t0X&&I16?skMG{xh|~&}zr!=X z`**zk&*YuTgNPT-$K}cM6`q>AmZe!`S?={T&sPydUg`ai=XQ?X`e(XL^ey@~CUw4r z<1aOWMHYOG!KagA)_Tp_6)6y9Yt_enU)iH!OmctjC{vSWe_QoVeI|A19I9F_3F+j| z_ly>4f63zoZEpTMzQL5pe9=D>xtG}BFdv6L$rgbfp^buE&&l!ZlhEbK{}qbxK0Nu2 z*kaFtDGB6WKI#uUmbE_Wzq20;#M4%TePe$OG4|9vgO_(Cq`moF<~Mkv%0V(kUt}RI z<+{2LS#4ddFZkwcE8?nJ%1~P(^l>}ytF@T=U_eS(+2~(&^{(tMN?)QZt4nx zb?YQ5sa7tI9)F?yc$Sj6OY&4Kv(3 zv~yqW)-SJ*Y%s3%a68)upY$qmCmVYn!_OKJh^O_-)h-K$t0am^>2XUb<(X`ZP)X>2 zrLRqrMfdm95nd+(-q_t)gvnQZmAl)D0Wy!Z{f$U z64vt9xUg-pVPT%u&%DK>`Qc7xg08nq(ZEqi+kzv<7_o1u&^-%lVdAW8r`loo~7T@4cse9`D zi8wsrXMi&_8f8vH{kCUc73$IP5|7HMdF0--g9%$Ge=kjyCN{4gXxw?dQZ$a;F_j+T z(P=7^0RzE1QHf7`_&0UH9{gIv==AWi^v5H^CS@#=+Rdf+zge8EGjxnf&SPH5b6vz# zgf}hgM8>H#iH3ucm}Pcx93M92!&46hWwfOG?w!3m+Wg^cM}5Dq?(#hl7pogV)^8CM zr2!$YQxhm!q|}&%N3%Ttuh%kmYpo;g>KYrm+J{O!#WkcYAq8TmyF!h9S?HD2?#Yug z0-bcA_2&kKNVx2y&g60BqRU;&7HCRm&FGq8J6%^EW5=+0q}|tB#F1M(QwpJILb@@194oL zZZ!ebW*FPe7u{D>_&V_eL%OtN*!DKlwAiYHn1Lmj5nD-HQ?al(p|`{dxkw;kLOK!^ z*aCtw`N>U;p$UqU8J=CmFCAJ$!vdtyt+1tUb$EFJT)ph2g6Oz3< z0#x{OnOE-tgiHWiZ0IanlRaQn4p77hI3td1diyppcJxbh4en@$968~aCV6tEPq9lc zkaKTo#Ys7cVsE3Gf>;WexN;yWBA4G40v%X-L`h%cC@!+(h~lnb!wwWt-&q1}Nkd<~ z70Tq!O?*Z;h^>SKI?)o|VGs7kAa`IWB=Ez>Xkk5}7wSS{$|4JNSVv`j`->|7zsqde zRVIPJ#{}o!)1)M-TS(R4D07)mY7!+eArp)VIyjijtuRYkH7qs@906_^s;-+czvax7 zN>{V+)amjq)SmgmnC-a+OGyMICaOxG~P+&?54 zg0*cz3ypLPFX}!}A&*0KM#ZL;1?~z)GOsem(#2$F;+L^2O^nk|bNmm{6r;gsn8udK zli*ap>X823SzQUZH@4aTi?E9^u`(&s1u69SMj0jrTmF));Ik$HW(O1hgO^GP4HWTK zg%Fp7py^A~>;2pD4rP-Fgrsm$oS$Sbx1ru-kiK~M%??BVzOMfj>K`Q)8pj)G zn($0&wsIpdTne1_I~H4;rG9DY<9E1nsk6oa`FEk}`G8 z$X3jy>#&D78o$Hec)F>8KjhFHz=j&BL+SQVuI;5L9_lqZ*GC~9G6#12ROGBwG112+ z{+WeLvNGNiYsy!7xEngLPuj60%H1_-yua0iMDVCNU|DRP(rS@*ZyWA8@WS(d9ja&T zk1?ljHmYsPLK>v!Uoe57+~9yY-&X18A&FJcy` zLwCGl6<~S_ z;sI?Av~M+#-uNmiLF?kqs~kPzy9aC*rRZ;|iASBb?%UDpv+1l;LlHlV8VG^??Ts;#)tE*I>$ zr|XY0HL-X6bXijG?Dj94njvDM+jT-_uNt!}PK*|Zub%DIx*%VX)GmHH$`otwIE1K8 zUn=TA9kq}+~$(wg(wjnL;b;I2*At{{h);)agA+^bVT!`Q0ZIe!} z)>n@ehf>BV*71FNm|?2F0;dC9KI?2u9?@50&hIH05WD@1s`B29@YyVu9C#HH`7)=6 zgGOZs^0`H`FxJaKK~X?+G%l_Sq$D7dN-(vD-}8cfJz{S_IZ9%Jz!UO=J{M;u zC^Z*{Kd6b5#N#JLU<>>D-ub3UP(u$zFG`y{Xk#?y`aCi;Cx?XK4=h6vmG!o#>JM@^ z)MQ;!Zt{k1`@Al#XzWnI+L}w@h1ZYLd zTZH2p17@($&qO|U)B|`3EQ5}EQQ{wZ7O-F z?o>f71gur04wM5?uRH5Vi?}EQ5p3)Ilmi=9K}HrR&H5FdNjT;WmEy+p4}#Ho&rPi{ zITK@_<;b3gPU|FX(kM5~bN1>Lr&U`EMz<)V^vHf`$1YQpdX*`Jm1~BDJ}=1KR}br! zIF$an@ogpir|-s_su%uzo^PdQ=tj&<*bcQ8{hD1{-RW9jkUHlPgxOEN`8On<^v^l` zF5Q)KrYG9>T1g2ox%1&=W4ZGbde1n5KGe1)ltJcuTjJUp@&{acF3d#?^_WnUi}_Z> zKmW!#a(bjc{VMvv8PS{&$f0$58u*>wa8V1bYq2}I2z_OJC$evLuC+t8EO@}caOy(W zaBCvCRMn;UiIT(yOX~nx#T}}y^W9*VyJ*ZKMYTuK$eNWUSwq3yT($RzRvI3?vd3M` z93aWH)PXGQ)N%~rtA!0QmC>268t7s1puI?9t)LxCwDA(oNwV?$Htm^|(T?BQOWS8c zsFS2zUNJe@_5LQol+XBfC=7@fo2B55N0|w|CwJl@1L8F_fij$q`o9@dbgP&2VxDqG zjc9CUlE322qvanW*TrY8NHyf4oXFf@%^I-$X4*&jb4=gV2>+x4l7_)=waoP%QbY8_#a>3J zf?PDHwf*wyz1IKyY^M4!Cx#HP$XY$TsIVoe5`@qeONVWIv-o0vdGxZ%f3W#%x;am! zckYofS$j!#iYmyG-`h#0_q((^-gY~7m&!{cWFJa+0xmL*)(<*Nf+{2G$A}&h zj7|>>_BzWO3%4JBL%g)JnFSjO_!(0Wcp^0>8S$wdoCFmEr zn@;Tbr2(rpls6cl@x@h<-?BcATT19ip(bX=58dq(riCHSid1I>@naRS!_wez@V}C} zW=Ik+Ke!x>>l|rIgtChP&~w5b=K*_kz*r`SLnOZ}CYThs&2D;#|KlCnEfvTO>wA4{ zbLM|bs`;F{&_@-Hx2qw>1F%fgxjM=-b}$)bSPtM#2S&KZ5+tWCU?$~lUTcxA@IlAe zO;tocxnnDduEGgl5DFn!pge4F7mRudCWUO zfqws}DF;l>0xMj_)Hb#|S!e}QD*azbUFqlYp2wuo5*j1C&O;Kl0P=ZZa>6mQ_?KW% zJyn^B(q9)eah+(f2JCH@KtHkSMJP-RwNHm8ZXMm*h5gusJ+>6>%zy97|H+90NWcc4 z7tdM1miPRZO#fV>pqJ>Hyd-)J2_20I2S>n5sT(^+wgwvD0(pI??6@h3yd_D$1<57- z<_$KQ@e3H!IzWC6@IriGJQ>wb&k9Nh)MWxk^I3c-7&b8F5t!`xHVY1DmFYlEiNOHz z!838CCw|Zzb)a(+z%>i;jUVJiKU{^EPz)w79NVBB7VnPgbx-YO%<`lG z@{_yW`NO*zi&lvv5X46T&^2jHI1k>{D)G$%@qPn!?%l~4f9 z@hTREztX4&TDx|%*a`NW$4!4Xa$-%l8;AIW40yy2e+bze3E3QAqJ_|$t`aIi7XgV%E!} z=@dtjXe*qky?TC3R}V28mJK9llE!=&a@HW+q%(M#K)c|$<^fgZXy?R7zjfVQ9^uL_0kv~F zC7KP`j=!y-ZUYZ)l)UqyZ8}ZU+32&4(hw1OnH7Z9;T=ISf+4ZOc$>vU;YPOFEE=Kf zDJgI>=A!o1_Pym;cw5*3qe1Y;s=~_MV}$MvdAp#^-T#O`N%6YmK#0gmsSkqA$}D84 zt6DabNvvqjHh}ri*s-y?_w}@gX7J2u+B*`48{>$Ndx*g2z8M8$kO#I-2kDWHtJr;* zclhC{!B#^n&hnaB*`I=8|Hsb{E1`dXWTynXi(T!!u$DXDDffiMthNcKdcK~KDBaK3 zz0l&i<)93sNbJK?widZ$H~3%aEj(hh4c~C9_7tC&pbuVN9+jY9A$qo_9+Da+Ig;%Y z99Pm;u>Di=KS_(UmDyz&8D=^7=eN3E+p0sRF~yb&20M9`(0_1xb!EnETV-jda>rrk zlNNotnY5HvzFE1(oWth^Mk~=i6$uW}yR^kWMA!y{C{LL=yY8PaiPh%t+k$P)OSR@t zr)1{}Ymb-M?Iav>>{tga{k4wmhI4l^yy{gaIG2Zb_rLlxnvHO*No1L)S?d3^uUo1y z6h&|^ys9k_3-GO2G()oj2d?F4lUvPxRFeD;LCQ5F<}}Vijo0{jEdy49wktIf(r@)Y z2@YMPxg2Q-_fc+Z2%8MI9A>;nr+Tu`9<-`L_Rf*|tH5U*s$0c=-iYb~1sA=rRii)* zaka;Uh7f9f#&qq^D2kqY7x{XBVWccHlNPiBf@xPM{toKBf^aZ&zFwbwNjd1SWERSg9 zDH*KpzrHqoC*qa52kPd0VSRo5earj2WnK@?p+Zx~%^)+toe|ENf5J_$3+B-yd*Ek_ zif-@up9|{%0tIH5c7lITH|3gObrt{6{sf$++3II_vKGG-vx`?`Xh5qx^zT@#E<}|S z#PogqxPW19$N}FR%PHe&MyF+$853B1D#VW-Dp<7;M08)mUhI>$2-LSeP$SlR3(m z`kgOPgZVQZBP@DFwsb%#MSd{*cH@&JA4OA@=Y5}c`c1_O4!^@1d*|5HfzZ>YMMatX zntOes>A|YZ<7OjoCNEy8*E)H2N$8&UdcIi+e^HvzbZiU!&y>8J}jg^k)|r-r?j7jT`mM07hbGIV6LGN`g;IMQ=y1Gxa*x>8sj zau|wgvG9LDYu)&CSixTb%J}16P#m<5x8}rN51otRJ zTI6@tb$3s$u)?~cSYKwbuD#a%A)GFGQ}^Y5v&%^MA+rHX>(EO*zwNK7h z+WJX+u)EJP$}(#oE*96;6#_z#(V$PPpyhCwX)Zx{_&5G!_W5!9Ip~(|Men09ZU;d+ z!(QTs{HY%IO=NF6oKmDlSqZt%NUw4o#*iF9Gl{Mi;xaPXit;?CtpNJwl~|k7~C!E!~wM_@${ucqy$a_OnUlNZQN{RRBb>^5<&gI@~`>$@-iPF)z5|_AJ6)wcvn zJ$n3>*%nGizilub=5=2(LkfOLHTv8j6_lUX=LP>}YU@7~uUUiB$% zj28-XViuL($LLV;-hFkvC$wSJ2ISX*K_hKjiQL*vrAI<5U zn9FnD^7hpz%6sD5|6w=cMu{ht_3OxQBeXUz=^Y;4$;>>T8iL$4T7Qi^$cH{0l^wXg zX**e6D@m~Y@!jMrYX^2Ar{;UO#&V~A>sHB`sMW{ZAtB%v(8OHIy4;gC*Nd(4I8xE1 z(HSe-WO1cY&V_N;8jCK5w$0~mn2!x|4y1TDvln|TD){F$JhNFmd|+XV@tfTa8LyyW zaS;5OyLSFs&S4eEREwW;5^A9{=apfk;@hW~bK#VEKP z_OMTX$LAKvK&nA!kP09tfS&JBYxcwJnEdcSv`3G>j$LjL-6)Gr^pJhV#8a zJEZ5X%c=&FJ2S#}_>-ndUxQDrT8Yy|5*w&sgbblEORPStd79L`eYJs70i=CGCk(47 z$y#KF@6nz1(;-5r@2ld_hL%S4EK(tF&`hal#jiz<^rfmT_voED*3+eo&fc;(&FXx* zC$W0v{NMPr-R-rArSOY;UuMQ1T_6xHrFd->A*i?s-GIp6YCv$zi=w+bz(MQ9TV|rS zXFS3kK>6-^IfQwG&6=@zir$=yh2&aeKeh&+_o?mGi`!g@~roKR= zOYeqhpD~$(`4pmxTD8{wESUHAc*yK?Dl?Gu9ZwpE!f(hOK2PM1 z!qJ?UTF{ob_?|ldeUpw3&qIJu)}0|udZpHkXlL!v$a3IgLj{}1&mD&r>=iWXHP#sM zZl1`!z_EJS$NVSiPhEDR!rCQTYi;U`2kwFaXCY$knGC)SMM{jaWAW0BG+&J^>c}~b z#22^BIp<`^9>JyElftWK606S}i0^ONb}K1#U|R%7(WxlHamRT zqn@yz`0By@ zH`I12Z^GL+2k|nSHKTE@*SUw|zW7(+UKkk4aG4y0}NGjFyn z17CD`A75?W=yCi&wv|;cWDMBsX>)z%Y5-mPE+h&}J*1g2GJwhsB^Vnt`WQf2HgS+} zxQ&4NOM0!rgv=6XT8RwmI0myP{5y;O01p^RZjbUBPB#9IyxNJ&@Ir+EYL3pHVV_Co^J`8Jo@tz8z%%Z6J!oCr zL)3+P1kXMFK@T(3lWF+f-C6&j6mLBa#GVBiZy(}X-MGL_H{Cf~+y#|*JP3I$nC>uk zEk`0c#he2Xuy(-Mu5`O?(uSRX`-Jn{EXJ@n=Z73;gt;L2vrM%6RL>Q2E*Tz|=U=*I zp9RQ%Xa2Ts(1}0Izai&8y1d`y!{eN8Q&IASs09R&iS9v|Ta7w~W%Ury`5f z&U~1r`7shNI6~}D;Fe0>86gF$e1=?sNdlTz0Nk~)F;%hi(vPayU~jK2%UZQWm$JR7 zPW&iUiHY~b5ci~T{xz<{X|+ioeQtKq)2$aMSDK$)MBGC$^UN+I!hP9&Z>gp5+1+)wN& zAfK8cf+~nu2&w#Sa$N-XyJYB&a4TgMFHN%p5|3txoLO9lFYSv?kSjYW1`Nm0&KRL{w9LVRKTdi={7S;BBHWR<6A69{m}X5w7&?i~WWiSKs>pF$+DQG;yqoCqp` zUxWkO3DkWZblt4+;dt)#Cqatu{Kk)Fy2J`N1=;$!a+FsMUdp$PeMtT zZa~vlzn|E#-x+~jeuOCH-g;WaQmN7&3t6so&YeR;X(_2gW2vK!Gn9e5=$UBghQWEy zbdN&xlPCSN(2s^uL3YP>9u?K+dQNsrL5JxJ52+6~`9m&yk7Ng$JoNRi{4&4vC`@r-;`p55 z!}_M@h8w>hzT>^naNY{msf$P;ExzJ6#V|-z)wT^F;|MdZ3NkV=Z=(4e|K+PwrL9vU zluO#(`ovYcB7LL}DhnI$2f}^Zkz}=|370X=PKOXu{&~PkznE3P6 zhPm3ZwW}drpSc<29)t(t4n|r22S;wW%CxxrTMY$!E}NU(jq~Csx5N>V6L(^2j(VJp zDW?U^?0K%xWuROqs%OrI6eDvoeSR89PdWr8Wt`VU1meDHpJCFR|of4FzAUgq2&LA-UEm}mQS(;d*5${Zw$YQ4U=Pkptz^< zn)Fjq^YSXEEgZns>Q1km?ZB3K&Q@L$C!QRX;y@uOr0qCrZsfJ-Hh*tnm!_)U{Pm_6j&deE|AIOZ zcmrVF!S6pd|LS{c&>nbS)+{oS{NqShP#GcH96k2 zbVx{A6d{-XP!s`SaGLNfF(Oy7wO7%+lfq&CqChd2!3h!{CfoRbD__cY-u@SIkg9zT zMRfFYvJpiTRDc;)x=B@kQ!vbSka!yuF{C#AvgTieh$3tfi?)sWASmL0EQr072nhav z+y940ulxTBUglp0LKs#KMR1W}4DGg5y=d}cpD0351}SbNT*{<6LPYRHwY1O#M5sJQ z^?n&94Fy)djUD02A$Fjt_N!z6U}8;Ce^b-cBDxorf?7R308(gc87l%O*imjc# z3fIs=bHF}J-d$sBAHa}MK3fZvHhZy3N)~pFl{D`<>5k{S&3%czye*xao!HCRdV6I{ z#@P^gOZqNMf}*9djU=uuNW5t`F=m-T3(w$o1ULRw!q&c8nJm5|TtjKkM?}*pzyHso z$YZ4*eUYeQ)`t8?&6Q|O7O|t20p=Gk2*L^G5mP-77N4deM&zemJWgIoL{15xxC$t- zCfh(1A!09F%drH-EdlaC5?9^fm(HX8<)`WHHsfae>l*pR40x8&M&y+_mar6^EVg!M z-{gTM5?IY|k=A@SzS%&=5ls`|M}IS{8&2;qPwA^#Z2MP=CA3Gh0B$HARl&a0Mg;sl zOr$y2@+$4SP#yT)$Y}MR4 zfP&*shBaIEMP>?r;OL_t?Ix@J)jeSUMfTH5WYYddp{_`w#rn5ij6f`quE_hUNdoy$ z=NV_0*h3>SCyUPFRR;|kXP)>nmr5=zl>O!V`t71DL}%AZbMQzf4)#W^*QPRx=>7&$ zOCgEbI4^2#EYkM8D2YIN19<(ox?S_^87Aq;X}g?!OUHaTGDoR`#Ke3sX`30ub#2Qp zY{7}7DcG8jIUX--@k@t~h&6BPwMk_mea(B24I!N*k?vTWLKvW;eyBP~kM;k;gw?sU zuZx1C80p=EiE3$Gu>XfG%P;u?)HMLm{%)l-)g;ABr>eWtP`bXlUx(qc`YJ>Y^LWSMASH3PjWD?EZ!b>N)rlwj65WjG_X^KU~w> zw}DUk(9OV)Cj&Hr%2Xvg z`2{gKq+$tidgV5|^C#GSA)0!lz4iOH%N2pRIo90kc3{V|bk-KU_olJqSuv~f4elDL zkd1+R>a(anK_4aO_&WI5!g>c`Ej}kDUx$HvNg{0|(J3&*#>v+4><^{q?i1^UItq&a E0W3NW(EtDd diff --git a/test/snapshots/seam-blueprint.test.ts.md b/test/snapshots/seam-blueprint.test.ts.md index 5fd409a..147148c 100644 --- a/test/snapshots/seam-blueprint.test.ts.md +++ b/test/snapshots/seam-blueprint.test.ts.md @@ -1207,6 +1207,129 @@ Generated by [AVA](https://avajs.dev). ], resourceType: 'acs_user', }, + event: { + description: '', + properties: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'acs_credential_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'acs_system_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'acs_user_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'action_attempt_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'client_session_id', + }, + { + deprecationMessage: '', + description: '', + format: 'datetime', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'created_at', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'device_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'enrollment_automation_id', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'event_description', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'event_id', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'event_type', + }, + { + deprecationMessage: '', + description: '', + format: 'datetime', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'occurred_at', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isUndocumented: false, + jsonType: 'string', + name: 'workspace_id', + }, + ], + resourceType: 'event', + }, }, routes: [ { @@ -3566,6 +3689,385 @@ Generated by [AVA](https://avajs.dev). path: '/acs/users/unmanaged', subroutes: [], }, + { + endpoints: [ + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'get', + path: '/events/get', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'device_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'event_id', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'event_type', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + { + codeSamples: [], + deprecationMessage: '', + description: '', + isDeprecated: false, + isUndocumented: false, + name: 'list', + path: '/events/list', + request: { + methods: [ + 'POST', + ], + parameters: [ + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'access_code_id', + }, + { + deprecationMessage: '', + description: '', + format: 'list', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'array', + name: 'access_code_ids', + }, + { + deprecationMessage: '', + description: '', + format: 'list', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'array', + name: 'between', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'connect_webview_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'connected_account_id', + }, + { + deprecationMessage: '', + description: '', + format: 'id', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'device_id', + }, + { + deprecationMessage: '', + description: '', + format: 'list', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'array', + name: 'device_ids', + }, + { + deprecationMessage: '', + description: '', + format: 'enum', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'event_type', + values: [ + { + name: 'device.accessory_keypad_connected', + }, + { + name: 'device.accessory_keypad_disconnected', + }, + { + name: 'device.connected', + }, + { + name: 'device.unmanaged.connected', + }, + { + name: 'device.disconnected', + }, + { + name: 'device.unmanaged.disconnected', + }, + { + name: 'device.converted_to_unmanaged', + }, + { + name: 'device.unmanaged.converted_to_managed', + }, + { + name: 'device.removed', + }, + { + name: 'device.deleted', + }, + { + name: 'device.tampered', + }, + { + name: 'device.low_battery', + }, + { + name: 'device.battery_status_changed', + }, + { + name: 'device.third_party_integration_detected', + }, + { + name: 'device.third_party_integration_no_longer_detected', + }, + { + name: 'device.salto.privacy_mode_activated', + }, + { + name: 'device.salto.privacy_mode_deactivated', + }, + { + name: 'device.connection_became_flaky', + }, + { + name: 'device.connection_stabilized', + }, + { + name: 'device.error.subscription_required', + }, + { + name: 'device.error.subscription_required.resolved', + }, + { + name: 'access_code.created', + }, + { + name: 'access_code.changed', + }, + { + name: 'access_code.scheduled_on_device', + }, + { + name: 'access_code.set_on_device', + }, + { + name: 'access_code.deleted', + }, + { + name: 'access_code.removed_from_device', + }, + { + name: 'access_code.failed_to_set_on_device', + }, + { + name: 'access_code.delay_in_setting_on_device', + }, + { + name: 'access_code.failed_to_remove_from_device', + }, + { + name: 'access_code.delay_in_removing_from_device', + }, + { + name: 'access_code.deleted_external_to_seam', + }, + { + name: 'access_code.modified_external_to_seam', + }, + { + name: 'access_code.unmanaged.converted_to_managed', + }, + { + name: 'access_code.unmanaged.failed_to_convert_to_managed', + }, + { + name: 'access_code.unmanaged.created', + }, + { + name: 'access_code.unmanaged.removed', + }, + { + name: 'lock.locked', + }, + { + name: 'lock.unlocked', + }, + { + name: 'lock.access_denied', + }, + { + name: 'phone.deactivated', + }, + { + name: 'connected_account.connected', + }, + { + name: 'connected_account.successful_login', + }, + { + name: 'connected_account.created', + }, + { + name: 'connected_account.deleted', + }, + { + name: 'connected_account.disconnected', + }, + { + name: 'connected_account.completed_first_sync', + }, + { + name: 'connected_account.completed_first_sync_after_reconnection', + }, + { + name: 'connect_webview.login_succeeded', + }, + { + name: 'connect_webview.login_failed', + }, + { + name: 'noise_sensor.noise_threshold_triggered', + }, + { + name: 'access_code.backup_access_code_pulled', + }, + { + name: 'acs_system.connected', + }, + { + name: 'acs_user.deleted', + }, + { + name: 'acs_credential.deleted', + }, + { + name: 'enrollment_automation.deleted', + }, + { + name: 'client_session.deleted', + }, + { + name: 'action_attempt.lock_door.succeeded', + }, + { + name: 'action_attempt.lock_door.failed', + }, + { + name: 'action_attempt.unlock_door.succeeded', + }, + { + name: 'action_attempt.unlock_door.failed', + }, + ], + }, + { + deprecationMessage: '', + description: '', + format: 'list', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'array', + name: 'event_types', + }, + { + deprecationMessage: '', + description: '', + format: 'number', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'number', + name: 'limit', + }, + { + deprecationMessage: '', + description: '', + format: 'string', + isDeprecated: false, + isRequired: false, + isUndocumented: false, + jsonType: 'string', + name: 'since', + }, + ], + preferredMethod: 'POST', + semanticMethod: 'POST', + }, + response: { + description: 'OK', + responseType: 'void', + }, + title: '', + }, + ], + name: 'events', + namespace: null, + path: '/events', + subroutes: [], + }, ], title: 'Seam Connect', } diff --git a/test/snapshots/seam-blueprint.test.ts.snap b/test/snapshots/seam-blueprint.test.ts.snap index bd223fc0521b899aec33e8301a6fbf7c2826058b..a1234074c702af062d88894e93541e18ac1c141b 100644 GIT binary patch literal 24515 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 u|GJeop4X6qzca&@{ Date: Wed, 11 Sep 2024 13:26:29 +0000 Subject: [PATCH 8/9] 0.19.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index a77e0b6..7e00980 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@seamapi/blueprint", - "version": "0.18.0", + "version": "0.19.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@seamapi/blueprint", - "version": "0.18.0", + "version": "0.19.0", "license": "MIT", "dependencies": { "change-case": "^5.4.4", diff --git a/package.json b/package.json index c947c08..03cb4f1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@seamapi/blueprint", - "version": "0.18.0", + "version": "0.19.0", "description": "Build tools for the Seam API using this blueprint.", "type": "module", "main": "index.js", From 7913ed6dca2a0d7f022b6b4077625168225d8f81 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 15 Sep 2024 18:15:06 -0700 Subject: [PATCH 9/9] test(deps-dev): bump @seamapi/types from 1.240.0 to 1.242.0 in the seam group (#85) * test(deps-dev): bump @seamapi/types in the seam group Bumps the seam group with 1 update: [@seamapi/types](https://github.com/seamapi/types). Updates `@seamapi/types` from 1.240.0 to 1.242.0 - [Release notes](https://github.com/seamapi/types/releases) - [Changelog](https://github.com/seamapi/types/blob/main/.releaserc.json) - [Commits](https://github.com/seamapi/types/compare/v1.240.0...v1.242.0) --- updated-dependencies: - dependency-name: "@seamapi/types" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: seam ... Signed-off-by: dependabot[bot] * ci: Generate code --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Seam Bot --- package-lock.json | 9 ++++----- package.json | 2 +- test/snapshots/seam-blueprint.test.ts.md | 9 +++++++++ test/snapshots/seam-blueprint.test.ts.snap | Bin 24515 -> 24580 bytes 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7e00980..d7fe33d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "zod": "^3.23.8" }, "devDependencies": { - "@seamapi/types": "1.240.0", + "@seamapi/types": "1.242.0", "@types/node": "^20.8.10", "ava": "^6.0.1", "c8": "^10.1.2", @@ -1052,11 +1052,10 @@ ] }, "node_modules/@seamapi/types": { - "version": "1.240.0", - "resolved": "https://registry.npmjs.org/@seamapi/types/-/types-1.240.0.tgz", - "integrity": "sha512-Yebt0M/92SgmNEjQrvPvc2NchdYqubcqUtTdYaTpoqGC3vpp76U0Q9D61aFtxKxAZ7Davc/H+EXhjkr64Im6RQ==", + "version": "1.242.0", + "resolved": "https://registry.npmjs.org/@seamapi/types/-/types-1.242.0.tgz", + "integrity": "sha512-s3r5T9ttfEgdhKgY4RgsA2FOc25q4hxYet82WqKfB7TsGDwrl1V5LUKf9xQOHbWQuTfigitZOOzqUbg1PaiNbA==", "dev": true, - "license": "MIT", "engines": { "node": ">=18.12.0", "npm": ">= 9.0.0" diff --git a/package.json b/package.json index 03cb4f1..92e7ad3 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "zod": "^3.23.8" }, "devDependencies": { - "@seamapi/types": "1.240.0", + "@seamapi/types": "1.242.0", "@types/node": "^20.8.10", "ava": "^6.0.1", "c8": "^10.1.2", diff --git a/test/snapshots/seam-blueprint.test.ts.md b/test/snapshots/seam-blueprint.test.ts.md index 147148c..e7b7737 100644 --- a/test/snapshots/seam-blueprint.test.ts.md +++ b/test/snapshots/seam-blueprint.test.ts.md @@ -1052,6 +1052,15 @@ Generated by [AVA](https://avajs.dev). jsonType: 'string', name: 'email_address', }, + { + deprecationMessage: '', + description: '', + format: 'list', + isDeprecated: false, + isUndocumented: false, + jsonType: 'array', + name: 'errors', + }, { deprecationMessage: '', description: '', diff --git a/test/snapshots/seam-blueprint.test.ts.snap b/test/snapshots/seam-blueprint.test.ts.snap index a1234074c702af062d88894e93541e18ac1c141b..67b456271577c8f2e781b8125c1e1c6fb841417d 100644 GIT binary patch literal 24580 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 literal 24515 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 avCWoqPX#pn