-
Notifications
You must be signed in to change notification settings - Fork 12k
/
Copy pathversion.ts
140 lines (118 loc) · 5.54 KB
/
version.ts
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/**
* @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 * as path from 'path';
import { SemVer, satisfies } 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;
}
satisfies(other: string) {
// This comparison includes pre-releases (like betas and rcs), and considers them to be
// before the release proper.
// e.g. '9.0.0-beta.1' will satisfy '>=7.0.0 <9.0.0', but '9.0.0' will not.
return this._semver !== null && satisfies(this._semver, other, { includePrerelease: true });
}
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 angularCliPkgJson;
let angularPkgJson;
let rxjsPkgJson;
const resolveOptions = { paths: [projectRoot] };
try {
const angularPackagePath = require.resolve('@angular/core/package.json', resolveOptions);
const rxjsPackagePath = require.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);
}
try {
const angularCliPkgPath = require.resolve('@angular/cli/package.json', resolveOptions);
angularCliPkgJson = require(angularCliPkgPath);
if (!(angularCliPkgJson && angularCliPkgJson['version'])) {
throw new Error();
}
} catch (error) {
console.error(terminal.bold(terminal.red(tags.stripIndents`
Cannot determine versions of "@angular/cli".
This likely means your local installation is broken. Please reinstall your packages.
`)));
process.exit(2);
}
if (angularCliPkgJson['version'] === '0.0.0') {
// Internal testing version
return;
}
const cliMajor = new Version(angularCliPkgJson['version']).major;
// e.g. CLI 8.0 supports '>=8.0.0 <9.0.0', including pre-releases (betas, rcs, snapshots)
// of both 8 and 9.
const supportedAngularSemver = `^${cliMajor}.0.0-beta || ` +
`>=${cliMajor}.0.0 <${cliMajor + 1}.0.0`;
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.satisfies(supportedAngularSemver)) {
console.error(terminal.bold(terminal.red(tags.stripIndents`
This version of CLI is only compatible with Angular versions ${supportedAngularSemver},
but Angular version ${angularVersion} was found instead.
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')));
}
}
}