@backstage-community/plugin-3scale-backend 3.0.4 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  ## @janus-idp/backstage-plugin-3scale-backend [1.8.0](https://github.com/janus-idp/backstage-plugins/compare/@janus-idp/backstage-plugin-3scale-backend@1.7.1...@janus-idp/backstage-plugin-3scale-backend@1.8.0) (2024-07-25)
2
2
 
3
+ ## 3.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - da1a744: Backstage version bump to v1.34.2
8
+
3
9
  ## 3.0.4
4
10
 
5
11
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"ThreeScaleAPIConnector.cjs.js","sources":["../../src/clients/ThreeScaleAPIConnector.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport type { APIDocs, Proxy, Services } from './types';\n\n/**\n * @internal\n */\nexport function listServices(\n baseUrl: string,\n access_token: string,\n page: number,\n size: number,\n): Promise<Services> {\n return fetch(\n `${baseUrl}/admin/api/services.json?access_token=${access_token}&page=${page}&size=${size}`,\n ).then(response => {\n if (!response.ok) {\n throw new Error(response.statusText);\n }\n return response.json() as Promise<Services>;\n });\n}\n\n/**\n * @internal\n */\nexport function listApiDocs(\n baseUrl: string,\n access_token: string,\n): Promise<APIDocs> {\n return fetch(\n `${baseUrl}/admin/api/active_docs.json?access_token=${access_token}`,\n ).then(response => {\n if (!response.ok) {\n throw new Error(response.statusText);\n }\n return response.json() as Promise<APIDocs>;\n });\n}\n\n/**\n * @internal\n */\nexport function getProxyConfig(\n baseUrl: string,\n access_token: string,\n service_id: number,\n): Promise<Proxy> {\n return fetch(\n `${baseUrl}/admin/api/services/${service_id}/proxy.json?access_token=${access_token}`,\n ).then(response => {\n if (!response.ok) {\n throw new Error(response.statusText);\n }\n return response.json() as Promise<Proxy>;\n });\n}\n"],"names":[],"mappings":";;AAoBO,SAAS,YACd,CAAA,OAAA,EACA,YACA,EAAA,IAAA,EACA,IACmB,EAAA;AACnB,EAAO,OAAA,KAAA;AAAA,IACL,GAAG,OAAO,CAAA,sCAAA,EAAyC,YAAY,CAAS,MAAA,EAAA,IAAI,SAAS,IAAI,CAAA,CAAA;AAAA,GAC3F,CAAE,KAAK,CAAY,QAAA,KAAA;AACjB,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAM,MAAA,IAAI,KAAM,CAAA,QAAA,CAAS,UAAU,CAAA,CAAA;AAAA,KACrC;AACA,IAAA,OAAO,SAAS,IAAK,EAAA,CAAA;AAAA,GACtB,CAAA,CAAA;AACH,CAAA;AAKgB,SAAA,WAAA,CACd,SACA,YACkB,EAAA;AAClB,EAAO,OAAA,KAAA;AAAA,IACL,CAAA,EAAG,OAAO,CAAA,yCAAA,EAA4C,YAAY,CAAA,CAAA;AAAA,GACpE,CAAE,KAAK,CAAY,QAAA,KAAA;AACjB,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAM,MAAA,IAAI,KAAM,CAAA,QAAA,CAAS,UAAU,CAAA,CAAA;AAAA,KACrC;AACA,IAAA,OAAO,SAAS,IAAK,EAAA,CAAA;AAAA,GACtB,CAAA,CAAA;AACH,CAAA;AAKgB,SAAA,cAAA,CACd,OACA,EAAA,YAAA,EACA,UACgB,EAAA;AAChB,EAAO,OAAA,KAAA;AAAA,IACL,CAAG,EAAA,OAAO,CAAuB,oBAAA,EAAA,UAAU,4BAA4B,YAAY,CAAA,CAAA;AAAA,GACrF,CAAE,KAAK,CAAY,QAAA,KAAA;AACjB,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAM,MAAA,IAAI,KAAM,CAAA,QAAA,CAAS,UAAU,CAAA,CAAA;AAAA,KACrC;AACA,IAAA,OAAO,SAAS,IAAK,EAAA,CAAA;AAAA,GACtB,CAAA,CAAA;AACH;;;;;;"}
1
+ {"version":3,"file":"ThreeScaleAPIConnector.cjs.js","sources":["../../src/clients/ThreeScaleAPIConnector.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport type { APIDocs, Proxy, Services } from './types';\n\n/**\n * @internal\n */\nexport function listServices(\n baseUrl: string,\n access_token: string,\n page: number,\n size: number,\n): Promise<Services> {\n return fetch(\n `${baseUrl}/admin/api/services.json?access_token=${access_token}&page=${page}&size=${size}`,\n ).then(response => {\n if (!response.ok) {\n throw new Error(response.statusText);\n }\n return response.json() as Promise<Services>;\n });\n}\n\n/**\n * @internal\n */\nexport function listApiDocs(\n baseUrl: string,\n access_token: string,\n): Promise<APIDocs> {\n return fetch(\n `${baseUrl}/admin/api/active_docs.json?access_token=${access_token}`,\n ).then(response => {\n if (!response.ok) {\n throw new Error(response.statusText);\n }\n return response.json() as Promise<APIDocs>;\n });\n}\n\n/**\n * @internal\n */\nexport function getProxyConfig(\n baseUrl: string,\n access_token: string,\n service_id: number,\n): Promise<Proxy> {\n return fetch(\n `${baseUrl}/admin/api/services/${service_id}/proxy.json?access_token=${access_token}`,\n ).then(response => {\n if (!response.ok) {\n throw new Error(response.statusText);\n }\n return response.json() as Promise<Proxy>;\n });\n}\n"],"names":[],"mappings":";;AAoBO,SAAS,YACd,CAAA,OAAA,EACA,YACA,EAAA,IAAA,EACA,IACmB,EAAA;AACnB,EAAO,OAAA,KAAA;AAAA,IACL,GAAG,OAAO,CAAA,sCAAA,EAAyC,YAAY,CAAS,MAAA,EAAA,IAAI,SAAS,IAAI,CAAA;AAAA,GAC3F,CAAE,KAAK,CAAY,QAAA,KAAA;AACjB,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAM,MAAA,IAAI,KAAM,CAAA,QAAA,CAAS,UAAU,CAAA;AAAA;AAErC,IAAA,OAAO,SAAS,IAAK,EAAA;AAAA,GACtB,CAAA;AACH;AAKgB,SAAA,WAAA,CACd,SACA,YACkB,EAAA;AAClB,EAAO,OAAA,KAAA;AAAA,IACL,CAAA,EAAG,OAAO,CAAA,yCAAA,EAA4C,YAAY,CAAA;AAAA,GACpE,CAAE,KAAK,CAAY,QAAA,KAAA;AACjB,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAM,MAAA,IAAI,KAAM,CAAA,QAAA,CAAS,UAAU,CAAA;AAAA;AAErC,IAAA,OAAO,SAAS,IAAK,EAAA;AAAA,GACtB,CAAA;AACH;AAKgB,SAAA,cAAA,CACd,OACA,EAAA,YAAA,EACA,UACgB,EAAA;AAChB,EAAO,OAAA,KAAA;AAAA,IACL,CAAG,EAAA,OAAO,CAAuB,oBAAA,EAAA,UAAU,4BAA4B,YAAY,CAAA;AAAA,GACrF,CAAE,KAAK,CAAY,QAAA,KAAA;AACjB,IAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,MAAM,MAAA,IAAI,KAAM,CAAA,QAAA,CAAS,UAAU,CAAA;AAAA;AAErC,IAAA,OAAO,SAAS,IAAK,EAAA;AAAA,GACtB,CAAA;AACH;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"module.cjs.js","sources":["../src/module.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createBackendModule,\n} from '@backstage/backend-plugin-api';\nimport { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';\n\nimport { ThreeScaleApiEntityProvider } from './providers';\n\n/**\n * @public\n */\nexport const catalogModule3ScaleEntityProvider = createBackendModule({\n moduleId: 'catalog-backend-module-3scale',\n pluginId: 'catalog',\n register(env) {\n env.registerInit({\n deps: {\n catalog: catalogProcessingExtensionPoint,\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n scheduler: coreServices.scheduler,\n },\n async init({ catalog, config, logger, scheduler }) {\n catalog.addEntityProvider(\n ThreeScaleApiEntityProvider.fromConfig(\n { config, logger },\n {\n scheduler: scheduler,\n schedule: scheduler.createScheduledTaskRunner({\n frequency: { minutes: 30 },\n timeout: { minutes: 3 },\n }),\n },\n ),\n );\n },\n });\n },\n});\n"],"names":["createBackendModule","catalogProcessingExtensionPoint","coreServices","ThreeScaleApiEntityProvider"],"mappings":";;;;;;AA2BO,MAAM,oCAAoCA,oCAAoB,CAAA;AAAA,EACnE,QAAU,EAAA,+BAAA;AAAA,EACV,QAAU,EAAA,SAAA;AAAA,EACV,SAAS,GAAK,EAAA;AACZ,IAAA,GAAA,CAAI,YAAa,CAAA;AAAA,MACf,IAAM,EAAA;AAAA,QACJ,OAAS,EAAAC,qCAAA;AAAA,QACT,QAAQC,6BAAa,CAAA,UAAA;AAAA,QACrB,QAAQA,6BAAa,CAAA,MAAA;AAAA,QACrB,WAAWA,6BAAa,CAAA,SAAA;AAAA,OAC1B;AAAA,MACA,MAAM,IAAK,CAAA,EAAE,SAAS,MAAQ,EAAA,MAAA,EAAQ,WAAa,EAAA;AACjD,QAAQ,OAAA,CAAA,iBAAA;AAAA,UACNC,uDAA4B,CAAA,UAAA;AAAA,YAC1B,EAAE,QAAQ,MAAO,EAAA;AAAA,YACjB;AAAA,cACE,SAAA;AAAA,cACA,QAAA,EAAU,UAAU,yBAA0B,CAAA;AAAA,gBAC5C,SAAA,EAAW,EAAE,OAAA,EAAS,EAAG,EAAA;AAAA,gBACzB,OAAA,EAAS,EAAE,OAAA,EAAS,CAAE,EAAA;AAAA,eACvB,CAAA;AAAA,aACH;AAAA,WACF;AAAA,SACF,CAAA;AAAA,OACF;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AACF,CAAC;;;;"}
1
+ {"version":3,"file":"module.cjs.js","sources":["../src/module.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createBackendModule,\n} from '@backstage/backend-plugin-api';\nimport { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha';\n\nimport { ThreeScaleApiEntityProvider } from './providers';\n\n/**\n * @public\n */\nexport const catalogModule3ScaleEntityProvider = createBackendModule({\n moduleId: 'catalog-backend-module-3scale',\n pluginId: 'catalog',\n register(env) {\n env.registerInit({\n deps: {\n catalog: catalogProcessingExtensionPoint,\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n scheduler: coreServices.scheduler,\n },\n async init({ catalog, config, logger, scheduler }) {\n catalog.addEntityProvider(\n ThreeScaleApiEntityProvider.fromConfig(\n { config, logger },\n {\n scheduler: scheduler,\n schedule: scheduler.createScheduledTaskRunner({\n frequency: { minutes: 30 },\n timeout: { minutes: 3 },\n }),\n },\n ),\n );\n },\n });\n },\n});\n"],"names":["createBackendModule","catalogProcessingExtensionPoint","coreServices","ThreeScaleApiEntityProvider"],"mappings":";;;;;;AA2BO,MAAM,oCAAoCA,oCAAoB,CAAA;AAAA,EACnE,QAAU,EAAA,+BAAA;AAAA,EACV,QAAU,EAAA,SAAA;AAAA,EACV,SAAS,GAAK,EAAA;AACZ,IAAA,GAAA,CAAI,YAAa,CAAA;AAAA,MACf,IAAM,EAAA;AAAA,QACJ,OAAS,EAAAC,qCAAA;AAAA,QACT,QAAQC,6BAAa,CAAA,UAAA;AAAA,QACrB,QAAQA,6BAAa,CAAA,MAAA;AAAA,QACrB,WAAWA,6BAAa,CAAA;AAAA,OAC1B;AAAA,MACA,MAAM,IAAK,CAAA,EAAE,SAAS,MAAQ,EAAA,MAAA,EAAQ,WAAa,EAAA;AACjD,QAAQ,OAAA,CAAA,iBAAA;AAAA,UACNC,uDAA4B,CAAA,UAAA;AAAA,YAC1B,EAAE,QAAQ,MAAO,EAAA;AAAA,YACjB;AAAA,cACE,SAAA;AAAA,cACA,QAAA,EAAU,UAAU,yBAA0B,CAAA;AAAA,gBAC5C,SAAA,EAAW,EAAE,OAAA,EAAS,EAAG,EAAA;AAAA,gBACzB,OAAA,EAAS,EAAE,OAAA,EAAS,CAAE;AAAA,eACvB;AAAA;AACH;AACF,SACF;AAAA;AACF,KACD,CAAA;AAAA;AAEL,CAAC;;;;"}
@@ -219,7 +219,7 @@ function getDocInfo(spec) {
219
219
  if (openApiMergerConverter.isSwagger2_0(spec) || openApiMergerConverter.isOpenAPI3_0(spec)) {
220
220
  return spec.info;
221
221
  }
222
- return void 0;
222
+ return undefined;
223
223
  }
224
224
 
225
225
  exports.ThreeScaleApiEntityProvider = ThreeScaleApiEntityProvider;
@@ -1 +1 @@
1
- {"version":3,"file":"ThreeScaleApiEntityProvider.cjs.js","sources":["../../src/providers/ThreeScaleApiEntityProvider.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n SchedulerServiceTaskRunner,\n SchedulerService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport {\n ANNOTATION_LOCATION,\n ANNOTATION_ORIGIN_LOCATION,\n ApiEntity,\n Entity,\n} from '@backstage/catalog-model';\n\nimport type { Config } from '@backstage/config';\nimport { InputError, isError, NotFoundError } from '@backstage/errors';\n\nimport {\n EntityProvider,\n EntityProviderConnection,\n} from '@backstage/plugin-catalog-node';\n\nimport {\n getProxyConfig,\n listApiDocs,\n listServices,\n} from '../clients/ThreeScaleAPIConnector';\nimport type {\n APIDocElement,\n APIDocs,\n Proxy,\n ServiceElement,\n Services,\n} from '../clients/types';\nimport { readThreeScaleApiEntityConfigs } from './config';\nimport { isNonEmptyArray, NonEmptyArray, ThreeScaleConfig } from './types';\nimport {\n isOpenAPI3_0,\n isSwagger1_2,\n isSwagger2_0,\n OpenAPIMergerAndConverter,\n} from './open-api-merger-converter';\nimport { Swagger } from 'atlassian-openapi';\n\n/**\n * @public\n */\nexport class ThreeScaleApiEntityProvider implements EntityProvider {\n private static SERVICES_FETCH_SIZE: number = 500;\n private readonly env: string;\n private readonly baseUrl: string;\n private readonly accessToken: string;\n private readonly logger: LoggerService;\n private readonly scheduleFn: () => Promise<void>;\n private readonly openApiMerger: OpenAPIMergerAndConverter;\n private connection?: EntityProviderConnection;\n\n static fromConfig(\n deps: {\n config: Config;\n logger: LoggerService;\n },\n\n options: {\n schedule: SchedulerServiceTaskRunner;\n scheduler: SchedulerService;\n },\n ): ThreeScaleApiEntityProvider[] {\n const providerConfigs = readThreeScaleApiEntityConfigs(deps.config);\n\n if (!options.schedule && !options.scheduler) {\n throw new Error('Either schedule or scheduler must be provided.');\n }\n\n return providerConfigs.map(providerConfig => {\n if (!options.schedule && !providerConfig.schedule) {\n throw new InputError(\n `No schedule provided via config for ThreeScaleApiEntityProvider:${providerConfig.id}.`,\n );\n }\n\n let taskRunner;\n\n if (options.scheduler && providerConfig.schedule) {\n // Create a scheduled task runner using the provided scheduler and schedule configuration\n taskRunner = options.scheduler.createScheduledTaskRunner(\n providerConfig.schedule,\n );\n } else if (options.schedule) {\n // Use the provided schedule directly\n taskRunner = options.schedule;\n } else {\n // Handle the case where both options.schedule and options.scheduler are missing\n throw new Error('Neither schedule nor scheduler is provided.');\n }\n\n return new ThreeScaleApiEntityProvider(\n providerConfig,\n deps.logger,\n taskRunner,\n );\n });\n }\n\n private constructor(\n config: ThreeScaleConfig,\n logger: LoggerService,\n taskRunner: SchedulerServiceTaskRunner,\n ) {\n this.env = config.id;\n this.baseUrl = config.baseUrl;\n this.accessToken = config.accessToken;\n this.logger = logger.child({\n target: this.getProviderName(),\n });\n\n this.scheduleFn = this.createScheduleFn(taskRunner);\n this.openApiMerger = new OpenAPIMergerAndConverter();\n }\n\n private createScheduleFn(\n taskRunner: SchedulerServiceTaskRunner,\n ): () => Promise<void> {\n return async () => {\n const taskId = `${this.getProviderName()}:run`;\n return taskRunner.run({\n id: taskId,\n fn: async () => {\n try {\n await this.run();\n } catch (error: any) {\n if (isError(error)) {\n // Ensure that we don't log any sensitive internal data:\n this.logger.error(\n `Error while syncing 3scale API from ${this.baseUrl}`,\n {\n // Default Error properties:\n name: error.name,\n message: error.message,\n stack: error.stack,\n // Additional status code if available:\n status: (error.response as { status?: string })?.status,\n },\n );\n }\n }\n },\n });\n };\n }\n\n getProviderName(): string {\n return `ThreeScaleApiEntityProvider:${this.env}`;\n }\n\n async connect(connection: EntityProviderConnection): Promise<void> {\n this.connection = connection;\n await this.scheduleFn();\n }\n\n async run(): Promise<void> {\n if (!this.connection) {\n throw new NotFoundError('Not initialized');\n }\n\n this.logger.info(`Discovering ApiEntities from 3scale ${this.baseUrl}`);\n\n const entities: Entity[] = [];\n\n let page: number = 0;\n let services: Services;\n let apiDocs: APIDocs;\n let fetchServices: boolean = true;\n while (fetchServices) {\n services = await listServices(\n this.baseUrl,\n this.accessToken,\n page,\n ThreeScaleApiEntityProvider.SERVICES_FETCH_SIZE,\n );\n apiDocs = await listApiDocs(this.baseUrl, this.accessToken);\n for (const element of services.services) {\n const service = element;\n this.logger.debug(`Find service ${service.service.name}`);\n\n const docs = apiDocs.api_docs.filter(\n obj => obj.api_doc.service_id === service.service.id,\n );\n const proxy = await getProxyConfig(\n this.baseUrl,\n this.accessToken,\n service.service.id,\n );\n if (isNonEmptyArray(docs)) {\n this.logger.info(JSON.stringify(docs));\n const apiEntity: ApiEntity = await this.buildApiEntityFromService(\n service,\n docs,\n proxy,\n );\n entities.push(apiEntity);\n this.logger.debug(`Discovered ApiEntity ${service.service.name}`);\n }\n }\n\n if (\n services.services.length <\n ThreeScaleApiEntityProvider.SERVICES_FETCH_SIZE\n ) {\n fetchServices = false;\n }\n page++;\n }\n\n this.logger.info(`Applying the mutation with ${entities.length} entities`);\n\n await this.connection.applyMutation({\n type: 'full',\n entities: entities.map(entity => ({\n entity,\n locationKey: this.getProviderName(),\n })),\n });\n }\n\n private async buildApiEntityFromService(\n service: ServiceElement,\n apiDocs: NonEmptyArray<APIDocElement>,\n proxy: Proxy,\n ): Promise<ApiEntity> {\n const location = `url:${this.baseUrl}/apiconfig/services/${service.service.id}`;\n const serviceDescription = service.service.description || '';\n let entityDescription: string | undefined;\n\n const docs = apiDocs.map(doc => JSON.parse(doc.api_doc.body));\n\n let swaggerDocJSON;\n if (docs.length > 1) {\n // convert all docs to openapi 3.0 and merge them\n let mergedDescription = `[Merged ${docs.length} API docs]`;\n let mergedTitle = mergedDescription;\n const convertedDocs: Swagger.SwaggerV3[] = [];\n for (const doc of docs) {\n const convertedDoc = await this.openApiMerger.convertAPIDocToOpenAPI3(\n doc,\n );\n convertedDocs.push(convertedDoc);\n mergedDescription = getDocInfo(convertedDoc)?.description\n ? `${mergedDescription} ${getDocInfo(convertedDoc)?.description}`\n : mergedDescription;\n mergedTitle = getDocInfo(convertedDoc)?.title\n ? `${mergedTitle} ${getDocInfo(convertedDoc)?.title}`\n : mergedTitle;\n }\n if (isNonEmptyArray(convertedDocs)) {\n swaggerDocJSON = await this.openApiMerger.mergeOpenAPI3Docs(\n convertedDocs,\n );\n swaggerDocJSON.info.description = mergedDescription;\n swaggerDocJSON.info.title = mergedTitle;\n entityDescription = mergedDescription;\n }\n }\n\n if (docs.length === 1) {\n swaggerDocJSON = docs[0];\n\n const spec = JSON.parse(apiDocs[0].api_doc.body);\n if (isSwagger1_2(spec)) {\n // Backstage UI can render only openapi 3.0 or swagger 2.0. That's why we need to convert swagger 1.2 to swagger 2.0.\n swaggerDocJSON = await this.openApiMerger.convertSwagger1_2To2_0(spec);\n }\n entityDescription = getDocInfo(spec)?.description;\n }\n\n return {\n kind: 'API',\n apiVersion: 'backstage.io/v1alpha1',\n metadata: {\n annotations: {\n [ANNOTATION_LOCATION]: location,\n [ANNOTATION_ORIGIN_LOCATION]: location,\n },\n // TODO: add tenant name\n name: `${service.service.system_name}`,\n description: entityDescription || serviceDescription,\n // TODO: add labels\n // labels: this.getApiEntityLabels(service),\n links: [\n {\n url: `${this.baseUrl}/apiconfig/services/${service.service.id}`,\n title: '3scale Overview',\n },\n {\n url: `${proxy.proxy.sandbox_endpoint}`,\n title: 'Staging Apicast Endpoint',\n },\n {\n url: `${proxy.proxy.endpoint}`,\n title: 'Production Apicast Endpoint',\n },\n ],\n },\n spec: {\n type: 'openapi',\n lifecycle: this.env,\n system: '3scale',\n owner: '3scale',\n definition: JSON.stringify(swaggerDocJSON, null, 2),\n },\n };\n }\n}\n\nfunction getDocInfo(\n spec: any,\n): { description: string; title: string } | undefined {\n if (isSwagger2_0(spec) || isOpenAPI3_0(spec)) {\n return spec.info;\n }\n\n // swagger 1.2 spec doc defined by single file doesn't have description field\n return undefined;\n}\n"],"names":["readThreeScaleApiEntityConfigs","InputError","OpenAPIMergerAndConverter","isError","NotFoundError","listServices","listApiDocs","getProxyConfig","isNonEmptyArray","isSwagger1_2","ANNOTATION_LOCATION","ANNOTATION_ORIGIN_LOCATION","isSwagger2_0","isOpenAPI3_0"],"mappings":"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"}
1
+ {"version":3,"file":"ThreeScaleApiEntityProvider.cjs.js","sources":["../../src/providers/ThreeScaleApiEntityProvider.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n SchedulerServiceTaskRunner,\n SchedulerService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport {\n ANNOTATION_LOCATION,\n ANNOTATION_ORIGIN_LOCATION,\n ApiEntity,\n Entity,\n} from '@backstage/catalog-model';\n\nimport type { Config } from '@backstage/config';\nimport { InputError, isError, NotFoundError } from '@backstage/errors';\n\nimport {\n EntityProvider,\n EntityProviderConnection,\n} from '@backstage/plugin-catalog-node';\n\nimport {\n getProxyConfig,\n listApiDocs,\n listServices,\n} from '../clients/ThreeScaleAPIConnector';\nimport type {\n APIDocElement,\n APIDocs,\n Proxy,\n ServiceElement,\n Services,\n} from '../clients/types';\nimport { readThreeScaleApiEntityConfigs } from './config';\nimport { isNonEmptyArray, NonEmptyArray, ThreeScaleConfig } from './types';\nimport {\n isOpenAPI3_0,\n isSwagger1_2,\n isSwagger2_0,\n OpenAPIMergerAndConverter,\n} from './open-api-merger-converter';\nimport { Swagger } from 'atlassian-openapi';\n\n/**\n * @public\n */\nexport class ThreeScaleApiEntityProvider implements EntityProvider {\n private static SERVICES_FETCH_SIZE: number = 500;\n private readonly env: string;\n private readonly baseUrl: string;\n private readonly accessToken: string;\n private readonly logger: LoggerService;\n private readonly scheduleFn: () => Promise<void>;\n private readonly openApiMerger: OpenAPIMergerAndConverter;\n private connection?: EntityProviderConnection;\n\n static fromConfig(\n deps: {\n config: Config;\n logger: LoggerService;\n },\n\n options: {\n schedule: SchedulerServiceTaskRunner;\n scheduler: SchedulerService;\n },\n ): ThreeScaleApiEntityProvider[] {\n const providerConfigs = readThreeScaleApiEntityConfigs(deps.config);\n\n if (!options.schedule && !options.scheduler) {\n throw new Error('Either schedule or scheduler must be provided.');\n }\n\n return providerConfigs.map(providerConfig => {\n if (!options.schedule && !providerConfig.schedule) {\n throw new InputError(\n `No schedule provided via config for ThreeScaleApiEntityProvider:${providerConfig.id}.`,\n );\n }\n\n let taskRunner;\n\n if (options.scheduler && providerConfig.schedule) {\n // Create a scheduled task runner using the provided scheduler and schedule configuration\n taskRunner = options.scheduler.createScheduledTaskRunner(\n providerConfig.schedule,\n );\n } else if (options.schedule) {\n // Use the provided schedule directly\n taskRunner = options.schedule;\n } else {\n // Handle the case where both options.schedule and options.scheduler are missing\n throw new Error('Neither schedule nor scheduler is provided.');\n }\n\n return new ThreeScaleApiEntityProvider(\n providerConfig,\n deps.logger,\n taskRunner,\n );\n });\n }\n\n private constructor(\n config: ThreeScaleConfig,\n logger: LoggerService,\n taskRunner: SchedulerServiceTaskRunner,\n ) {\n this.env = config.id;\n this.baseUrl = config.baseUrl;\n this.accessToken = config.accessToken;\n this.logger = logger.child({\n target: this.getProviderName(),\n });\n\n this.scheduleFn = this.createScheduleFn(taskRunner);\n this.openApiMerger = new OpenAPIMergerAndConverter();\n }\n\n private createScheduleFn(\n taskRunner: SchedulerServiceTaskRunner,\n ): () => Promise<void> {\n return async () => {\n const taskId = `${this.getProviderName()}:run`;\n return taskRunner.run({\n id: taskId,\n fn: async () => {\n try {\n await this.run();\n } catch (error: any) {\n if (isError(error)) {\n // Ensure that we don't log any sensitive internal data:\n this.logger.error(\n `Error while syncing 3scale API from ${this.baseUrl}`,\n {\n // Default Error properties:\n name: error.name,\n message: error.message,\n stack: error.stack,\n // Additional status code if available:\n status: (error.response as { status?: string })?.status,\n },\n );\n }\n }\n },\n });\n };\n }\n\n getProviderName(): string {\n return `ThreeScaleApiEntityProvider:${this.env}`;\n }\n\n async connect(connection: EntityProviderConnection): Promise<void> {\n this.connection = connection;\n await this.scheduleFn();\n }\n\n async run(): Promise<void> {\n if (!this.connection) {\n throw new NotFoundError('Not initialized');\n }\n\n this.logger.info(`Discovering ApiEntities from 3scale ${this.baseUrl}`);\n\n const entities: Entity[] = [];\n\n let page: number = 0;\n let services: Services;\n let apiDocs: APIDocs;\n let fetchServices: boolean = true;\n while (fetchServices) {\n services = await listServices(\n this.baseUrl,\n this.accessToken,\n page,\n ThreeScaleApiEntityProvider.SERVICES_FETCH_SIZE,\n );\n apiDocs = await listApiDocs(this.baseUrl, this.accessToken);\n for (const element of services.services) {\n const service = element;\n this.logger.debug(`Find service ${service.service.name}`);\n\n const docs = apiDocs.api_docs.filter(\n obj => obj.api_doc.service_id === service.service.id,\n );\n const proxy = await getProxyConfig(\n this.baseUrl,\n this.accessToken,\n service.service.id,\n );\n if (isNonEmptyArray(docs)) {\n this.logger.info(JSON.stringify(docs));\n const apiEntity: ApiEntity = await this.buildApiEntityFromService(\n service,\n docs,\n proxy,\n );\n entities.push(apiEntity);\n this.logger.debug(`Discovered ApiEntity ${service.service.name}`);\n }\n }\n\n if (\n services.services.length <\n ThreeScaleApiEntityProvider.SERVICES_FETCH_SIZE\n ) {\n fetchServices = false;\n }\n page++;\n }\n\n this.logger.info(`Applying the mutation with ${entities.length} entities`);\n\n await this.connection.applyMutation({\n type: 'full',\n entities: entities.map(entity => ({\n entity,\n locationKey: this.getProviderName(),\n })),\n });\n }\n\n private async buildApiEntityFromService(\n service: ServiceElement,\n apiDocs: NonEmptyArray<APIDocElement>,\n proxy: Proxy,\n ): Promise<ApiEntity> {\n const location = `url:${this.baseUrl}/apiconfig/services/${service.service.id}`;\n const serviceDescription = service.service.description || '';\n let entityDescription: string | undefined;\n\n const docs = apiDocs.map(doc => JSON.parse(doc.api_doc.body));\n\n let swaggerDocJSON;\n if (docs.length > 1) {\n // convert all docs to openapi 3.0 and merge them\n let mergedDescription = `[Merged ${docs.length} API docs]`;\n let mergedTitle = mergedDescription;\n const convertedDocs: Swagger.SwaggerV3[] = [];\n for (const doc of docs) {\n const convertedDoc = await this.openApiMerger.convertAPIDocToOpenAPI3(\n doc,\n );\n convertedDocs.push(convertedDoc);\n mergedDescription = getDocInfo(convertedDoc)?.description\n ? `${mergedDescription} ${getDocInfo(convertedDoc)?.description}`\n : mergedDescription;\n mergedTitle = getDocInfo(convertedDoc)?.title\n ? `${mergedTitle} ${getDocInfo(convertedDoc)?.title}`\n : mergedTitle;\n }\n if (isNonEmptyArray(convertedDocs)) {\n swaggerDocJSON = await this.openApiMerger.mergeOpenAPI3Docs(\n convertedDocs,\n );\n swaggerDocJSON.info.description = mergedDescription;\n swaggerDocJSON.info.title = mergedTitle;\n entityDescription = mergedDescription;\n }\n }\n\n if (docs.length === 1) {\n swaggerDocJSON = docs[0];\n\n const spec = JSON.parse(apiDocs[0].api_doc.body);\n if (isSwagger1_2(spec)) {\n // Backstage UI can render only openapi 3.0 or swagger 2.0. That's why we need to convert swagger 1.2 to swagger 2.0.\n swaggerDocJSON = await this.openApiMerger.convertSwagger1_2To2_0(spec);\n }\n entityDescription = getDocInfo(spec)?.description;\n }\n\n return {\n kind: 'API',\n apiVersion: 'backstage.io/v1alpha1',\n metadata: {\n annotations: {\n [ANNOTATION_LOCATION]: location,\n [ANNOTATION_ORIGIN_LOCATION]: location,\n },\n // TODO: add tenant name\n name: `${service.service.system_name}`,\n description: entityDescription || serviceDescription,\n // TODO: add labels\n // labels: this.getApiEntityLabels(service),\n links: [\n {\n url: `${this.baseUrl}/apiconfig/services/${service.service.id}`,\n title: '3scale Overview',\n },\n {\n url: `${proxy.proxy.sandbox_endpoint}`,\n title: 'Staging Apicast Endpoint',\n },\n {\n url: `${proxy.proxy.endpoint}`,\n title: 'Production Apicast Endpoint',\n },\n ],\n },\n spec: {\n type: 'openapi',\n lifecycle: this.env,\n system: '3scale',\n owner: '3scale',\n definition: JSON.stringify(swaggerDocJSON, null, 2),\n },\n };\n }\n}\n\nfunction getDocInfo(\n spec: any,\n): { description: string; title: string } | undefined {\n if (isSwagger2_0(spec) || isOpenAPI3_0(spec)) {\n return spec.info;\n }\n\n // swagger 1.2 spec doc defined by single file doesn't have description field\n return undefined;\n}\n"],"names":["readThreeScaleApiEntityConfigs","InputError","OpenAPIMergerAndConverter","isError","NotFoundError","listServices","listApiDocs","getProxyConfig","isNonEmptyArray","isSwagger1_2","ANNOTATION_LOCATION","ANNOTATION_ORIGIN_LOCATION","isSwagger2_0","isOpenAPI3_0"],"mappings":"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"}
@@ -21,7 +21,7 @@ function readThreeScaleApiEntityConfig(id, config) {
21
21
  const addLabels = config.getOptionalBoolean("addLabels") || true;
22
22
  const schedule = config.has("schedule") ? backendPluginApi.readSchedulerServiceTaskScheduleDefinitionFromConfig(
23
23
  config.getConfig("schedule")
24
- ) : void 0;
24
+ ) : undefined;
25
25
  return {
26
26
  id,
27
27
  baseUrl,
@@ -1 +1 @@
1
- {"version":3,"file":"config.cjs.js","sources":["../../src/providers/config.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { readSchedulerServiceTaskScheduleDefinitionFromConfig } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\n\nimport { ThreeScaleConfig } from './types';\n\nexport function readThreeScaleApiEntityConfigs(\n config: Config,\n): ThreeScaleConfig[] {\n const providerConfigs = config.getOptionalConfig(\n 'catalog.providers.threeScaleApiEntity',\n );\n if (!providerConfigs) {\n return [];\n }\n return providerConfigs\n .keys()\n .map(id =>\n readThreeScaleApiEntityConfig(id, providerConfigs.getConfig(id)),\n );\n}\n\nfunction readThreeScaleApiEntityConfig(\n id: string,\n config: Config,\n): ThreeScaleConfig {\n const baseUrl = config.getString('baseUrl');\n const accessToken = config.getString('accessToken');\n const systemLabel = config.getOptionalString('systemLabel');\n const ownerLabel = config.getOptionalString('ownerLabel');\n const addLabels = config.getOptionalBoolean('addLabels') || true;\n\n const schedule = config.has('schedule')\n ? readSchedulerServiceTaskScheduleDefinitionFromConfig(\n config.getConfig('schedule'),\n )\n : undefined;\n\n return {\n id,\n baseUrl,\n accessToken,\n systemLabel,\n ownerLabel,\n addLabels,\n schedule,\n };\n}\n"],"names":["readSchedulerServiceTaskScheduleDefinitionFromConfig"],"mappings":";;;;AAoBO,SAAS,+BACd,MACoB,EAAA;AACpB,EAAA,MAAM,kBAAkB,MAAO,CAAA,iBAAA;AAAA,IAC7B,uCAAA;AAAA,GACF,CAAA;AACA,EAAA,IAAI,CAAC,eAAiB,EAAA;AACpB,IAAA,OAAO,EAAC,CAAA;AAAA,GACV;AACA,EAAO,OAAA,eAAA,CACJ,MACA,CAAA,GAAA;AAAA,IAAI,QACH,6BAA8B,CAAA,EAAA,EAAI,eAAgB,CAAA,SAAA,CAAU,EAAE,CAAC,CAAA;AAAA,GACjE,CAAA;AACJ,CAAA;AAEA,SAAS,6BAAA,CACP,IACA,MACkB,EAAA;AAClB,EAAM,MAAA,OAAA,GAAU,MAAO,CAAA,SAAA,CAAU,SAAS,CAAA,CAAA;AAC1C,EAAM,MAAA,WAAA,GAAc,MAAO,CAAA,SAAA,CAAU,aAAa,CAAA,CAAA;AAClD,EAAM,MAAA,WAAA,GAAc,MAAO,CAAA,iBAAA,CAAkB,aAAa,CAAA,CAAA;AAC1D,EAAM,MAAA,UAAA,GAAa,MAAO,CAAA,iBAAA,CAAkB,YAAY,CAAA,CAAA;AACxD,EAAA,MAAM,SAAY,GAAA,MAAA,CAAO,kBAAmB,CAAA,WAAW,CAAK,IAAA,IAAA,CAAA;AAE5D,EAAA,MAAM,QAAW,GAAA,MAAA,CAAO,GAAI,CAAA,UAAU,CAClC,GAAAA,qEAAA;AAAA,IACE,MAAA,CAAO,UAAU,UAAU,CAAA;AAAA,GAE7B,GAAA,KAAA,CAAA,CAAA;AAEJ,EAAO,OAAA;AAAA,IACL,EAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,GACF,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"config.cjs.js","sources":["../../src/providers/config.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { readSchedulerServiceTaskScheduleDefinitionFromConfig } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\n\nimport { ThreeScaleConfig } from './types';\n\nexport function readThreeScaleApiEntityConfigs(\n config: Config,\n): ThreeScaleConfig[] {\n const providerConfigs = config.getOptionalConfig(\n 'catalog.providers.threeScaleApiEntity',\n );\n if (!providerConfigs) {\n return [];\n }\n return providerConfigs\n .keys()\n .map(id =>\n readThreeScaleApiEntityConfig(id, providerConfigs.getConfig(id)),\n );\n}\n\nfunction readThreeScaleApiEntityConfig(\n id: string,\n config: Config,\n): ThreeScaleConfig {\n const baseUrl = config.getString('baseUrl');\n const accessToken = config.getString('accessToken');\n const systemLabel = config.getOptionalString('systemLabel');\n const ownerLabel = config.getOptionalString('ownerLabel');\n const addLabels = config.getOptionalBoolean('addLabels') || true;\n\n const schedule = config.has('schedule')\n ? readSchedulerServiceTaskScheduleDefinitionFromConfig(\n config.getConfig('schedule'),\n )\n : undefined;\n\n return {\n id,\n baseUrl,\n accessToken,\n systemLabel,\n ownerLabel,\n addLabels,\n schedule,\n };\n}\n"],"names":["readSchedulerServiceTaskScheduleDefinitionFromConfig"],"mappings":";;;;AAoBO,SAAS,+BACd,MACoB,EAAA;AACpB,EAAA,MAAM,kBAAkB,MAAO,CAAA,iBAAA;AAAA,IAC7B;AAAA,GACF;AACA,EAAA,IAAI,CAAC,eAAiB,EAAA;AACpB,IAAA,OAAO,EAAC;AAAA;AAEV,EAAO,OAAA,eAAA,CACJ,MACA,CAAA,GAAA;AAAA,IAAI,QACH,6BAA8B,CAAA,EAAA,EAAI,eAAgB,CAAA,SAAA,CAAU,EAAE,CAAC;AAAA,GACjE;AACJ;AAEA,SAAS,6BAAA,CACP,IACA,MACkB,EAAA;AAClB,EAAM,MAAA,OAAA,GAAU,MAAO,CAAA,SAAA,CAAU,SAAS,CAAA;AAC1C,EAAM,MAAA,WAAA,GAAc,MAAO,CAAA,SAAA,CAAU,aAAa,CAAA;AAClD,EAAM,MAAA,WAAA,GAAc,MAAO,CAAA,iBAAA,CAAkB,aAAa,CAAA;AAC1D,EAAM,MAAA,UAAA,GAAa,MAAO,CAAA,iBAAA,CAAkB,YAAY,CAAA;AACxD,EAAA,MAAM,SAAY,GAAA,MAAA,CAAO,kBAAmB,CAAA,WAAW,CAAK,IAAA,IAAA;AAE5D,EAAA,MAAM,QAAW,GAAA,MAAA,CAAO,GAAI,CAAA,UAAU,CAClC,GAAAA,qEAAA;AAAA,IACE,MAAA,CAAO,UAAU,UAAU;AAAA,GAE7B,GAAA,SAAA;AAEJ,EAAO,OAAA;AAAA,IACL,EAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"open-api-merger-converter.cjs.js","sources":["../../src/providers/open-api-merger-converter.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { merge, isErrorResult, MergeInput } from 'openapi-merge';\nimport { Swagger } from 'atlassian-openapi';\nimport Swagger2OpenAPI from 'swagger2openapi';\n// @ts-ignore\nimport SwaggerConverter from 'swagger-converter';\nimport { NonEmptyArray } from './types';\n\nexport function isSwagger1_2(apiDoc: any): boolean {\n return apiDoc.swaggerVersion && apiDoc.swaggerVersion === '1.2';\n}\n\nexport function isSwagger2_0(apiDoc: any): boolean {\n return apiDoc.swagger && apiDoc.swagger === '2.0';\n}\n\nexport function isOpenAPI3_0(apiDoc: any): boolean {\n return apiDoc.openapi;\n}\n\nexport class OpenAPIMergerAndConverter {\n async mergeOpenAPI3Docs(\n docs: NonEmptyArray<Swagger.SwaggerV3>,\n ): Promise<Swagger.SwaggerV3> {\n const mergeInput: MergeInput = docs.map(doc => {\n return { oas: doc };\n });\n\n const result = await merge(mergeInput);\n if (isErrorResult(result)) {\n throw new Error(result.message);\n }\n return result.output;\n }\n\n // Convert api doc to format openAPI 3. Do nothing with doc if it has format openAPI 3.0.\n // 3scale supports API docs in formats:\n // - swagger 1.2\n // - swagger 2.0\n // - openAPI 3.0\n async convertAPIDocToOpenAPI3(apiDoc: any): Promise<Swagger.SwaggerV3> {\n if (isOpenAPI3_0(apiDoc)) {\n return apiDoc;\n }\n if (isSwagger1_2(apiDoc)) {\n // Unfortunately there is no library in the JavaScript world, which can convert both swagger 1.2 and 2.0 to openAPI 3.0.\n // That's why, for swagger 1.2 we are using convertation to swagger 2.0. And then swagger 2.0 will be converted to openAPI 3.0.\n const swagger2_0Doc = await this.convertSwagger1_2To2_0(apiDoc);\n return await this.convertSwagger2_0ToOpenAPI3_0(swagger2_0Doc);\n }\n if (isSwagger2_0(apiDoc)) {\n return await this.convertSwagger2_0ToOpenAPI3_0(apiDoc);\n }\n\n throw new Error(\n `Unsupported API document. Plugin supports Swagger 1.2, 2.0, 3.0(Open API 3.0)`,\n );\n }\n\n async convertSwagger1_2To2_0(swaggerDoc: any): Promise<any> {\n try {\n const result = SwaggerConverter.convert(swaggerDoc, {});\n return result;\n } catch (error) {\n console.error('Error converting Swagger 1.2 to Swagger 2.0:', error);\n throw error;\n }\n }\n\n private async convertSwagger2_0ToOpenAPI3_0(swaggerDoc: any): Promise<any> {\n try {\n const result = await Swagger2OpenAPI.convertObj(swaggerDoc, {\n patch: true, // patch: true helps to fix minor issues\n warnOnly: true, // Do not throw on non-patchable errors\n });\n return result.openapi;\n } catch (error) {\n console.error('Error converting Swagger 2.0 to OpenAPI 3.0:', error);\n throw error;\n }\n }\n}\n"],"names":["merge","isErrorResult","SwaggerConverter","Swagger2OpenAPI"],"mappings":";;;;;;;;;;;AAuBO,SAAS,aAAa,MAAsB,EAAA;AACjD,EAAO,OAAA,MAAA,CAAO,cAAkB,IAAA,MAAA,CAAO,cAAmB,KAAA,KAAA,CAAA;AAC5D,CAAA;AAEO,SAAS,aAAa,MAAsB,EAAA;AACjD,EAAO,OAAA,MAAA,CAAO,OAAW,IAAA,MAAA,CAAO,OAAY,KAAA,KAAA,CAAA;AAC9C,CAAA;AAEO,SAAS,aAAa,MAAsB,EAAA;AACjD,EAAA,OAAO,MAAO,CAAA,OAAA,CAAA;AAChB,CAAA;AAEO,MAAM,yBAA0B,CAAA;AAAA,EACrC,MAAM,kBACJ,IAC4B,EAAA;AAC5B,IAAM,MAAA,UAAA,GAAyB,IAAK,CAAA,GAAA,CAAI,CAAO,GAAA,KAAA;AAC7C,MAAO,OAAA,EAAE,KAAK,GAAI,EAAA,CAAA;AAAA,KACnB,CAAA,CAAA;AAED,IAAM,MAAA,MAAA,GAAS,MAAMA,kBAAA,CAAM,UAAU,CAAA,CAAA;AACrC,IAAI,IAAAC,0BAAA,CAAc,MAAM,CAAG,EAAA;AACzB,MAAM,MAAA,IAAI,KAAM,CAAA,MAAA,CAAO,OAAO,CAAA,CAAA;AAAA,KAChC;AACA,IAAA,OAAO,MAAO,CAAA,MAAA,CAAA;AAAA,GAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,wBAAwB,MAAyC,EAAA;AACrE,IAAI,IAAA,YAAA,CAAa,MAAM,CAAG,EAAA;AACxB,MAAO,OAAA,MAAA,CAAA;AAAA,KACT;AACA,IAAI,IAAA,YAAA,CAAa,MAAM,CAAG,EAAA;AAGxB,MAAA,MAAM,aAAgB,GAAA,MAAM,IAAK,CAAA,sBAAA,CAAuB,MAAM,CAAA,CAAA;AAC9D,MAAO,OAAA,MAAM,IAAK,CAAA,6BAAA,CAA8B,aAAa,CAAA,CAAA;AAAA,KAC/D;AACA,IAAI,IAAA,YAAA,CAAa,MAAM,CAAG,EAAA;AACxB,MAAO,OAAA,MAAM,IAAK,CAAA,6BAAA,CAA8B,MAAM,CAAA,CAAA;AAAA,KACxD;AAEA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,6EAAA,CAAA;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EAEA,MAAM,uBAAuB,UAA+B,EAAA;AAC1D,IAAI,IAAA;AACF,MAAA,MAAM,MAAS,GAAAC,iCAAA,CAAiB,OAAQ,CAAA,UAAA,EAAY,EAAE,CAAA,CAAA;AACtD,MAAO,OAAA,MAAA,CAAA;AAAA,aACA,KAAO,EAAA;AACd,MAAQ,OAAA,CAAA,KAAA,CAAM,gDAAgD,KAAK,CAAA,CAAA;AACnE,MAAM,MAAA,KAAA,CAAA;AAAA,KACR;AAAA,GACF;AAAA,EAEA,MAAc,8BAA8B,UAA+B,EAAA;AACzE,IAAI,IAAA;AACF,MAAA,MAAM,MAAS,GAAA,MAAMC,gCAAgB,CAAA,UAAA,CAAW,UAAY,EAAA;AAAA,QAC1D,KAAO,EAAA,IAAA;AAAA;AAAA,QACP,QAAU,EAAA,IAAA;AAAA;AAAA,OACX,CAAA,CAAA;AACD,MAAA,OAAO,MAAO,CAAA,OAAA,CAAA;AAAA,aACP,KAAO,EAAA;AACd,MAAQ,OAAA,CAAA,KAAA,CAAM,gDAAgD,KAAK,CAAA,CAAA;AACnE,MAAM,MAAA,KAAA,CAAA;AAAA,KACR;AAAA,GACF;AACF;;;;;;;"}
1
+ {"version":3,"file":"open-api-merger-converter.cjs.js","sources":["../../src/providers/open-api-merger-converter.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { merge, isErrorResult, MergeInput } from 'openapi-merge';\nimport { Swagger } from 'atlassian-openapi';\nimport Swagger2OpenAPI from 'swagger2openapi';\n// @ts-ignore\nimport SwaggerConverter from 'swagger-converter';\nimport { NonEmptyArray } from './types';\n\nexport function isSwagger1_2(apiDoc: any): boolean {\n return apiDoc.swaggerVersion && apiDoc.swaggerVersion === '1.2';\n}\n\nexport function isSwagger2_0(apiDoc: any): boolean {\n return apiDoc.swagger && apiDoc.swagger === '2.0';\n}\n\nexport function isOpenAPI3_0(apiDoc: any): boolean {\n return apiDoc.openapi;\n}\n\nexport class OpenAPIMergerAndConverter {\n async mergeOpenAPI3Docs(\n docs: NonEmptyArray<Swagger.SwaggerV3>,\n ): Promise<Swagger.SwaggerV3> {\n const mergeInput: MergeInput = docs.map(doc => {\n return { oas: doc };\n });\n\n const result = await merge(mergeInput);\n if (isErrorResult(result)) {\n throw new Error(result.message);\n }\n return result.output;\n }\n\n // Convert api doc to format openAPI 3. Do nothing with doc if it has format openAPI 3.0.\n // 3scale supports API docs in formats:\n // - swagger 1.2\n // - swagger 2.0\n // - openAPI 3.0\n async convertAPIDocToOpenAPI3(apiDoc: any): Promise<Swagger.SwaggerV3> {\n if (isOpenAPI3_0(apiDoc)) {\n return apiDoc;\n }\n if (isSwagger1_2(apiDoc)) {\n // Unfortunately there is no library in the JavaScript world, which can convert both swagger 1.2 and 2.0 to openAPI 3.0.\n // That's why, for swagger 1.2 we are using convertation to swagger 2.0. And then swagger 2.0 will be converted to openAPI 3.0.\n const swagger2_0Doc = await this.convertSwagger1_2To2_0(apiDoc);\n return await this.convertSwagger2_0ToOpenAPI3_0(swagger2_0Doc);\n }\n if (isSwagger2_0(apiDoc)) {\n return await this.convertSwagger2_0ToOpenAPI3_0(apiDoc);\n }\n\n throw new Error(\n `Unsupported API document. Plugin supports Swagger 1.2, 2.0, 3.0(Open API 3.0)`,\n );\n }\n\n async convertSwagger1_2To2_0(swaggerDoc: any): Promise<any> {\n try {\n const result = SwaggerConverter.convert(swaggerDoc, {});\n return result;\n } catch (error) {\n console.error('Error converting Swagger 1.2 to Swagger 2.0:', error);\n throw error;\n }\n }\n\n private async convertSwagger2_0ToOpenAPI3_0(swaggerDoc: any): Promise<any> {\n try {\n const result = await Swagger2OpenAPI.convertObj(swaggerDoc, {\n patch: true, // patch: true helps to fix minor issues\n warnOnly: true, // Do not throw on non-patchable errors\n });\n return result.openapi;\n } catch (error) {\n console.error('Error converting Swagger 2.0 to OpenAPI 3.0:', error);\n throw error;\n }\n }\n}\n"],"names":["merge","isErrorResult","SwaggerConverter","Swagger2OpenAPI"],"mappings":";;;;;;;;;;;AAuBO,SAAS,aAAa,MAAsB,EAAA;AACjD,EAAO,OAAA,MAAA,CAAO,cAAkB,IAAA,MAAA,CAAO,cAAmB,KAAA,KAAA;AAC5D;AAEO,SAAS,aAAa,MAAsB,EAAA;AACjD,EAAO,OAAA,MAAA,CAAO,OAAW,IAAA,MAAA,CAAO,OAAY,KAAA,KAAA;AAC9C;AAEO,SAAS,aAAa,MAAsB,EAAA;AACjD,EAAA,OAAO,MAAO,CAAA,OAAA;AAChB;AAEO,MAAM,yBAA0B,CAAA;AAAA,EACrC,MAAM,kBACJ,IAC4B,EAAA;AAC5B,IAAM,MAAA,UAAA,GAAyB,IAAK,CAAA,GAAA,CAAI,CAAO,GAAA,KAAA;AAC7C,MAAO,OAAA,EAAE,KAAK,GAAI,EAAA;AAAA,KACnB,CAAA;AAED,IAAM,MAAA,MAAA,GAAS,MAAMA,kBAAA,CAAM,UAAU,CAAA;AACrC,IAAI,IAAAC,0BAAA,CAAc,MAAM,CAAG,EAAA;AACzB,MAAM,MAAA,IAAI,KAAM,CAAA,MAAA,CAAO,OAAO,CAAA;AAAA;AAEhC,IAAA,OAAO,MAAO,CAAA,MAAA;AAAA;AAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,wBAAwB,MAAyC,EAAA;AACrE,IAAI,IAAA,YAAA,CAAa,MAAM,CAAG,EAAA;AACxB,MAAO,OAAA,MAAA;AAAA;AAET,IAAI,IAAA,YAAA,CAAa,MAAM,CAAG,EAAA;AAGxB,MAAA,MAAM,aAAgB,GAAA,MAAM,IAAK,CAAA,sBAAA,CAAuB,MAAM,CAAA;AAC9D,MAAO,OAAA,MAAM,IAAK,CAAA,6BAAA,CAA8B,aAAa,CAAA;AAAA;AAE/D,IAAI,IAAA,YAAA,CAAa,MAAM,CAAG,EAAA;AACxB,MAAO,OAAA,MAAM,IAAK,CAAA,6BAAA,CAA8B,MAAM,CAAA;AAAA;AAGxD,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,6EAAA;AAAA,KACF;AAAA;AACF,EAEA,MAAM,uBAAuB,UAA+B,EAAA;AAC1D,IAAI,IAAA;AACF,MAAA,MAAM,MAAS,GAAAC,iCAAA,CAAiB,OAAQ,CAAA,UAAA,EAAY,EAAE,CAAA;AACtD,MAAO,OAAA,MAAA;AAAA,aACA,KAAO,EAAA;AACd,MAAQ,OAAA,CAAA,KAAA,CAAM,gDAAgD,KAAK,CAAA;AACnE,MAAM,MAAA,KAAA;AAAA;AACR;AACF,EAEA,MAAc,8BAA8B,UAA+B,EAAA;AACzE,IAAI,IAAA;AACF,MAAA,MAAM,MAAS,GAAA,MAAMC,gCAAgB,CAAA,UAAA,CAAW,UAAY,EAAA;AAAA,QAC1D,KAAO,EAAA,IAAA;AAAA;AAAA,QACP,QAAU,EAAA;AAAA;AAAA,OACX,CAAA;AACD,MAAA,OAAO,MAAO,CAAA,OAAA;AAAA,aACP,KAAO,EAAA;AACd,MAAQ,OAAA,CAAA,KAAA,CAAM,gDAAgD,KAAK,CAAA;AACnE,MAAM,MAAA,KAAA;AAAA;AACR;AAEJ;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.cjs.js","sources":["../../src/providers/types.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SchedulerServiceTaskScheduleDefinition } from '@backstage/backend-plugin-api';\n\nexport type ThreeScaleConfig = {\n id: string;\n baseUrl: string;\n accessToken: string;\n systemLabel?: string;\n ownerLabel?: string;\n addLabels?: boolean;\n schedule?: SchedulerServiceTaskScheduleDefinition;\n};\n\nexport type NonEmptyArray<T> = [T, ...T[]];\n\nexport function isNonEmptyArray<T>(arr: T[]): arr is NonEmptyArray<T> {\n return arr.length > 0;\n}\n"],"names":[],"mappings":";;AA8BO,SAAS,gBAAmB,GAAmC,EAAA;AACpE,EAAA,OAAO,IAAI,MAAS,GAAA,CAAA,CAAA;AACtB;;;;"}
1
+ {"version":3,"file":"types.cjs.js","sources":["../../src/providers/types.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SchedulerServiceTaskScheduleDefinition } from '@backstage/backend-plugin-api';\n\nexport type ThreeScaleConfig = {\n id: string;\n baseUrl: string;\n accessToken: string;\n systemLabel?: string;\n ownerLabel?: string;\n addLabels?: boolean;\n schedule?: SchedulerServiceTaskScheduleDefinition;\n};\n\nexport type NonEmptyArray<T> = [T, ...T[]];\n\nexport function isNonEmptyArray<T>(arr: T[]): arr is NonEmptyArray<T> {\n return arr.length > 0;\n}\n"],"names":[],"mappings":";;AA8BO,SAAS,gBAAmB,GAAmC,EAAA;AACpE,EAAA,OAAO,IAAI,MAAS,GAAA,CAAA;AACtB;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage-community/plugin-3scale-backend",
3
- "version": "3.0.4",
3
+ "version": "3.1.0",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./dist/index.cjs.js",
6
6
  "types": "./dist/index.d.ts",
@@ -22,6 +22,13 @@
22
22
  },
23
23
  "./package.json": "./package.json"
24
24
  },
25
+ "typesVersions": {
26
+ "*": {
27
+ "index": [
28
+ "dist/index.d.ts"
29
+ ]
30
+ }
31
+ },
25
32
  "scripts": {
26
33
  "build": "backstage-cli package build",
27
34
  "clean": "backstage-cli package clean",
@@ -32,25 +39,22 @@
32
39
  "test": "backstage-cli package test --passWithNoTests --coverage"
33
40
  },
34
41
  "dependencies": {
35
- "@backstage/backend-plugin-api": "^1.0.1",
36
- "@backstage/catalog-model": "^1.7.0",
37
- "@backstage/errors": "^1.2.4",
38
- "@backstage/plugin-catalog-node": "^1.13.1",
42
+ "@backstage/backend-plugin-api": "^1.1.0",
43
+ "@backstage/catalog-model": "^1.7.2",
44
+ "@backstage/errors": "^1.2.6",
45
+ "@backstage/plugin-catalog-node": "^1.15.0",
39
46
  "atlassian-openapi": "^1.0.19",
40
47
  "openapi-merge": "^1.3.3",
41
48
  "swagger-converter": "2.1.0",
42
49
  "swagger2openapi": "^7.0.4"
43
50
  },
44
51
  "devDependencies": {
45
- "@backstage/backend-defaults": "^0.5.2",
46
- "@backstage/backend-test-utils": "^1.0.2",
47
- "@backstage/cli": "^0.28.0",
48
- "@backstage/config": "^1.2.0",
49
- "@backstage/plugin-catalog-backend": "^1.27.1",
50
- "@types/supertest": "6.0.2",
51
- "@types/swagger2openapi": "^7.0.4",
52
- "msw": "1.3.5",
53
- "supertest": "7.0.0"
52
+ "@backstage/backend-defaults": "^0.6.2",
53
+ "@backstage/backend-test-utils": "^1.2.0",
54
+ "@backstage/cli": "^0.29.4",
55
+ "@backstage/config": "^1.3.1",
56
+ "@backstage/plugin-catalog-backend": "^1.29.0",
57
+ "@types/swagger2openapi": "^7.0.4"
54
58
  },
55
59
  "files": [
56
60
  "app-config.example.yaml",