File: Up.ts

package info (click to toggle)
node-corepack 0.24.0-5
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 262,916 kB
  • sloc: javascript: 94; makefile: 18; sh: 12
file content (54 lines) | stat: -rw-r--r-- 2,207 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import {Command, UsageError} from 'clipanion';
import semver                from 'semver';

import {BaseCommand}         from './Base';

export class UpCommand extends BaseCommand {
  static paths = [
    [`up`],
  ];

  static usage = Command.Usage({
    description: `Update the package manager used in the current project`,
    details: `
      Retrieve the latest available version for the current major release line
      of the package manager used in the local project, and update the project
      to use it.

      Unlike \`corepack use\` this command doesn't take a package manager name
      nor a version range, as it will always select the latest available
      version from the same major line. Should you need to upgrade to a new
      major, use an explicit \`corepack use '{name}@*'\` call.
    `,
    examples: [[
      `Configure the project to use the latest Yarn release`,
      `corepack up`,
    ]],
  });

  async execute() {
    const [descriptor] = await this.resolvePatternsToDescriptors({
      all: false,
      patterns: [],
    });

    if (!semver.valid(descriptor.range) && !semver.validRange(descriptor.range))
      throw new UsageError(`The 'corepack up' command can only be used when your project's packageManager field is set to a semver version or semver range`);

    const resolved = await this.context.engine.resolveDescriptor(descriptor, {useCache: false});
    if (!resolved)
      throw new UsageError(`Failed to successfully resolve '${descriptor.range}' to a valid ${descriptor.name} release`);

    const majorVersion = semver.major(resolved?.reference);
    const majorDescriptor = {name: descriptor.name, range: `^${majorVersion}.0.0`};

    const highestVersion = await this.context.engine.resolveDescriptor(majorDescriptor, {useCache: false});
    if (!highestVersion)
      throw new UsageError(`Failed to find the highest release for ${descriptor.name} ${majorVersion}.x`);

    this.context.stdout.write(`Installing ${highestVersion.name}@${highestVersion.reference} in the project...\n`);

    const packageManagerInfo = await this.context.engine.ensurePackageManager(highestVersion);
    await this.setLocalPackageManager(packageManagerInfo);
  }
}