@backstage/cli 0.35.2-next.1 → 0.35.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,19 @@
1
1
  # @backstage/cli
2
2
 
3
+ ## 0.35.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 320c6a9: Bump `@swc/core` to support `ES2023` and `ES2024`
8
+ - c0d7bf6: Added `--include` and `--format` options to `backstage-cli info` command for including additional packages via glob patterns and outputting as JSON or Text.
9
+ - f6a5d2f: Fixed CSS module class name collisions when running multiple versions of packages simultaneously by using content-based hashing for class name generation.
10
+ - 140cbc2: Added `@backstage/backend-test-utils` to backend package templates.
11
+ - 4eeba9e: Upgrade `zod-validation-error` to version 4
12
+ - 9ee5996: Bump minimum required `@swc/core` to avoid transpilation bug
13
+ - Updated dependencies
14
+ - @backstage/cli-common@0.1.17
15
+ - @backstage/integration@1.19.2
16
+
3
17
  ## 0.35.2-next.1
4
18
 
5
19
  ### Patch Changes
@@ -2,6 +2,7 @@
2
2
 
3
3
  var chalk = require('chalk');
4
4
  var fs = require('fs-extra');
5
+ var crypto = require('crypto');
5
6
  var path = require('path');
6
7
  var commonjs = require('@rollup/plugin-commonjs');
7
8
  var resolve = require('@rollup/plugin-node-resolve');
@@ -179,7 +180,15 @@ async function makeRollupConfigs(options) {
179
180
  include: /node_modules/,
180
181
  exclude: [/\/[^/]+\.(?:stories|test)\.[^/]+$/]
181
182
  }),
