hunk.code_window:  */
   import { tags, terminal } from '@angular-devkit/core';
   import { resolve } from '@angular-devkit/core/node';
   import * as path from 'path';
   import { SemVer } from 'semver';
  
hunk.labels: keep keep keep replace keep keep keep
hunk.file_path: packages/angular/cli/upgrade/version.ts
hunk.type: replace
file: /**
   * @license
   * Copyright Google Inc. All Rights Reserved.
   *
   * Use of this source code is governed by an MIT-style license that can be
   * found in the LICENSE file at https://angular.io/license
   */
  
  import { tags, terminal } from '@angular-devkit/core';
  import { resolve } from '@angular-devkit/core/node';
  import * as path from 'path';
  import { SemVer } from 'semver';
  
  
  export class Version {
    private _semver: SemVer | null = null;
    constructor(private _version: string | null = null) {
      this._semver = _version ? new SemVer(_version) : null;
    }
  
    isAlpha() { return this.qualifier == 'alpha'; }
    isBeta() { return this.qualifier == 'beta'; }
    isReleaseCandidate() { return this.qualifier == 'rc'; }
    isKnown() { return this._version !== null; }
  
    isLocal() { return this.isKnown() && this._version && path.isAbsolute(this._version); }
    isGreaterThanOrEqualTo(other: SemVer) {
      return this._semver !== null && this._semver.compare(other) >= 0;
    }
  
    get major() { return this._semver ? this._semver.major : 0; }
    get minor() { return this._semver ? this._semver.minor : 0; }
    get patch() { return this._semver ? this._semver.patch : 0; }
    get qualifier() { return this._semver ? this._semver.prerelease[0] : ''; }
    get extra() { return this._semver ? this._semver.prerelease[1] : ''; }
  
    toString() { return this._version; }
  
    static assertCompatibleAngularVersion(projectRoot: string) {
      let angularPkgJson;
      let rxjsPkgJson;
  
      try {
        const resolveOptions = {
          basedir: projectRoot,
          checkGlobal: false,
          checkLocal: true,
        };
        const angularPackagePath = resolve('@angular/core/package.json', resolveOptions);
        const rxjsPackagePath = resolve('rxjs/package.json', resolveOptions);
  
        angularPkgJson = require(angularPackagePath);
        rxjsPkgJson = require(rxjsPackagePath);
      } catch {
        console.error(terminal.bold(terminal.red(tags.stripIndents`
          You seem to not be depending on "@angular/core" and/or "rxjs". This is an error.
        `)));
        process.exit(2);
      }
  
      if (!(angularPkgJson && angularPkgJson['version'] && rxjsPkgJson && rxjsPkgJson['version'])) {
        console.error(terminal.bold(terminal.red(tags.stripIndents`
          Cannot determine versions of "@angular/core" and/or "rxjs".
          This likely means your local installation is broken. Please reinstall your packages.
        `)));
        process.exit(2);
      }
  
      const angularVersion = new Version(angularPkgJson['version']);
      const rxjsVersion = new Version(rxjsPkgJson['version']);
  
      if (angularVersion.isLocal()) {
        console.error(terminal.yellow('Using a local version of angular. Proceeding with care...'));
  
        return;
      }
  
      if (!angularVersion.isGreaterThanOrEqualTo(new SemVer('5.0.0'))) {
        console.error(terminal.bold(terminal.red(tags.stripIndents`
            This version of CLI is only compatible with Angular version 5.0.0 or higher.
  
            Please visit the link below to find instructions on how to update Angular.
            https://angular-update-guide.firebaseapp.com/
          ` + '\n')));
        process.exit(3);
      } else if (
        angularVersion.isGreaterThanOrEqualTo(new SemVer('6.0.0-rc.0'))
        && !rxjsVersion.isGreaterThanOrEqualTo(new SemVer('5.6.0-forward-compat.0'))
        && !rxjsVersion.isGreaterThanOrEqualTo(new SemVer('6.0.0-beta.0'))
      ) {
        console.error(terminal.bold(terminal.red(tags.stripIndents`
            This project uses version ${rxjsVersion} of RxJs, which is not supported by Angular v6.
            The official RxJs version that is supported is 5.6.0-forward-compat.0 and greater.
  
            Please visit the link below to find instructions on how to update RxJs.
            https://docs.google.com/document/d/12nlLt71VLKb-z3YaSGzUfx6mJbc34nsMXtByPUN35cg/edit#
          ` + '\n')));
        process.exit(3);
      } else if (
        angularVersion.isGreaterThanOrEqualTo(new SemVer('6.0.0-rc.0'))
        && !rxjsVersion.isGreaterThanOrEqualTo(new SemVer('6.0.0-beta.0'))
      ) {
        console.warn(terminal.bold(terminal.red(tags.stripIndents`
            This project uses a temporary compatibility version of RxJs (${rxjsVersion}).
  
            Please visit the link below to find instructions on how to update RxJs.
            https://docs.google.com/document/d/12nlLt71VLKb-z3YaSGzUfx6mJbc34nsMXtByPUN35cg/edit#
          ` + '\n')));
      }
    }
  
  }
  