@backstage/cli-module-migrate 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.
@@ -0,0 +1,403 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var cliCommon = require('@backstage/cli-common');
6
+ var node_process = require('node:process');
7
+ var fs = require('fs-extra');
8
+ var chalk = require('chalk');
9
+ var minimatch = require('minimatch');
10
+ var semver = require('semver');
11
+ var cleye = require('cleye');
12
+ var errors = require('@backstage/errors');
13
+ var node_path = require('node:path');
14
+ var cliNode = require('@backstage/cli-node');
15
+ var packages = require('../../lib/versioning/packages.cjs.js');
16
+ var releaseManifests = require('@backstage/release-manifests');
17
+ var migrate = require('./migrate.cjs.js');
18
+ var utils = require('../../lib/utils.cjs.js');
19
+
20
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
21
+
22
+ var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
23
+ var chalk__default = /*#__PURE__*/_interopDefaultCompat(chalk);
24
+ var semver__default = /*#__PURE__*/_interopDefaultCompat(semver);
25
+
26
+ cliCommon.bootstrapEnvProxyAgents();
27
+ const DEP_TYPES = [
28
+ "dependencies",
29
+ "devDependencies",
30
+ "peerDependencies",
31
+ "optionalDependencies"
32
+ ];
33
+ const DEFAULT_PATTERN_GLOB = "@backstage/*";
34
+ function extendsDefaultPattern(pattern) {
35
+ if (!pattern.endsWith("/*")) {
36
+ return false;
37
+ }
38
+ return minimatch.minimatch("@backstage/", pattern.slice(0, -1));
39
+ }
40
+ var bump = async ({ args, info }) => {
41
+ const {
42
+ flags: { pattern: patternFlag, release, skipInstall, skipMigrate }
43
+ } = cleye.cli(
44
+ {
45
+ help: info,
46
+ booleanFlagNegation: true,
47
+ flags: {
48
+ pattern: {
49
+ type: String,
50
+ description: "Override glob for matching packages to upgrade"
51
+ },
52
+ release: {
53
+ type: String,
54
+ description: "Bump to a specific Backstage release line or version",
55
+ default: "main"
56
+ },
57
+ skipInstall: {
58
+ type: Boolean,
59
+ description: "Skips yarn install step"
60
+ },
61
+ skipMigrate: {
62
+ type: Boolean,
63
+ description: "Skips migration of any moved packages"
64
+ }
65
+ }
66
+ },
67
+ void 0,
68
+ args
69
+ );
70
+ const lockfilePath = cliCommon.targetPaths.resolveRoot("yarn.lock");
71
+ const lockfile = await cliNode.Lockfile.load(lockfilePath);
72
+ const yarnPluginEnabled = await cliNode.hasBackstageYarnPlugin();
73
+ let pattern = patternFlag;
74
+ if (!pattern) {
75
+ console.log(`Using default pattern glob ${DEFAULT_PATTERN_GLOB}`);
76
+ pattern = DEFAULT_PATTERN_GLOB;
77
+ } else if (pattern === "*") {
78
+ throw new Error(`Rejected pattern '*', please use a more specific pattern`);
79
+ } else {
80
+ console.log(`Using custom pattern glob ${pattern}`);
81
+ }
82
+ let findTargetVersion;
83
+ let releaseManifest;
84
+ if (node_process.env.BACKSTAGE_MANIFEST_FILE) {
85
+ releaseManifest = await fs__default.default.readJson(node_process.env.BACKSTAGE_MANIFEST_FILE);
86
+ findTargetVersion = createStrictVersionFinder({
87
+ releaseManifest
88
+ });
89
+ } else if (semver__default.default.valid(release)) {
90
+ releaseManifest = await releaseManifests.getManifestByVersion({ version: release });
91
+ findTargetVersion = createStrictVersionFinder({
92
+ releaseManifest
93
+ });
94
+ } else {
95
+ if (release === "next") {
96
+ const next = await releaseManifests.getManifestByReleaseLine({
97
+ releaseLine: "next",
98
+ versionsBaseUrl: node_process.env.BACKSTAGE_VERSIONS_BASE_URL
99
+ });
100
+ const main = await releaseManifests.getManifestByReleaseLine({
101
+ releaseLine: "main",
102
+ versionsBaseUrl: node_process.env.BACKSTAGE_VERSIONS_BASE_URL
103
+ });
104
+ releaseManifest = semver__default.default.gt(next.releaseVersion, main.releaseVersion) ? next : main;
105
+ } else {
106
+ releaseManifest = await releaseManifests.getManifestByReleaseLine({
107
+ releaseLine: release,
108
+ versionsBaseUrl: node_process.env.BACKSTAGE_VERSIONS_BASE_URL
109
+ });
110
+ }
111
+ findTargetVersion = createVersionFinder({
112
+ releaseLine: release,
113
+ releaseManifest
114
+ });
115
+ }
116
+ if (yarnPluginEnabled) {
117
+ console.log();
118
+ console.log(
119
+ `Updating yarn plugin to v${releaseManifest.releaseVersion}...`
120
+ );
121
+ console.log();
122
+ const yarnPluginUrl = node_process.env.BACKSTAGE_VERSIONS_BASE_URL ? `${node_process.env.BACKSTAGE_VERSIONS_BASE_URL}/v1/releases/${releaseManifest.releaseVersion}/yarn-plugin` : `https://versions.backstage.io/v1/releases/${releaseManifest.releaseVersion}/yarn-plugin`;
123
+ await cliCommon.run(["yarn", "plugin", "import", yarnPluginUrl]).waitForExit();
124
+ console.log();
125
+ }
126
+ const dependencyMap = await packages.mapDependencies(cliCommon.targetPaths.dir, pattern);
127
+ const versionBumps = /* @__PURE__ */ new Map();
128
+ await cliNode.runConcurrentTasks({
129
+ concurrencyFactor: 4,
130
+ items: dependencyMap.entries(),
131
+ async worker([name, pkgs]) {
132
+ let target;
133
+ try {
134
+ target = await findTargetVersion(name);
135
+ } catch (error) {
136
+ if (errors.isError(error) && error.name === "NotFoundError") {
137
+ console.log(`Package info not found, ignoring package ${name}`);
138
+ return;
139
+ }
140
+ throw error;
141
+ }
142
+ for (const pkg of pkgs) {
143
+ versionBumps.set(
144
+ pkg.name,
145
+ (versionBumps.get(pkg.name) ?? []).concat({
146
+ name,
147
+ location: pkg.location,
148
+ range: `^${target}`,
149
+ // TODO(Rugvip): Option to use something else than ^?
150
+ target
151
+ })
152
+ );
153
+ }
154
+ }
155
+ });
156
+ if (versionBumps.size === 0) {
157
+ console.log(chalk__default.default.green("All Backstage packages are up to date!"));
158
+ } else {
159
+ console.log(chalk__default.default.yellow("Some packages are outdated, updating"));
160
+ console.log();
161
+ const breakingUpdates = /* @__PURE__ */ new Map();
162
+ await cliNode.runConcurrentTasks({
163
+ concurrencyFactor: 4,
164
+ items: versionBumps.entries(),
165
+ async worker([name, deps]) {
166
+ const pkgPath = node_path.resolve(deps[0].location, "package.json");
167
+ const pkgJson = await fs__default.default.readJson(pkgPath);
168
+ for (const dep of deps) {
169
+ console.log(
170
+ `${chalk__default.default.cyan("bumping")} ${dep.name} in ${chalk__default.default.cyan(
171
+ name
172
+ )} to ${chalk__default.default.yellow(dep.range)}`
173
+ );
174
+ for (const depType of DEP_TYPES) {
175
+ if (depType in pkgJson && dep.name in pkgJson[depType]) {
176
+ const oldRange = pkgJson[depType][dep.name];
177
+ const oldLockfileRange = await asLockfileVersion(oldRange);
178
+ const useBackstageRange = yarnPluginEnabled && // Only use backstage:^ versions if the package is present in
179
+ // the manifest for the release we're bumping to.
180
+ releaseManifest.packages.find(
181
+ ({ name: manifestPackageName }) => dep.name === manifestPackageName
182
+ ) && // Don't use backstage:^ versions for peerDependencies; they only
183
+ // support npm and workspace: versions.
184
+ depType !== "peerDependencies";
185
+ const newRange = useBackstageRange ? "backstage:^" : dep.range;
186
+ pkgJson[depType][dep.name] = newRange;
187
+ const lockfileEntry = lockfile.get(dep.name)?.find((entry) => entry.range === oldLockfileRange);
188
+ if (lockfileEntry) {
189
+ const from = lockfileEntry.version;
190
+ const to = dep.target;
191
+ if (!semver__default.default.satisfies(to, `^${from}`)) {
192
+ breakingUpdates.set(dep.name, { from, to });
193
+ }
194
+ }
195
+ }
196
+ }
197
+ }
198
+ await fs__default.default.writeJson(pkgPath, pkgJson, { spaces: 2 });
199
+ }
200
+ });
201
+ console.log();
202
+ if (extendsDefaultPattern(pattern)) {
203
+ await bumpBackstageJsonVersion(
204
+ releaseManifest.releaseVersion,
205
+ yarnPluginEnabled
206
+ );
207
+ } else {
208
+ console.log(
209
+ chalk__default.default.yellow(
210
+ `Skipping backstage.json update as custom pattern is used`
211
+ )
212
+ );
213
+ }
214
+ if (!skipInstall) {
215
+ await utils.runYarnInstall();
216
+ } else {
217
+ console.log();
218
+ console.log(chalk__default.default.yellow(`Skipping yarn install`));
219
+ }
220
+ if (!skipMigrate) {
221
+ console.log();
222
+ const changed = await migrate.migrateMovedPackages({
223
+ pattern: patternFlag
224
+ });
225
+ if (changed && !skipInstall) {
226
+ await utils.runYarnInstall();
227
+ }
228
+ }
229
+ if (breakingUpdates.size > 0) {
230
+ console.log();
231
+ console.log(
232
+ chalk__default.default.yellow("\u26A0\uFE0F The following packages may have breaking changes:")
233
+ );
234
+ console.log();
235
+ for (const [name, { from, to }] of Array.from(
236
+ breakingUpdates.entries()
237
+ ).sort()) {
238
+ console.log(
239
+ ` ${chalk__default.default.yellow(name)} : ${chalk__default.default.yellow(from)} ~> ${chalk__default.default.yellow(
240
+ to
241
+ )}`
242
+ );
243
+ let path;
244
+ if (name.startsWith("@backstage/plugin-")) {
245
+ path = `plugins/${name.replace("@backstage/plugin-", "")}`;
246
+ } else if (name.startsWith("@backstage/")) {
247
+ path = `packages/${name.replace("@backstage/", "")}`;
248
+ }
249
+ if (path) {
250
+ console.log(
251
+ ` https://github.com/backstage/backstage/blob/master/${path}/CHANGELOG.md`
252
+ );
253
+ }
254
+ console.log();
255
+ }
256
+ } else {
257
+ console.log();
258
+ }
259
+ if (yarnPluginEnabled) {
260
+ console.log();
261
+ console.log(
262
+ chalk__default.default.blue(
263
+ `${chalk__default.default.bold(
264
+ "NOTE"
265
+ )}: this bump used backstage:^ versions in package.json files, since the Backstage yarn plugin was detected in the repository. To migrate back to explicit npm versions, remove the plugin by running "yarn plugin remove @yarnpkg/plugin-backstage", then repeat this command.`
266
+ )
267
+ );
268
+ console.log();
269
+ }
270
+ console.log(chalk__default.default.green("Version bump complete!"));
271
+ }
272
+ console.log();
273
+ };
274
+ function createStrictVersionFinder(options) {
275
+ const releasePackages = new Map(
276
+ options.releaseManifest.packages.map((p) => [p.name, p.version])
277
+ );
278
+ return async function findTargetVersion(name) {
279
+ console.log(`Checking for updates of ${name}`);
280
+ const manifestVersion = releasePackages.get(name);
281
+ if (manifestVersion) {
282
+ return manifestVersion;
283
+ }
284
+ throw new errors.NotFoundError(`Package ${name} not found in release manifest`);
285
+ };
286
+ }
287
+ function createVersionFinder(options) {
288
+ const {
289
+ releaseLine = "latest",
290
+ packageInfoFetcher = packages.fetchPackageInfo,
291
+ releaseManifest
292
+ } = options;
293
+ const distTag = releaseLine === "main" ? "latest" : releaseLine;
294
+ const found = /* @__PURE__ */ new Map();
295
+ const releasePackages = new Map(
296
+ releaseManifest?.packages.map((p) => [p.name, p.version])
297
+ );
298
+ return async function findTargetVersion(name) {
299
+ const existing = found.get(name);
300
+ if (existing) {
301
+ return existing;
302
+ }
303
+ console.log(`Checking for updates of ${name}`);
304
+ const manifestVersion = releasePackages.get(name);
305
+ if (manifestVersion) {
306
+ return manifestVersion;
307
+ }
308
+ const info = await packageInfoFetcher(name);
309
+ const latestVersion = info["dist-tags"].latest;
310
+ if (!latestVersion) {
311
+ throw new Error(`No target 'latest' version found for ${name}`);
312
+ }
313
+ const taggedVersion = info["dist-tags"][distTag];
314
+ if (distTag === "latest" || !taggedVersion) {
315
+ found.set(name, latestVersion);
316
+ return latestVersion;
317
+ }
318
+ const latestVersionDateStr = info.time[latestVersion];
319
+ const taggedVersionDateStr = info.time[taggedVersion];
320
+ if (!latestVersionDateStr) {
321
+ throw new Error(
322
+ `No time available for version '${latestVersion}' of ${name}`
323
+ );
324
+ }
325
+ if (!taggedVersionDateStr) {
326
+ throw new Error(
327
+ `No time available for version '${taggedVersion}' of ${name}`
328
+ );
329
+ }
330
+ const latestVersionRelease = new Date(latestVersionDateStr).getTime();
331
+ const taggedVersionRelease = new Date(taggedVersionDateStr).getTime();
332
+ if (latestVersionRelease > taggedVersionRelease) {
333
+ found.set(name, latestVersion);
334
+ return latestVersion;
335
+ }
336
+ found.set(name, taggedVersion);
337
+ return taggedVersion;
338
+ };
339
+ }
340
+ function getBackstageJsonPath() {
341
+ return cliCommon.targetPaths.resolveRoot(cliCommon.BACKSTAGE_JSON);
342
+ }
343
+ async function getBackstageJson() {
344
+ const backstageJsonPath = getBackstageJsonPath();
345
+ return fs__default.default.readJSON(backstageJsonPath).catch((e) => {
346
+ if (e.code === "ENOENT") {
347
+ return;
348
+ }
349
+ throw e;
350
+ });
351
+ }
352
+ async function bumpBackstageJsonVersion(version, useYarnPlugin) {
353
+ const backstageJson = await getBackstageJson();
354
+ const prevVersion = backstageJson?.version;
355
+ if (prevVersion === version) {
356
+ return;
357
+ }
358
+ const { yellow, cyan, green } = chalk__default.default;
359
+ if (prevVersion) {
360
+ const from = encodeURIComponent(prevVersion);
361
+ const to = encodeURIComponent(version);
362
+ let link = `https://backstage.github.io/upgrade-helper/?from=${from}&to=${to}`;
363
+ if (useYarnPlugin) {
364
+ link += "&yarnPlugin=1";
365
+ }
366
+ console.log(
367
+ yellow(
368
+ `Upgraded from release ${green(prevVersion)} to ${green(
369
+ version
370
+ )}, please review these template changes:`
371
+ )
372
+ );
373
+ console.log();
374
+ console.log(` ${cyan(link)}`);
375
+ console.log();
376
+ } else {
377
+ console.log(
378
+ yellow(
379
+ `Your project is now at version ${version}, which has been written to ${cliCommon.BACKSTAGE_JSON}`
380
+ )
381
+ );
382
+ }
383
+ await fs__default.default.writeJson(
384
+ getBackstageJsonPath(),
385
+ { ...backstageJson, version },
386
+ {
387
+ spaces: 2,
388
+ encoding: "utf8"
389
+ }
390
+ );
391
+ }
392
+ async function asLockfileVersion(version) {
393
+ if (version === "backstage:^") {
394
+ return `backstage:${(await getBackstageJson())?.version}`;
395
+ }
396
+ return version;
397
+ }
398
+
399
+ exports.bumpBackstageJsonVersion = bumpBackstageJsonVersion;
400
+ exports.createStrictVersionFinder = createStrictVersionFinder;
401
+ exports.createVersionFinder = createVersionFinder;
402
+ exports.default = bump;
403
+ //# sourceMappingURL=bump.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bump.cjs.js","sources":["../../../src/commands/versions/bump.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 */\nimport {\n BACKSTAGE_JSON,\n bootstrapEnvProxyAgents,\n targetPaths,\n} from '@backstage/cli-common';\n\nbootstrapEnvProxyAgents();\n\nimport { env } from 'node:process';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport { minimatch } from 'minimatch';\nimport semver from 'semver';\nimport { cli } from 'cleye';\nimport { isError, NotFoundError } from '@backstage/errors';\nimport { resolve as resolvePath } from 'node:path';\n\nimport {\n hasBackstageYarnPlugin,\n Lockfile,\n runConcurrentTasks,\n} from '@backstage/cli-node';\nimport {\n fetchPackageInfo,\n mapDependencies,\n YarnInfoInspectData,\n} from '../../lib/versioning/packages';\nimport {\n getManifestByReleaseLine,\n getManifestByVersion,\n ReleaseManifest,\n} from '@backstage/release-manifests';\nimport { migrateMovedPackages } from './migrate';\nimport { runYarnInstall } from '../../lib/utils';\nimport { run } from '@backstage/cli-common';\nimport type { CliCommandContext } from '@backstage/cli-node';\n\nconst DEP_TYPES = [\n 'dependencies',\n 'devDependencies',\n 'peerDependencies',\n 'optionalDependencies',\n];\n\nconst DEFAULT_PATTERN_GLOB = '@backstage/*';\n\ntype PkgVersionInfo = {\n range: string;\n target: string;\n name: string;\n location: string;\n};\n\nfunction extendsDefaultPattern(pattern: string): boolean {\n if (!pattern.endsWith('/*')) {\n return false;\n }\n\n return minimatch('@backstage/', pattern.slice(0, -1));\n}\n\nexport default async ({ args, info }: CliCommandContext) => {\n const {\n flags: { pattern: patternFlag, release, skipInstall, skipMigrate },\n } = cli(\n {\n help: info,\n booleanFlagNegation: true,\n flags: {\n pattern: {\n type: String,\n description: 'Override glob for matching packages to upgrade',\n },\n release: {\n type: String,\n description: 'Bump to a specific Backstage release line or version',\n default: 'main',\n },\n skipInstall: {\n type: Boolean,\n description: 'Skips yarn install step',\n },\n skipMigrate: {\n type: Boolean,\n description: 'Skips migration of any moved packages',\n },\n },\n },\n undefined,\n args,\n );\n\n const lockfilePath = targetPaths.resolveRoot('yarn.lock');\n const lockfile = await Lockfile.load(lockfilePath);\n const yarnPluginEnabled = await hasBackstageYarnPlugin();\n\n let pattern = patternFlag;\n\n if (!pattern) {\n console.log(`Using default pattern glob ${DEFAULT_PATTERN_GLOB}`);\n pattern = DEFAULT_PATTERN_GLOB;\n } else if (pattern === '*') {\n throw new Error(`Rejected pattern '*', please use a more specific pattern`);\n } else {\n console.log(`Using custom pattern glob ${pattern}`);\n }\n\n let findTargetVersion: (name: string) => Promise<string>;\n let releaseManifest: ReleaseManifest;\n if (env.BACKSTAGE_MANIFEST_FILE) {\n // Use specific manifest file if provided\n releaseManifest = await fs.readJson(env.BACKSTAGE_MANIFEST_FILE);\n findTargetVersion = createStrictVersionFinder({\n releaseManifest,\n });\n } else if (semver.valid(release)) {\n // Specific release specified. Be strict when resolving versions\n releaseManifest = await getManifestByVersion({ version: release! });\n findTargetVersion = createStrictVersionFinder({\n releaseManifest,\n });\n } else {\n // Release line specified. Be lenient when resolving versions.\n if (release === 'next') {\n const next = await getManifestByReleaseLine({\n releaseLine: 'next',\n versionsBaseUrl: env.BACKSTAGE_VERSIONS_BASE_URL,\n });\n const main = await getManifestByReleaseLine({\n releaseLine: 'main',\n versionsBaseUrl: env.BACKSTAGE_VERSIONS_BASE_URL,\n });\n // Prefer manifest with the latest release version\n releaseManifest = semver.gt(next.releaseVersion, main.releaseVersion)\n ? next\n : main;\n } else {\n releaseManifest = await getManifestByReleaseLine({\n releaseLine: release!,\n versionsBaseUrl: env.BACKSTAGE_VERSIONS_BASE_URL,\n });\n }\n findTargetVersion = createVersionFinder({\n releaseLine: release,\n releaseManifest,\n });\n }\n\n if (yarnPluginEnabled) {\n console.log();\n console.log(\n `Updating yarn plugin to v${releaseManifest.releaseVersion}...`,\n );\n console.log();\n\n const yarnPluginUrl = env.BACKSTAGE_VERSIONS_BASE_URL\n ? `${env.BACKSTAGE_VERSIONS_BASE_URL}/v1/releases/${releaseManifest.releaseVersion}/yarn-plugin`\n : `https://versions.backstage.io/v1/releases/${releaseManifest.releaseVersion}/yarn-plugin`;\n\n await run(['yarn', 'plugin', 'import', yarnPluginUrl]).waitForExit();\n console.log();\n }\n\n // First we discover all Backstage dependencies within our own repo\n const dependencyMap = await mapDependencies(targetPaths.dir, pattern);\n\n // Next check with the package registry to see which dependency ranges we need to bump\n const versionBumps = new Map<string, PkgVersionInfo[]>();\n\n await runConcurrentTasks({\n concurrencyFactor: 4,\n items: dependencyMap.entries(),\n async worker([name, pkgs]) {\n let target: string;\n try {\n target = await findTargetVersion(name);\n } catch (error) {\n if (isError(error) && error.name === 'NotFoundError') {\n console.log(`Package info not found, ignoring package ${name}`);\n return;\n }\n throw error;\n }\n\n for (const pkg of pkgs) {\n versionBumps.set(\n pkg.name,\n (versionBumps.get(pkg.name) ?? []).concat({\n name,\n location: pkg.location,\n range: `^${target}`, // TODO(Rugvip): Option to use something else than ^?\n target,\n }),\n );\n }\n },\n });\n\n // Write all discovered version bumps to package.json in this repo\n if (versionBumps.size === 0) {\n console.log(chalk.green('All Backstage packages are up to date!'));\n } else {\n console.log(chalk.yellow('Some packages are outdated, updating'));\n console.log();\n\n const breakingUpdates = new Map<string, { from: string; to: string }>();\n await runConcurrentTasks({\n concurrencyFactor: 4,\n items: versionBumps.entries(),\n async worker([name, deps]) {\n const pkgPath = resolvePath(deps[0].location, 'package.json');\n const pkgJson = await fs.readJson(pkgPath);\n\n for (const dep of deps) {\n console.log(\n `${chalk.cyan('bumping')} ${dep.name} in ${chalk.cyan(\n name,\n )} to ${chalk.yellow(dep.range)}`,\n );\n\n for (const depType of DEP_TYPES) {\n if (depType in pkgJson && dep.name in pkgJson[depType]) {\n const oldRange = pkgJson[depType][dep.name];\n\n // backstage:^ are written to the lockfile as\n // backstage:<backstage-version>, so that updates to\n // backstage.json can be detected during yarn install. In order to\n // locate the corresponding lockfile entry for \"backstage:^\"\n // versions, we need to perform the same transformation.\n const oldLockfileRange = await asLockfileVersion(oldRange);\n\n const useBackstageRange =\n yarnPluginEnabled &&\n // Only use backstage:^ versions if the package is present in\n // the manifest for the release we're bumping to.\n releaseManifest.packages.find(\n ({ name: manifestPackageName }) =>\n dep.name === manifestPackageName,\n ) &&\n // Don't use backstage:^ versions for peerDependencies; they only\n // support npm and workspace: versions.\n depType !== 'peerDependencies';\n\n const newRange = useBackstageRange ? 'backstage:^' : dep.range;\n\n pkgJson[depType][dep.name] = newRange;\n\n // Check if the update was at least a pre-v1 minor or post-v1 major release\n const lockfileEntry = lockfile\n .get(dep.name)\n ?.find(entry => entry.range === oldLockfileRange);\n if (lockfileEntry) {\n const from = lockfileEntry.version;\n const to = dep.target;\n if (!semver.satisfies(to, `^${from}`)) {\n breakingUpdates.set(dep.name, { from, to });\n }\n }\n }\n }\n }\n\n await fs.writeJson(pkgPath, pkgJson, { spaces: 2 });\n },\n });\n\n console.log();\n\n // Do not update backstage.json when default pattern is not covered\n if (extendsDefaultPattern(pattern)) {\n await bumpBackstageJsonVersion(\n releaseManifest.releaseVersion,\n yarnPluginEnabled,\n );\n } else {\n console.log(\n chalk.yellow(\n `Skipping backstage.json update as custom pattern is used`,\n ),\n );\n }\n\n if (!skipInstall) {\n await runYarnInstall();\n } else {\n console.log();\n\n console.log(chalk.yellow(`Skipping yarn install`));\n }\n\n if (!skipMigrate) {\n console.log();\n\n const changed = await migrateMovedPackages({\n pattern: patternFlag,\n });\n\n if (changed && !skipInstall) {\n await runYarnInstall();\n }\n }\n\n if (breakingUpdates.size > 0) {\n console.log();\n console.log(\n chalk.yellow('⚠️ The following packages may have breaking changes:'),\n );\n console.log();\n\n for (const [name, { from, to }] of Array.from(\n breakingUpdates.entries(),\n ).sort()) {\n console.log(\n ` ${chalk.yellow(name)} : ${chalk.yellow(from)} ~> ${chalk.yellow(\n to,\n )}`,\n );\n\n let path;\n if (name.startsWith('@backstage/plugin-')) {\n path = `plugins/${name.replace('@backstage/plugin-', '')}`;\n } else if (name.startsWith('@backstage/')) {\n path = `packages/${name.replace('@backstage/', '')}`;\n }\n if (path) {\n // TODO(Rugvip): Grab these URLs and paths from package.json, possibly verify existence\n // Possibly invent new \"changelog\" field in package.json or some sh*t.\n console.log(\n ` https://github.com/backstage/backstage/blob/master/${path}/CHANGELOG.md`,\n );\n }\n console.log();\n }\n } else {\n console.log();\n }\n\n if (yarnPluginEnabled) {\n console.log();\n console.log(\n chalk.blue(\n `${chalk.bold(\n 'NOTE',\n )}: this bump used backstage:^ versions in package.json files, since the Backstage ` +\n `yarn plugin was detected in the repository. To migrate back to explicit npm versions, ` +\n `remove the plugin by running \"yarn plugin remove @yarnpkg/plugin-backstage\", then ` +\n `repeat this command.`,\n ),\n );\n console.log();\n }\n\n console.log(chalk.green('Version bump complete!'));\n }\n\n console.log();\n};\n\nexport function createStrictVersionFinder(options: {\n releaseManifest: ReleaseManifest;\n}) {\n const releasePackages = new Map(\n options.releaseManifest.packages.map(p => [p.name, p.version]),\n );\n return async function findTargetVersion(name: string) {\n console.log(`Checking for updates of ${name}`);\n const manifestVersion = releasePackages.get(name);\n if (manifestVersion) {\n return manifestVersion;\n }\n throw new NotFoundError(`Package ${name} not found in release manifest`);\n };\n}\n\nexport function createVersionFinder(options: {\n releaseLine?: string;\n packageInfoFetcher?: () => Promise<YarnInfoInspectData>;\n releaseManifest?: ReleaseManifest;\n}) {\n const {\n releaseLine = 'latest',\n packageInfoFetcher = fetchPackageInfo,\n releaseManifest,\n } = options;\n // The main release line is just an alias for latest\n const distTag = releaseLine === 'main' ? 'latest' : releaseLine;\n const found = new Map<string, string>();\n const releasePackages = new Map(\n releaseManifest?.packages.map(p => [p.name, p.version]),\n );\n return async function findTargetVersion(name: string) {\n const existing = found.get(name);\n if (existing) {\n return existing;\n }\n\n console.log(`Checking for updates of ${name}`);\n const manifestVersion = releasePackages.get(name);\n if (manifestVersion) {\n return manifestVersion;\n }\n\n const info = await packageInfoFetcher(name);\n const latestVersion = info['dist-tags'].latest;\n if (!latestVersion) {\n throw new Error(`No target 'latest' version found for ${name}`);\n }\n\n const taggedVersion = info['dist-tags'][distTag];\n if (distTag === 'latest' || !taggedVersion) {\n found.set(name, latestVersion);\n return latestVersion;\n }\n\n const latestVersionDateStr = info.time[latestVersion];\n const taggedVersionDateStr = info.time[taggedVersion];\n if (!latestVersionDateStr) {\n throw new Error(\n `No time available for version '${latestVersion}' of ${name}`,\n );\n }\n if (!taggedVersionDateStr) {\n throw new Error(\n `No time available for version '${taggedVersion}' of ${name}`,\n );\n }\n\n const latestVersionRelease = new Date(latestVersionDateStr).getTime();\n const taggedVersionRelease = new Date(taggedVersionDateStr).getTime();\n if (latestVersionRelease > taggedVersionRelease) {\n // Prefer latest version if it's newer.\n found.set(name, latestVersion);\n return latestVersion;\n }\n\n found.set(name, taggedVersion);\n return taggedVersion;\n };\n}\n\nfunction getBackstageJsonPath() {\n return targetPaths.resolveRoot(BACKSTAGE_JSON);\n}\n\nasync function getBackstageJson() {\n const backstageJsonPath = getBackstageJsonPath();\n return fs.readJSON(backstageJsonPath).catch(e => {\n if (e.code === 'ENOENT') {\n // gracefully continue in case the file doesn't exist\n return;\n }\n throw e;\n });\n}\n\nexport async function bumpBackstageJsonVersion(\n version: string,\n useYarnPlugin?: boolean,\n) {\n const backstageJson = await getBackstageJson();\n const prevVersion = backstageJson?.version;\n\n if (prevVersion === version) {\n return;\n }\n\n const { yellow, cyan, green } = chalk;\n if (prevVersion) {\n const from = encodeURIComponent(prevVersion);\n const to = encodeURIComponent(version);\n let link = `https://backstage.github.io/upgrade-helper/?from=${from}&to=${to}`;\n\n if (useYarnPlugin) {\n link += '&yarnPlugin=1';\n }\n\n console.log(\n yellow(\n `Upgraded from release ${green(prevVersion)} to ${green(\n version,\n )}, please review these template changes:`,\n ),\n );\n console.log();\n console.log(` ${cyan(link)}`);\n console.log();\n } else {\n console.log(\n yellow(\n `Your project is now at version ${version}, which has been written to ${BACKSTAGE_JSON}`,\n ),\n );\n }\n\n await fs.writeJson(\n getBackstageJsonPath(),\n { ...backstageJson, version },\n {\n spaces: 2,\n encoding: 'utf8',\n },\n );\n}\n\nasync function asLockfileVersion(version: string) {\n if (version === 'backstage:^') {\n return `backstage:${(await getBackstageJson())?.version}`;\n }\n\n return version;\n}\n"],"names":["bootstrapEnvProxyAgents","minimatch","cli","targetPaths","Lockfile","hasBackstageYarnPlugin","env","fs","semver","getManifestByVersion","getManifestByReleaseLine","run","mapDependencies","runConcurrentTasks","isError","chalk","resolvePath","runYarnInstall","migrateMovedPackages","NotFoundError","fetchPackageInfo","BACKSTAGE_JSON"],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var cliNode = require('@backstage/cli-node');
6
+ var chalk = require('chalk');
7
+ var node_path = require('node:path');
8
+ var cleye = require('cleye');
9
+ var fs = require('fs-extra');
10
+ var minimatch = require('minimatch');
11
+ var utils = require('../../lib/utils.cjs.js');
12
+ var replace = require('replace-in-file');
13
+
14
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
15
+
16
+ var chalk__default = /*#__PURE__*/_interopDefaultCompat(chalk);
17
+ var replace__default = /*#__PURE__*/_interopDefaultCompat(replace);
18
+
19
+ var migrate = async ({ args, info }) => {
20
+ const {
21
+ flags: { pattern, skipCodeChanges }
22
+ } = cleye.cli(
23
+ {
24
+ help: info,
25
+ booleanFlagNegation: true,
26
+ flags: {
27
+ pattern: {
28
+ type: String,
29
+ description: "Override glob for matching packages to upgrade"
30
+ },
31
+ skipCodeChanges: {
32
+ type: Boolean,
33
+ description: "Skip code changes and only update package.json files"
34
+ }
35
+ }
36
+ },
37
+ void 0,
38
+ args
39
+ );
40
+ const changed = await migrateMovedPackages({
41
+ pattern,
42
+ skipCodeChanges
43
+ });
44
+ if (changed) {
45
+ await utils.runYarnInstall();
46
+ }
47
+ };
48
+ async function migrateMovedPackages(options) {
49
+ console.log(
50
+ "Checking for moved packages to the @backstage-community namespace..."
51
+ );
52
+ const packages = await cliNode.PackageGraph.listTargetPackages();
53
+ let didAnythingChange = false;
54
+ for (const pkg of packages) {
55
+ const pkgName = pkg.packageJson.name;
56
+ let didPackageChange = false;
57
+ const movedPackages = /* @__PURE__ */ new Map();
58
+ for (const depType of [
59
+ "dependencies",
60
+ "devDependencies",
61
+ "peerDependencies"
62
+ ]) {
63
+ const depsObj = pkg.packageJson[depType];
64
+ if (!depsObj) {
65
+ continue;
66
+ }
67
+ for (const [depName, depVersion] of Object.entries(depsObj)) {
68
+ if (options?.pattern && !minimatch.minimatch(depName, options.pattern)) {
69
+ continue;
70
+ }
71
+ let packageInfo;
72
+ try {
73
+ packageInfo = await fs.readJson(
74
+ require.resolve(`${depName}/package.json`, {
75
+ paths: [pkg.dir]
76
+ })
77
+ );
78
+ } catch (ex) {
79
+ console.warn(
80
+ chalk__default.default.yellow(
81
+ `Could not find package.json for ${depName}@${depVersion} in ${pkgName} (${depType})`
82
+ )
83
+ );
84
+ continue;
85
+ }
86
+ const movedPackageName = packageInfo.backstage?.moved;
87
+ if (movedPackageName) {
88
+ movedPackages.set(depName, movedPackageName);
89
+ console.log(
90
+ chalk__default.default.yellow(
91
+ `Found a moved package ${depName}@${depVersion} -> ${movedPackageName} in ${pkgName} (${depType})`
92
+ )
93
+ );
94
+ didPackageChange = true;
95
+ didAnythingChange = true;
96
+ depsObj[movedPackageName] = depsObj[depName];
97
+ delete depsObj[depName];
98
+ }
99
+ }
100
+ }
101
+ if (didPackageChange) {
102
+ await fs.writeJson(node_path.resolve(pkg.dir, "package.json"), pkg.packageJson, {
103
+ spaces: 2
104
+ });
105
+ if (!options?.skipCodeChanges) {
106
+ const files = await replace__default.default({
107
+ files: node_path.join(pkg.dir, "src", "**"),
108
+ allowEmptyPaths: true,
109
+ processor: (content) => {
110
+ return Array.from(movedPackages.entries()).reduce(
111
+ (newContent, [oldName, newName]) => {
112
+ return newContent.replace(new RegExp(`"${oldName}"`, "g"), `"${newName}"`).replace(new RegExp(`'${oldName}'`, "g"), `'${newName}'`).replace(new RegExp(`${oldName}/`, "g"), `${newName}/`);
113
+ },
114
+ content
115
+ );
116
+ }
117
+ });
118
+ if (files.length > 0) {
119
+ console.log(
120
+ chalk__default.default.green(
121
+ `Updated ${files.length} files in ${pkgName} to use the new package names`
122
+ )
123
+ );
124
+ }
125
+ }
126
+ }
127
+ }
128
+ return didAnythingChange;
129
+ }
130
+
131
+ exports.default = migrate;
132
+ exports.migrateMovedPackages = migrateMovedPackages;
133
+ //# sourceMappingURL=migrate.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.cjs.js","sources":["../../../src/commands/versions/migrate.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 */\nimport { BackstagePackageJson, PackageGraph } from '@backstage/cli-node';\nimport chalk from 'chalk';\nimport { resolve as resolvePath, join as joinPath } from 'node:path';\nimport { cli } from 'cleye';\nimport { readJson, writeJson } from 'fs-extra';\nimport { minimatch } from 'minimatch';\nimport { runYarnInstall } from '../../lib/utils';\nimport replace from 'replace-in-file';\nimport type { CliCommandContext } from '@backstage/cli-node';\n\ndeclare module 'replace-in-file' {\n export default function (config: {\n files: string | string[];\n processor: (content: string, file: string) => string;\n ignore?: string | string[];\n allowEmptyPaths?: boolean;\n }): Promise<\n {\n file: string;\n hasChanged: boolean;\n numMatches?: number;\n numReplacements?: number;\n }[]\n >;\n}\n\nexport default async ({ args, info }: CliCommandContext) => {\n const {\n flags: { pattern, skipCodeChanges },\n } = cli(\n {\n help: info,\n booleanFlagNegation: true,\n flags: {\n pattern: {\n type: String,\n description: 'Override glob for matching packages to upgrade',\n },\n skipCodeChanges: {\n type: Boolean,\n description: 'Skip code changes and only update package.json files',\n },\n },\n },\n undefined,\n args,\n );\n\n const changed = await migrateMovedPackages({\n pattern,\n skipCodeChanges,\n });\n\n if (changed) {\n await runYarnInstall();\n }\n};\n\nexport async function migrateMovedPackages(options?: {\n pattern?: string;\n skipCodeChanges?: boolean;\n}) {\n console.log(\n 'Checking for moved packages to the @backstage-community namespace...',\n );\n const packages = await PackageGraph.listTargetPackages();\n let didAnythingChange = false;\n\n for (const pkg of packages) {\n const pkgName = pkg.packageJson.name;\n let didPackageChange = false;\n const movedPackages = new Map<string, string>();\n\n for (const depType of [\n 'dependencies',\n 'devDependencies',\n 'peerDependencies',\n ] as const) {\n const depsObj = pkg.packageJson[depType];\n if (!depsObj) {\n continue;\n }\n for (const [depName, depVersion] of Object.entries(depsObj)) {\n if (options?.pattern && !minimatch(depName, options.pattern)) {\n continue;\n }\n let packageInfo: BackstagePackageJson;\n try {\n packageInfo = await readJson(\n require.resolve(`${depName}/package.json`, {\n paths: [pkg.dir],\n }),\n );\n } catch (ex) {\n console.warn(\n chalk.yellow(\n `Could not find package.json for ${depName}@${depVersion} in ${pkgName} (${depType})`,\n ),\n );\n continue;\n }\n\n const movedPackageName = packageInfo.backstage?.moved;\n\n if (movedPackageName) {\n movedPackages.set(depName, movedPackageName);\n console.log(\n chalk.yellow(\n `Found a moved package ${depName}@${depVersion} -> ${movedPackageName} in ${pkgName} (${depType})`,\n ),\n );\n\n didPackageChange = true;\n didAnythingChange = true;\n\n depsObj[movedPackageName] = depsObj[depName];\n delete depsObj[depName];\n }\n }\n }\n\n if (didPackageChange) {\n await writeJson(resolvePath(pkg.dir, 'package.json'), pkg.packageJson, {\n spaces: 2,\n });\n\n if (!options?.skipCodeChanges) {\n // Replace all occurrences of the old package names in the code.\n const files = await replace({\n files: joinPath(pkg.dir, 'src', '**'),\n allowEmptyPaths: true,\n processor: content => {\n return Array.from(movedPackages.entries()).reduce(\n (newContent, [oldName, newName]) => {\n return newContent\n .replace(new RegExp(`\"${oldName}\"`, 'g'), `\"${newName}\"`)\n .replace(new RegExp(`'${oldName}'`, 'g'), `'${newName}'`)\n .replace(new RegExp(`${oldName}/`, 'g'), `${newName}/`);\n },\n content,\n );\n },\n });\n\n if (files.length > 0) {\n console.log(\n chalk.green(\n `Updated ${files.length} files in ${pkgName} to use the new package names`,\n ),\n );\n }\n }\n }\n }\n\n return didAnythingChange;\n}\n"],"names":["cli","runYarnInstall","PackageGraph","minimatch","readJson","chalk","writeJson","resolvePath","replace","joinPath"],"mappings":"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"}