182
- postcss__default.default(),
183
+ postcss__default.default({
184
+ modules: {
185
+ generateScopedName(name, filename, css) {
186
+ const hash = crypto.createHash("md5").update(css).digest("hex").slice(0, 10);
187
+ const file = path.basename(filename, ".module.css");
188
+ return `${file}_${name}__${hash}`;
189
+ }
190
+ }
191
+ }),
183
192
  plugins.forwardFileImports({
184
193
  exclude: /\.icon\.svg$/,
185
194
  include: [
@@ -7,9 +7,10 @@ var os = require('os');
7
7
  var cliCommon = require('@backstage/cli-common');
8
8
  var paths = require('../../../lib/paths.cjs.js');
9
9
  var Lockfile = require('../../../lib/versioning/Lockfile.cjs.js');
10
- require('minimatch');
10
+ var minimatch = require('minimatch');
11
11
  require('@manypkg/get-packages');
12
12
  require('@backstage/errors');
13
+ var cliNode = require('@backstage/cli-node');
13
14
  var fs = require('fs-extra');
14
15
 
15
16
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
@@ -17,7 +18,20 @@ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'defau
17
18
  var os__default = /*#__PURE__*/_interopDefaultCompat(os);
18
19
  var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
19
20
 
20
- var info = async () => {
21
+ function tryReadPackageJson(packageName, targetPath) {
22
+ try {
23
+ return require(require.resolve(`${packageName}/package.json`, {
24
+ paths: [targetPath]
25
+ }));
26
+ } catch {
27
+ return void 0;
28
+ }
29
+ }
30
+ function hasBackstageField(packageName, targetPath) {
31
+ const pkg = tryReadPackageJson(packageName, targetPath);
32
+ return pkg?.backstage !== void 0;
33
+ }
34
+ var info = async (options) => {
21
35
  await new Promise(async () => {
22
36
  const yarnVersion = await cliCommon.runOutput(["yarn", "--version"]);
23
37
  const isLocal = fs__default.default.existsSync(paths.paths.resolveOwn("./src"));
@@ -28,24 +42,119 @@ var info = async () => {
28
42
  const backstageJson = await fs__default.default.readJSON(backstageFile);
29
43
  backstageVersion = backstageJson.version ?? "N/A";
30
44
  } catch (error) {
31
- console.warn('The "backstage.json" file is not in the expected format');
32
- console.log();
45
+ if (options.format !== "json") {
46
+ console.warn(
47
+ 'The "backstage.json" file is not in the expected format'
48
+ );
49
+ console.log();
50
+ }
33
51
  }
34
52
  }
35
- console.log(`OS: ${os__default.default.type} ${os__default.default.release} - ${os__default.default.platform}/${os__default.default.arch}`);
36
- console.log(`node: ${process.version}`);
37
- console.log(`yarn: ${yarnVersion}`);
53
+ const systemInfo = {
54
+ os: `${os__default.default.type} ${os__default.default.release} - ${os__default.default.platform}/${os__default.default.arch}`,
55
+ node: process.version,
56
+ yarn: yarnVersion,
57
+ cli: { version: _package.version, local: isLocal },
58
+ backstage: backstageVersion
59
+ };
60
+ const lockfilePath = paths.paths.resolveTargetRoot("yarn.lock");
61
+ const lockfile = await Lockfile.Lockfile.load(lockfilePath);
62
+ const targetPath = paths.paths.targetRoot;
63
+ const workspacePackages = /* @__PURE__ */ new Map();
64
+ try {
65
+ const packages = await cliNode.PackageGraph.listTargetPackages();
66
+ for (const pkg of packages) {
67
+ workspacePackages.set(pkg.packageJson.name, pkg.packageJson.version);
68
+ }
69
+ } catch {
70
+ }
71
+ const allPackages = [...lockfile.keys()];
72
+ const includePatterns = options.include || [];
73
+ const installedDeps = /* @__PURE__ */ new Set();
74
+ const localDeps = /* @__PURE__ */ new Set();
75
+ for (const pkg of allPackages) {
76
+ if (pkg.startsWith("@backstage/")) {
77
+ if (workspacePackages.has(pkg)) {
78
+ localDeps.add(pkg);
79
+ } else {
80
+ installedDeps.add(pkg);
81
+ }
82
+ }
83
+ }
84
+ for (const pattern of includePatterns) {
85
+ for (const pkg of allPackages) {
86
+ if (minimatch.minimatch(pkg, pattern)) {
87
+ if (workspacePackages.has(pkg)) {
88
+ localDeps.add(pkg);
89
+ } else {
90
+ installedDeps.add(pkg);
91
+ }
92
+ }
93
+ }
94
+ }
95
+ for (const pkg of allPackages) {
96
+ if (pkg.startsWith("@backstage/")) {
97
+ continue;
98
+ }
99
+ if (workspacePackages.has(pkg)) {
100
+ if (hasBackstageField(pkg, targetPath)) {
101
+ localDeps.add(pkg);
102
+ }
103
+ } else if (hasBackstageField(pkg, targetPath)) {
104
+ installedDeps.add(pkg);
105
+ }
106
+ }
107
+ const getVersions = (dep) => {
108
+ const entries = lockfile.get(dep);
109
+ if (!entries) {
110
+ return [{ version: "unknown" }];
111
+ }
112
+ const versions = [...new Set(entries.map((i) => i.version))];
113
+ return versions.map((v) => ({ version: v }));
114
+ };
115
+ const sortedInstalled = [...installedDeps].sort();
116
+ const sortedLocal = [...localDeps].sort();
117
+ if (options.format === "json") {
118
+ const output = {
119
+ system: systemInfo,
120
+ dependencies: Object.fromEntries(
121
+ sortedInstalled.map((dep) => [dep, getVersions(dep)])
122
+ ),
123
+ local: Object.fromEntries(
124
+ sortedLocal.map((dep) => [
125
+ dep,
126
+ [{ version: workspacePackages.get(dep) ?? "unknown" }]
127
+ ])
128
+ )
129
+ };
130
+ process.stdout.write(`${JSON.stringify(output, null, 2)}
131
+ `);
132
+ return;
133
+ }
134
+ console.log(`OS: ${systemInfo.os}`);
135
+ console.log(`node: ${systemInfo.node}`);
136
+ console.log(`yarn: ${systemInfo.yarn}`);
38
137
  console.log(`cli: ${_package.version} (${isLocal ? "local" : "installed"})`);
39
138
  console.log(`backstage: ${backstageVersion}`);
40
139
  console.log();
41
140
  console.log("Dependencies:");
42
- const lockfilePath = paths.paths.resolveTargetRoot("yarn.lock");
43
- const lockfile = await Lockfile.Lockfile.load(lockfilePath);
44
- const deps = [...lockfile.keys()].filter((n) => n.startsWith("@backstage/"));
45
- const maxLength = Math.max(...deps.map((d) => d.length));
46
- for (const dep of deps) {
47
- const versions = new Set(lockfile.get(dep).map((i) => i.version));
48
- console.log(` ${dep.padEnd(maxLength)} ${[...versions].join(", ")}`);
141
+ if (sortedInstalled.length > 0) {
142
+ const maxLength = Math.max(...sortedInstalled.map((d) => d.length));
143
+ for (const dep of sortedInstalled) {
144
+ const versions = getVersions(dep).map((v) => v.version).join(", ");
145
+ console.log(` ${dep.padEnd(maxLength)} ${versions}`);
146
+ }
147
+ } else {
148
+ console.log(" (no installed Backstage packages found)");
149
+ }
150
+ if (localDeps.size > 0) {
151
+ console.log();
152
+ console.log("Local:");
153
+ const maxLength = Math.max(...sortedLocal.map((d) => d.length));
154
+ for (const dep of sortedLocal) {
155
+ const version = workspacePackages.get(dep) ?? "unknown";
156
+ console.log(` ${dep.padEnd(maxLength)} ${version}`);
157
+ }
49
158
  }
50
159
  });
51
160
  };
@@ -17,8 +17,21 @@ var index = factory.createCliPlugin({
17
17
  path: ["info"],
18
18
  description: "Show helpful information for debugging and reporting bugs",
19
19
  execute: async ({ args }) => {
20
- yargs__default.default().parse(args);
21
- await lazy.lazy(() => import('./commands/info.cjs.js'), "default")(args);
20
+ const argv = await yargs__default.default().options({
21
+ include: {
22
+ type: "string",
23
+ array: true,
24
+ default: [],
25
+ description: "Glob patterns for additional packages to include (e.g., @spotify/backstage*)"
26
+ },
27
+ format: {
28
+ type: "string",
29
+ choices: ["text", "json"],
30
+ default: "text",
31
+ description: "Output format (text or json)"
32
+ }
33
+ }).help().parse(args);
34
+ await lazy.lazy(() => import('./commands/info.cjs.js'), "default")(argv);
22
35
  }
23
36
  });
24
37
  }
@@ -9,7 +9,7 @@ var yaml = require('yaml');
9
9
  var paths = require('../../../../lib/paths.cjs.js');
10
10
  var types = require('../types.cjs.js');
11
11
  var errors = require('@backstage/errors');
12
- var zodValidationError = require('zod-validation-error');
12
+ var v3 = require('zod-validation-error/v3');
13
13
 
14
14
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
15
15
 
@@ -37,7 +37,7 @@ async function loadPortableTemplate(pointer) {
37
37
  if (!parsed.success) {
38
38
  throw new errors.ForwardedError(
39
39
  `Invalid template definition at '${pointer.target}'`,
40
- zodValidationError.fromZodError(parsed.error)
40
+ v3.fromZodError(parsed.error)
41
41
  );
42
42
  }
43
43
  const { role, values = {} } = parsed.data;
@@ -7,7 +7,7 @@ var defaultTemplates = require('../defaultTemplates.cjs.js');
7
7
  var types = require('../types.cjs.js');
8
8
  var yaml = require('yaml');
9
9
  var z = require('zod');
10
- var zodValidationError = require('zod-validation-error');
10
+ var v3 = require('zod-validation-error/v3');
11
11
  var errors = require('@backstage/errors');
12
12
 
13
13
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
@@ -54,7 +54,7 @@ async function loadPortableTemplateConfig(options = {}) {
54
54
  if (!parsed.success) {
55
55
  throw new errors.ForwardedError(
56
56
  `Failed to load templating configuration from '${pkgPath}'`,
57
- zodValidationError.fromZodError(parsed.error)
57
+ v3.fromZodError(parsed.error)
58
58
  );
59
59
  }
60
60
  const config = parsed.data.backstage?.cli?.new;
@@ -119,7 +119,7 @@ async function peekLocalTemplateDefinition(target) {
119
119
  const rawTemplate = yaml.parse(content);
120
120
  const parsed = partialTemplateDefinitionSchema.safeParse(rawTemplate);
121
121
  if (!parsed.success) {
122
- throw zodValidationError.fromZodError(parsed.error);
122
+ throw v3.fromZodError(parsed.error);
123
123
  }
124
124
  return {
125
125
  name: parsed.data.name,
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.14.1-next.1";
3
+ var version = "0.15.0";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "1.6.0";
3
+ var version = "1.6.1";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "1.10.3-next.0";
3
+ var version = "1.10.3";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.35.2-next.1";
3
+ var version = "0.35.2";
4
4
  var dependencies = {
5
5
  "@backstage/catalog-model": "workspace:^",
6
6
  "@backstage/cli-common": "workspace:^",
@@ -98,7 +98,7 @@ var dependencies = {
98
98
  "yml-loader": "^2.1.0",
99
99
  yn: "^4.0.0",
100
100
  zod: "^3.22.4",
101
- "zod-validation-error": "^3.4.0"
101
+ "zod-validation-error": "^4.0.2"
102
102
  };
103
103
  var devDependencies = {
104
104
  "@backstage/backend-plugin-api": "workspace:^",
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.18.4";
3
+ var version = "0.18.5";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "1.1.19-next.1";
3
+ var version = "1.1.19";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.3.5-next.0";
3
+ var version = "0.3.5";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.13.2";
3
+ var version = "0.13.3";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.4.3-next.0";
3
+ var version = "0.4.3";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.25.7";
3
+ var version = "0.26.0";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.12.3-next.0";
3
+ var version = "0.12.3";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var version = "0.3.7-next.1";
3
+ var version = "0.3.7";
4
4
 
5
5
  exports.version = version;
6
6
  //# sourceMappingURL=package.json.cjs.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/cli",
3
- "version": "0.35.2-next.1",
3
+ "version": "0.35.2",
4
4
  "description": "CLI for developing Backstage plugins and apps",
5
5
  "backstage": {
6
6
  "role": "cli"
@@ -47,16 +47,16 @@
47
47
  ]
48
48
  },
49
49
  "dependencies": {
50
- "@backstage/catalog-model": "1.7.6",
51
- "@backstage/cli-common": "0.1.16",
52
- "@backstage/cli-node": "0.2.16",
53
- "@backstage/config": "1.3.6",
54
- "@backstage/config-loader": "1.10.7",
55
- "@backstage/errors": "1.2.7",
56
- "@backstage/eslint-plugin": "0.2.0",
57
- "@backstage/integration": "1.19.2-next.0",
58
- "@backstage/release-manifests": "0.0.13",
59
- "@backstage/types": "1.2.2",
50
+ "@backstage/catalog-model": "^1.7.6",
51
+ "@backstage/cli-common": "^0.1.17",
52
+ "@backstage/cli-node": "^0.2.16",
53
+ "@backstage/config": "^1.3.6",
54
+ "@backstage/config-loader": "^1.10.7",
55
+ "@backstage/errors": "^1.2.7",
56
+ "@backstage/eslint-plugin": "^0.2.0",
57
+ "@backstage/integration": "^1.19.2",
58
+ "@backstage/release-manifests": "^0.0.13",
59
+ "@backstage/types": "^1.2.2",
60
60
  "@manypkg/get-packages": "^1.1.3",
61
61
  "@module-federation/enhanced": "^0.9.0",
62
62
  "@octokit/request": "^8.0.0",
@@ -143,25 +143,25 @@
143
143
  "yml-loader": "^2.1.0",
144
144
  "yn": "^4.0.0",
145
145
  "zod": "^3.22.4",
146
- "zod-validation-error": "^3.4.0"
146
+ "zod-validation-error": "^4.0.2"
147
147
  },
148
148
  "devDependencies": {
149
- "@backstage/backend-plugin-api": "1.6.0",
150
- "@backstage/backend-test-utils": "1.10.3-next.0",
151
- "@backstage/catalog-client": "1.12.1",
152
- "@backstage/config": "1.3.6",
153
- "@backstage/core-app-api": "1.19.3",
154
- "@backstage/core-components": "0.18.4",
155
- "@backstage/core-plugin-api": "1.12.1",
156
- "@backstage/dev-utils": "1.1.19-next.1",
157
- "@backstage/errors": "1.2.7",
158
- "@backstage/plugin-auth-backend": "0.25.7",
159
- "@backstage/plugin-auth-backend-module-guest-provider": "0.2.15",
160
- "@backstage/plugin-catalog-node": "1.20.1",
161
- "@backstage/plugin-scaffolder-node": "0.12.3-next.0",
162
- "@backstage/plugin-scaffolder-node-test-utils": "0.3.7-next.1",
163
- "@backstage/test-utils": "1.7.14",
164
- "@backstage/theme": "0.7.1",
149
+ "@backstage/backend-plugin-api": "^1.6.1",
150
+ "@backstage/backend-test-utils": "^1.10.3",
151
+ "@backstage/catalog-client": "^1.12.1",
152
+ "@backstage/config": "^1.3.6",
153
+ "@backstage/core-app-api": "^1.19.3",
154
+ "@backstage/core-components": "^0.18.5",
155
+ "@backstage/core-plugin-api": "^1.12.1",
156
+ "@backstage/dev-utils": "^1.1.19",
157
+ "@backstage/errors": "^1.2.7",
158
+ "@backstage/plugin-auth-backend": "^0.26.0",
159
+ "@backstage/plugin-auth-backend-module-guest-provider": "^0.2.15",
160
+ "@backstage/plugin-catalog-node": "^1.20.1",
161
+ "@backstage/plugin-scaffolder-node": "^0.12.3",
162
+ "@backstage/plugin-scaffolder-node-test-utils": "^0.3.7",
163
+ "@backstage/test-utils": "^1.7.14",
164
+ "@backstage/theme": "^0.7.1",
165
165
  "@jest/environment-jsdom-abstract": "^30.0.0",
166
166
  "@pmmmwh/react-refresh-webpack-plugin": "^0.6.0",
167
167
  "@types/cross-spawn": "^6.0.2",
@@ -20,6 +20,7 @@
20
20
  "postpack": "backstage-cli package postpack"
21
21
  },
22
22
  "devDependencies": {
23
+ "@backstage/backend-test-utils": "{{versionQuery '@backstage/backend-test-utils'}}",
23
24
  "@backstage/cli": "{{versionQuery '@backstage/cli'}}"
24
25
  },
25
26
  "files": [
@@ -21,6 +21,7 @@
21
21
  "postpack": "backstage-cli package postpack"
22
22
  },
23
23
  "devDependencies": {
24
+ "@backstage/backend-test-utils": "{{versionQuery '@backstage/backend-test-utils'}}",
24
25
  "@backstage/cli": "{{versionQuery '@backstage/cli'}}"
25
26
  },
26
27
  "files": [
@@ -26,6 +26,7 @@
26
26
  "@backstage/plugin-scaffolder-node": "{{versionQuery '@backstage/plugin-scaffolder-node'}}"
27
27
  },
28
28
  "devDependencies": {
29
+ "@backstage/backend-test-utils": "{{versionQuery '@backstage/backend-test-utils'}}",
29
30
  "@backstage/cli": "{{versionQuery '@backstage/cli'}}",
30
31
  "@backstage/plugin-scaffolder-node-test-utils": "{{versionQuery '@backstage/plugin-scaffolder-node-test-utils'}}"
31
32
  },