@backstage/repo-tools 0.1.4-next.1 → 0.2.0-next.2
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 +12 -0
- package/dist/cjs/{api-reports-f39f7b2c.cjs.js → api-reports-6ef2363c.cjs.js} +23 -68
- package/dist/cjs/constants-a9b2f484.cjs.js +42 -0
- package/dist/cjs/generate-d9406b4d.cjs.js +66 -0
- package/dist/cjs/paths-5e048aab.cjs.js +66 -0
- package/dist/cjs/verify-47d1fef6.cjs.js +83 -0
- package/dist/index.cjs.js +7 -1
- package/package.json +6 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @backstage/repo-tools
|
|
2
2
|
|
|
3
|
+
## 0.2.0-next.2
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- a876e69b20e: Adding two new commands to support OpenAPI spec writing, `schema:openapi:generate` to generate the Typescript file that `@backstage/backend-openapi-utils` needs for typing and `schema:openapi:verify` to verify that this file exists and matches your `src/schema/openapi.yaml` file.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies
|
|
12
|
+
- @backstage/cli-common@0.1.12
|
|
13
|
+
- @backstage/errors@1.1.5
|
|
14
|
+
|
|
3
15
|
## 0.1.4-next.1
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var fs = require('fs-extra');
|
|
4
3
|
var path = require('path');
|
|
5
4
|
var child_process = require('child_process');
|
|
5
|
+
var fs = require('fs-extra');
|
|
6
6
|
var apiExtractor = require('@microsoft/api-extractor');
|
|
7
7
|
var tsdoc = require('@microsoft/tsdoc');
|
|
8
8
|
var tsdocConfig = require('@microsoft/tsdoc-config');
|
|
@@ -12,52 +12,19 @@ var DocTable = require('@microsoft/api-documenter/lib/nodes/DocTable');
|
|
|
12
12
|
var DocTableRow = require('@microsoft/api-documenter/lib/nodes/DocTableRow');
|
|
13
13
|
var DocHeading = require('@microsoft/api-documenter/lib/nodes/DocHeading');
|
|
14
14
|
var CustomMarkdownEmitter = require('@microsoft/api-documenter/lib/markdown/CustomMarkdownEmitter');
|
|
15
|
-
var
|
|
16
|
-
var g = require('glob');
|
|
17
|
-
var isGlob = require('is-glob');
|
|
18
|
-
var util = require('util');
|
|
15
|
+
var paths = require('./paths-5e048aab.cjs.js');
|
|
19
16
|
var minimatch = require('minimatch');
|
|
20
17
|
var entryPoints = require('./entryPoints-c9b88245.cjs.js');
|
|
18
|
+
require('@backstage/cli-common');
|
|
19
|
+
require('glob');
|
|
20
|
+
require('is-glob');
|
|
21
|
+
require('util');
|
|
21
22
|
|
|
22
23
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
23
24
|
|
|
24
25
|
var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
|
|
25
|
-
var g__default = /*#__PURE__*/_interopDefaultLegacy(g);
|
|
26
|
-
var isGlob__default = /*#__PURE__*/_interopDefaultLegacy(isGlob);
|
|
27
26
|
var minimatch__default = /*#__PURE__*/_interopDefaultLegacy(minimatch);
|
|
28
27
|
|
|
29
|
-
const glob = util.promisify(g__default["default"]);
|
|
30
|
-
const paths = cliCommon.findPaths(__dirname);
|
|
31
|
-
async function resolvePackagePath(packagePath) {
|
|
32
|
-
const fullPackageDir = paths.resolveTargetRoot(packagePath);
|
|
33
|
-
try {
|
|
34
|
-
const stat = await fs__default["default"].stat(fullPackageDir);
|
|
35
|
-
if (!stat.isDirectory()) {
|
|
36
|
-
return void 0;
|
|
37
|
-
}
|
|
38
|
-
const packageJsonPath = path.join(fullPackageDir, "package.json");
|
|
39
|
-
await fs__default["default"].access(packageJsonPath);
|
|
40
|
-
} catch (e) {
|
|
41
|
-
console.log(`folder omitted: ${fullPackageDir}, cause: ${e}`);
|
|
42
|
-
return void 0;
|
|
43
|
-
}
|
|
44
|
-
return path.relative(paths.targetRoot, fullPackageDir);
|
|
45
|
-
}
|
|
46
|
-
async function findPackageDirs(selectedPaths = []) {
|
|
47
|
-
const packageDirs = new Array();
|
|
48
|
-
for (const packageRoot of selectedPaths) {
|
|
49
|
-
const dirs = isGlob__default["default"](packageRoot) ? await glob(packageRoot, { cwd: paths.targetRoot }) : [packageRoot];
|
|
50
|
-
for (const dir of dirs) {
|
|
51
|
-
const packageDir = await resolvePackagePath(dir);
|
|
52
|
-
if (!packageDir) {
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
packageDirs.push(packageDir);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return packageDirs;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
28
|
var __accessCheck = (obj, member, msg) => {
|
|
62
29
|
if (!member.has(obj))
|
|
63
30
|
throw TypeError("Cannot " + msg);
|
|
@@ -77,7 +44,7 @@ var __privateSet = (obj, member, value, setter) => {
|
|
|
77
44
|
return value;
|
|
78
45
|
};
|
|
79
46
|
var _tokens;
|
|
80
|
-
const tmpDir = paths.resolveTargetRoot(
|
|
47
|
+
const tmpDir = paths.paths.resolveTargetRoot(
|
|
81
48
|
"./node_modules/.cache/api-extractor"
|
|
82
49
|
);
|
|
83
50
|
const {
|
|
@@ -161,7 +128,7 @@ ApiReportGenerator.generateReviewFileContent = function decoratedGenerateReviewF
|
|
|
161
128
|
);
|
|
162
129
|
try {
|
|
163
130
|
const prettier = require("prettier");
|
|
164
|
-
const config = (_a = prettier.resolveConfig.sync(paths.targetRoot)) != null ? _a : {};
|
|
131
|
+
const config = (_a = prettier.resolveConfig.sync(paths.paths.targetRoot)) != null ? _a : {};
|
|
165
132
|
return prettier.format(content, {
|
|
166
133
|
...config,
|
|
167
134
|
parser: "markdown"
|
|
@@ -171,7 +138,7 @@ ApiReportGenerator.generateReviewFileContent = function decoratedGenerateReviewF
|
|
|
171
138
|
}
|
|
172
139
|
};
|
|
173
140
|
async function createTemporaryTsConfig(includedPackageDirs) {
|
|
174
|
-
const path$1 = paths.resolveTargetRoot("tsconfig.tmp.json");
|
|
141
|
+
const path$1 = paths.paths.resolveTargetRoot("tsconfig.tmp.json");
|
|
175
142
|
process.once("exit", () => {
|
|
176
143
|
fs__default["default"].removeSync(path$1);
|
|
177
144
|
});
|
|
@@ -250,7 +217,7 @@ async function findPackageEntryPoints(packageDirs) {
|
|
|
250
217
|
packageDirs.map(async (packageDir) => {
|
|
251
218
|
var _a, _b, _c, _d;
|
|
252
219
|
const pkg = await fs__default["default"].readJson(
|
|
253
|
-
paths.resolveTargetRoot(packageDir, "package.json")
|
|
220
|
+
paths.paths.resolveTargetRoot(packageDir, "package.json")
|
|
254
221
|
);
|
|
255
222
|
return (_d = (_a = entryPoints.getPackageExportNames(pkg)) == null ? void 0 : _a.map((name) => ({ packageDir, name }))) != null ? _d : {
|
|
256
223
|
packageDir,
|
|
@@ -274,7 +241,7 @@ async function runApiExtraction({
|
|
|
274
241
|
await fs__default["default"].remove(outputDir);
|
|
275
242
|
const packageEntryPoints = await findPackageEntryPoints(packageDirs);
|
|
276
243
|
const entryPoints = packageEntryPoints.map(({ packageDir, name }) => {
|
|
277
|
-
return paths.resolveTargetRoot(
|
|
244
|
+
return paths.paths.resolveTargetRoot(
|
|
278
245
|
`./dist-types/${packageDir}/src/${name}.d.ts`
|
|
279
246
|
);
|
|
280
247
|
});
|
|
@@ -294,8 +261,8 @@ async function runApiExtraction({
|
|
|
294
261
|
} of packageEntryPoints) {
|
|
295
262
|
console.log(`## Processing ${packageDir}`);
|
|
296
263
|
const noBail = Array.isArray(allowWarnings) ? allowWarnings.some((aw) => aw === packageDir || minimatch__default["default"](packageDir, aw)) : allowWarnings;
|
|
297
|
-
const projectFolder = paths.resolveTargetRoot(packageDir);
|
|
298
|
-
const packageFolder = paths.resolveTargetRoot(
|
|
264
|
+
const projectFolder = paths.paths.resolveTargetRoot(packageDir);
|
|
265
|
+
const packageFolder = paths.paths.resolveTargetRoot(
|
|
299
266
|
"./dist-types",
|
|
300
267
|
packageDir
|
|
301
268
|
);
|
|
@@ -908,7 +875,7 @@ async function categorizePackageDirs(packageDirs) {
|
|
|
908
875
|
if (!dir) {
|
|
909
876
|
return;
|
|
910
877
|
}
|
|
911
|
-
const pkgJson = await fs__default["default"].readJson(paths.resolveTargetRoot(dir, "package.json")).catch((error) => {
|
|
878
|
+
const pkgJson = await fs__default["default"].readJson(paths.paths.resolveTargetRoot(dir, "package.json")).catch((error) => {
|
|
912
879
|
if (error.code === "ENOENT") {
|
|
913
880
|
return void 0;
|
|
914
881
|
}
|
|
@@ -1044,7 +1011,7 @@ async function runCliExtraction({
|
|
|
1044
1011
|
}) {
|
|
1045
1012
|
for (const packageDir of packageDirs) {
|
|
1046
1013
|
console.log(`## Processing ${packageDir}`);
|
|
1047
|
-
const fullDir = paths.resolveTargetRoot(packageDir);
|
|
1014
|
+
const fullDir = paths.paths.resolveTargetRoot(packageDir);
|
|
1048
1015
|
const pkgJson = await fs__default["default"].readJson(path.resolve(fullDir, "package.json"));
|
|
1049
1016
|
if (!pkgJson.bin) {
|
|
1050
1017
|
throw new Error(`CLI Package in ${packageDir} has no bin field`);
|
|
@@ -1079,7 +1046,7 @@ async function runCliExtraction({
|
|
|
1079
1046
|
console.log("");
|
|
1080
1047
|
console.log(
|
|
1081
1048
|
`The conflicting file is ${path.relative(
|
|
1082
|
-
paths.targetRoot,
|
|
1049
|
+
paths.paths.targetRoot,
|
|
1083
1050
|
reportPath
|
|
1084
1051
|
)}, expecting the following content:`
|
|
1085
1052
|
);
|
|
@@ -1094,7 +1061,7 @@ async function runCliExtraction({
|
|
|
1094
1061
|
}
|
|
1095
1062
|
|
|
1096
1063
|
async function generateTypeDeclarations(tsconfigFilePath) {
|
|
1097
|
-
await fs__default["default"].remove(paths.resolveTargetRoot("dist-types"));
|
|
1064
|
+
await fs__default["default"].remove(paths.paths.resolveTargetRoot("dist-types"));
|
|
1098
1065
|
const { status } = child_process.spawnSync(
|
|
1099
1066
|
"yarn",
|
|
1100
1067
|
[
|
|
@@ -1106,7 +1073,7 @@ async function generateTypeDeclarations(tsconfigFilePath) {
|
|
|
1106
1073
|
{
|
|
1107
1074
|
stdio: "inherit",
|
|
1108
1075
|
shell: true,
|
|
1109
|
-
cwd: paths.targetRoot
|
|
1076
|
+
cwd: paths.paths.targetRoot
|
|
1110
1077
|
}
|
|
1111
1078
|
);
|
|
1112
1079
|
if (status !== 0) {
|
|
@@ -1115,7 +1082,7 @@ async function generateTypeDeclarations(tsconfigFilePath) {
|
|
|
1115
1082
|
}
|
|
1116
1083
|
|
|
1117
1084
|
const buildApiReports = async (paths$1 = [], opts) => {
|
|
1118
|
-
const tmpDir = paths.resolveTargetRoot(
|
|
1085
|
+
const tmpDir = paths.paths.resolveTargetRoot(
|
|
1119
1086
|
"./node_modules/.cache/api-extractor"
|
|
1120
1087
|
);
|
|
1121
1088
|
const isCiBuild = opts.ci;
|
|
@@ -1125,8 +1092,7 @@ const buildApiReports = async (paths$1 = [], opts) => {
|
|
|
1125
1092
|
const allowAllWarnings = opts.allowAllWarnings;
|
|
1126
1093
|
const omitMessages = parseArrayOption(opts.omitMessages);
|
|
1127
1094
|
const isAllPackages = !(paths$1 == null ? void 0 : paths$1.length);
|
|
1128
|
-
const
|
|
1129
|
-
const selectedPackageDirs = await findPackageDirs(selectedPaths);
|
|
1095
|
+
const selectedPackageDirs = await paths.getMatchingWorkspacePaths(paths$1);
|
|
1130
1096
|
if (isAllPackages && !isCiBuild && !isDocsBuild) {
|
|
1131
1097
|
console.log("");
|
|
1132
1098
|
console.log(
|
|
@@ -1142,7 +1108,7 @@ const buildApiReports = async (paths$1 = [], opts) => {
|
|
|
1142
1108
|
if (!isAllPackages) {
|
|
1143
1109
|
temporaryTsConfigPath = await createTemporaryTsConfig(selectedPackageDirs);
|
|
1144
1110
|
}
|
|
1145
|
-
const tsconfigFilePath = temporaryTsConfigPath != null ? temporaryTsConfigPath : paths.resolveTargetRoot("tsconfig.json");
|
|
1111
|
+
const tsconfigFilePath = temporaryTsConfigPath != null ? temporaryTsConfigPath : paths.paths.resolveTargetRoot("tsconfig.json");
|
|
1146
1112
|
if (runTsc) {
|
|
1147
1113
|
console.log("# Compiling TypeScript");
|
|
1148
1114
|
await generateTypeDeclarations(tsconfigFilePath);
|
|
@@ -1173,24 +1139,13 @@ const buildApiReports = async (paths$1 = [], opts) => {
|
|
|
1173
1139
|
console.log("# Generating package documentation");
|
|
1174
1140
|
await buildDocs({
|
|
1175
1141
|
inputDir: tmpDir,
|
|
1176
|
-
outputDir: paths.resolveTargetRoot("docs/reference")
|
|
1142
|
+
outputDir: paths.paths.resolveTargetRoot("docs/reference")
|
|
1177
1143
|
});
|
|
1178
1144
|
}
|
|
1179
1145
|
};
|
|
1180
|
-
async function getWorkspacePackagePathPatterns() {
|
|
1181
|
-
var _a;
|
|
1182
|
-
const pkgJson = await fs__default["default"].readJson(paths.resolveTargetRoot("package.json")).catch((error) => {
|
|
1183
|
-
if (error.code === "ENOENT") {
|
|
1184
|
-
return void 0;
|
|
1185
|
-
}
|
|
1186
|
-
throw error;
|
|
1187
|
-
});
|
|
1188
|
-
const workspaces = (_a = pkgJson == null ? void 0 : pkgJson.workspaces) == null ? void 0 : _a.packages;
|
|
1189
|
-
return workspaces;
|
|
1190
|
-
}
|
|
1191
1146
|
function parseArrayOption(value) {
|
|
1192
1147
|
return value ? value.split(",").map((s) => s.trim()) : [];
|
|
1193
1148
|
}
|
|
1194
1149
|
|
|
1195
1150
|
exports.buildApiReports = buildApiReports;
|
|
1196
|
-
//# sourceMappingURL=api-reports-
|
|
1151
|
+
//# sourceMappingURL=api-reports-6ef2363c.cjs.js.map
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var paths = require('./paths-5e048aab.cjs.js');
|
|
4
|
+
var pLimit = require('p-limit');
|
|
5
|
+
var path = require('path');
|
|
6
|
+
|
|
7
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
8
|
+
|
|
9
|
+
var pLimit__default = /*#__PURE__*/_interopDefaultLegacy(pLimit);
|
|
10
|
+
|
|
11
|
+
async function runner(paths$1, command) {
|
|
12
|
+
const packages = await paths.getMatchingWorkspacePaths(paths$1);
|
|
13
|
+
const limit = pLimit__default["default"](5);
|
|
14
|
+
const resultsList = await Promise.all(
|
|
15
|
+
packages.map(
|
|
16
|
+
(pkg) => limit(async () => {
|
|
17
|
+
let resultText = "";
|
|
18
|
+
try {
|
|
19
|
+
console.log(`## Processing ${pkg}`);
|
|
20
|
+
await command(pkg);
|
|
21
|
+
} catch (err) {
|
|
22
|
+
resultText = err.message;
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
relativeDir: path.relative(paths.paths.targetRoot, pkg),
|
|
26
|
+
resultText
|
|
27
|
+
};
|
|
28
|
+
})
|
|
29
|
+
)
|
|
30
|
+
);
|
|
31
|
+
return resultsList;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const YAML_SCHEMA_PATH = "src/schema/openapi.yaml";
|
|
35
|
+
const TS_MODULE = "src/schema/openapi";
|
|
36
|
+
const TS_SCHEMA_PATH = `${TS_MODULE}.ts`;
|
|
37
|
+
|
|
38
|
+
exports.TS_MODULE = TS_MODULE;
|
|
39
|
+
exports.TS_SCHEMA_PATH = TS_SCHEMA_PATH;
|
|
40
|
+
exports.YAML_SCHEMA_PATH = YAML_SCHEMA_PATH;
|
|
41
|
+
exports.runner = runner;
|
|
42
|
+
//# sourceMappingURL=constants-a9b2f484.cjs.js.map
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var fs = require('fs-extra');
|
|
4
|
+
var YAML = require('js-yaml');
|
|
5
|
+
var chalk = require('chalk');
|
|
6
|
+
var path = require('path');
|
|
7
|
+
var constants = require('./constants-a9b2f484.cjs.js');
|
|
8
|
+
var util = require('util');
|
|
9
|
+
var child_process = require('child_process');
|
|
10
|
+
require('./paths-5e048aab.cjs.js');
|
|
11
|
+
require('@backstage/cli-common');
|
|
12
|
+
require('glob');
|
|
13
|
+
require('is-glob');
|
|
14
|
+
require('p-limit');
|
|
15
|
+
|
|
16
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
17
|
+
|
|
18
|
+
var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
|
|
19
|
+
var YAML__default = /*#__PURE__*/_interopDefaultLegacy(YAML);
|
|
20
|
+
var chalk__default = /*#__PURE__*/_interopDefaultLegacy(chalk);
|
|
21
|
+
|
|
22
|
+
const exec = util.promisify(child_process.exec);
|
|
23
|
+
async function generate(directoryPath, config) {
|
|
24
|
+
const { skipMissingYamlFile } = config != null ? config : {};
|
|
25
|
+
const openapiPath = path.resolve(directoryPath, constants.YAML_SCHEMA_PATH);
|
|
26
|
+
if (!await fs__default["default"].pathExists(openapiPath)) {
|
|
27
|
+
if (skipMissingYamlFile) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
throw new Error(`Could not find ${constants.YAML_SCHEMA_PATH} in root of directory.`);
|
|
31
|
+
}
|
|
32
|
+
const yaml = YAML__default["default"].load(await fs__default["default"].readFile(openapiPath, "utf8"));
|
|
33
|
+
const tsPath = path.resolve(directoryPath, constants.TS_SCHEMA_PATH);
|
|
34
|
+
await fs__default["default"].writeFile(
|
|
35
|
+
tsPath,
|
|
36
|
+
`export default ${JSON.stringify(yaml, null, 2)} as const`
|
|
37
|
+
);
|
|
38
|
+
await exec(`yarn backstage-cli package lint --fix ${tsPath}`);
|
|
39
|
+
}
|
|
40
|
+
async function bulkCommand(paths = []) {
|
|
41
|
+
const resultsList = await constants.runner(
|
|
42
|
+
paths,
|
|
43
|
+
(dir) => generate(dir, { skipMissingYamlFile: true })
|
|
44
|
+
);
|
|
45
|
+
let failed = false;
|
|
46
|
+
for (const { relativeDir, resultText } of resultsList) {
|
|
47
|
+
if (resultText) {
|
|
48
|
+
console.log();
|
|
49
|
+
console.log(
|
|
50
|
+
chalk__default["default"].red(
|
|
51
|
+
`OpenAPI yaml to Typescript generation failed in ${relativeDir}:`
|
|
52
|
+
)
|
|
53
|
+
);
|
|
54
|
+
console.log(resultText.trimStart());
|
|
55
|
+
failed = true;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (failed) {
|
|
59
|
+
process.exit(1);
|
|
60
|
+
} else {
|
|
61
|
+
console.log(chalk__default["default"].green("Generated all files."));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
exports.bulkCommand = bulkCommand;
|
|
66
|
+
//# sourceMappingURL=generate-d9406b4d.cjs.js.map
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var cliCommon = require('@backstage/cli-common');
|
|
4
|
+
var path = require('path');
|
|
5
|
+
var fs = require('fs-extra');
|
|
6
|
+
var g = require('glob');
|
|
7
|
+
var isGlob = require('is-glob');
|
|
8
|
+
var util = require('util');
|
|
9
|
+
|
|
10
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
11
|
+
|
|
12
|
+
var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
|
|
13
|
+
var g__default = /*#__PURE__*/_interopDefaultLegacy(g);
|
|
14
|
+
var isGlob__default = /*#__PURE__*/_interopDefaultLegacy(isGlob);
|
|
15
|
+
|
|
16
|
+
const glob = util.promisify(g__default["default"]);
|
|
17
|
+
const paths = cliCommon.findPaths(__dirname);
|
|
18
|
+
async function resolvePackagePath(packagePath) {
|
|
19
|
+
const fullPackageDir = paths.resolveTargetRoot(packagePath);
|
|
20
|
+
try {
|
|
21
|
+
const stat = await fs__default["default"].stat(fullPackageDir);
|
|
22
|
+
if (!stat.isDirectory()) {
|
|
23
|
+
return void 0;
|
|
24
|
+
}
|
|
25
|
+
const packageJsonPath = path.join(fullPackageDir, "package.json");
|
|
26
|
+
await fs__default["default"].access(packageJsonPath);
|
|
27
|
+
} catch (e) {
|
|
28
|
+
console.log(`folder omitted: ${fullPackageDir}, cause: ${e}`);
|
|
29
|
+
return void 0;
|
|
30
|
+
}
|
|
31
|
+
return path.relative(paths.targetRoot, fullPackageDir);
|
|
32
|
+
}
|
|
33
|
+
async function findPackageDirs(selectedPaths = []) {
|
|
34
|
+
const packageDirs = new Array();
|
|
35
|
+
for (const packageRoot of selectedPaths) {
|
|
36
|
+
const dirs = isGlob__default["default"](packageRoot) ? await glob(packageRoot, { cwd: paths.targetRoot }) : [packageRoot];
|
|
37
|
+
for (const dir of dirs) {
|
|
38
|
+
const packageDir = await resolvePackagePath(dir);
|
|
39
|
+
if (!packageDir) {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
packageDirs.push(packageDir);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return packageDirs;
|
|
46
|
+
}
|
|
47
|
+
async function getWorkspacePackagePathPatterns() {
|
|
48
|
+
var _a;
|
|
49
|
+
const pkgJson = await fs__default["default"].readJson(paths.resolveTargetRoot("package.json")).catch((error) => {
|
|
50
|
+
if (error.code === "ENOENT") {
|
|
51
|
+
return void 0;
|
|
52
|
+
}
|
|
53
|
+
throw error;
|
|
54
|
+
});
|
|
55
|
+
const workspaces = (_a = pkgJson == null ? void 0 : pkgJson.workspaces) == null ? void 0 : _a.packages;
|
|
56
|
+
return workspaces;
|
|
57
|
+
}
|
|
58
|
+
async function getMatchingWorkspacePaths(cliPaths) {
|
|
59
|
+
const isAllPackages = !(cliPaths == null ? void 0 : cliPaths.length);
|
|
60
|
+
const selectedPaths = isAllPackages ? await getWorkspacePackagePathPatterns() : cliPaths;
|
|
61
|
+
return await findPackageDirs(selectedPaths);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
exports.getMatchingWorkspacePaths = getMatchingWorkspacePaths;
|
|
65
|
+
exports.paths = paths;
|
|
66
|
+
//# sourceMappingURL=paths-5e048aab.cjs.js.map
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var fs = require('fs-extra');
|
|
4
|
+
var YAML = require('js-yaml');
|
|
5
|
+
var lodash = require('lodash');
|
|
6
|
+
var path = require('path');
|
|
7
|
+
var chalk = require('chalk');
|
|
8
|
+
var Parser = require('@apidevtools/swagger-parser');
|
|
9
|
+
var constants = require('./constants-a9b2f484.cjs.js');
|
|
10
|
+
var paths = require('./paths-5e048aab.cjs.js');
|
|
11
|
+
require('p-limit');
|
|
12
|
+
require('@backstage/cli-common');
|
|
13
|
+
require('glob');
|
|
14
|
+
require('is-glob');
|
|
15
|
+
require('util');
|
|
16
|
+
|
|
17
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
18
|
+
|
|
19
|
+
function _interopNamespace(e) {
|
|
20
|
+
if (e && e.__esModule) return e;
|
|
21
|
+
var n = Object.create(null);
|
|
22
|
+
if (e) {
|
|
23
|
+
Object.keys(e).forEach(function (k) {
|
|
24
|
+
if (k !== 'default') {
|
|
25
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
26
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
27
|
+
enumerable: true,
|
|
28
|
+
get: function () { return e[k]; }
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
n["default"] = e;
|
|
34
|
+
return Object.freeze(n);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
|
|
38
|
+
var YAML__default = /*#__PURE__*/_interopDefaultLegacy(YAML);
|
|
39
|
+
var chalk__default = /*#__PURE__*/_interopDefaultLegacy(chalk);
|
|
40
|
+
var Parser__default = /*#__PURE__*/_interopDefaultLegacy(Parser);
|
|
41
|
+
|
|
42
|
+
async function verify(directoryPath) {
|
|
43
|
+
const openapiPath = path.join(directoryPath, constants.YAML_SCHEMA_PATH);
|
|
44
|
+
if (!await fs__default["default"].pathExists(openapiPath)) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const yaml = YAML__default["default"].load(await fs__default["default"].readFile(openapiPath, "utf8"));
|
|
48
|
+
await Parser__default["default"].validate(lodash.cloneDeep(yaml));
|
|
49
|
+
const schemaPath = path.join(directoryPath, constants.TS_SCHEMA_PATH);
|
|
50
|
+
if (!await fs__default["default"].pathExists(schemaPath)) {
|
|
51
|
+
throw new Error(`No \`${constants.TS_SCHEMA_PATH}\` file found.`);
|
|
52
|
+
}
|
|
53
|
+
const schema = await (function (t) { return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require(t)); }); })(path.resolve(path.join(directoryPath, constants.TS_MODULE)));
|
|
54
|
+
if (!schema.default) {
|
|
55
|
+
throw new Error(`\`${constants.TS_SCHEMA_PATH}\` needs to have a default export.`);
|
|
56
|
+
}
|
|
57
|
+
if (!lodash.isEqual(schema.default, yaml)) {
|
|
58
|
+
const path$1 = path.relative(paths.paths.targetRoot, directoryPath);
|
|
59
|
+
throw new Error(
|
|
60
|
+
`\`${constants.YAML_SCHEMA_PATH}\` and \`${constants.TS_SCHEMA_PATH}\` do not match. Please run \`yarn backstage-repo-tools schema:openapi:generate ${path$1}\` to regenerate \`${constants.TS_SCHEMA_PATH}\`.`
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async function bulkCommand(paths = []) {
|
|
65
|
+
const resultsList = await constants.runner(paths, (dir) => verify(dir));
|
|
66
|
+
let failed = false;
|
|
67
|
+
for (const { relativeDir, resultText } of resultsList) {
|
|
68
|
+
if (resultText) {
|
|
69
|
+
console.log();
|
|
70
|
+
console.log(chalk__default["default"].red(`OpenAPI validation failed in ${relativeDir}:`));
|
|
71
|
+
console.log(resultText.trimStart());
|
|
72
|
+
failed = true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (failed) {
|
|
76
|
+
process.exit(1);
|
|
77
|
+
} else {
|
|
78
|
+
console.log(chalk__default["default"].green("Verified all files."));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
exports.bulkCommand = bulkCommand;
|
|
83
|
+
//# sourceMappingURL=verify-47d1fef6.cjs.js.map
|
package/dist/index.cjs.js
CHANGED
|
@@ -53,10 +53,16 @@ function registerCommands(program) {
|
|
|
53
53
|
"Turn on release tag validation for the public, beta, and alpha APIs"
|
|
54
54
|
).description("Generate an API report for selected packages").action(
|
|
55
55
|
lazy(
|
|
56
|
-
() => Promise.resolve().then(function () { return require('./cjs/api-reports-
|
|
56
|
+
() => Promise.resolve().then(function () { return require('./cjs/api-reports-6ef2363c.cjs.js'); }).then((m) => m.buildApiReports)
|
|
57
57
|
)
|
|
58
58
|
);
|
|
59
59
|
program.command("type-deps").description("Find inconsistencies in types of all packages and plugins").action(lazy(() => Promise.resolve().then(function () { return require('./cjs/type-deps-5eacd931.cjs.js'); }).then((m) => m.default)));
|
|
60
|
+
program.command("schema:openapi:verify [paths...]").description(
|
|
61
|
+
"Verify that all OpenAPI schemas are valid and have a matching `schemas/openapi.ts` file."
|
|
62
|
+
).action(lazy(() => Promise.resolve().then(function () { return require('./cjs/verify-47d1fef6.cjs.js'); }).then((m) => m.bulkCommand)));
|
|
63
|
+
program.command("schema:openapi:generate [paths...]").description(
|
|
64
|
+
"Generates a Typescript file from an OpenAPI yaml spec. For use with the `@backstage/backend-openapi-utils` ApiRouter type."
|
|
65
|
+
).action(lazy(() => Promise.resolve().then(function () { return require('./cjs/generate-d9406b4d.cjs.js'); }).then((m) => m.bulkCommand)));
|
|
60
66
|
}
|
|
61
67
|
function lazy(getActionFunc) {
|
|
62
68
|
return async (...args) => {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/repo-tools",
|
|
3
3
|
"description": "CLI for Backstage repo tooling ",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.2.0-next.2",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"backstage-repo-tools": "bin/backstage-repo-tools"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
+
"@apidevtools/swagger-parser": "^10.1.0",
|
|
33
34
|
"@backstage/cli-common": "^0.1.12",
|
|
34
35
|
"@backstage/errors": "^1.1.5",
|
|
35
36
|
"@manypkg/get-packages": "^1.1.3",
|
|
@@ -40,11 +41,14 @@
|
|
|
40
41
|
"fs-extra": "10.1.0",
|
|
41
42
|
"glob": "^8.0.3",
|
|
42
43
|
"is-glob": "^4.0.3",
|
|
44
|
+
"js-yaml": "^4.1.0",
|
|
45
|
+
"lodash": "^4.17.21",
|
|
43
46
|
"minimatch": "^5.1.1",
|
|
47
|
+
"p-limit": "^3.0.2",
|
|
44
48
|
"ts-node": "^10.0.0"
|
|
45
49
|
},
|
|
46
50
|
"devDependencies": {
|
|
47
|
-
"@backstage/cli": "^0.22.6-next.
|
|
51
|
+
"@backstage/cli": "^0.22.6-next.3",
|
|
48
52
|
"@backstage/types": "^1.0.2",
|
|
49
53
|
"@types/is-glob": "^4.0.2",
|
|
50
54
|
"@types/mock-fs": "^4.13.0",
|