@backstage/cli-module-maintenance 0.0.0-nightly-20260317031259 → 0.1.0

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,6 +1,6 @@
1
1
  # @backstage/cli-module-maintenance
2
2
 
3
- ## 0.0.0-nightly-20260317031259
3
+ ## 0.1.0
4
4
 
5
5
  ### Minor Changes
6
6
 
@@ -8,6 +8,7 @@
8
8
 
9
9
  ### Patch Changes
10
10
 
11
+ - f189d8f: Added auto-fill of `backstage.pluginPackage` metadata for known plugins during `repo fix`.
11
12
  - Updated dependencies
12
- - @backstage/cli-node@0.0.0-nightly-20260317031259
13
- - @backstage/cli-common@0.0.0-nightly-20260317031259
13
+ - @backstage/cli-node@0.3.0
14
+ - @backstage/cli-common@0.2.0
@@ -0,0 +1,9 @@
1
+ 'use strict';
2
+
3
+ var OpaqueType = require('../../opaque-internal/src/OpaqueType.cjs.js');
4
+
5
+ OpaqueType.OpaqueType.create({
6
+ type: "@backstage/CliModule",
7
+ versions: ["v1"]
8
+ });
9
+ //# sourceMappingURL=InternalCliModule.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InternalCliModule.cjs.js","sources":["../../../../cli-internal/src/InternalCliModule.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CliCommand, CliModule } from '@backstage/cli-node';\nimport { OpaqueType } from '@internal/opaque';\n\nexport const OpaqueCliModule = OpaqueType.create<{\n public: CliModule;\n versions: {\n readonly version: 'v1';\n readonly packageName: string;\n readonly commands: Promise<ReadonlyArray<CliCommand>>;\n };\n}>({\n type: '@backstage/CliModule',\n versions: ['v1'],\n});\n"],"names":["OpaqueType"],"mappings":";;;;AAmB+BA,sBAAW,MAAA,CAOvC;AAAA,EACD,IAAA,EAAM,sBAAA;AAAA,EACN,QAAA,EAAU,CAAC,IAAI;AACjB,CAAC;;"}
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ var OpaqueType = require('../../opaque-internal/src/OpaqueType.cjs.js');
4
+
5
+ OpaqueType.OpaqueType.create({
6
+ type: "@backstage/CommandTreeNode",
7
+ versions: ["v1"]
8
+ });
9
+ OpaqueType.OpaqueType.create({
10
+ type: "@backstage/CommandLeafNode",
11
+ versions: ["v1"]
12
+ });
13
+ //# sourceMappingURL=InternalCommandNode.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InternalCommandNode.cjs.js","sources":["../../../../cli-internal/src/InternalCommandNode.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CliCommand, CliModule } from '@backstage/cli-node';\nimport { OpaqueType } from '@internal/opaque';\n\n/** @internal */\nexport interface CommandTreeNode {\n readonly $$type: '@backstage/CommandTreeNode';\n}\n\n/** @internal */\nexport interface CommandLeafNode {\n readonly $$type: '@backstage/CommandLeafNode';\n}\n\nexport type CommandNode = CommandTreeNode | CommandLeafNode;\n\nexport const OpaqueCommandTreeNode = OpaqueType.create<{\n public: CommandTreeNode;\n versions: {\n readonly version: 'v1';\n readonly name: string;\n readonly children: CommandNode[];\n };\n}>({\n type: '@backstage/CommandTreeNode',\n versions: ['v1'],\n});\n\nexport const OpaqueCommandLeafNode = OpaqueType.create<{\n public: CommandLeafNode;\n versions: {\n readonly version: 'v1';\n readonly name: string;\n readonly command: CliCommand;\n readonly module?: CliModule;\n };\n}>({\n type: '@backstage/CommandLeafNode',\n versions: ['v1'],\n});\n\n/**\n * Checks whether a command node should be hidden from help output.\n * Leaf nodes are hidden if they are deprecated or experimental.\n * Tree nodes are hidden if all of their children are hidden.\n */\nexport function isCommandNodeHidden(node: CommandNode): boolean {\n if (OpaqueCommandLeafNode.isType(node)) {\n const { command } = OpaqueCommandLeafNode.toInternal(node);\n return !!command.deprecated || !!command.experimental;\n }\n const { children } = OpaqueCommandTreeNode.toInternal(node);\n return children.every(child => isCommandNodeHidden(child));\n}\n"],"names":["OpaqueType"],"mappings":";;;;AA+BqCA,sBAAW,MAAA,CAO7C;AAAA,EACD,IAAA,EAAM,4BAAA;AAAA,EACN,QAAA,EAAU,CAAC,IAAI;AACjB,CAAC;AAEoCA,sBAAW,MAAA,CAQ7C;AAAA,EACD,IAAA,EAAM,4BAAA;AAAA,EACN,QAAA,EAAU,CAAC,IAAI;AACjB,CAAC;;"}
@@ -0,0 +1,43 @@
1
+ 'use strict';
2
+
3
+ const knownBackendPluginIds = [
4
+ "app",
5
+ "auth",
6
+ "catalog",
7
+ "events",
8
+ "kubernetes",
9
+ "notifications",
10
+ "permission",
11
+ "proxy",
12
+ "scaffolder",
13
+ "search",
14
+ "signals",
15
+ "techdocs"
16
+ ];
17
+ const knownFrontendPluginIds = [
18
+ "app",
19
+ "auth",
20
+ "catalog",
21
+ "kubernetes",
22
+ "notifications",
23
+ "scaffolder",
24
+ "search",
25
+ "signals",
26
+ "techdocs"
27
+ ];
28
+ const knownBackendPluginPackageNameByPluginId = Object.fromEntries(
29
+ knownBackendPluginIds.map((pluginId) => [
30
+ pluginId,
31
+ `@backstage/plugin-${pluginId}-backend`
32
+ ])
33
+ );
34
+ const knownFrontendPluginPackageNameByPluginId = Object.fromEntries(
35
+ knownFrontendPluginIds.map((pluginId) => [
36
+ pluginId,
37
+ `@backstage/plugin-${pluginId}`
38
+ ])
39
+ );
40
+
41
+ exports.knownBackendPluginPackageNameByPluginId = knownBackendPluginPackageNameByPluginId;
42
+ exports.knownFrontendPluginPackageNameByPluginId = knownFrontendPluginPackageNameByPluginId;
43
+ //# sourceMappingURL=knownPluginPackages.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knownPluginPackages.cjs.js","sources":["../../../../cli-internal/src/knownPluginPackages.ts"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst knownBackendPluginIds = [\n 'app',\n 'auth',\n 'catalog',\n 'events',\n 'kubernetes',\n 'notifications',\n 'permission',\n 'proxy',\n 'scaffolder',\n 'search',\n 'signals',\n 'techdocs',\n];\n\n// Only includes plugin IDs that have a corresponding frontend package; some plugins are backend-only and not listed here.\nconst knownFrontendPluginIds = [\n 'app',\n 'auth',\n 'catalog',\n 'kubernetes',\n 'notifications',\n 'scaffolder',\n 'search',\n 'signals',\n 'techdocs',\n];\n\n/**\n * Maps known plugin IDs to their corresponding backend package names.\n */\nexport const knownBackendPluginPackageNameByPluginId: Record<string, string> =\n Object.fromEntries(\n knownBackendPluginIds.map(pluginId => [\n pluginId,\n `@backstage/plugin-${pluginId}-backend`,\n ]),\n );\n\n/**\n * Maps known plugin IDs to their corresponding frontend package names.\n */\nexport const knownFrontendPluginPackageNameByPluginId: Record<string, string> =\n Object.fromEntries(\n knownFrontendPluginIds.map(pluginId => [\n pluginId,\n `@backstage/plugin-${pluginId}`,\n ]),\n );\n"],"names":[],"mappings":";;AAgBA,MAAM,qBAAA,GAAwB;AAAA,EAC5B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA;AAGA,MAAM,sBAAA,GAAyB;AAAA,EAC7B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA;AAKO,MAAM,0CACX,MAAA,CAAO,WAAA;AAAA,EACL,qBAAA,CAAsB,IAAI,CAAA,QAAA,KAAY;AAAA,IACpC,QAAA;AAAA,IACA,qBAAqB,QAAQ,CAAA,QAAA;AAAA,GAC9B;AACH;AAKK,MAAM,2CACX,MAAA,CAAO,WAAA;AAAA,EACL,sBAAA,CAAuB,IAAI,CAAA,QAAA,KAAY;AAAA,IACrC,QAAA;AAAA,IACA,qBAAqB,QAAQ,CAAA;AAAA,GAC9B;AACH;;;;;"}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var name = "@backstage/cli-module-maintenance";
6
- var version = "0.0.0-nightly-20260317031259";
6
+ var version = "0.1.0";
7
7
  var description = "CLI module for Backstage CLI";
