@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 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 cliCommon = require('@backstage/cli-common');
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 selectedPaths = isAllPackages ? await getWorkspacePackagePathPatterns() : paths$1;
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-f39f7b2c.cjs.js.map
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-f39f7b2c.cjs.js'); }).then((m) => m.buildApiReports)
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.1.4-next.1",
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.1",
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",