@backstage/plugin-catalog-backend-module-openapi 0.0.0-nightly-20220624024747
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 +17 -0
- package/README.md +27 -0
- package/dist/index.cjs.js +114 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/package.json +53 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# @backstage/plugin-catalog-backend-module-openapi
|
|
2
|
+
|
|
3
|
+
## 0.0.0-nightly-20220624024747
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 67503d159e: Add basic OpenAPI \$ref support.
|
|
8
|
+
|
|
9
|
+
For more information see [here](https://github.com/backstage/backstage/tree/master/plugins/catalog-backend-module-openapi).
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- Updated dependencies
|
|
14
|
+
- @backstage/backend-common@0.0.0-nightly-20220624024747
|
|
15
|
+
- @backstage/catalog-model@0.0.0-nightly-20220624024747
|
|
16
|
+
- @backstage/plugin-catalog-backend@0.0.0-nightly-20220624024747
|
|
17
|
+
- @backstage/integration@0.0.0-nightly-20220624024747
|
package/README.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Catalog Backend Module for OpenAPI specifications
|
|
2
|
+
|
|
3
|
+
This is an extension module to the plugin-catalog-backend plugin, providing extensions targeted at OpenAPI specifications.
|
|
4
|
+
|
|
5
|
+
With this you can split your OpenAPI definition into multiple files and reference them. They will be bundled, using an UrlReader, during processing and stored as a single specification.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
### Install the package
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# From your Backstage root directory
|
|
13
|
+
yarn add --cwd packages/backend @backstage/plugin-catalog-backend-module-openapi
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### Adding the plugin to your `packages/backend`
|
|
17
|
+
|
|
18
|
+
The processor can be added by importing `OpenApiRefProcessor` in `src/plugins/catalog.ts` in your `backend` package and adding the following.
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
builder.addProcessor(
|
|
22
|
+
OpenApiRefProcessor.fromConfig(env.config, {
|
|
23
|
+
logger: env.logger,
|
|
24
|
+
reader: env.reader,
|
|
25
|
+
}),
|
|
26
|
+
);
|
|
27
|
+
```
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var integration = require('@backstage/integration');
|
|
6
|
+
var SwaggerParser = require('@apidevtools/swagger-parser');
|
|
7
|
+
var yaml = require('yaml');
|
|
8
|
+
var path = require('path');
|
|
9
|
+
|
|
10
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
11
|
+
|
|
12
|
+
function _interopNamespace(e) {
|
|
13
|
+
if (e && e.__esModule) return e;
|
|
14
|
+
var n = Object.create(null);
|
|
15
|
+
if (e) {
|
|
16
|
+
Object.keys(e).forEach(function (k) {
|
|
17
|
+
if (k !== 'default') {
|
|
18
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
19
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
get: function () { return e[k]; }
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
n["default"] = e;
|
|
27
|
+
return Object.freeze(n);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
var SwaggerParser__default = /*#__PURE__*/_interopDefaultLegacy(SwaggerParser);
|
|
31
|
+
var path__namespace = /*#__PURE__*/_interopNamespace(path);
|
|
32
|
+
|
|
33
|
+
const protocolPattern = /^(\w{2,}):\/\//i;
|
|
34
|
+
const getProtocol = (refPath) => {
|
|
35
|
+
const match = protocolPattern.exec(refPath);
|
|
36
|
+
if (match) {
|
|
37
|
+
return match[1].toLowerCase();
|
|
38
|
+
}
|
|
39
|
+
return void 0;
|
|
40
|
+
};
|
|
41
|
+
async function bundleOpenApiSpecification(specification, targetUrl, reader, scmIntegration) {
|
|
42
|
+
const fileUrlReaderResolver = {
|
|
43
|
+
canRead: (file) => {
|
|
44
|
+
const protocol = getProtocol(file.url);
|
|
45
|
+
return protocol === void 0 || protocol === "file";
|
|
46
|
+
},
|
|
47
|
+
read: async (file) => {
|
|
48
|
+
const relativePath = path__namespace.relative(".", file.url);
|
|
49
|
+
const url = scmIntegration.resolveUrl({
|
|
50
|
+
base: targetUrl,
|
|
51
|
+
url: relativePath
|
|
52
|
+
});
|
|
53
|
+
if (reader.readUrl) {
|
|
54
|
+
const data = await reader.readUrl(url);
|
|
55
|
+
return data.buffer();
|
|
56
|
+
}
|
|
57
|
+
throw new Error("UrlReader has no readUrl method defined");
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
if (!specification) {
|
|
61
|
+
return void 0;
|
|
62
|
+
}
|
|
63
|
+
const options = {
|
|
64
|
+
resolve: {
|
|
65
|
+
file: fileUrlReaderResolver,
|
|
66
|
+
http: true
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
const specObject = yaml.parse(specification);
|
|
70
|
+
const bundledSpec = await SwaggerParser__default["default"].bundle(specObject, options);
|
|
71
|
+
return yaml.stringify(bundledSpec);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
class OpenApiRefProcessor {
|
|
75
|
+
static fromConfig(config, options) {
|
|
76
|
+
const integrations = integration.ScmIntegrations.fromConfig(config);
|
|
77
|
+
return new OpenApiRefProcessor({
|
|
78
|
+
...options,
|
|
79
|
+
integrations
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
constructor(options) {
|
|
83
|
+
this.integrations = options.integrations;
|
|
84
|
+
this.logger = options.logger;
|
|
85
|
+
this.reader = options.reader;
|
|
86
|
+
}
|
|
87
|
+
getProcessorName() {
|
|
88
|
+
return "OpenApiRefProcessor";
|
|
89
|
+
}
|
|
90
|
+
async preProcessEntity(entity, location) {
|
|
91
|
+
var _a;
|
|
92
|
+
if (!entity || entity.kind !== "API" || entity.spec && entity.spec.type !== "openapi") {
|
|
93
|
+
return entity;
|
|
94
|
+
}
|
|
95
|
+
const scmIntegration = this.integrations.byUrl(location.target);
|
|
96
|
+
if (!scmIntegration) {
|
|
97
|
+
return entity;
|
|
98
|
+
}
|
|
99
|
+
this.logger.debug(`Bundling OpenAPI specification from ${location.target}`);
|
|
100
|
+
try {
|
|
101
|
+
const bundledSpec = await bundleOpenApiSpecification((_a = entity.spec.definition) == null ? void 0 : _a.toString(), location.target, this.reader, scmIntegration);
|
|
102
|
+
return {
|
|
103
|
+
...entity,
|
|
104
|
+
spec: { ...entity.spec, definition: bundledSpec }
|
|
105
|
+
};
|
|
106
|
+
} catch (error) {
|
|
107
|
+
this.logger.error(`Unable to bundle OpenAPI specification`, error);
|
|
108
|
+
return entity;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
exports.OpenApiRefProcessor = OpenApiRefProcessor;
|
|
114
|
+
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/lib/bundle.ts","../src/OpenApiRefProcessor.ts"],"sourcesContent":["/*\n * Copyright 2020 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 { UrlReader } from '@backstage/backend-common';\nimport { ScmIntegration } from '@backstage/integration';\nimport SwaggerParser from '@apidevtools/swagger-parser';\nimport { parse, stringify } from 'yaml';\nimport * as path from 'path';\n\nconst protocolPattern = /^(\\w{2,}):\\/\\//i;\nconst getProtocol = (refPath: string) => {\n const match = protocolPattern.exec(refPath);\n if (match) {\n return match[1].toLowerCase();\n }\n return undefined;\n};\n\nexport async function bundleOpenApiSpecification(\n specification: string | undefined,\n targetUrl: string,\n reader: UrlReader,\n scmIntegration: ScmIntegration,\n): Promise<string | undefined> {\n const fileUrlReaderResolver: SwaggerParser.ResolverOptions = {\n canRead: file => {\n const protocol = getProtocol(file.url);\n return protocol === undefined || protocol === 'file';\n },\n read: async file => {\n const relativePath = path.relative('.', file.url);\n const url = scmIntegration.resolveUrl({\n base: targetUrl,\n url: relativePath,\n });\n if (reader.readUrl) {\n const data = await reader.readUrl(url);\n return data.buffer();\n }\n throw new Error('UrlReader has no readUrl method defined');\n },\n };\n\n if (!specification) {\n return undefined;\n }\n\n const options: SwaggerParser.Options = {\n resolve: {\n file: fileUrlReaderResolver,\n http: true,\n },\n };\n const specObject = parse(specification);\n const bundledSpec = await SwaggerParser.bundle(specObject, options);\n return stringify(bundledSpec);\n}\n","/*\n * Copyright 2020 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 { UrlReader } from '@backstage/backend-common';\nimport { Entity } from '@backstage/catalog-model';\nimport { Config } from '@backstage/config';\nimport { ScmIntegrations } from '@backstage/integration';\nimport {\n CatalogProcessor,\n LocationSpec,\n} from '@backstage/plugin-catalog-backend';\nimport { bundleOpenApiSpecification } from './lib';\nimport { Logger } from 'winston';\n\n/** @public */\nexport class OpenApiRefProcessor implements CatalogProcessor {\n private readonly integrations: ScmIntegrations;\n private readonly logger: Logger;\n private readonly reader: UrlReader;\n\n static fromConfig(\n config: Config,\n options: { logger: Logger; reader: UrlReader },\n ) {\n const integrations = ScmIntegrations.fromConfig(config);\n\n return new OpenApiRefProcessor({\n ...options,\n integrations,\n });\n }\n\n constructor(options: {\n integrations: ScmIntegrations;\n logger: Logger;\n reader: UrlReader;\n }) {\n this.integrations = options.integrations;\n this.logger = options.logger;\n this.reader = options.reader;\n }\n\n getProcessorName(): string {\n return 'OpenApiRefProcessor';\n }\n\n async preProcessEntity(\n entity: Entity,\n location: LocationSpec,\n ): Promise<Entity> {\n if (\n !entity ||\n entity.kind !== 'API' ||\n (entity.spec && entity.spec.type !== 'openapi')\n ) {\n return entity;\n }\n\n const scmIntegration = this.integrations.byUrl(location.target);\n if (!scmIntegration) {\n return entity;\n }\n\n this.logger.debug(`Bundling OpenAPI specification from ${location.target}`);\n try {\n const bundledSpec = await bundleOpenApiSpecification(\n entity.spec!.definition?.toString(),\n location.target,\n this.reader,\n scmIntegration,\n );\n\n return {\n ...entity,\n spec: { ...entity.spec, definition: bundledSpec },\n };\n } catch (error) {\n this.logger.error(`Unable to bundle OpenAPI specification`, error);\n return entity;\n }\n }\n}\n"],"names":["path","parse","SwaggerParser","stringify","ScmIntegrations"],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { UrlReader } from '@backstage/backend-common';
|
|
2
|
+
import { Entity } from '@backstage/catalog-model';
|
|
3
|
+
import { Config } from '@backstage/config';
|
|
4
|
+
import { ScmIntegrations } from '@backstage/integration';
|
|
5
|
+
import { CatalogProcessor, LocationSpec } from '@backstage/plugin-catalog-backend';
|
|
6
|
+
import { Logger } from 'winston';
|
|
7
|
+
|
|
8
|
+
/** @public */
|
|
9
|
+
declare class OpenApiRefProcessor implements CatalogProcessor {
|
|
10
|
+
private readonly integrations;
|
|
11
|
+
private readonly logger;
|
|
12
|
+
private readonly reader;
|
|
13
|
+
static fromConfig(config: Config, options: {
|
|
14
|
+
logger: Logger;
|
|
15
|
+
reader: UrlReader;
|
|
16
|
+
}): OpenApiRefProcessor;
|
|
17
|
+
constructor(options: {
|
|
18
|
+
integrations: ScmIntegrations;
|
|
19
|
+
logger: Logger;
|
|
20
|
+
reader: UrlReader;
|
|
21
|
+
});
|
|
22
|
+
getProcessorName(): string;
|
|
23
|
+
preProcessEntity(entity: Entity, location: LocationSpec): Promise<Entity>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export { OpenApiRefProcessor };
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@backstage/plugin-catalog-backend-module-openapi",
|
|
3
|
+
"description": "A Backstage catalog backend module that helps with OpenAPI specifications",
|
|
4
|
+
"version": "0.0.0-nightly-20220624024747",
|
|
5
|
+
"main": "dist/index.cjs.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"license": "Apache-2.0",
|
|
8
|
+
"private": false,
|
|
9
|
+
"publishConfig": {
|
|
10
|
+
"access": "public",
|
|
11
|
+
"main": "dist/index.cjs.js",
|
|
12
|
+
"types": "dist/index.d.ts"
|
|
13
|
+
},
|
|
14
|
+
"backstage": {
|
|
15
|
+
"role": "backend-plugin-module"
|
|
16
|
+
},
|
|
17
|
+
"homepage": "https://backstage.io",
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "https://github.com/backstage/backstage",
|
|
21
|
+
"directory": "plugins/catalog-backend-module-openapi"
|
|
22
|
+
},
|
|
23
|
+
"keywords": [
|
|
24
|
+
"backstage"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "backstage-cli package build",
|
|
28
|
+
"lint": "backstage-cli package lint",
|
|
29
|
+
"test": "backstage-cli package test",
|
|
30
|
+
"prepack": "backstage-cli package prepack",
|
|
31
|
+
"postpack": "backstage-cli package postpack",
|
|
32
|
+
"clean": "backstage-cli package clean",
|
|
33
|
+
"start": "backstage-cli package start"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@apidevtools/swagger-parser": "^10.1.0",
|
|
37
|
+
"@backstage/backend-common": "^0.0.0-nightly-20220624024747",
|
|
38
|
+
"@backstage/catalog-model": "^0.0.0-nightly-20220624024747",
|
|
39
|
+
"@backstage/config": "^1.0.1",
|
|
40
|
+
"@backstage/integration": "^0.0.0-nightly-20220624024747",
|
|
41
|
+
"@backstage/plugin-catalog-backend": "^0.0.0-nightly-20220624024747",
|
|
42
|
+
"winston": "^3.2.1",
|
|
43
|
+
"yaml": "^2.1.1"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@backstage/backend-test-utils": "^0.0.0-nightly-20220624024747",
|
|
47
|
+
"@backstage/cli": "^0.0.0-nightly-20220624024747",
|
|
48
|
+
"openapi-types": "^11.0.1"
|
|
49
|
+
},
|
|
50
|
+
"files": [
|
|
51
|
+
"dist"
|
|
52
|
+
]
|
|
53
|
+
}
|