8
8
  var backstage = {
9
9
  role: "cli-module"
@@ -22,6 +22,7 @@ var repository = {
22
22
  var license = "Apache-2.0";
23
23
  var main = "src/index.ts";
24
24
  var types = "src/index.ts";
25
+ var bin = "bin/backstage-cli-module-maintenance";
25
26
  var files = [
26
27
  "dist",
27
28
  "bin"
@@ -35,18 +36,17 @@ var scripts = {
35
36
  test: "backstage-cli package test"
36
37
  };
37
38
  var dependencies = {
38
- "@backstage/cli-common": "workspace:*",
39
- "@backstage/cli-node": "workspace:*",
39
+ "@backstage/cli-common": "workspace:^",
40
+ "@backstage/cli-node": "workspace:^",
40
41
  chalk: "^4.0.0",
41
42
  cleye: "^2.3.0",
42
43
  eslint: "^8.6.0",
43
44
  "fs-extra": "^11.2.0"
44
45
  };
45
46
  var devDependencies = {
46
- "@backstage/cli": "workspace:*",
47
+ "@backstage/cli": "workspace:^",
47
48
  "@types/fs-extra": "^11.0.0"
48
49
  };
49
- var bin = "bin/backstage-cli-module-maintenance";
50
50
  var packageJson = {
51
51
  name: name,
52
52
  version: version,
@@ -58,11 +58,11 @@ var packageJson = {
58
58
  license: license,
59
59
  main: main,
60
60
  types: types,
61
+ bin: bin,
61
62
  files: files,
62
63
  scripts: scripts,
63
64
  dependencies: dependencies,
64
- devDependencies: devDependencies,
65
- bin: bin
65
+ devDependencies: devDependencies
66
66
  };
67
67
 
68
68
  exports.backstage = backstage;
@@ -5,8 +5,13 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var cliNode = require('@backstage/cli-node');
6
6
  var cleye = require('cleye');
7
7
  var fs = require('fs-extra');
8
- var node_path = require('node:path');
8
+ var path = require('node:path');
9
9
  var cliCommon = require('@backstage/cli-common');
10
+ require('../../cli-internal/src/InternalCliModule.cjs.js');
11
+ require('../../cli-internal/src/InternalCommandNode.cjs.js');
12
+ require('node:fs');
13
+ require('node:os');
14
+ var knownPluginPackages = require('../../cli-internal/src/knownPluginPackages.cjs.js');
10
15
 
11
16
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
12
17
 
@@ -39,7 +44,7 @@ async function writeFixedPackages(packages) {
39
44
  return;
40
45
  }
41
46
  await fs__default.default.writeJson(
42
- node_path.resolve(pkg.dir, "package.json"),
47
+ path.resolve(pkg.dir, "package.json"),
43
48
  pkg.packageJson,
44
49
  {
45
50
  spaces: 2
@@ -75,19 +80,19 @@ function fixPackageExports(pkg) {
75
80
  }
76
81
  const existingTypesVersions = JSON.stringify(pkg.packageJson.typesVersions);
77
82
  const typeEntries = {};
78
- for (const [path, value] of Object.entries(exp)) {
79
- if (path === ".") {
83
+ for (const [path$1, value] of Object.entries(exp)) {
84
+ if (path$1 === ".") {
80
85
  continue;
81
86
  }
82
- const newPath = trimRelative(path);
87
+ const newPath = trimRelative(path$1);
83
88
  if (typeof value === "string") {
84
- if (SCRIPT_EXTS.includes(node_path.extname(value))) {
89
+ if (SCRIPT_EXTS.includes(path.extname(value))) {
85
90
  typeEntries[newPath] = [trimRelative(value)];
86
91
  }
87
92
  } else if (value && typeof value === "object" && !Array.isArray(value)) {
88
93
  if (typeof value.types === "string") {
89
94
  typeEntries[newPath] = [trimRelative(value.types)];
90
- } else if (typeof value.default === "string" && SCRIPT_EXTS.includes(node_path.extname(value.default))) {
95
+ } else if (typeof value.default === "string" && SCRIPT_EXTS.includes(path.extname(value.default))) {
91
96
  typeEntries[newPath] = [trimRelative(value.default)];
92
97
  }
93
98
  }
@@ -160,9 +165,9 @@ function createRepositoryFieldFixer() {
160
165
  const rootUrl = rootRepoField.url;
161
166
  const rootDir = rootRepoField.directory || "";
162
167
  return (pkg) => {
163
- const expectedPath = node_path.posix.join(
168
+ const expectedPath = path.posix.join(
164
169
  rootDir,
165
- node_path.relative(cliCommon.targetPaths.rootDir, pkg.dir)
170
+ path.relative(cliCommon.targetPaths.rootDir, pkg.dir)
166
171
  );
167
172
  const repoField = pkg.packageJson.repository;
168
173
  if (!repoField || typeof repoField === "string") {
@@ -235,11 +240,11 @@ function fixPluginId(pkg) {
235
240
  }
236
241
  const guessedPluginId = guessPluginId(role, pkg.packageJson.name);
237
242
  if (!guessedPluginId && (role === "frontend-plugin" || role === "frontend-plugin-module" || role === "backend-plugin" || role === "backend-plugin-module")) {
238
- const path = node_path.relative(
243
+ const path$1 = path.relative(
239
244
  cliCommon.targetPaths.rootDir,
240
- node_path.resolve(pkg.dir, "package.json")
245
+ path.resolve(pkg.dir, "package.json")
241
246
  );
242
- const msg = `Failed to guess plugin ID for "${pkg.packageJson.name}", please set the 'backstage.pluginId' field manually in "${path}"`;
247
+ const msg = `Failed to guess plugin ID for "${pkg.packageJson.name}", please set the 'backstage.pluginId' field manually in "${path$1}"`;
243
248
  if (role.endsWith("module")) {
244
249
  const suggestedRole = role.startsWith("frontend") ? "web-library" : "node-library";
245
250
  throw new Error(
@@ -257,21 +262,6 @@ function fixPluginId(pkg) {
257
262
  pkg.changed = true;
258
263
  }
259
264
  }
260
- const backendPluginPackageNameByPluginId = new Map(
261
- [
262
- "app",
263
- "auth",
264
- "catalog",
265
- "events",
266
- "kubernetes",
267
- "notifications",
268
- "permission",
269
- "scaffolder",
270
- "search",
271
- "signals",
272
- "techdocs"
273
- ].map((pluginId) => [pluginId, `@backstage/plugin-${pluginId}-backend`])
274
- );
275
265
  const pluginPackageRoles = [
276
266
  "frontend-plugin",
277
267
  "backend-plugin",
@@ -301,18 +291,18 @@ function fixPluginPackages(pkg, repoPackages) {
301
291
  const targetRole = role.replace("-module", "");
302
292
  const pluginPkgName = repoPackages.find(
303
293
  (p) => p.packageJson.backstage?.pluginId === pluginId && p.packageJson.backstage?.role === targetRole
304
- )?.packageJson.name ?? backendPluginPackageNameByPluginId.get(pluginId);
294
+ )?.packageJson.name ?? (role === "backend-plugin-module" ? knownPluginPackages.knownBackendPluginPackageNameByPluginId[pluginId] : knownPluginPackages.knownFrontendPluginPackageNameByPluginId[pluginId]);
305
295
  if (!pluginPkgName) {
306
296
  if (pkgBackstage.pluginPackage) {
307
297
  return;
308
298
  }
309
- const path = node_path.relative(
299
+ const path$1 = path.relative(
310
300
  cliCommon.targetPaths.rootDir,
311
- node_path.resolve(pkg.dir, "package.json")
301
+ path.resolve(pkg.dir, "package.json")
312
302
  );
313
303
  const suggestedRole = role === "frontend-plugin-module" ? "web-library" : "node-library";
314
304
  throw new Error(
315
- `Failed to find plugin package for "${pkg.packageJson.name}", please declare the name of the plugin package that this package is a module for in the 'backstage.pluginPackage' field in "${path}". It is also possible that this package is not a module, and should use the '${suggestedRole}' role instead.`
305
+ `Failed to find plugin package for "${pkg.packageJson.name}", please declare the name of the plugin package that this package is a module for in the 'backstage.pluginPackage' field in "${path$1}". It is also possible that this package is not a module, and should use the '${suggestedRole}' role instead.`
316
306
  );
317
307
  }
318
308
  if (pkgBackstage.pluginPackage !== pluginPkgName) {
@@ -342,9 +332,9 @@ function fixPeerModules(pkg) {
342
332
  if (peerModules === void 0) {
343
333
  return;
344
334
  }
345
- const packagePath = node_path.relative(
335
+ const packagePath = path.relative(
346
336
  cliCommon.targetPaths.rootDir,
347
- node_path.resolve(pkg.dir, "package.json")
337
+ path.resolve(pkg.dir, "package.json")
348
338
  );
349
339
  if (role !== "backend-plugin" && role !== "frontend-plugin") {
350
340
  throw new Error(
@@ -1 +1 @@
1
- {"version":3,"file":"fix.cjs.js","sources":["../../../src/commands/repo/fix.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n BackstagePackage,\n BackstagePackageJson,\n PackageGraph,\n PackageRole,\n PackageRoles,\n} from '@backstage/cli-node';\nimport { cli } from 'cleye';\nimport fs from 'fs-extra';\nimport {\n resolve as resolvePath,\n posix,\n relative as relativePath,\n extname,\n} from 'node:path';\nimport { targetPaths } from '@backstage/cli-common';\n\nconst SCRIPT_EXTS = ['.js', '.jsx', '.ts', '.tsx', '.json'];\n\n/**\n * A mutable object representing a package.json file with potential fixes.\n */\nexport interface FixablePackage extends BackstagePackage {\n changed: boolean;\n}\n\nexport async function readFixablePackages(): Promise<FixablePackage[]> {\n const packages = await PackageGraph.listTargetPackages();\n return packages.map(pkg => ({ ...pkg, changed: false }));\n}\n\nexport function printPackageFixHint(packages: FixablePackage[]) {\n const changed = packages.filter(pkg => pkg.changed);\n if (changed.length > 0) {\n const rootPkg = require(targetPaths.resolveRoot('package.json'));\n const fixCmd =\n rootPkg.scripts?.fix === 'backstage-cli repo fix'\n ? 'fix'\n : 'backstage-cli repo fix';\n console.log(\n `The following packages are out of sync, run 'yarn ${fixCmd}' to fix them:`,\n );\n for (const pkg of changed) {\n console.log(` ${pkg.packageJson.name}`);\n }\n return true;\n }\n return false;\n}\n\nexport async function writeFixedPackages(\n packages: FixablePackage[],\n): Promise<void> {\n await Promise.all(\n packages.map(async pkg => {\n if (!pkg.changed) {\n return;\n }\n\n await fs.writeJson(\n resolvePath(pkg.dir, 'package.json'),\n pkg.packageJson,\n {\n spaces: 2,\n },\n );\n }),\n );\n}\n\nfunction trimRelative(path: string): string {\n if (path.startsWith('./')) {\n return path.slice(2);\n }\n return path;\n}\n\nexport function fixPackageExports(pkg: FixablePackage) {\n let { exports: exp } = pkg.packageJson;\n if (!exp) {\n return;\n }\n if (Array.isArray(exp)) {\n throw new Error('Unexpected array in package.json exports field');\n }\n\n // If exports is a string we rewrite it to an object to add package.json\n if (typeof exp === 'string') {\n pkg.changed = true;\n exp = { '.': exp };\n pkg.packageJson.exports = exp;\n } else if (typeof exp !== 'object') {\n return;\n }\n\n if (!exp['./package.json']) {\n pkg.changed = true;\n exp['./package.json'] = './package.json';\n }\n\n const existingTypesVersions = JSON.stringify(pkg.packageJson.typesVersions);\n\n const typeEntries: Record<string, [string]> = {};\n for (const [path, value] of Object.entries(exp)) {\n // Main entry point does not need to be listed\n if (path === '.') {\n continue;\n }\n const newPath = trimRelative(path);\n\n // Only script files and package.json should be added to typesVersions\n if (typeof value === 'string') {\n if (SCRIPT_EXTS.includes(extname(value))) {\n typeEntries[newPath] = [trimRelative(value)];\n }\n } else if (value && typeof value === 'object' && !Array.isArray(value)) {\n if (typeof value.types === 'string') {\n typeEntries[newPath] = [trimRelative(value.types)];\n } else if (\n typeof value.default === 'string' &&\n SCRIPT_EXTS.includes(extname(value.default))\n ) {\n typeEntries[newPath] = [trimRelative(value.default)];\n }\n }\n }\n\n const hasTypeEntries = Object.keys(typeEntries).length > 0;\n const typesVersions = hasTypeEntries ? { '*': typeEntries } : undefined;\n\n if (existingTypesVersions !== JSON.stringify(typesVersions)) {\n if (pkg.packageJson.typesVersions) {\n // Update in place to preserve field order\n if (typesVersions) {\n pkg.packageJson.typesVersions = typesVersions;\n } else {\n delete pkg.packageJson.typesVersions;\n }\n } else if (typesVersions) {\n // Insert after exports when adding for the first time\n const newPkgEntries = Object.entries(pkg.packageJson);\n newPkgEntries.splice(\n newPkgEntries.findIndex(([name]) => name === 'exports') + 1,\n 0,\n ['typesVersions', typesVersions],\n );\n pkg.packageJson = Object.fromEntries(\n newPkgEntries,\n ) as BackstagePackageJson;\n }\n pkg.changed = true;\n }\n\n // Remove the legacy fields from publishConfig, which are no longer needed\n const publishConfig = pkg.packageJson.publishConfig as\n | Record<string, string>\n | undefined;\n if (publishConfig) {\n for (const field of ['main', 'module', 'browser', 'types']) {\n if (publishConfig[field]) {\n delete publishConfig[field];\n pkg.changed = true;\n }\n }\n }\n}\n\nexport function fixSideEffects(pkg: FixablePackage) {\n const role = PackageRoles.getRoleFromPackage(pkg.packageJson);\n if (!role) {\n return;\n }\n\n const roleInfo = PackageRoles.getRoleInfo(role);\n\n // Only web and common packages benefit from being marked as side effect free\n if (roleInfo.platform === 'node') {\n return;\n }\n // Bundled packages don't need to mark themselves as having no side effects\n if (roleInfo.output.length === 1 && roleInfo.output[0] === 'bundle') {\n return;\n }\n\n // Already declared\n if ('sideEffects' in pkg.packageJson) {\n return;\n }\n\n const pkgEntries = Object.entries(pkg.packageJson);\n pkgEntries.splice(\n // Place it just above the scripts field\n pkgEntries.findIndex(([name]) => name === 'scripts'),\n 0,\n ['sideEffects', false],\n );\n pkg.packageJson = Object.fromEntries(pkgEntries) as BackstagePackageJson;\n pkg.changed = true;\n}\n\nexport function createRepositoryFieldFixer() {\n const rootPkg = require(targetPaths.resolveRoot('package.json'));\n const rootRepoField = rootPkg.repository;\n if (!rootRepoField) {\n return () => {};\n }\n\n const rootType = rootRepoField.type || 'git';\n const rootUrl = rootRepoField.url;\n const rootDir = rootRepoField.directory || '';\n\n return (pkg: FixablePackage) => {\n const expectedPath = posix.join(\n rootDir,\n relativePath(targetPaths.rootDir, pkg.dir),\n );\n const repoField = pkg.packageJson.repository;\n\n if (!repoField || typeof repoField === 'string') {\n const pkgEntries = Object.entries(pkg.packageJson);\n pkgEntries.splice(\n // Place it just above the backstage field\n pkgEntries.findIndex(([name]) => name === 'backstage'),\n 0,\n [\n 'repository',\n {\n type: rootType,\n url: rootUrl,\n directory: expectedPath,\n },\n ],\n );\n pkg.packageJson = Object.fromEntries(pkgEntries) as BackstagePackageJson;\n pkg.changed = true;\n return;\n }\n\n // If there's a type or URL mismatch, leave the field as is\n if (repoField.type !== rootType || repoField.url !== rootUrl) {\n return;\n }\n\n if (repoField.directory !== expectedPath) {\n repoField.directory = expectedPath;\n pkg.changed = true;\n }\n };\n}\n\nfunction guessPluginId(role: PackageRole, pkgName: string): string | undefined {\n switch (role) {\n case 'frontend':\n case 'frontend-plugin':\n return pkgName.match(/plugin-(.*)/)?.[1];\n case 'frontend-plugin-module':\n return pkgName.match(/plugin-(.*)-module-/)?.[1];\n case 'backend-plugin':\n return pkgName.match(/plugin-(.*)-backend$/)?.[1];\n case 'backend-plugin-module':\n return pkgName.match(/plugin-(.*)-backend-module-/)?.[1];\n case 'common-library':\n return pkgName.match(/plugin-(.*)-(?:common)$/)?.[1];\n case 'web-library':\n return pkgName.match(/plugin-(.*)-(?:react|test-utils)/)?.[1];\n case 'node-library':\n return pkgName.match(/plugin-(.*)-(?:node|backend)-?/)?.[1];\n default:\n throw new Error(\n `Invalid 'backstage.role' field in \"${pkgName}\", got '${role}'`,\n );\n }\n}\n\nexport function fixPluginId(pkg: FixablePackage) {\n const role = pkg.packageJson.backstage?.role;\n if (!role) {\n return;\n }\n\n if (\n role === 'backend' ||\n role === 'frontend' ||\n role === 'cli' ||\n role === 'cli-module'\n ) {\n return;\n }\n\n const currentId = pkg.packageJson.backstage?.pluginId;\n if (currentId !== undefined) {\n if (typeof currentId !== 'string' && currentId !== null) {\n throw new Error(\n `Invalid 'backstage.pluginId' field in \"${pkg.packageJson.name}\", must be a string`,\n );\n }\n return;\n }\n\n const guessedPluginId = guessPluginId(role, pkg.packageJson.name);\n if (\n !guessedPluginId &&\n (role === 'frontend-plugin' ||\n role === 'frontend-plugin-module' ||\n role === 'backend-plugin' ||\n role === 'backend-plugin-module')\n ) {\n const path = relativePath(\n targetPaths.rootDir,\n resolvePath(pkg.dir, 'package.json'),\n );\n const msg = `Failed to guess plugin ID for \"${pkg.packageJson.name}\", please set the 'backstage.pluginId' field manually in \"${path}\"`;\n if (role.endsWith('module')) {\n const suggestedRole = role.startsWith('frontend')\n ? 'web-library'\n : 'node-library';\n throw new Error(\n `${msg}. It is also possible that this package is not a module, and should use the '${suggestedRole}' role instead.`,\n );\n } else {\n throw new Error(msg);\n }\n }\n\n if (guessedPluginId) {\n pkg.packageJson.backstage = {\n ...pkg.packageJson.backstage,\n pluginId: guessedPluginId,\n };\n pkg.changed = true;\n }\n}\n\nconst backendPluginPackageNameByPluginId = new Map(\n [\n 'app',\n 'auth',\n 'catalog',\n 'events',\n 'kubernetes',\n 'notifications',\n 'permission',\n 'scaffolder',\n 'search',\n 'signals',\n 'techdocs',\n ].map(pluginId => [pluginId, `@backstage/plugin-${pluginId}-backend`]),\n);\n\nconst pluginPackageRoles: Array<string | undefined> = [\n 'frontend-plugin',\n 'backend-plugin',\n 'common-library',\n 'web-library',\n 'node-library',\n];\n\nexport function fixPluginPackages(\n pkg: FixablePackage,\n repoPackages: FixablePackage[],\n) {\n const pkgBackstage = pkg.packageJson.backstage;\n const role = pkgBackstage?.role;\n if (!role) {\n return;\n }\n\n if (\n role === 'backend' ||\n role === 'frontend' ||\n role === 'cli' ||\n role === 'cli-module'\n ) {\n return;\n }\n\n const pluginId = pkgBackstage.pluginId;\n if (!pluginId) {\n // Might be a plugin-less library, skip\n if (\n role === 'common-library' ||\n role === 'web-library' ||\n role === 'node-library' ||\n role === 'frontend-plugin-module' // TODO(Rugvip): Remove this once frontend modules are required to have a plugin ID\n ) {\n return;\n }\n throw new Error(\n `Missing 'backstage.pluginId' field in \"${pkg.packageJson.name}\"`,\n );\n }\n\n if (role === 'backend-plugin-module' || role === 'frontend-plugin-module') {\n const targetRole = role.replace('-module', '');\n\n // Try to find a plugin package in the same repo, but otherwise fall back to looking up the package name by ID of @backstage/* plugins\n const pluginPkgName =\n repoPackages.find(\n p =>\n p.packageJson.backstage?.pluginId === pluginId &&\n p.packageJson.backstage?.role === targetRole,\n )?.packageJson.name ?? backendPluginPackageNameByPluginId.get(pluginId);\n\n if (!pluginPkgName) {\n // If we can't find a matching package in the repo but one is declared, skip\n if (pkgBackstage.pluginPackage) {\n return;\n }\n const path = relativePath(\n targetPaths.rootDir,\n resolvePath(pkg.dir, 'package.json'),\n );\n const suggestedRole =\n role === 'frontend-plugin-module' ? 'web-library' : 'node-library';\n throw new Error(\n `Failed to find plugin package for \"${pkg.packageJson.name}\", please declare the name of the plugin package that this package is a module for in the 'backstage.pluginPackage' field in \"${path}\". ` +\n `It is also possible that this package is not a module, and should use the '${suggestedRole}' role instead.`,\n );\n }\n\n if (pkgBackstage.pluginPackage !== pluginPkgName) {\n pkgBackstage.pluginPackage = pluginPkgName;\n pkg.changed = true;\n }\n } else {\n let pluginPackages: string[] | undefined = repoPackages\n .filter(\n p =>\n p.packageJson.backstage?.pluginId === pluginId &&\n pluginPackageRoles.includes(p.packageJson.backstage?.role),\n )\n .map(p => p.packageJson.name)\n .sort();\n\n if (pluginPackages.length === 0) {\n pluginPackages = undefined;\n }\n\n if (pkgBackstage.pluginPackages?.join(',') !== pluginPackages?.join(',')) {\n pkgBackstage.pluginPackages = pluginPackages;\n pkg.changed = true;\n }\n }\n}\n\nexport function fixPeerModules(pkg: FixablePackage) {\n const pkgBackstage = pkg.packageJson.backstage;\n const role = pkgBackstage?.role;\n if (!role) {\n return;\n }\n\n const peerModules = pkgBackstage.peerModules;\n if (peerModules === undefined) {\n return;\n }\n\n const packagePath = relativePath(\n targetPaths.rootDir,\n resolvePath(pkg.dir, 'package.json'),\n );\n\n // Validate that peerModules is only used on plugin packages\n if (role !== 'backend-plugin' && role !== 'frontend-plugin') {\n throw new Error(\n `The 'backstage.peerModules' field in \"${pkg.packageJson.name}\" can only be used on plugin packages (backend-plugin or frontend-plugin), but package has role '${role}' in \"${packagePath}\"`,\n );\n }\n\n // Validate that peerModules is an array\n if (!Array.isArray(peerModules)) {\n throw new Error(\n `Invalid 'backstage.peerModules' field in \"${pkg.packageJson.name}\", must be an array of package names in \"${packagePath}\"`,\n );\n }\n\n // Validate that all entries are non-empty strings\n for (const entry of peerModules) {\n if (typeof entry !== 'string' || entry.length === 0) {\n throw new Error(\n `Invalid entry in 'backstage.peerModules' field in \"${pkg.packageJson.name}\", all entries must be non-empty package name strings in \"${packagePath}\"`,\n );\n }\n }\n}\n\ntype PackageFixer = (pkg: FixablePackage, packages: FixablePackage[]) => void;\n\nexport default async ({\n args,\n info,\n}: import('@backstage/cli-node').CliCommandContext) => {\n const {\n flags: { publish, check },\n } = cli(\n {\n help: info,\n booleanFlagNegation: true,\n flags: {\n publish: {\n type: Boolean,\n description:\n 'Enable additional fixes that only apply when publishing packages',\n },\n check: {\n type: Boolean,\n description:\n 'Fail if any packages would have been changed by the command',\n },\n },\n },\n undefined,\n args,\n );\n\n const packages = await readFixablePackages();\n const fixRepositoryField = createRepositoryFieldFixer();\n\n const fixers: PackageFixer[] = [fixPackageExports, fixSideEffects];\n\n if (publish) {\n fixers.push(\n fixRepositoryField,\n fixPluginId,\n fixPluginPackages,\n fixPeerModules,\n );\n }\n\n for (const fixer of fixers) {\n for (const pkg of packages) {\n fixer(pkg, packages);\n }\n }\n\n if (check) {\n if (printPackageFixHint(packages)) {\n process.exit(1);\n }\n } else {\n await writeFixedPackages(packages);\n }\n};\n"],"names":["PackageGraph","targetPaths","fs","resolvePath","extname","PackageRoles","posix","relativePath","cli"],"mappings":"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"}
1
+ {"version":3,"file":"fix.cjs.js","sources":["../../../src/commands/repo/fix.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n BackstagePackage,\n BackstagePackageJson,\n PackageGraph,\n PackageRole,\n PackageRoles,\n} from '@backstage/cli-node';\nimport { cli } from 'cleye';\nimport fs from 'fs-extra';\nimport {\n resolve as resolvePath,\n posix,\n relative as relativePath,\n extname,\n} from 'node:path';\nimport { targetPaths } from '@backstage/cli-common';\nimport {\n knownBackendPluginPackageNameByPluginId,\n knownFrontendPluginPackageNameByPluginId,\n} from '@internal/cli';\n\nconst SCRIPT_EXTS = ['.js', '.jsx', '.ts', '.tsx', '.json'];\n\n/**\n * A mutable object representing a package.json file with potential fixes.\n */\nexport interface FixablePackage extends BackstagePackage {\n changed: boolean;\n}\n\nexport async function readFixablePackages(): Promise<FixablePackage[]> {\n const packages = await PackageGraph.listTargetPackages();\n return packages.map(pkg => ({ ...pkg, changed: false }));\n}\n\nexport function printPackageFixHint(packages: FixablePackage[]) {\n const changed = packages.filter(pkg => pkg.changed);\n if (changed.length > 0) {\n const rootPkg = require(targetPaths.resolveRoot('package.json'));\n const fixCmd =\n rootPkg.scripts?.fix === 'backstage-cli repo fix'\n ? 'fix'\n : 'backstage-cli repo fix';\n console.log(\n `The following packages are out of sync, run 'yarn ${fixCmd}' to fix them:`,\n );\n for (const pkg of changed) {\n console.log(` ${pkg.packageJson.name}`);\n }\n return true;\n }\n return false;\n}\n\nexport async function writeFixedPackages(\n packages: FixablePackage[],\n): Promise<void> {\n await Promise.all(\n packages.map(async pkg => {\n if (!pkg.changed) {\n return;\n }\n\n await fs.writeJson(\n resolvePath(pkg.dir, 'package.json'),\n pkg.packageJson,\n {\n spaces: 2,\n },\n );\n }),\n );\n}\n\nfunction trimRelative(path: string): string {\n if (path.startsWith('./')) {\n return path.slice(2);\n }\n return path;\n}\n\nexport function fixPackageExports(pkg: FixablePackage) {\n let { exports: exp } = pkg.packageJson;\n if (!exp) {\n return;\n }\n if (Array.isArray(exp)) {\n throw new Error('Unexpected array in package.json exports field');\n }\n\n // If exports is a string we rewrite it to an object to add package.json\n if (typeof exp === 'string') {\n pkg.changed = true;\n exp = { '.': exp };\n pkg.packageJson.exports = exp;\n } else if (typeof exp !== 'object') {\n return;\n }\n\n if (!exp['./package.json']) {\n pkg.changed = true;\n exp['./package.json'] = './package.json';\n }\n\n const existingTypesVersions = JSON.stringify(pkg.packageJson.typesVersions);\n\n const typeEntries: Record<string, [string]> = {};\n for (const [path, value] of Object.entries(exp)) {\n // Main entry point does not need to be listed\n if (path === '.') {\n continue;\n }\n const newPath = trimRelative(path);\n\n // Only script files and package.json should be added to typesVersions\n if (typeof value === 'string') {\n if (SCRIPT_EXTS.includes(extname(value))) {\n typeEntries[newPath] = [trimRelative(value)];\n }\n } else if (value && typeof value === 'object' && !Array.isArray(value)) {\n if (typeof value.types === 'string') {\n typeEntries[newPath] = [trimRelative(value.types)];\n } else if (\n typeof value.default === 'string' &&\n SCRIPT_EXTS.includes(extname(value.default))\n ) {\n typeEntries[newPath] = [trimRelative(value.default)];\n }\n }\n }\n\n const hasTypeEntries = Object.keys(typeEntries).length > 0;\n const typesVersions = hasTypeEntries ? { '*': typeEntries } : undefined;\n\n if (existingTypesVersions !== JSON.stringify(typesVersions)) {\n if (pkg.packageJson.typesVersions) {\n // Update in place to preserve field order\n if (typesVersions) {\n pkg.packageJson.typesVersions = typesVersions;\n } else {\n delete pkg.packageJson.typesVersions;\n }\n } else if (typesVersions) {\n // Insert after exports when adding for the first time\n const newPkgEntries = Object.entries(pkg.packageJson);\n newPkgEntries.splice(\n newPkgEntries.findIndex(([name]) => name === 'exports') + 1,\n 0,\n ['typesVersions', typesVersions],\n );\n pkg.packageJson = Object.fromEntries(\n newPkgEntries,\n ) as BackstagePackageJson;\n }\n pkg.changed = true;\n }\n\n // Remove the legacy fields from publishConfig, which are no longer needed\n const publishConfig = pkg.packageJson.publishConfig as\n | Record<string, string>\n | undefined;\n if (publishConfig) {\n for (const field of ['main', 'module', 'browser', 'types']) {\n if (publishConfig[field]) {\n delete publishConfig[field];\n pkg.changed = true;\n }\n }\n }\n}\n\nexport function fixSideEffects(pkg: FixablePackage) {\n const role = PackageRoles.getRoleFromPackage(pkg.packageJson);\n if (!role) {\n return;\n }\n\n const roleInfo = PackageRoles.getRoleInfo(role);\n\n // Only web and common packages benefit from being marked as side effect free\n if (roleInfo.platform === 'node') {\n return;\n }\n // Bundled packages don't need to mark themselves as having no side effects\n if (roleInfo.output.length === 1 && roleInfo.output[0] === 'bundle') {\n return;\n }\n\n // Already declared\n if ('sideEffects' in pkg.packageJson) {\n return;\n }\n\n const pkgEntries = Object.entries(pkg.packageJson);\n pkgEntries.splice(\n // Place it just above the scripts field\n pkgEntries.findIndex(([name]) => name === 'scripts'),\n 0,\n ['sideEffects', false],\n );\n pkg.packageJson = Object.fromEntries(pkgEntries) as BackstagePackageJson;\n pkg.changed = true;\n}\n\nexport function createRepositoryFieldFixer() {\n const rootPkg = require(targetPaths.resolveRoot('package.json'));\n const rootRepoField = rootPkg.repository;\n if (!rootRepoField) {\n return () => {};\n }\n\n const rootType = rootRepoField.type || 'git';\n const rootUrl = rootRepoField.url;\n const rootDir = rootRepoField.directory || '';\n\n return (pkg: FixablePackage) => {\n const expectedPath = posix.join(\n rootDir,\n relativePath(targetPaths.rootDir, pkg.dir),\n );\n const repoField = pkg.packageJson.repository;\n\n if (!repoField || typeof repoField === 'string') {\n const pkgEntries = Object.entries(pkg.packageJson);\n pkgEntries.splice(\n // Place it just above the backstage field\n pkgEntries.findIndex(([name]) => name === 'backstage'),\n 0,\n [\n 'repository',\n {\n type: rootType,\n url: rootUrl,\n directory: expectedPath,\n },\n ],\n );\n pkg.packageJson = Object.fromEntries(pkgEntries) as BackstagePackageJson;\n pkg.changed = true;\n return;\n }\n\n // If there's a type or URL mismatch, leave the field as is\n if (repoField.type !== rootType || repoField.url !== rootUrl) {\n return;\n }\n\n if (repoField.directory !== expectedPath) {\n repoField.directory = expectedPath;\n pkg.changed = true;\n }\n };\n}\n\nfunction guessPluginId(role: PackageRole, pkgName: string): string | undefined {\n switch (role) {\n case 'frontend':\n case 'frontend-plugin':\n return pkgName.match(/plugin-(.*)/)?.[1];\n case 'frontend-plugin-module':\n return pkgName.match(/plugin-(.*)-module-/)?.[1];\n case 'backend-plugin':\n return pkgName.match(/plugin-(.*)-backend$/)?.[1];\n case 'backend-plugin-module':\n return pkgName.match(/plugin-(.*)-backend-module-/)?.[1];\n case 'common-library':\n return pkgName.match(/plugin-(.*)-(?:common)$/)?.[1];\n case 'web-library':\n return pkgName.match(/plugin-(.*)-(?:react|test-utils)/)?.[1];\n case 'node-library':\n return pkgName.match(/plugin-(.*)-(?:node|backend)-?/)?.[1];\n default:\n throw new Error(\n `Invalid 'backstage.role' field in \"${pkgName}\", got '${role}'`,\n );\n }\n}\n\nexport function fixPluginId(pkg: FixablePackage) {\n const role = pkg.packageJson.backstage?.role;\n if (!role) {\n return;\n }\n\n if (\n role === 'backend' ||\n role === 'frontend' ||\n role === 'cli' ||\n role === 'cli-module'\n ) {\n return;\n }\n\n const currentId = pkg.packageJson.backstage?.pluginId;\n if (currentId !== undefined) {\n if (typeof currentId !== 'string' && currentId !== null) {\n throw new Error(\n `Invalid 'backstage.pluginId' field in \"${pkg.packageJson.name}\", must be a string`,\n );\n }\n return;\n }\n\n const guessedPluginId = guessPluginId(role, pkg.packageJson.name);\n if (\n !guessedPluginId &&\n (role === 'frontend-plugin' ||\n role === 'frontend-plugin-module' ||\n role === 'backend-plugin' ||\n role === 'backend-plugin-module')\n ) {\n const path = relativePath(\n targetPaths.rootDir,\n resolvePath(pkg.dir, 'package.json'),\n );\n const msg = `Failed to guess plugin ID for \"${pkg.packageJson.name}\", please set the 'backstage.pluginId' field manually in \"${path}\"`;\n if (role.endsWith('module')) {\n const suggestedRole = role.startsWith('frontend')\n ? 'web-library'\n : 'node-library';\n throw new Error(\n `${msg}. It is also possible that this package is not a module, and should use the '${suggestedRole}' role instead.`,\n );\n } else {\n throw new Error(msg);\n }\n }\n\n if (guessedPluginId) {\n pkg.packageJson.backstage = {\n ...pkg.packageJson.backstage,\n pluginId: guessedPluginId,\n };\n pkg.changed = true;\n }\n}\n\nconst pluginPackageRoles: Array<string | undefined> = [\n 'frontend-plugin',\n 'backend-plugin',\n 'common-library',\n 'web-library',\n 'node-library',\n];\n\nexport function fixPluginPackages(\n pkg: FixablePackage,\n repoPackages: FixablePackage[],\n) {\n const pkgBackstage = pkg.packageJson.backstage;\n const role = pkgBackstage?.role;\n if (!role) {\n return;\n }\n\n if (\n role === 'backend' ||\n role === 'frontend' ||\n role === 'cli' ||\n role === 'cli-module'\n ) {\n return;\n }\n\n const pluginId = pkgBackstage.pluginId;\n if (!pluginId) {\n // Might be a plugin-less library, skip\n if (\n role === 'common-library' ||\n role === 'web-library' ||\n role === 'node-library' ||\n role === 'frontend-plugin-module' // TODO(Rugvip): Remove this once frontend modules are required to have a plugin ID\n ) {\n return;\n }\n throw new Error(\n `Missing 'backstage.pluginId' field in \"${pkg.packageJson.name}\"`,\n );\n }\n\n if (role === 'backend-plugin-module' || role === 'frontend-plugin-module') {\n const targetRole = role.replace('-module', '');\n\n // Try to find a plugin package in the same repo, but otherwise fall back to looking up the package name by ID of @backstage/* plugins\n const pluginPkgName =\n repoPackages.find(\n p =>\n p.packageJson.backstage?.pluginId === pluginId &&\n p.packageJson.backstage?.role === targetRole,\n )?.packageJson.name ??\n (role === 'backend-plugin-module'\n ? knownBackendPluginPackageNameByPluginId[pluginId]\n : knownFrontendPluginPackageNameByPluginId[pluginId]);\n if (!pluginPkgName) {\n // If we can't find a matching package in the repo but one is declared, skip\n if (pkgBackstage.pluginPackage) {\n return;\n }\n const path = relativePath(\n targetPaths.rootDir,\n resolvePath(pkg.dir, 'package.json'),\n );\n const suggestedRole =\n role === 'frontend-plugin-module' ? 'web-library' : 'node-library';\n throw new Error(\n `Failed to find plugin package for \"${pkg.packageJson.name}\", please declare the name of the plugin package that this package is a module for in the 'backstage.pluginPackage' field in \"${path}\". ` +\n `It is also possible that this package is not a module, and should use the '${suggestedRole}' role instead.`,\n );\n }\n\n if (pkgBackstage.pluginPackage !== pluginPkgName) {\n pkgBackstage.pluginPackage = pluginPkgName;\n pkg.changed = true;\n }\n } else {\n let pluginPackages: string[] | undefined = repoPackages\n .filter(\n p =>\n p.packageJson.backstage?.pluginId === pluginId &&\n pluginPackageRoles.includes(p.packageJson.backstage?.role),\n )\n .map(p => p.packageJson.name)\n .sort();\n\n if (pluginPackages.length === 0) {\n pluginPackages = undefined;\n }\n\n if (pkgBackstage.pluginPackages?.join(',') !== pluginPackages?.join(',')) {\n pkgBackstage.pluginPackages = pluginPackages;\n pkg.changed = true;\n }\n }\n}\n\nexport function fixPeerModules(pkg: FixablePackage) {\n const pkgBackstage = pkg.packageJson.backstage;\n const role = pkgBackstage?.role;\n if (!role) {\n return;\n }\n\n const peerModules = pkgBackstage.peerModules;\n if (peerModules === undefined) {\n return;\n }\n\n const packagePath = relativePath(\n targetPaths.rootDir,\n resolvePath(pkg.dir, 'package.json'),\n );\n\n // Validate that peerModules is only used on plugin packages\n if (role !== 'backend-plugin' && role !== 'frontend-plugin') {\n throw new Error(\n `The 'backstage.peerModules' field in \"${pkg.packageJson.name}\" can only be used on plugin packages (backend-plugin or frontend-plugin), but package has role '${role}' in \"${packagePath}\"`,\n );\n }\n\n // Validate that peerModules is an array\n if (!Array.isArray(peerModules)) {\n throw new Error(\n `Invalid 'backstage.peerModules' field in \"${pkg.packageJson.name}\", must be an array of package names in \"${packagePath}\"`,\n );\n }\n\n // Validate that all entries are non-empty strings\n for (const entry of peerModules) {\n if (typeof entry !== 'string' || entry.length === 0) {\n throw new Error(\n `Invalid entry in 'backstage.peerModules' field in \"${pkg.packageJson.name}\", all entries must be non-empty package name strings in \"${packagePath}\"`,\n );\n }\n }\n}\n\ntype PackageFixer = (pkg: FixablePackage, packages: FixablePackage[]) => void;\n\nexport default async ({\n args,\n info,\n}: import('@backstage/cli-node').CliCommandContext) => {\n const {\n flags: { publish, check },\n } = cli(\n {\n help: info,\n booleanFlagNegation: true,\n flags: {\n publish: {\n type: Boolean,\n description:\n 'Enable additional fixes that only apply when publishing packages',\n },\n check: {\n type: Boolean,\n description:\n 'Fail if any packages would have been changed by the command',\n },\n },\n },\n undefined,\n args,\n );\n\n const packages = await readFixablePackages();\n const fixRepositoryField = createRepositoryFieldFixer();\n\n const fixers: PackageFixer[] = [fixPackageExports, fixSideEffects];\n\n if (publish) {\n fixers.push(\n fixRepositoryField,\n fixPluginId,\n fixPluginPackages,\n fixPeerModules,\n );\n }\n\n for (const fixer of fixers) {\n for (const pkg of packages) {\n fixer(pkg, packages);\n }\n }\n\n if (check) {\n if (printPackageFixHint(packages)) {\n process.exit(1);\n }\n } else {\n await writeFixedPackages(packages);\n }\n};\n"],"names":["PackageGraph","targetPaths","fs","resolvePath","path","extname","PackageRoles","posix","relativePath","knownBackendPluginPackageNameByPluginId","knownFrontendPluginPackageNameByPluginId","cli"],"mappings":"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"}
@@ -5,7 +5,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var chalk = require('chalk');
6
6
  var eslint = require('eslint');
7
7
  var cleye = require('cleye');
8
- var node_path = require('node:path');
8
+ var path = require('node:path');
9
9
  var cliNode = require('@backstage/cli-node');
10
10
  var cliCommon = require('@backstage/cli-common');
11
11
 
@@ -53,9 +53,9 @@ var listDeprecations = async ({ args, info }) => {
53
53
  if (message.ruleId !== "deprecation/deprecation") {
54
54
  continue;
55
55
  }
56
- const path = node_path.relative(cliCommon.targetPaths.rootDir, result.filePath);
56
+ const path$1 = path.relative(cliCommon.targetPaths.rootDir, result.filePath);
57
57
  deprecations.push({
58
- path,
58
+ path: path$1,
59
59
  message: message.message,
60
60
  line: message.line,
61
61
  column: message.column
@@ -1 +1 @@
1
- {"version":3,"file":"list-deprecations.cjs.js","sources":["../../../src/commands/repo/list-deprecations.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport chalk from 'chalk';\nimport { ESLint } from 'eslint';\nimport { cli } from 'cleye';\nimport { relative as relativePath } from 'node:path';\nimport { PackageGraph } from '@backstage/cli-node';\nimport { targetPaths } from '@backstage/cli-common';\nimport type { CliCommandContext } from '@backstage/cli-node';\n\nexport default async ({ args, info }: CliCommandContext) => {\n const {\n flags: { json },\n } = cli(\n {\n help: info,\n booleanFlagNegation: true,\n flags: {\n json: { type: Boolean, description: 'Output as JSON' },\n },\n },\n undefined,\n args,\n );\n\n const packages = await PackageGraph.listTargetPackages();\n\n const eslint = new ESLint({\n cwd: targetPaths.dir,\n overrideConfig: {\n plugins: ['deprecation'],\n rules: {\n 'deprecation/deprecation': 'error',\n },\n parserOptions: {\n project: [targetPaths.resolveRoot('tsconfig.json')],\n },\n },\n extensions: ['jsx', 'ts', 'tsx', 'mjs', 'cjs'],\n });\n\n const { stderr } = process;\n if (stderr.isTTY) {\n stderr.write('Initializing TypeScript...');\n }\n\n const deprecations = [];\n for (const [index, pkg] of packages.entries()) {\n const results = await eslint.lintFiles(pkg.dir);\n for (const result of results) {\n for (const message of result.messages) {\n if (message.ruleId !== 'deprecation/deprecation') {\n continue;\n }\n\n const path = relativePath(targetPaths.rootDir, result.filePath);\n deprecations.push({\n path,\n message: message.message,\n line: message.line,\n column: message.column,\n });\n }\n }\n\n if (stderr.isTTY) {\n stderr.clearLine(0);\n stderr.cursorTo(0);\n stderr.write(`Scanning packages ${index + 1}/${packages.length}`);\n }\n }\n\n if (stderr.isTTY) {\n stderr.clearLine(0);\n stderr.cursorTo(0);\n }\n\n if (json) {\n console.log(JSON.stringify(deprecations, null, 2));\n } else {\n for (const d of deprecations) {\n const location = `${d.path}:${d.line}:${d.column}`;\n const wrappedMessage = d.message.replace(/\\r?\\n\\s*/g, ' ');\n console.log(`${location} - ${chalk.yellow(wrappedMessage)}`);\n }\n }\n\n if (deprecations.length > 0) {\n process.exit(1);\n }\n};\n"],"names":["cli","PackageGraph","eslint","ESLint","targetPaths","relativePath","chalk"],"mappings":";;;;;;;;;;;;;;;AAwBA,uBAAe,OAAO,EAAE,IAAA,EAAM,IAAA,EAAK,KAAyB;AAC1D,EAAA,MAAM;AAAA,IACJ,KAAA,EAAO,EAAE,IAAA;AAAK,GAChB,GAAIA,SAAA;AAAA,IACF;AAAA,MACE,IAAA,EAAM,IAAA;AAAA,MACN,mBAAA,EAAqB,IAAA;AAAA,MACrB,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA,EAAS,aAAa,gBAAA;AAAiB;AACvD,KACF;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,QAAA,GAAW,MAAMC,oBAAA,CAAa,kBAAA,EAAmB;AAEvD,EAAA,MAAMC,QAAA,GAAS,IAAIC,aAAA,CAAO;AAAA,IACxB,KAAKC,qBAAA,CAAY,GAAA;AAAA,IACjB,cAAA,EAAgB;AAAA,MACd,OAAA,EAAS,CAAC,aAAa,CAAA;AAAA,MACvB,KAAA,EAAO;AAAA,QACL,yBAAA,EAA2B;AAAA,OAC7B;AAAA,MACA,aAAA,EAAe;AAAA,QACb,OAAA,EAAS,CAACA,qBAAA,CAAY,WAAA,CAAY,eAAe,CAAC;AAAA;AACpD,KACF;AAAA,IACA,YAAY,CAAC,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,OAAO,KAAK;AAAA,GAC9C,CAAA;AAED,EAAA,MAAM,EAAE,QAAO,GAAI,OAAA;AACnB,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,MAAA,CAAO,MAAM,4BAA4B,CAAA;AAAA,EAC3C;AAEA,EAAA,MAAM,eAAe,EAAC;AACtB,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,GAAG,CAAA,IAAK,QAAA,CAAS,SAAQ,EAAG;AAC7C,IAAA,MAAM,OAAA,GAAU,MAAMF,QAAA,CAAO,SAAA,CAAU,IAAI,GAAG,CAAA;AAC9C,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,KAAA,MAAW,OAAA,IAAW,OAAO,QAAA,EAAU;AACrC,QAAA,IAAI,OAAA,CAAQ,WAAW,yBAAA,EAA2B;AAChD,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,IAAA,GAAOG,kBAAA,CAAaD,qBAAA,CAAY,OAAA,EAAS,OAAO,QAAQ,CAAA;AAC9D,QAAA,YAAA,CAAa,IAAA,CAAK;AAAA,UAChB,IAAA;AAAA,UACA,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,QAAQ,OAAA,CAAQ;AAAA,SACjB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,MAAA,CAAO,UAAU,CAAC,CAAA;AAClB,MAAA,MAAA,CAAO,SAAS,CAAC,CAAA;AACjB,MAAA,MAAA,CAAO,MAAM,CAAA,kBAAA,EAAqB,KAAA,GAAQ,CAAC,CAAA,CAAA,EAAI,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,IAClE;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,MAAA,CAAO,UAAU,CAAC,CAAA;AAClB,IAAA,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,EACnB;AAEA,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,YAAA,EAAc,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,EACnD,CAAA,MAAO;AACL,IAAA,KAAA,MAAW,KAAK,YAAA,EAAc;AAC5B,MAAA,MAAM,QAAA,GAAW,GAAG,CAAA,CAAE,IAAI,IAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,MAAM,CAAA,CAAA;AAChD,MAAA,MAAM,cAAA,GAAiB,CAAA,CAAE,OAAA,CAAQ,OAAA,CAAQ,aAAa,GAAG,CAAA;AACzD,MAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,QAAQ,CAAA,GAAA,EAAME,uBAAM,MAAA,CAAO,cAAc,CAAC,CAAA,CAAE,CAAA;AAAA,IAC7D;AAAA,EACF;AAEA,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"list-deprecations.cjs.js","sources":["../../../src/commands/repo/list-deprecations.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport chalk from 'chalk';\nimport { ESLint } from 'eslint';\nimport { cli } from 'cleye';\nimport { relative as relativePath } from 'node:path';\nimport { PackageGraph } from '@backstage/cli-node';\nimport { targetPaths } from '@backstage/cli-common';\nimport type { CliCommandContext } from '@backstage/cli-node';\n\nexport default async ({ args, info }: CliCommandContext) => {\n const {\n flags: { json },\n } = cli(\n {\n help: info,\n booleanFlagNegation: true,\n flags: {\n json: { type: Boolean, description: 'Output as JSON' },\n },\n },\n undefined,\n args,\n );\n\n const packages = await PackageGraph.listTargetPackages();\n\n const eslint = new ESLint({\n cwd: targetPaths.dir,\n overrideConfig: {\n plugins: ['deprecation'],\n rules: {\n 'deprecation/deprecation': 'error',\n },\n parserOptions: {\n project: [targetPaths.resolveRoot('tsconfig.json')],\n },\n },\n extensions: ['jsx', 'ts', 'tsx', 'mjs', 'cjs'],\n });\n\n const { stderr } = process;\n if (stderr.isTTY) {\n stderr.write('Initializing TypeScript...');\n }\n\n const deprecations = [];\n for (const [index, pkg] of packages.entries()) {\n const results = await eslint.lintFiles(pkg.dir);\n for (const result of results) {\n for (const message of result.messages) {\n if (message.ruleId !== 'deprecation/deprecation') {\n continue;\n }\n\n const path = relativePath(targetPaths.rootDir, result.filePath);\n deprecations.push({\n path,\n message: message.message,\n line: message.line,\n column: message.column,\n });\n }\n }\n\n if (stderr.isTTY) {\n stderr.clearLine(0);\n stderr.cursorTo(0);\n stderr.write(`Scanning packages ${index + 1}/${packages.length}`);\n }\n }\n\n if (stderr.isTTY) {\n stderr.clearLine(0);\n stderr.cursorTo(0);\n }\n\n if (json) {\n console.log(JSON.stringify(deprecations, null, 2));\n } else {\n for (const d of deprecations) {\n const location = `${d.path}:${d.line}:${d.column}`;\n const wrappedMessage = d.message.replace(/\\r?\\n\\s*/g, ' ');\n console.log(`${location} - ${chalk.yellow(wrappedMessage)}`);\n }\n }\n\n if (deprecations.length > 0) {\n process.exit(1);\n }\n};\n"],"names":["cli","PackageGraph","eslint","ESLint","targetPaths","path","relativePath","chalk"],"mappings":"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"}
package/dist/index.cjs.js CHANGED
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var cliNode = require('@backstage/cli-node');
6
- var _package = require('./package.json.cjs.js');
6
+ var _package = require('./cli-module-maintenance/package.json.cjs.js');
7
7
 
8
8
  var index = cliNode.createCliModule({
9
9
  packageJson: _package.default,
@@ -0,0 +1,105 @@
1
+ 'use strict';
2
+
3
+ class OpaqueType {
4
+ /**
5
+ * Creates a new opaque type.
6
+ *
7
+ * @param options.type The type identifier of the opaque type
8
+ * @param options.versions The available versions of the opaque type
9
+ * @returns A new opaque type helper
10
+ */
11
+ static create(options) {
12
+ return new OpaqueType(options.type, new Set(options.versions));
13
+ }
14
+ #type;
15
+ #versions;
16
+ constructor(type, versions) {
17
+ this.#type = type;
18
+ this.#versions = versions;
19
+ }
20
+ /**
21
+ * The internal version of the opaque type, used like this: `typeof MyOpaqueType.TPublic`
22
+ *
23
+ * @remarks
24
+ *
25
+ * This property is only useful for type checking, its runtime value is `undefined`.
26
+ */
27
+ TPublic = void 0;
28
+ /**
29
+ * The internal version of the opaque type, used like this: `typeof MyOpaqueType.TInternal`
30
+ *
31
+ * @remarks
32
+ *
33
+ * This property is only useful for type checking, its runtime value is `undefined`.
34
+ */
35
+ TInternal = void 0;
36
+ /**
37
+ * @param value Input value expected to be an instance of this opaque type
38
+ * @returns True if the value matches this opaque type
39
+ */
40
+ isType = (value) => {
41
+ return this.#isThisInternalType(value);
42
+ };
43
+ /**
44
+ * @param value Input value expected to be an instance of this opaque type
45
+ * @throws If the value is not an instance of this opaque type or is of an unsupported version
46
+ * @returns The internal version of the opaque type
47
+ */
48
+ toInternal = (value) => {
49
+ if (!this.#isThisInternalType(value)) {
50
+ throw new TypeError(
51
+ `Invalid opaque type, expected '${this.#type}', but got '${this.#stringifyUnknown(value)}'`
52
+ );
53
+ }
54
+ if (!this.#versions.has(value.version)) {
55
+ const versions = Array.from(this.#versions).map(this.#stringifyVersion);
56
+ if (versions.length > 1) {
57
+ versions[versions.length - 1] = `or ${versions[versions.length - 1]}`;
58
+ }
59
+ const expected = versions.length > 2 ? versions.join(", ") : versions.join(" ");
60
+ throw new TypeError(
61
+ `Invalid opaque type instance, got version ${this.#stringifyVersion(
62
+ value.version
63
+ )}, expected ${expected}`
64
+ );
65
+ }
66
+ return value;
67
+ };
68
+ /**
69
+ * Creates an instance of the opaque type, returning the public type.
70
+ *
71
+ * @param version The version of the instance to create
72
+ * @param value The remaining public and internal properties of the instance
73
+ * @returns An instance of the opaque type
74
+ */
75
+ createInstance(version, props) {
76
+ return Object.assign(props, {
77
+ $$type: this.#type,
78
+ ...version && { version }
79
+ });
80
+ }
81
+ #isThisInternalType(value) {
82
+ if (value === null || typeof value !== "object") {
83
+ return false;
84
+ }
85
+ return value.$$type === this.#type;
86
+ }
87
+ #stringifyUnknown(value) {
88
+ if (typeof value !== "object") {
89
+ return `<${typeof value}>`;
90
+ }
91
+ if (value === null) {
92
+ return "<null>";
93
+ }
94
+ if ("$$type" in value) {
95
+ return String(value.$$type);
96
+ }
97
+ return String(value);
98
+ }
99
+ #stringifyVersion = (version) => {
100
+ return version ? `'${version}'` : "undefined";
101
+ };
102
+ }
103
+
104
+ exports.OpaqueType = OpaqueType;
105
+ //# sourceMappingURL=OpaqueType.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpaqueType.cjs.js","sources":["../../../../opaque-internal/src/OpaqueType.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// TODO(Rugvip): This lives here temporarily, but should be moved to a more\n// central location. It's useful for backend packages too so we'll need to have\n// it in a common package, but it might also be that we want to make it\n// available publicly too in which case it would make sense to have this be part\n// of @backstage/version-bridge. The problem with exporting it from there is\n// that it would need to be very stable at that point, so it might be a bit\n// early to put it there already.\n\n/**\n * A helper for working with opaque types.\n */\nexport class OpaqueType<\n T extends {\n public: { $$type: string };\n versions: { version: string | undefined };\n },\n> {\n /**\n * Creates a new opaque type.\n *\n * @param options.type The type identifier of the opaque type\n * @param options.versions The available versions of the opaque type\n * @returns A new opaque type helper\n */\n static create<\n T extends {\n public: { $$type: string };\n versions: { version: string | undefined };\n },\n >(options: {\n type: T['public']['$$type'];\n versions: Array<T['versions']['version']>;\n }) {\n return new OpaqueType<T>(options.type, new Set(options.versions));\n }\n\n #type: string;\n #versions: Set<string | undefined>;\n\n private constructor(type: string, versions: Set<string | undefined>) {\n this.#type = type;\n this.#versions = versions;\n }\n\n /**\n * The internal version of the opaque type, used like this: `typeof MyOpaqueType.TPublic`\n *\n * @remarks\n *\n * This property is only useful for type checking, its runtime value is `undefined`.\n */\n TPublic: T['public'] = undefined as any;\n\n /**\n * The internal version of the opaque type, used like this: `typeof MyOpaqueType.TInternal`\n *\n * @remarks\n *\n * This property is only useful for type checking, its runtime value is `undefined`.\n */\n TInternal: T['public'] & T['versions'] = undefined as any;\n\n /**\n * @param value Input value expected to be an instance of this opaque type\n * @returns True if the value matches this opaque type\n */\n isType = (value: unknown): value is T['public'] => {\n return this.#isThisInternalType(value);\n };\n\n /**\n * @param value Input value expected to be an instance of this opaque type\n * @throws If the value is not an instance of this opaque type or is of an unsupported version\n * @returns The internal version of the opaque type\n */\n toInternal = (value: unknown): T['public'] & T['versions'] => {\n if (!this.#isThisInternalType(value)) {\n throw new TypeError(\n `Invalid opaque type, expected '${\n this.#type\n }', but got '${this.#stringifyUnknown(value)}'`,\n );\n }\n\n if (!this.#versions.has(value.version)) {\n const versions = Array.from(this.#versions).map(this.#stringifyVersion);\n if (versions.length > 1) {\n versions[versions.length - 1] = `or ${versions[versions.length - 1]}`;\n }\n const expected =\n versions.length > 2 ? versions.join(', ') : versions.join(' ');\n throw new TypeError(\n `Invalid opaque type instance, got version ${this.#stringifyVersion(\n value.version,\n )}, expected ${expected}`,\n );\n }\n\n return value;\n };\n\n /**\n * Creates an instance of the opaque type, returning the public type.\n *\n * @param version The version of the instance to create\n * @param value The remaining public and internal properties of the instance\n * @returns An instance of the opaque type\n */\n createInstance<\n TVersion extends T['versions']['version'],\n TPublic extends T['public'],\n >(\n version: TVersion,\n props: Omit<T['public'], '$$type'> &\n (T['versions'] extends infer UVersion\n ? UVersion extends { version: TVersion }\n ? Omit<UVersion, 'version'>\n : never\n : never) &\n Object, // & Object to allow for object properties too, e.g. toString()\n ): TPublic {\n return Object.assign(props as object, {\n $$type: this.#type,\n ...(version && { version }),\n }) as unknown as TPublic;\n }\n\n #isThisInternalType(value: unknown): value is T['public'] & T['versions'] {\n if (value === null || typeof value !== 'object') {\n return false;\n }\n return (value as T['public']).$$type === this.#type;\n }\n\n #stringifyUnknown(value: unknown) {\n if (typeof value !== 'object') {\n return `<${typeof value}>`;\n }\n if (value === null) {\n return '<null>';\n }\n if ('$$type' in value) {\n return String(value.$$type);\n }\n return String(value);\n }\n\n #stringifyVersion = (version: string | undefined) => {\n return version ? `'${version}'` : 'undefined';\n };\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/cli-module-maintenance",
3
- "version": "0.0.0-nightly-20260317031259",
3
+ "version": "0.1.0",
4
4
  "description": "CLI module for Backstage CLI",
5
5
  "backstage": {
6
6
  "role": "cli-module"
@@ -19,6 +19,7 @@
19
19
  "license": "Apache-2.0",
20
20
  "main": "dist/index.cjs.js",
21
21
  "types": "dist/index.d.ts",
22
+ "bin": "bin/backstage-cli-module-maintenance",
22
23
  "files": [
23
24
  "dist",
24
25
  "bin"
@@ -32,18 +33,17 @@
32
33
  "test": "backstage-cli package test"
33
34
  },
34
35
  "dependencies": {
35
- "@backstage/cli-common": "0.0.0-nightly-20260317031259",
36
- "@backstage/cli-node": "0.0.0-nightly-20260317031259",
36
+ "@backstage/cli-common": "^0.2.0",
37
+ "@backstage/cli-node": "^0.3.0",
37
38
  "chalk": "^4.0.0",
38
39
  "cleye": "^2.3.0",
39
40
  "eslint": "^8.6.0",
40
41
  "fs-extra": "^11.2.0"
41
42
  },
42
43
  "devDependencies": {
43
- "@backstage/cli": "0.0.0-nightly-20260317031259",
44
+ "@backstage/cli": "^0.36.0",
44
45
  "@types/fs-extra": "^11.0.0"
45
46
  },
46
- "bin": "bin/backstage-cli-module-maintenance",
47
47
  "typesVersions": {
48
48
  "*": {
49
49
  "package.json": [