@backstage/repo-tools 0.10.0-next.0 → 0.10.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 +29 -0
- package/dist/{cjs/api-reports-B3Gt_Fej.cjs.js → commands/api-reports/api-extractor.cjs.js} +13 -103
- package/dist/commands/api-reports/api-reports.cjs.js +78 -0
- package/dist/commands/api-reports/generateTypeDeclarations.cjs.js +33 -0
- package/dist/commands/generate-catalog-info/codeowners.cjs.js +42 -0
- package/dist/{cjs/generate-catalog-info-DxKb-9Wh.cjs.js → commands/generate-catalog-info/generate-catalog-info.cjs.js} +22 -68
- package/dist/commands/generate-catalog-info/utils.cjs.js +30 -0
- package/dist/commands/index.cjs.js +159 -0
- package/dist/{cjs/knip-reports-028OuOct.cjs.js → commands/knip-reports/knip-extractor.cjs.js} +4 -40
- package/dist/commands/knip-reports/knip-reports.cjs.js +39 -0
- package/dist/{cjs/lint-legacy-backend-exports-CDxZ51l5.cjs.js → commands/lint-legacy-backend-exports/lint-legacy-backend-exports.cjs.js} +2 -4
- package/dist/{cjs/diff-zt06VUKR.cjs.js → commands/package/schema/openapi/diff.cjs.js} +4 -11
- package/dist/{cjs/fuzz-BGbvHwkB.cjs.js → commands/package/schema/openapi/fuzz.cjs.js} +4 -10
- package/dist/commands/package/schema/openapi/generate/client.cjs.js +86 -0
- package/dist/commands/package/schema/openapi/generate/index.cjs.js +27 -0
- package/dist/commands/package/schema/openapi/generate/server.cjs.js +56 -0
- package/dist/{cjs/init-wsIZc-Ys.cjs.js → commands/package/schema/openapi/init.cjs.js} +5 -11
- package/dist/commands/peer-deps/peer-deps.cjs.js +175 -0
- package/dist/commands/repo/schema/openapi/diff.cjs.js +81 -0
- package/dist/{cjs/fuzz-CRe0ewrD.cjs.js → commands/repo/schema/openapi/fuzz.cjs.js} +2 -4
- package/dist/{cjs/lint-DqMp4VN_.cjs.js → commands/repo/schema/openapi/lint.cjs.js} +3 -11
- package/dist/{cjs/test-5XE2uhir.cjs.js → commands/repo/schema/openapi/test.cjs.js} +6 -13
- package/dist/{cjs/verify-ARmbHOf8.cjs.js → commands/repo/schema/openapi/verify.cjs.js} +5 -10
- package/dist/{cjs/type-deps-DgJcEpV_.cjs.js → commands/type-deps/type-deps.cjs.js} +7 -2
- package/dist/{cjs/util-BhlP_S3V.cjs.js → commands/util.cjs.js} +1 -1
- package/dist/index.cjs.js +7 -186
- package/dist/lib/errors.cjs.js +42 -0
- package/dist/{cjs/exec-C0kCNRgF.cjs.js → lib/exec.cjs.js} +1 -1
- package/dist/{cjs/getPackageExportDetails-FkT40JIH.cjs.js → lib/getPackageExportDetails.cjs.js} +1 -1
- package/dist/{cjs/constants-Dwa51b6l.cjs.js → lib/openapi/constants.cjs.js} +1 -1
- package/dist/{cjs/helpers-ja_ryoK_.cjs.js → lib/openapi/helpers.cjs.js} +5 -3
- package/dist/{cjs/diff-DDkHPBWC.cjs.js → lib/openapi/optic/helpers.cjs.js} +2 -82
- package/dist/{cjs/paths-BvbxdT_S.cjs.js → lib/paths.cjs.js} +2 -1
- package/dist/{cjs/runner-DMC006Gs.cjs.js → lib/runner.cjs.js} +2 -2
- package/dist/package.json.cjs.js +6 -0
- package/package.json +10 -10
- package/dist/cjs/index-zZtTyIMm.cjs.js +0 -145
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,34 @@
|
|
|
1
1
|
# @backstage/repo-tools
|
|
2
2
|
|
|
3
|
+
## 0.10.0-next.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies
|
|
8
|
+
- @backstage/cli-node@0.2.9-next.0
|
|
9
|
+
- @backstage/backend-plugin-api@1.0.1-next.1
|
|
10
|
+
- @backstage/catalog-model@1.7.0
|
|
11
|
+
- @backstage/cli-common@0.1.14
|
|
12
|
+
- @backstage/config-loader@1.9.1
|
|
13
|
+
- @backstage/errors@1.2.4
|
|
14
|
+
|
|
15
|
+
## 0.10.0-next.1
|
|
16
|
+
|
|
17
|
+
### Minor Changes
|
|
18
|
+
|
|
19
|
+
- 8eb3033: Adds a new command `backstage-repo-tools peer-deps` for validating your usage of peer dependencies in your plugins. It currently supports react related peer dependencies. It also has a `--fix` mode for quickly fixing any issues that it finds.
|
|
20
|
+
|
|
21
|
+
### Patch Changes
|
|
22
|
+
|
|
23
|
+
- 1f6706f: Properly log instructions when APIs do not match
|
|
24
|
+
- Updated dependencies
|
|
25
|
+
- @backstage/backend-plugin-api@1.0.1-next.0
|
|
26
|
+
- @backstage/catalog-model@1.7.0
|
|
27
|
+
- @backstage/cli-common@0.1.14
|
|
28
|
+
- @backstage/cli-node@0.2.8
|
|
29
|
+
- @backstage/config-loader@1.9.1
|
|
30
|
+
- @backstage/errors@1.2.4
|
|
31
|
+
|
|
3
32
|
## 0.10.0-next.0
|
|
4
33
|
|
|
5
34
|
### Minor Changes
|
|
@@ -12,15 +12,10 @@ 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 paths = require('
|
|
15
|
+
var paths = require('../../lib/paths.cjs.js');
|
|
16
16
|
var minimatch = require('minimatch');
|
|
17
|
-
var getPackageExportDetails = require('
|
|
18
|
-
var util = require('
|
|
19
|
-
var child_process = require('child_process');
|
|
20
|
-
require('@backstage/cli-common');
|
|
21
|
-
require('@backstage/cli-node');
|
|
22
|
-
require('os');
|
|
23
|
-
require('p-limit');
|
|
17
|
+
var getPackageExportDetails = require('../../lib/getPackageExportDetails.cjs.js');
|
|
18
|
+
var util = require('../util.cjs.js');
|
|
24
19
|
|
|
25
20
|
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
26
21
|
|
|
@@ -344,11 +339,11 @@ async function runApiExtraction({
|
|
|
344
339
|
shouldLogInstructions = true;
|
|
345
340
|
}
|
|
346
341
|
if (message.text.includes(
|
|
347
|
-
"You have changed the
|
|
342
|
+
"You have changed the API signature for this project."
|
|
348
343
|
)) {
|
|
349
344
|
shouldLogInstructions = true;
|
|
350
345
|
const match = message.text.match(
|
|
351
|
-
/Please copy the file "(.*)" to "
|
|
346
|
+
/Please copy the file "(.*)" to "report\.api\.md"/
|
|
352
347
|
);
|
|
353
348
|
if (match) {
|
|
354
349
|
conflictingFile = match[1];
|
|
@@ -1036,96 +1031,11 @@ async function runCliExtraction({
|
|
|
1036
1031
|
}
|
|
1037
1032
|
}
|
|
1038
1033
|
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
["--incremental", "false"]
|
|
1048
|
-
].flat(),
|
|
1049
|
-
{
|
|
1050
|
-
stdio: "inherit",
|
|
1051
|
-
shell: true,
|
|
1052
|
-
cwd: paths.paths.targetRoot
|
|
1053
|
-
}
|
|
1054
|
-
);
|
|
1055
|
-
if (status !== 0) {
|
|
1056
|
-
process.exit(status || void 0);
|
|
1057
|
-
}
|
|
1058
|
-
}
|
|
1059
|
-
|
|
1060
|
-
const buildApiReports = async (paths$1 = [], opts) => {
|
|
1061
|
-
const tmpDir = paths.paths.resolveTargetRoot(
|
|
1062
|
-
"./node_modules/.cache/api-extractor"
|
|
1063
|
-
);
|
|
1064
|
-
const isCiBuild = opts.ci;
|
|
1065
|
-
const isDocsBuild = opts.docs;
|
|
1066
|
-
const runTsc = opts.tsc;
|
|
1067
|
-
const allowWarnings = parseArrayOption(opts.allowWarnings);
|
|
1068
|
-
const allowAllWarnings = opts.allowAllWarnings;
|
|
1069
|
-
const omitMessages = parseArrayOption(opts.omitMessages);
|
|
1070
|
-
const isAllPackages = !paths$1?.length;
|
|
1071
|
-
const selectedPackageDirs = await paths.resolvePackagePaths({
|
|
1072
|
-
paths: paths$1,
|
|
1073
|
-
include: opts.include,
|
|
1074
|
-
exclude: opts.exclude
|
|
1075
|
-
});
|
|
1076
|
-
if (isAllPackages && !isCiBuild && !isDocsBuild) {
|
|
1077
|
-
console.log("");
|
|
1078
|
-
console.log(
|
|
1079
|
-
"TIP: You can generate api-reports for select packages by passing package paths:"
|
|
1080
|
-
);
|
|
1081
|
-
console.log("");
|
|
1082
|
-
console.log(
|
|
1083
|
-
" yarn build:api-reports packages/config packages/core-plugin-api plugins/*"
|
|
1084
|
-
);
|
|
1085
|
-
console.log("");
|
|
1086
|
-
}
|
|
1087
|
-
let temporaryTsConfigPath;
|
|
1088
|
-
if (!isAllPackages) {
|
|
1089
|
-
temporaryTsConfigPath = await createTemporaryTsConfig(selectedPackageDirs);
|
|
1090
|
-
}
|
|
1091
|
-
const tsconfigFilePath = temporaryTsConfigPath ?? paths.paths.resolveTargetRoot("tsconfig.json");
|
|
1092
|
-
if (runTsc) {
|
|
1093
|
-
console.log("# Compiling TypeScript");
|
|
1094
|
-
await generateTypeDeclarations(tsconfigFilePath);
|
|
1095
|
-
}
|
|
1096
|
-
const { tsPackageDirs, cliPackageDirs } = await categorizePackageDirs(
|
|
1097
|
-
selectedPackageDirs
|
|
1098
|
-
);
|
|
1099
|
-
if (tsPackageDirs.length > 0) {
|
|
1100
|
-
console.log("# Generating package API reports");
|
|
1101
|
-
await runApiExtraction({
|
|
1102
|
-
packageDirs: tsPackageDirs,
|
|
1103
|
-
outputDir: tmpDir,
|
|
1104
|
-
isLocalBuild: !isCiBuild,
|
|
1105
|
-
tsconfigFilePath,
|
|
1106
|
-
allowWarnings: allowAllWarnings || allowWarnings,
|
|
1107
|
-
omitMessages: Array.isArray(omitMessages) ? omitMessages : [],
|
|
1108
|
-
validateReleaseTags: opts.validateReleaseTags
|
|
1109
|
-
});
|
|
1110
|
-
}
|
|
1111
|
-
if (cliPackageDirs.length > 0) {
|
|
1112
|
-
console.log("# Generating package CLI reports");
|
|
1113
|
-
await runCliExtraction({
|
|
1114
|
-
packageDirs: cliPackageDirs,
|
|
1115
|
-
isLocalBuild: !isCiBuild
|
|
1116
|
-
});
|
|
1117
|
-
}
|
|
1118
|
-
if (isDocsBuild) {
|
|
1119
|
-
console.log("# Generating package documentation");
|
|
1120
|
-
await buildDocs({
|
|
1121
|
-
inputDir: tmpDir,
|
|
1122
|
-
outputDir: paths.paths.resolveTargetRoot("docs/reference")
|
|
1123
|
-
});
|
|
1124
|
-
}
|
|
1125
|
-
};
|
|
1126
|
-
function parseArrayOption(value) {
|
|
1127
|
-
return value ? value.split(",").map((s) => s.trim()) : [];
|
|
1128
|
-
}
|
|
1129
|
-
|
|
1130
|
-
exports.buildApiReports = buildApiReports;
|
|
1131
|
-
//# sourceMappingURL=api-reports-B3Gt_Fej.cjs.js.map
|
|
1034
|
+
exports.buildDocs = buildDocs;
|
|
1035
|
+
exports.categorizePackageDirs = categorizePackageDirs;
|
|
1036
|
+
exports.countApiReportWarnings = countApiReportWarnings;
|
|
1037
|
+
exports.createTemporaryTsConfig = createTemporaryTsConfig;
|
|
1038
|
+
exports.getTsDocConfig = getTsDocConfig;
|
|
1039
|
+
exports.runApiExtraction = runApiExtraction;
|
|
1040
|
+
exports.runCliExtraction = runCliExtraction;
|
|
1041
|
+
//# sourceMappingURL=api-extractor.cjs.js.map
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var apiExtractor = require('./api-extractor.cjs.js');
|
|
4
|
+
var paths = require('../../lib/paths.cjs.js');
|
|
5
|
+
var generateTypeDeclarations = require('./generateTypeDeclarations.cjs.js');
|
|
6
|
+
|
|
7
|
+
const buildApiReports = async (paths$1 = [], opts) => {
|
|
8
|
+
const tmpDir = paths.paths.resolveTargetRoot(
|
|
9
|
+
"./node_modules/.cache/api-extractor"
|
|
10
|
+
);
|
|
11
|
+
const isCiBuild = opts.ci;
|
|
12
|
+
const isDocsBuild = opts.docs;
|
|
13
|
+
const runTsc = opts.tsc;
|
|
14
|
+
const allowWarnings = parseArrayOption(opts.allowWarnings);
|
|
15
|
+
const allowAllWarnings = opts.allowAllWarnings;
|
|
16
|
+
const omitMessages = parseArrayOption(opts.omitMessages);
|
|
17
|
+
const isAllPackages = !paths$1?.length;
|
|
18
|
+
const selectedPackageDirs = await paths.resolvePackagePaths({
|
|
19
|
+
paths: paths$1,
|
|
20
|
+
include: opts.include,
|
|
21
|
+
exclude: opts.exclude
|
|
22
|
+
});
|
|
23
|
+
if (isAllPackages && !isCiBuild && !isDocsBuild) {
|
|
24
|
+
console.log("");
|
|
25
|
+
console.log(
|
|
26
|
+
"TIP: You can generate api-reports for select packages by passing package paths:"
|
|
27
|
+
);
|
|
28
|
+
console.log("");
|
|
29
|
+
console.log(
|
|
30
|
+
" yarn build:api-reports packages/config packages/core-plugin-api plugins/*"
|
|
31
|
+
);
|
|
32
|
+
console.log("");
|
|
33
|
+
}
|
|
34
|
+
let temporaryTsConfigPath;
|
|
35
|
+
if (!isAllPackages) {
|
|
36
|
+
temporaryTsConfigPath = await apiExtractor.createTemporaryTsConfig(selectedPackageDirs);
|
|
37
|
+
}
|
|
38
|
+
const tsconfigFilePath = temporaryTsConfigPath ?? paths.paths.resolveTargetRoot("tsconfig.json");
|
|
39
|
+
if (runTsc) {
|
|
40
|
+
console.log("# Compiling TypeScript");
|
|
41
|
+
await generateTypeDeclarations.generateTypeDeclarations(tsconfigFilePath);
|
|
42
|
+
}
|
|
43
|
+
const { tsPackageDirs, cliPackageDirs } = await apiExtractor.categorizePackageDirs(
|
|
44
|
+
selectedPackageDirs
|
|
45
|
+
);
|
|
46
|
+
if (tsPackageDirs.length > 0) {
|
|
47
|
+
console.log("# Generating package API reports");
|
|
48
|
+
await apiExtractor.runApiExtraction({
|
|
49
|
+
packageDirs: tsPackageDirs,
|
|
50
|
+
outputDir: tmpDir,
|
|
51
|
+
isLocalBuild: !isCiBuild,
|
|
52
|
+
tsconfigFilePath,
|
|
53
|
+
allowWarnings: allowAllWarnings || allowWarnings,
|
|
54
|
+
omitMessages: Array.isArray(omitMessages) ? omitMessages : [],
|
|
55
|
+
validateReleaseTags: opts.validateReleaseTags
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
if (cliPackageDirs.length > 0) {
|
|
59
|
+
console.log("# Generating package CLI reports");
|
|
60
|
+
await apiExtractor.runCliExtraction({
|
|
61
|
+
packageDirs: cliPackageDirs,
|
|
62
|
+
isLocalBuild: !isCiBuild
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
if (isDocsBuild) {
|
|
66
|
+
console.log("# Generating package documentation");
|
|
67
|
+
await apiExtractor.buildDocs({
|
|
68
|
+
inputDir: tmpDir,
|
|
69
|
+
outputDir: paths.paths.resolveTargetRoot("docs/reference")
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
function parseArrayOption(value) {
|
|
74
|
+
return value ? value.split(",").map((s) => s.trim()) : [];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
exports.buildApiReports = buildApiReports;
|
|
78
|
+
//# sourceMappingURL=api-reports.cjs.js.map
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var fs = require('fs-extra');
|
|
4
|
+
var child_process = require('child_process');
|
|
5
|
+
var paths = require('../../lib/paths.cjs.js');
|
|
6
|
+
|
|
7
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
|
|
10
|
+
|
|
11
|
+
async function generateTypeDeclarations(tsconfigFilePath) {
|
|
12
|
+
await fs__default.default.remove(paths.paths.resolveTargetRoot("dist-types"));
|
|
13
|
+
const { status } = child_process.spawnSync(
|
|
14
|
+
"yarn",
|
|
15
|
+
[
|
|
16
|
+
"tsc",
|
|
17
|
+
["--project", tsconfigFilePath],
|
|
18
|
+
["--skipLibCheck", "false"],
|
|
19
|
+
["--incremental", "false"]
|
|
20
|
+
].flat(),
|
|
21
|
+
{
|
|
22
|
+
stdio: "inherit",
|
|
23
|
+
shell: true,
|
|
24
|
+
cwd: paths.paths.targetRoot
|
|
25
|
+
}
|
|
26
|
+
);
|
|
27
|
+
if (status !== 0) {
|
|
28
|
+
process.exit(status || void 0);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
exports.generateTypeDeclarations = generateTypeDeclarations;
|
|
33
|
+
//# sourceMappingURL=generateTypeDeclarations.cjs.js.map
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var codeownersUtils = require('codeowners-utils');
|
|
4
|
+
var path = require('path');
|
|
5
|
+
var utils = require('./utils.cjs.js');
|
|
6
|
+
|
|
7
|
+
async function loadCodeowners() {
|
|
8
|
+
const maybeFiles = await Promise.allSettled(
|
|
9
|
+
codeownersUtils.CODEOWNERS_PATHS.map(
|
|
10
|
+
async (path$1) => utils.readFile(path.resolve(".", path$1), { encoding: "utf-8" })
|
|
11
|
+
)
|
|
12
|
+
);
|
|
13
|
+
const file = maybeFiles.find(
|
|
14
|
+
(maybeFile) => maybeFile.status === "fulfilled"
|
|
15
|
+
);
|
|
16
|
+
if (!file) {
|
|
17
|
+
throw new Error(
|
|
18
|
+
"This utility expects a CODEOWNERS file, but no such file was found."
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
return codeownersUtils.parse(file.value);
|
|
22
|
+
}
|
|
23
|
+
function getPossibleCodeowners(codeowners, relPath) {
|
|
24
|
+
const codeownerMaybe = codeownersUtils.matchFile(relPath, codeowners);
|
|
25
|
+
return codeownerMaybe ? codeownerMaybe.owners.map(
|
|
26
|
+
(owner) => (owner.match(/(?:\@[^\/]+\/)?([^\@\/]*)$/) || [])[1]
|
|
27
|
+
) : [];
|
|
28
|
+
}
|
|
29
|
+
function getOwnerFromCodeowners(codeowners, absPath) {
|
|
30
|
+
const relPath = path.relative(".", absPath);
|
|
31
|
+
const possibleOwners = getPossibleCodeowners(codeowners, relPath);
|
|
32
|
+
const owner = possibleOwners[0];
|
|
33
|
+
if (!owner) {
|
|
34
|
+
throw new Error(`${relPath} isn't owned by anyone in CODEOWNERS`);
|
|
35
|
+
}
|
|
36
|
+
return owner;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
exports.getOwnerFromCodeowners = getOwnerFromCodeowners;
|
|
40
|
+
exports.getPossibleCodeowners = getPossibleCodeowners;
|
|
41
|
+
exports.loadCodeowners = loadCodeowners;
|
|
42
|
+
//# sourceMappingURL=codeowners.cjs.js.map
|
|
@@ -1,91 +1,45 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
3
5
|
var YAML = require('js-yaml');
|
|
4
6
|
var pLimit = require('p-limit');
|
|
5
7
|
var path = require('path');
|
|
6
8
|
var yamlDiffPatch = require('yaml-diff-patch');
|
|
7
9
|
var chalk = require('chalk');
|
|
8
10
|
var cliNode = require('@backstage/cli-node');
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var util = require('util');
|
|
11
|
+
var codeowners = require('./codeowners.cjs.js');
|
|
12
|
+
var utils = require('./utils.cjs.js');
|
|
12
13
|
|
|
13
14
|
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
14
15
|
|
|
15
16
|
var YAML__default = /*#__PURE__*/_interopDefaultCompat(YAML);
|
|
16
17
|
var pLimit__default = /*#__PURE__*/_interopDefaultCompat(pLimit);
|
|
17
18
|
var chalk__default = /*#__PURE__*/_interopDefaultCompat(chalk);
|
|
18
|
-
var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
|
|
19
|
-
|
|
20
|
-
const readFile = util.promisify(fs__default.default.readFile);
|
|
21
|
-
const writeFile = util.promisify(fs__default.default.writeFile);
|
|
22
|
-
function isBackstagePackage(packageJson) {
|
|
23
|
-
return packageJson && packageJson.hasOwnProperty("backstage") && packageJson?.backstage?.role !== "undefined";
|
|
24
|
-
}
|
|
25
|
-
const isRejected = (input) => input.status === "rejected";
|
|
26
|
-
const isFulfilled = (input) => input.status === "fulfilled";
|
|
27
|
-
const safeEntityName = (packageName) => {
|
|
28
|
-
return packageName.replace(/^[^\w\s]|[^a-z0-9]$/g, "").replace(/[^A-Za-z0-9_\-.]+/g, "-").replace(
|
|
29
|
-
/([a-z])([A-Z])/g,
|
|
30
|
-
(_, a, b) => `${a}-${b.toLocaleLowerCase("en-US")}`
|
|
31
|
-
).replace(/^(.)/, (_, a) => a.toLocaleLowerCase("en-US"));
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
async function loadCodeowners() {
|
|
35
|
-
const maybeFiles = await Promise.allSettled(
|
|
36
|
-
codeownersUtils.CODEOWNERS_PATHS.map(
|
|
37
|
-
async (path$1) => readFile(path.resolve(".", path$1), { encoding: "utf-8" })
|
|
38
|
-
)
|
|
39
|
-
);
|
|
40
|
-
const file = maybeFiles.find(
|
|
41
|
-
(maybeFile) => maybeFile.status === "fulfilled"
|
|
42
|
-
);
|
|
43
|
-
if (!file) {
|
|
44
|
-
throw new Error(
|
|
45
|
-
"This utility expects a CODEOWNERS file, but no such file was found."
|
|
46
|
-
);
|
|
47
|
-
}
|
|
48
|
-
return codeownersUtils.parse(file.value);
|
|
49
|
-
}
|
|
50
|
-
function getPossibleCodeowners(codeowners, relPath) {
|
|
51
|
-
const codeownerMaybe = codeownersUtils.matchFile(relPath, codeowners);
|
|
52
|
-
return codeownerMaybe ? codeownerMaybe.owners.map(
|
|
53
|
-
(owner) => (owner.match(/(?:\@[^\/]+\/)?([^\@\/]*)$/) || [])[1]
|
|
54
|
-
) : [];
|
|
55
|
-
}
|
|
56
|
-
function getOwnerFromCodeowners(codeowners, absPath) {
|
|
57
|
-
const relPath = path.relative(".", absPath);
|
|
58
|
-
const possibleOwners = getPossibleCodeowners(codeowners, relPath);
|
|
59
|
-
const owner = possibleOwners[0];
|
|
60
|
-
if (!owner) {
|
|
61
|
-
throw new Error(`${relPath} isn't owned by anyone in CODEOWNERS`);
|
|
62
|
-
}
|
|
63
|
-
return owner;
|
|
64
|
-
}
|
|
65
19
|
|
|
66
20
|
var generateCatalogInfo = async (opts) => {
|
|
67
21
|
const { dryRun = false, ci = false } = opts;
|
|
68
22
|
const packages = await cliNode.PackageGraph.listTargetPackages();
|
|
69
|
-
const codeowners = await loadCodeowners();
|
|
23
|
+
const codeowners$1 = await codeowners.loadCodeowners();
|
|
70
24
|
const limit = pLimit__default.default(10);
|
|
71
25
|
const isDryRun = ci ? true : dryRun;
|
|
72
26
|
const checkForChanges = ci;
|
|
73
27
|
const results = await Promise.allSettled(
|
|
74
28
|
packages.map(
|
|
75
29
|
({ packageJson, dir }) => limit(async () => {
|
|
76
|
-
if (!isBackstagePackage(packageJson)) {
|
|
30
|
+
if (!utils.isBackstagePackage(packageJson)) {
|
|
77
31
|
return "";
|
|
78
32
|
}
|
|
79
33
|
const infoYamlPath = path.resolve(dir, "catalog-info.yaml");
|
|
80
34
|
let yamlString = "";
|
|
81
35
|
try {
|
|
82
|
-
yamlString = await readFile(infoYamlPath, { encoding: "utf-8" });
|
|
36
|
+
yamlString = await utils.readFile(infoYamlPath, { encoding: "utf-8" });
|
|
83
37
|
} catch (e) {
|
|
84
38
|
if (e.code === "ENOENT") {
|
|
85
39
|
return await createCatalogInfoYaml({
|
|
86
40
|
yamlPath: infoYamlPath,
|
|
87
41
|
packageJson,
|
|
88
|
-
codeowners,
|
|
42
|
+
codeowners: codeowners$1,
|
|
89
43
|
dryRun: isDryRun
|
|
90
44
|
});
|
|
91
45
|
}
|
|
@@ -94,7 +48,7 @@ var generateCatalogInfo = async (opts) => {
|
|
|
94
48
|
return await fixCatalogInfoYaml({
|
|
95
49
|
yamlPath: infoYamlPath,
|
|
96
50
|
packageJson,
|
|
97
|
-
codeowners,
|
|
51
|
+
codeowners: codeowners$1,
|
|
98
52
|
yamlString,
|
|
99
53
|
dryRun: isDryRun,
|
|
100
54
|
ci
|
|
@@ -102,7 +56,7 @@ var generateCatalogInfo = async (opts) => {
|
|
|
102
56
|
})
|
|
103
57
|
)
|
|
104
58
|
);
|
|
105
|
-
const rejects = results.filter(isRejected);
|
|
59
|
+
const rejects = results.filter(utils.isRejected);
|
|
106
60
|
if (rejects.length > 0) {
|
|
107
61
|
console.error(
|
|
108
62
|
chalk__default.default.red("Unable to create or fix catalog-info.yaml files\n")
|
|
@@ -112,7 +66,7 @@ var generateCatalogInfo = async (opts) => {
|
|
|
112
66
|
process.exit(1);
|
|
113
67
|
}
|
|
114
68
|
if (checkForChanges) {
|
|
115
|
-
const instructions = results.filter(isFulfilled).map((r) => r.value).filter((r) => r !== "");
|
|
69
|
+
const instructions = results.filter(utils.isFulfilled).map((r) => r.value).filter((r) => r !== "");
|
|
116
70
|
if (instructions.length > 0) {
|
|
117
71
|
console.error(
|
|
118
72
|
"\ncatalog-info.yaml file(s) out of sync with CODEOWNERS and/or package.json (see instructions above)\n"
|
|
@@ -126,24 +80,24 @@ var generateCatalogInfo = async (opts) => {
|
|
|
126
80
|
}
|
|
127
81
|
};
|
|
128
82
|
async function createCatalogInfoYaml(options) {
|
|
129
|
-
const { codeowners, dryRun, packageJson, yamlPath } = options;
|
|
83
|
+
const { codeowners: codeowners$1, dryRun, packageJson, yamlPath } = options;
|
|
130
84
|
const instruction = `Create ${path.relative(".", yamlPath)}`;
|
|
131
|
-
const owner = getOwnerFromCodeowners(codeowners, yamlPath);
|
|
85
|
+
const owner = codeowners.getOwnerFromCodeowners(codeowners$1, yamlPath);
|
|
132
86
|
const entity = createOrMergeEntity(packageJson, owner);
|
|
133
87
|
if (dryRun) {
|
|
134
88
|
console.error(instruction);
|
|
135
89
|
} else {
|
|
136
|
-
await writeFile(yamlPath, YAML__default.default.dump(entity));
|
|
90
|
+
await utils.writeFile(yamlPath, YAML__default.default.dump(entity));
|
|
137
91
|
}
|
|
138
92
|
return instruction;
|
|
139
93
|
}
|
|
140
94
|
async function fixCatalogInfoYaml(options) {
|
|
141
|
-
const { ci, codeowners, dryRun, packageJson, yamlPath, yamlString } = options;
|
|
142
|
-
const possibleOwners = getPossibleCodeowners(
|
|
143
|
-
codeowners,
|
|
95
|
+
const { ci, codeowners: codeowners$1, dryRun, packageJson, yamlPath, yamlString } = options;
|
|
96
|
+
const possibleOwners = codeowners.getPossibleCodeowners(
|
|
97
|
+
codeowners$1,
|
|
144
98
|
path.relative(".", yamlPath)
|
|
145
99
|
);
|
|
146
|
-
const safeName = safeEntityName(packageJson.name);
|
|
100
|
+
const safeName = utils.safeEntityName(packageJson.name);
|
|
147
101
|
let yamlJson;
|
|
148
102
|
try {
|
|
149
103
|
yamlJson = YAML__default.default.load(yamlString);
|
|
@@ -155,7 +109,7 @@ async function fixCatalogInfoYaml(options) {
|
|
|
155
109
|
const badName = yamlJson.metadata.name !== safeName;
|
|
156
110
|
const badType = yamlJson.spec?.type !== `backstage-${packageJson.backstage.role}`;
|
|
157
111
|
if (badOwner || badTitle || badName || badType) {
|
|
158
|
-
const owner = badOwner ? getOwnerFromCodeowners(codeowners, yamlPath) : yamlJson.spec?.owner;
|
|
112
|
+
const owner = badOwner ? codeowners.getOwnerFromCodeowners(codeowners$1, yamlPath) : yamlJson.spec?.owner;
|
|
159
113
|
const newJson = createOrMergeEntity(packageJson, owner, yamlJson);
|
|
160
114
|
const instructions = [`Update ${path.relative(".", yamlPath)}`];
|
|
161
115
|
if (ci) {
|
|
@@ -185,14 +139,14 @@ async function fixCatalogInfoYaml(options) {
|
|
|
185
139
|
if (dryRun) {
|
|
186
140
|
console.error(instructions.join("\n"));
|
|
187
141
|
} else {
|
|
188
|
-
await writeFile(yamlPath, yamlDiffPatch.yamlOverwrite(yamlString, newJson));
|
|
142
|
+
await utils.writeFile(yamlPath, yamlDiffPatch.yamlOverwrite(yamlString, newJson));
|
|
189
143
|
}
|
|
190
144
|
return instructions.join("\n");
|
|
191
145
|
}
|
|
192
146
|
return "";
|
|
193
147
|
}
|
|
194
148
|
function createOrMergeEntity(packageJson, owner, existingEntity = {}) {
|
|
195
|
-
const entityName = safeEntityName(packageJson.name);
|
|
149
|
+
const entityName = utils.safeEntityName(packageJson.name);
|
|
196
150
|
return {
|
|
197
151
|
...existingEntity,
|
|
198
152
|
apiVersion: "backstage.io/v1alpha1",
|
|
@@ -214,4 +168,4 @@ function createOrMergeEntity(packageJson, owner, existingEntity = {}) {
|
|
|
214
168
|
}
|
|
215
169
|
|
|
216
170
|
exports.default = generateCatalogInfo;
|
|
217
|
-
//# sourceMappingURL=generate-catalog-info
|
|
171
|
+
//# sourceMappingURL=generate-catalog-info.cjs.js.map
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var fs = require('fs');
|
|
4
|
+
var util = require('util');
|
|
5
|
+
|
|
6
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
|
|
9
|
+
|
|
10
|
+
const readFile = util.promisify(fs__default.default.readFile);
|
|
11
|
+
const writeFile = util.promisify(fs__default.default.writeFile);
|
|
12
|
+
function isBackstagePackage(packageJson) {
|
|
13
|
+
return packageJson && packageJson.hasOwnProperty("backstage") && packageJson?.backstage?.role !== "undefined";
|
|
14
|
+
}
|
|
15
|
+
const isRejected = (input) => input.status === "rejected";
|
|
16
|
+
const isFulfilled = (input) => input.status === "fulfilled";
|
|
17
|
+
const safeEntityName = (packageName) => {
|
|
18
|
+
return packageName.replace(/^[^\w\s]|[^a-z0-9]$/g, "").replace(/[^A-Za-z0-9_\-.]+/g, "-").replace(
|
|
19
|
+
/([a-z])([A-Z])/g,
|
|
20
|
+
(_, a, b) => `${a}-${b.toLocaleLowerCase("en-US")}`
|
|
21
|
+
).replace(/^(.)/, (_, a) => a.toLocaleLowerCase("en-US"));
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
exports.isBackstagePackage = isBackstagePackage;
|
|
25
|
+
exports.isFulfilled = isFulfilled;
|
|
26
|
+
exports.isRejected = isRejected;
|
|
27
|
+
exports.readFile = readFile;
|
|
28
|
+
exports.safeEntityName = safeEntityName;
|
|
29
|
+
exports.writeFile = writeFile;
|
|
30
|
+
//# sourceMappingURL=utils.cjs.js.map
|