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

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 ADDED
@@ -0,0 +1,13 @@
1
+ # @backstage/cli-module-maintenance
2
+
3
+ ## 0.0.0-nightly-20260317031259
4
+
5
+ ### Minor Changes
6
+
7
+ - 329f394: Initial release of the CLI module packages. Each module provides a set of commands that can be discovered automatically by `@backstage/cli` or executed standalone.
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies
12
+ - @backstage/cli-node@0.0.0-nightly-20260317031259
13
+ - @backstage/cli-common@0.0.0-nightly-20260317031259
package/README.md ADDED
@@ -0,0 +1,15 @@
1
+ # @backstage/cli-module-maintenance
2
+
3
+ CLI module that provides repository maintenance commands for the Backstage CLI.
4
+
5
+ ## Commands
6
+
7
+ | Command | Description |
8
+ | :----------------------- | :---------------------------------------- |
9
+ | `repo fix` | Automatically fix packages in the project |
10
+ | `repo list-deprecations` | List deprecations |
11
+
12
+ ## Documentation
13
+
14
+ - [Backstage Readme](https://github.com/backstage/backstage/blob/master/README.md)
15
+ - [Backstage Documentation](https://backstage.io/docs)
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ /*
3
+ * Copyright 2024 The Backstage Authors
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ const path = require('node:path');
19
+
20
+ /* eslint-disable-next-line no-restricted-syntax */
21
+ const isLocal = require('node:fs').existsSync(
22
+ path.resolve(__dirname, '../src'),
23
+ );
24
+
25
+ if (isLocal) {
26
+ require('@backstage/cli-node/config/nodeTransform.cjs');
27
+ }
28
+
29
+ const { runCliModule } = require('@backstage/cli-node');
30
+ const cliModule = require(isLocal ? '../src/index' : '..').default;
31
+ const pkg = require('../package.json');
32
+ runCliModule({ module: cliModule, name: pkg.name, version: pkg.version });
@@ -0,0 +1,426 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var cliNode = require('@backstage/cli-node');
6
+ var cleye = require('cleye');
7
+ var fs = require('fs-extra');
8
+ var node_path = require('node:path');
9
+ var cliCommon = require('@backstage/cli-common');
10
+
11
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
12
+
13
+ var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
14
+
15
+ const SCRIPT_EXTS = [".js", ".jsx", ".ts", ".tsx", ".json"];
16
+ async function readFixablePackages() {
17
+ const packages = await cliNode.PackageGraph.listTargetPackages();
18
+ return packages.map((pkg) => ({ ...pkg, changed: false }));
19
+ }
20
+ function printPackageFixHint(packages) {
21
+ const changed = packages.filter((pkg) => pkg.changed);
22
+ if (changed.length > 0) {
23
+ const rootPkg = require(cliCommon.targetPaths.resolveRoot("package.json"));
24
+ const fixCmd = rootPkg.scripts?.fix === "backstage-cli repo fix" ? "fix" : "backstage-cli repo fix";
25
+ console.log(
26
+ `The following packages are out of sync, run 'yarn ${fixCmd}' to fix them:`
27
+ );
28
+ for (const pkg of changed) {
29
+ console.log(` ${pkg.packageJson.name}`);
30
+ }
31
+ return true;
32
+ }
33
+ return false;
34
+ }
35
+ async function writeFixedPackages(packages) {
36
+ await Promise.all(
37
+ packages.map(async (pkg) => {
38
+ if (!pkg.changed) {
39
+ return;
40
+ }
41
+ await fs__default.default.writeJson(
42
+ node_path.resolve(pkg.dir, "package.json"),
43
+ pkg.packageJson,
44
+ {
45
+ spaces: 2
46
+ }
47
+ );
48
+ })
49
+ );
50
+ }
51
+ function trimRelative(path) {
52
+ if (path.startsWith("./")) {
53
+ return path.slice(2);
54
+ }
55
+ return path;
56
+ }
57
+ function fixPackageExports(pkg) {
58
+ let { exports: exp } = pkg.packageJson;
59
+ if (!exp) {
60
+ return;
61
+ }
62
+ if (Array.isArray(exp)) {
63
+ throw new Error("Unexpected array in package.json exports field");
64
+ }
65
+ if (typeof exp === "string") {
66
+ pkg.changed = true;
67
+ exp = { ".": exp };
68
+ pkg.packageJson.exports = exp;
69
+ } else if (typeof exp !== "object") {
70
+ return;
71
+ }
72
+ if (!exp["./package.json"]) {
73
+ pkg.changed = true;
74
+ exp["./package.json"] = "./package.json";
75
+ }
76
+ const existingTypesVersions = JSON.stringify(pkg.packageJson.typesVersions);
77
+ const typeEntries = {};
78
+ for (const [path, value] of Object.entries(exp)) {
79
+ if (path === ".") {
80
+ continue;
81
+ }
82
+ const newPath = trimRelative(path);
83
+ if (typeof value === "string") {
84
+ if (SCRIPT_EXTS.includes(node_path.extname(value))) {
85
+ typeEntries[newPath] = [trimRelative(value)];
86
+ }
87
+ } else if (value && typeof value === "object" && !Array.isArray(value)) {
88
+ if (typeof value.types === "string") {
89
+ typeEntries[newPath] = [trimRelative(value.types)];
90
+ } else if (typeof value.default === "string" && SCRIPT_EXTS.includes(node_path.extname(value.default))) {
91
+ typeEntries[newPath] = [trimRelative(value.default)];
92
+ }
93
+ }
94
+ }
95
+ const hasTypeEntries = Object.keys(typeEntries).length > 0;
96
+ const typesVersions = hasTypeEntries ? { "*": typeEntries } : void 0;
97
+ if (existingTypesVersions !== JSON.stringify(typesVersions)) {
98
+ if (pkg.packageJson.typesVersions) {
99
+ if (typesVersions) {
100
+ pkg.packageJson.typesVersions = typesVersions;
101
+ } else {
102
+ delete pkg.packageJson.typesVersions;
103
+ }
104
+ } else if (typesVersions) {
105
+ const newPkgEntries = Object.entries(pkg.packageJson);
106
+ newPkgEntries.splice(
107
+ newPkgEntries.findIndex(([name]) => name === "exports") + 1,
108
+ 0,
109
+ ["typesVersions", typesVersions]
110
+ );
111
+ pkg.packageJson = Object.fromEntries(
112
+ newPkgEntries
113
+ );
114
+ }
115
+ pkg.changed = true;
116
+ }
117
+ const publishConfig = pkg.packageJson.publishConfig;
118
+ if (publishConfig) {
119
+ for (const field of ["main", "module", "browser", "types"]) {
120
+ if (publishConfig[field]) {
121
+ delete publishConfig[field];
122
+ pkg.changed = true;
123
+ }
124
+ }
125
+ }
126
+ }
127
+ function fixSideEffects(pkg) {
128
+ const role = cliNode.PackageRoles.getRoleFromPackage(pkg.packageJson);
129
+ if (!role) {
130
+ return;
131
+ }
132
+ const roleInfo = cliNode.PackageRoles.getRoleInfo(role);
133
+ if (roleInfo.platform === "node") {
134
+ return;
135
+ }
136
+ if (roleInfo.output.length === 1 && roleInfo.output[0] === "bundle") {
137
+ return;
138
+ }
139
+ if ("sideEffects" in pkg.packageJson) {
140
+ return;
141
+ }
142
+ const pkgEntries = Object.entries(pkg.packageJson);
143
+ pkgEntries.splice(
144
+ // Place it just above the scripts field
145
+ pkgEntries.findIndex(([name]) => name === "scripts"),
146
+ 0,
147
+ ["sideEffects", false]
148
+ );
149
+ pkg.packageJson = Object.fromEntries(pkgEntries);
150
+ pkg.changed = true;
151
+ }
152
+ function createRepositoryFieldFixer() {
153
+ const rootPkg = require(cliCommon.targetPaths.resolveRoot("package.json"));
154
+ const rootRepoField = rootPkg.repository;
155
+ if (!rootRepoField) {
156
+ return () => {
157
+ };
158
+ }
159
+ const rootType = rootRepoField.type || "git";
160
+ const rootUrl = rootRepoField.url;
161
+ const rootDir = rootRepoField.directory || "";
162
+ return (pkg) => {
163
+ const expectedPath = node_path.posix.join(
164
+ rootDir,
165
+ node_path.relative(cliCommon.targetPaths.rootDir, pkg.dir)
166
+ );
167
+ const repoField = pkg.packageJson.repository;
168
+ if (!repoField || typeof repoField === "string") {
169
+ const pkgEntries = Object.entries(pkg.packageJson);
170
+ pkgEntries.splice(
171
+ // Place it just above the backstage field
172
+ pkgEntries.findIndex(([name]) => name === "backstage"),
173
+ 0,
174
+ [
175
+ "repository",
176
+ {
177
+ type: rootType,
178
+ url: rootUrl,
179
+ directory: expectedPath
180
+ }
181
+ ]
182
+ );
183
+ pkg.packageJson = Object.fromEntries(pkgEntries);
184
+ pkg.changed = true;
185
+ return;
186
+ }
187
+ if (repoField.type !== rootType || repoField.url !== rootUrl) {
188
+ return;
189
+ }
190
+ if (repoField.directory !== expectedPath) {
191
+ repoField.directory = expectedPath;
192
+ pkg.changed = true;
193
+ }
194
+ };
195
+ }
196
+ function guessPluginId(role, pkgName) {
197
+ switch (role) {
198
+ case "frontend":
199
+ case "frontend-plugin":
200
+ return pkgName.match(/plugin-(.*)/)?.[1];
201
+ case "frontend-plugin-module":
202
+ return pkgName.match(/plugin-(.*)-module-/)?.[1];
203
+ case "backend-plugin":
204
+ return pkgName.match(/plugin-(.*)-backend$/)?.[1];
205
+ case "backend-plugin-module":
206
+ return pkgName.match(/plugin-(.*)-backend-module-/)?.[1];
207
+ case "common-library":
208
+ return pkgName.match(/plugin-(.*)-(?:common)$/)?.[1];
209
+ case "web-library":
210
+ return pkgName.match(/plugin-(.*)-(?:react|test-utils)/)?.[1];
211
+ case "node-library":
212
+ return pkgName.match(/plugin-(.*)-(?:node|backend)-?/)?.[1];
213
+ default:
214
+ throw new Error(
215
+ `Invalid 'backstage.role' field in "${pkgName}", got '${role}'`
216
+ );
217
+ }
218
+ }
219
+ function fixPluginId(pkg) {
220
+ const role = pkg.packageJson.backstage?.role;
221
+ if (!role) {
222
+ return;
223
+ }
224
+ if (role === "backend" || role === "frontend" || role === "cli" || role === "cli-module") {
225
+ return;
226
+ }
227
+ const currentId = pkg.packageJson.backstage?.pluginId;
228
+ if (currentId !== void 0) {
229
+ if (typeof currentId !== "string" && currentId !== null) {
230
+ throw new Error(
231
+ `Invalid 'backstage.pluginId' field in "${pkg.packageJson.name}", must be a string`
232
+ );
233
+ }
234
+ return;
235
+ }
236
+ const guessedPluginId = guessPluginId(role, pkg.packageJson.name);
237
+ if (!guessedPluginId && (role === "frontend-plugin" || role === "frontend-plugin-module" || role === "backend-plugin" || role === "backend-plugin-module")) {
238
+ const path = node_path.relative(
239
+ cliCommon.targetPaths.rootDir,
240
+ node_path.resolve(pkg.dir, "package.json")
241
+ );
242
+ const msg = `Failed to guess plugin ID for "${pkg.packageJson.name}", please set the 'backstage.pluginId' field manually in "${path}"`;
243
+ if (role.endsWith("module")) {
244
+ const suggestedRole = role.startsWith("frontend") ? "web-library" : "node-library";
245
+ throw new Error(
246
+ `${msg}. It is also possible that this package is not a module, and should use the '${suggestedRole}' role instead.`
247
+ );
248
+ } else {
249
+ throw new Error(msg);
250
+ }
251
+ }
252
+ if (guessedPluginId) {
253
+ pkg.packageJson.backstage = {
254
+ ...pkg.packageJson.backstage,
255
+ pluginId: guessedPluginId
256
+ };
257
+ pkg.changed = true;
258
+ }
259
+ }
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
+ const pluginPackageRoles = [
276
+ "frontend-plugin",
277
+ "backend-plugin",
278
+ "common-library",
279
+ "web-library",
280
+ "node-library"
281
+ ];
282
+ function fixPluginPackages(pkg, repoPackages) {
283
+ const pkgBackstage = pkg.packageJson.backstage;
284
+ const role = pkgBackstage?.role;
285
+ if (!role) {
286
+ return;
287
+ }
288
+ if (role === "backend" || role === "frontend" || role === "cli" || role === "cli-module") {
289
+ return;
290
+ }
291
+ const pluginId = pkgBackstage.pluginId;
292
+ if (!pluginId) {
293
+ if (role === "common-library" || role === "web-library" || role === "node-library" || role === "frontend-plugin-module") {
294
+ return;
295
+ }
296
+ throw new Error(
297
+ `Missing 'backstage.pluginId' field in "${pkg.packageJson.name}"`
298
+ );
299
+ }
300
+ if (role === "backend-plugin-module" || role === "frontend-plugin-module") {
301
+ const targetRole = role.replace("-module", "");
302
+ const pluginPkgName = repoPackages.find(
303
+ (p) => p.packageJson.backstage?.pluginId === pluginId && p.packageJson.backstage?.role === targetRole
304
+ )?.packageJson.name ?? backendPluginPackageNameByPluginId.get(pluginId);
305
+ if (!pluginPkgName) {
306
+ if (pkgBackstage.pluginPackage) {
307
+ return;
308
+ }
309
+ const path = node_path.relative(
310
+ cliCommon.targetPaths.rootDir,
311
+ node_path.resolve(pkg.dir, "package.json")
312
+ );
313
+ const suggestedRole = role === "frontend-plugin-module" ? "web-library" : "node-library";
314
+ 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.`
316
+ );
317
+ }
318
+ if (pkgBackstage.pluginPackage !== pluginPkgName) {
319
+ pkgBackstage.pluginPackage = pluginPkgName;
320
+ pkg.changed = true;
321
+ }
322
+ } else {
323
+ let pluginPackages = repoPackages.filter(
324
+ (p) => p.packageJson.backstage?.pluginId === pluginId && pluginPackageRoles.includes(p.packageJson.backstage?.role)
325
+ ).map((p) => p.packageJson.name).sort();
326
+ if (pluginPackages.length === 0) {
327
+ pluginPackages = void 0;
328
+ }
329
+ if (pkgBackstage.pluginPackages?.join(",") !== pluginPackages?.join(",")) {
330
+ pkgBackstage.pluginPackages = pluginPackages;
331
+ pkg.changed = true;
332
+ }
333
+ }
334
+ }
335
+ function fixPeerModules(pkg) {
336
+ const pkgBackstage = pkg.packageJson.backstage;
337
+ const role = pkgBackstage?.role;
338
+ if (!role) {
339
+ return;
340
+ }
341
+ const peerModules = pkgBackstage.peerModules;
342
+ if (peerModules === void 0) {
343
+ return;
344
+ }
345
+ const packagePath = node_path.relative(
346
+ cliCommon.targetPaths.rootDir,
347
+ node_path.resolve(pkg.dir, "package.json")
348
+ );
349
+ if (role !== "backend-plugin" && role !== "frontend-plugin") {
350
+ throw new Error(
351
+ `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}"`
352
+ );
353
+ }
354
+ if (!Array.isArray(peerModules)) {
355
+ throw new Error(
356
+ `Invalid 'backstage.peerModules' field in "${pkg.packageJson.name}", must be an array of package names in "${packagePath}"`
357
+ );
358
+ }
359
+ for (const entry of peerModules) {
360
+ if (typeof entry !== "string" || entry.length === 0) {
361
+ throw new Error(
362
+ `Invalid entry in 'backstage.peerModules' field in "${pkg.packageJson.name}", all entries must be non-empty package name strings in "${packagePath}"`
363
+ );
364
+ }
365
+ }
366
+ }
367
+ var fix = async ({
368
+ args,
369
+ info
370
+ }) => {
371
+ const {
372
+ flags: { publish, check }
373
+ } = cleye.cli(
374
+ {
375
+ help: info,
376
+ booleanFlagNegation: true,
377
+ flags: {
378
+ publish: {
379
+ type: Boolean,
380
+ description: "Enable additional fixes that only apply when publishing packages"
381
+ },
382
+ check: {
383
+ type: Boolean,
384
+ description: "Fail if any packages would have been changed by the command"
385
+ }
386
+ }
387
+ },
388
+ void 0,
389
+ args
390
+ );
391
+ const packages = await readFixablePackages();
392
+ const fixRepositoryField = createRepositoryFieldFixer();
393
+ const fixers = [fixPackageExports, fixSideEffects];
394
+ if (publish) {
395
+ fixers.push(
396
+ fixRepositoryField,
397
+ fixPluginId,
398
+ fixPluginPackages,
399
+ fixPeerModules
400
+ );
401
+ }
402
+ for (const fixer of fixers) {
403
+ for (const pkg of packages) {
404
+ fixer(pkg, packages);
405
+ }
406
+ }
407
+ if (check) {
408
+ if (printPackageFixHint(packages)) {
409
+ process.exit(1);
410
+ }
411
+ } else {
412
+ await writeFixedPackages(packages);
413
+ }
414
+ };
415
+
416
+ exports.createRepositoryFieldFixer = createRepositoryFieldFixer;
417
+ exports.default = fix;
418
+ exports.fixPackageExports = fixPackageExports;
419
+ exports.fixPeerModules = fixPeerModules;
420
+ exports.fixPluginId = fixPluginId;
421
+ exports.fixPluginPackages = fixPluginPackages;
422
+ exports.fixSideEffects = fixSideEffects;
423
+ exports.printPackageFixHint = printPackageFixHint;
424
+ exports.readFixablePackages = readFixablePackages;
425
+ exports.writeFixedPackages = writeFixedPackages;
426
+ //# sourceMappingURL=fix.cjs.js.map
@@ -0,0 +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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"}
@@ -0,0 +1,90 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var chalk = require('chalk');
6
+ var eslint = require('eslint');
7
+ var cleye = require('cleye');
8
+ var node_path = require('node:path');
9
+ var cliNode = require('@backstage/cli-node');
10
+ var cliCommon = require('@backstage/cli-common');
11
+
12
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
13
+
14
+ var chalk__default = /*#__PURE__*/_interopDefaultCompat(chalk);
15
+
16
+ var listDeprecations = async ({ args, info }) => {
17
+ const {
18
+ flags: { json }
19
+ } = cleye.cli(
20
+ {
21
+ help: info,
22
+ booleanFlagNegation: true,
23
+ flags: {
24
+ json: { type: Boolean, description: "Output as JSON" }
25
+ }
26
+ },
27
+ void 0,
28
+ args
29
+ );
30
+ const packages = await cliNode.PackageGraph.listTargetPackages();
31
+ const eslint$1 = new eslint.ESLint({
32
+ cwd: cliCommon.targetPaths.dir,
33
+ overrideConfig: {
34
+ plugins: ["deprecation"],
35
+ rules: {
36
+ "deprecation/deprecation": "error"
37
+ },
38
+ parserOptions: {
39
+ project: [cliCommon.targetPaths.resolveRoot("tsconfig.json")]
40
+ }
41
+ },
42
+ extensions: ["jsx", "ts", "tsx", "mjs", "cjs"]
43
+ });
44
+ const { stderr } = process;
45
+ if (stderr.isTTY) {
46
+ stderr.write("Initializing TypeScript...");
47
+ }
48
+ const deprecations = [];
49
+ for (const [index, pkg] of packages.entries()) {
50
+ const results = await eslint$1.lintFiles(pkg.dir);
51
+ for (const result of results) {
52
+ for (const message of result.messages) {
53
+ if (message.ruleId !== "deprecation/deprecation") {
54
+ continue;
55
+ }
56
+ const path = node_path.relative(cliCommon.targetPaths.rootDir, result.filePath);
57
+ deprecations.push({
58
+ path,
59
+ message: message.message,
60
+ line: message.line,
61
+ column: message.column
62
+ });
63
+ }
64
+ }
65
+ if (stderr.isTTY) {
66
+ stderr.clearLine(0);
67
+ stderr.cursorTo(0);
68
+ stderr.write(`Scanning packages ${index + 1}/${packages.length}`);
69
+ }
70
+ }
71
+ if (stderr.isTTY) {
72
+ stderr.clearLine(0);
73
+ stderr.cursorTo(0);
74
+ }
75
+ if (json) {
76
+ console.log(JSON.stringify(deprecations, null, 2));
77
+ } else {
78
+ for (const d of deprecations) {
79
+ const location = `${d.path}:${d.line}:${d.column}`;
80
+ const wrappedMessage = d.message.replace(/\r?\n\s*/g, " ");
81
+ console.log(`${location} - ${chalk__default.default.yellow(wrappedMessage)}`);
82
+ }
83
+ }
84
+ if (deprecations.length > 0) {
85
+ process.exit(1);
86
+ }
87
+ };
88
+
89
+ exports.default = listDeprecations;
90
+ //# sourceMappingURL=list-deprecations.cjs.js.map
@@ -0,0 +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":"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"}
@@ -0,0 +1,25 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var cliNode = require('@backstage/cli-node');
6
+ var _package = require('./package.json.cjs.js');
7
+
8
+ var index = cliNode.createCliModule({
9
+ packageJson: _package.default,
10
+ init: async (reg) => {
11
+ reg.addCommand({
12
+ path: ["repo", "fix"],
13
+ description: "Automatically fix packages in the project",
14
+ execute: { loader: () => import('./commands/repo/fix.cjs.js') }
15
+ });
16
+ reg.addCommand({
17
+ path: ["repo", "list-deprecations"],
18
+ description: "List deprecations",
19
+ execute: { loader: () => import('./commands/repo/list-deprecations.cjs.js') }
20
+ });
21
+ }
22
+ });
23
+
24
+ exports.default = index;
25
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/index.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 */\nimport { createCliModule } from '@backstage/cli-node';\nimport packageJson from '../package.json';\n\nexport default createCliModule({\n packageJson,\n init: async reg => {\n reg.addCommand({\n path: ['repo', 'fix'],\n description: 'Automatically fix packages in the project',\n execute: { loader: () => import('./commands/repo/fix') },\n });\n\n reg.addCommand({\n path: ['repo', 'list-deprecations'],\n description: 'List deprecations',\n execute: { loader: () => import('./commands/repo/list-deprecations') },\n });\n },\n});\n"],"names":["createCliModule","packageJson"],"mappings":";;;;;;;AAkBA,YAAeA,uBAAA,CAAgB;AAAA,eAC7BC,gBAAA;AAAA,EACA,IAAA,EAAM,OAAM,GAAA,KAAO;AACjB,IAAA,GAAA,CAAI,UAAA,CAAW;AAAA,MACb,IAAA,EAAM,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,MACpB,WAAA,EAAa,2CAAA;AAAA,MACb,SAAS,EAAE,MAAA,EAAQ,MAAM,OAAO,4BAAqB,CAAA;AAAE,KACxD,CAAA;AAED,IAAA,GAAA,CAAI,UAAA,CAAW;AAAA,MACb,IAAA,EAAM,CAAC,MAAA,EAAQ,mBAAmB,CAAA;AAAA,MAClC,WAAA,EAAa,mBAAA;AAAA,MACb,SAAS,EAAE,MAAA,EAAQ,MAAM,OAAO,0CAAmC,CAAA;AAAE,KACtE,CAAA;AAAA,EACH;AACF,CAAC,CAAA;;;;"}
@@ -0,0 +1,5 @@
1
+ import * as _backstage_cli_node from '@backstage/cli-node';
2
+
3
+ declare const _default: _backstage_cli_node.CliModule;
4
+
5
+ export { _default as default };
@@ -0,0 +1,84 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var name = "@backstage/cli-module-maintenance";
6
+ var version = "0.0.0-nightly-20260317031259";
7
+ var description = "CLI module for Backstage CLI";
8
+ var backstage = {
9
+ role: "cli-module"
10
+ };
11
+ var publishConfig = {
12
+ access: "public",
13
+ main: "dist/index.cjs.js",
14
+ types: "dist/index.d.ts"
15
+ };
16
+ var homepage = "https://backstage.io";
17
+ var repository = {
18
+ type: "git",
19
+ url: "https://github.com/backstage/backstage",
20
+ directory: "packages/cli-module-maintenance"
21
+ };
22
+ var license = "Apache-2.0";
23
+ var main = "src/index.ts";
24
+ var types = "src/index.ts";
25
+ var files = [
26
+ "dist",
27
+ "bin"
28
+ ];
29
+ var scripts = {
30
+ build: "backstage-cli package build",
31
+ clean: "backstage-cli package clean",
32
+ lint: "backstage-cli package lint",
33
+ prepack: "backstage-cli package prepack",
34
+ postpack: "backstage-cli package postpack",
35
+ test: "backstage-cli package test"
36
+ };
37
+ var dependencies = {
38
+ "@backstage/cli-common": "workspace:*",
39
+ "@backstage/cli-node": "workspace:*",
40
+ chalk: "^4.0.0",
41
+ cleye: "^2.3.0",
42
+ eslint: "^8.6.0",
43
+ "fs-extra": "^11.2.0"
44
+ };
45
+ var devDependencies = {
46
+ "@backstage/cli": "workspace:*",
47
+ "@types/fs-extra": "^11.0.0"
48
+ };
49
+ var bin = "bin/backstage-cli-module-maintenance";
50
+ var packageJson = {
51
+ name: name,
52
+ version: version,
53
+ description: description,
54
+ backstage: backstage,
55
+ publishConfig: publishConfig,
56
+ homepage: homepage,
57
+ repository: repository,
58
+ license: license,
59
+ main: main,
60
+ types: types,
61
+ files: files,
62
+ scripts: scripts,
63
+ dependencies: dependencies,
64
+ devDependencies: devDependencies,
65
+ bin: bin
66
+ };
67
+
68
+ exports.backstage = backstage;
69
+ exports.bin = bin;
70
+ exports.default = packageJson;
71
+ exports.dependencies = dependencies;
72
+ exports.description = description;
73
+ exports.devDependencies = devDependencies;
74
+ exports.files = files;
75
+ exports.homepage = homepage;
76
+ exports.license = license;
77
+ exports.main = main;
78
+ exports.name = name;
79
+ exports.publishConfig = publishConfig;
80
+ exports.repository = repository;
81
+ exports.scripts = scripts;
82
+ exports.types = types;
83
+ exports.version = version;
84
+ //# sourceMappingURL=package.json.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.json.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@backstage/cli-module-maintenance",
3
+ "version": "0.0.0-nightly-20260317031259",
4
+ "description": "CLI module for Backstage CLI",
5
+ "backstage": {
6
+ "role": "cli-module"
7
+ },
8
+ "publishConfig": {
9
+ "access": "public",
10
+ "main": "dist/index.cjs.js",
11
+ "types": "dist/index.d.ts"
12
+ },
13
+ "homepage": "https://backstage.io",
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "https://github.com/backstage/backstage",
17
+ "directory": "packages/cli-module-maintenance"
18
+ },
19
+ "license": "Apache-2.0",
20
+ "main": "dist/index.cjs.js",
21
+ "types": "dist/index.d.ts",
22
+ "files": [
23
+ "dist",
24
+ "bin"
25
+ ],
26
+ "scripts": {
27
+ "build": "backstage-cli package build",
28
+ "clean": "backstage-cli package clean",
29
+ "lint": "backstage-cli package lint",
30
+ "prepack": "backstage-cli package prepack",
31
+ "postpack": "backstage-cli package postpack",
32
+ "test": "backstage-cli package test"
33
+ },
34
+ "dependencies": {
35
+ "@backstage/cli-common": "0.0.0-nightly-20260317031259",
36
+ "@backstage/cli-node": "0.0.0-nightly-20260317031259",
37
+ "chalk": "^4.0.0",
38
+ "cleye": "^2.3.0",
39
+ "eslint": "^8.6.0",
40
+ "fs-extra": "^11.2.0"
41
+ },
42
+ "devDependencies": {
43
+ "@backstage/cli": "0.0.0-nightly-20260317031259",
44
+ "@types/fs-extra": "^11.0.0"
45
+ },
46
+ "bin": "bin/backstage-cli-module-maintenance",
47
+ "typesVersions": {
48
+ "*": {
49
+ "package.json": [
50
+ "package.json"
51
+ ]
52
+ }
53
+ }
54
+ }