diff --git a/src/lib/blueprint.ts b/src/lib/blueprint.ts index 629a2fa..e8e4878 100644 --- a/src/lib/blueprint.ts +++ b/src/lib/blueprint.ts @@ -285,7 +285,8 @@ 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 +300,37 @@ const createRoutes = async ( return Array.from(routeMap.values()) } +const getNamespace = (path: string, paths: OpenapiPaths): string | null => { + const namespace: string[] = [] + + const pathParts = path.split('/').filter((path) => Boolean(path)) + + const pathKeys = Object.keys(paths) + // console.log('keys: ', pathKeys) + + for (const [index, part] of pathParts.entries()) { + if (namespace.length !== index) { + continue + } + + const children = pathKeys.filter((key) => + new RegExp(`^/${[...namespace, part].join('/')}/\\w+$`).test(key), + ) + + if (children.length === 0) { + namespace.push(part) + } + } + + if (namespace.length > 0) { + return `/${namespace.join('/')}` + } + + return null +} + const createRoute = async ( + namespace: string | null, path: string, pathItem: OpenapiPathItem, context: Context, @@ -314,7 +345,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/snapshots/seam-blueprint.test.ts.md b/test/snapshots/seam-blueprint.test.ts.md index 5fd409a..944c948 100644 --- a/test/snapshots/seam-blueprint.test.ts.md +++ b/test/snapshots/seam-blueprint.test.ts.md @@ -113,15 +113,6 @@ 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: '', @@ -268,9 +259,6 @@ Generated by [AVA](https://avajs.dev). { name: 'visionline_card', }, - { - name: 'salto_ks_credential', - }, ], }, { @@ -291,15 +279,6 @@ 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: '', @@ -362,15 +341,6 @@ Generated by [AVA](https://avajs.dev). }, ], }, - { - deprecationMessage: '', - description: '', - format: 'string', - isDeprecated: false, - isUndocumented: false, - jsonType: 'string', - name: 'card_id', - }, { deprecationMessage: '', description: '', @@ -380,15 +350,6 @@ 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: '', @@ -398,15 +359,6 @@ 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: '', @@ -947,10 +899,10 @@ Generated by [AVA](https://avajs.dev). }, { deprecationMessage: '', - description: 'Warnings associated with the `acs_system`.', + description: '', format: 'list', isDeprecated: false, - isUndocumented: false, + isUndocumented: true, jsonType: 'array', name: 'warnings', }, @@ -1114,15 +1066,6 @@ 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: '', @@ -1373,39 +1316,6 @@ Generated by [AVA](https://avajs.dev). }, 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: '', @@ -1490,92 +1400,6 @@ 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: [ { @@ -2313,71 +2137,6 @@ 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: [ { @@ -3450,122 +3209,6 @@ 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 bd223fc..e8d3073 100644 Binary files a/test/snapshots/seam-blueprint.test.ts.snap and b/test/snapshots/seam-blueprint.test.ts.snap differ