Skip to content

Commit a42a2b8

Browse files
committed
Use semver to compare versions
1 parent 9f1e25a commit a42a2b8

11 files changed

+40
-116
lines changed

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"license": "SEE LICENSE IN LICENSE.txt",
2727
"dependencies": {
2828
"lodash": "^4.17.10",
29+
"semver": "^5.5.0",
2930
"universal-analytics": "0.4.13",
3031
"uuid": "^3.2.1",
3132
"vscode-chrome-debug-core": "^3.23.11",

src/analytics/analyticsService.ts

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import * as os from 'os';
2-
import { Version } from '../common/version';
32
import { GUAService } from './guaService';
43
import { AnalyticsBaseInfo, OperatingSystem } from './analyticsBaseInfo';
54
import { Services } from '../services/extensionHostServices';
@@ -22,14 +21,14 @@ export class AnalyticsService {
2221
private _gua: GUAService;
2322
private _analyticsEnabled: boolean;
2423

25-
constructor(globalState: vscode.Memento) {
24+
constructor(globalState: vscode.Memento, cliVersion: string, extensionVersion: string) {
2625
this._globalState = globalState;
2726

2827
vscode.workspace.onDidChangeConfiguration(() => this.updateAnalyticsEnabled());
2928

3029
this._baseInfo = {
31-
cliVersion: Services.cli().version.toString(),
32-
extensionVersion: utils.getInstalledExtensionVersion().toString(),
30+
cliVersion,
31+
extensionVersion,
3332
operatingSystem: AnalyticsService.getOperatingSystem(),
3433
clientId: this.getOrGenerateClientId()
3534
};

src/common/utilities.ts

-10
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,6 @@
1-
import {Version} from './version';
21
import {ChildProcess, exec} from 'child_process';
32
import * as os from 'os';
43

5-
6-
export function getInstalledExtensionVersion(): Version {
7-
return Version.parse(require('../../package.json').version);
8-
}
9-
10-
export function getMinSupportedCliVersion(): Version {
11-
return Version.parse(require('../../package.json').minNativescriptCliVersion);
12-
}
13-
144
export function killProcess(childProcess: ChildProcess) : void {
155
switch (process.platform) {
166
case "win32":

src/common/version.ts

-28
This file was deleted.

src/debug-adapter/nativeScriptDebugAdapter.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ export class NativeScriptDebugAdapter extends ChromeDebugAdapter {
6363
this.callRemoteMethod('analyticsService', 'launchDebugger', args.request, args.platform);
6464

6565
// Run CLI Command
66-
this.log(`[NSDebugAdapter] Using tns CLI v${project.cli.version.version} on path '${project.cli.path}'\n`);
66+
const version = project.cli.executeGetVersion();
67+
this.log(`[NSDebugAdapter] Using tns CLI v${version} on path '${project.cli.path}'\n`);
6768
this.log('[NSDebugAdapter] Running tns command...\n');
6869
let cliCommand: DebugResult;
6970

src/main.ts

+25-15
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import * as vscode from 'vscode';
2-
import {CliVersion} from './project/nativeScriptCli';
32
import {Services} from './services/extensionHostServices';
43
import {Project} from './project/project';
54
import {IosProject} from './project/iosProject';
@@ -8,23 +7,36 @@ import * as utils from './common/utilities';
87
import * as extProtocol from './common/extensionProtocol';
98
import { ChannelLogger } from './services/channelLogger';
109
import { ILogger } from './common/logger';
10+
import * as semver from "semver";
1111

1212
// this method is called when the extension is activated
1313
export function activate(context: vscode.ExtensionContext) {
1414
Services.globalState = context.globalState;
1515
Services.cliPath = Services.workspaceConfigService.tnsPath || Services.cliPath;
1616

1717
const channel = vscode.window.createOutputChannel("NativeScript Extension");
18-
const logger = new ChannelLogger(channel);
19-
Services.logger = logger;
18+
Services.logger = new ChannelLogger(channel);
2019

21-
// Check if NativeScript CLI is installed globally and if it is compatible with the extension version
22-
let cliVersion = Services.cli().version;
23-
if (!cliVersion.isCompatible) {
24-
vscode.window.showErrorMessage(cliVersion.errorMessage);
20+
const packageJSON = vscode.extensions.getExtension("Telerik.nativescript").packageJSON;
21+
const cliVersion = Services.cli().executeGetVersion();
22+
23+
if(!cliVersion) {
24+
vscode.window.showErrorMessage("NativeScript CLI not found. Use 'nativescript.tnsPath' workspace setting to explicitly set the absolute path to the NativeScript CLI.");
25+
26+
return;
2527
}
2628

27-
logExtensionInfo(logger, cliVersion.version.toString());
29+
if(!semver.gte(cliVersion, packageJSON.minNativescriptCliVersion)) {
30+
vscode.window.showErrorMessage( `The existing NativeScript extension is compatible with NativeScript CLI v${packageJSON.minNativescriptCliVersion} or greater.
31+
The currently installed NativeScript CLI is v${cliVersion}.You can update the NativeScript CLI by executing 'npm install -g nativescript'.`);
32+
33+
return;
34+
}
35+
36+
Services.cliVersion = cliVersion;
37+
Services.extensionVersion = packageJSON.version;
38+
39+
logExtensionInfo(cliVersion, packageJSON);
2840

2941
Services.analyticsService.initialize();
3042

@@ -106,11 +118,9 @@ export function activate(context: vscode.ExtensionContext) {
106118
context.subscriptions.push(showOutputChannelCommand);
107119
}
108120

109-
function logExtensionInfo(logger: ILogger, cliVersion: string): void {
110-
const packageJSON = vscode.extensions.getExtension("Telerik.nativescript").packageJSON;
111-
112-
packageJSON.version && logger.log(`Version: ${packageJSON.version}`);
113-
packageJSON.buildVersion && logger.log(`Build version: ${packageJSON.buildVersion}`);
114-
packageJSON.commitId && logger.log(`Commit id: ${packageJSON.commitId}`);
115-
logger.log(`NativeScript CLI: ${cliVersion}`);
121+
function logExtensionInfo(cliVersion: string, packageJSON: any): void {
122+
packageJSON.version && Services.logger.log(`Version: ${packageJSON.version}`);
123+
packageJSON.buildVersion && Services.logger.log(`Build version: ${packageJSON.buildVersion}`);
124+
packageJSON.commitId && Services.logger.log(`Commit id: ${packageJSON.commitId}`);
125+
Services.logger.log(`NativeScript CLI: ${cliVersion}`);
116126
}

src/project/androidProject.ts

-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import * as stream from 'stream';
33
import {EventEmitter} from 'events';
44
import {Project, DebugResult} from './project';
55
import * as scanner from './streamScanner';
6-
import {Version} from '../common/version';
76
import {NativeScriptCli} from './nativeScriptCli';
87

98
export type GetDebugPortResult = { tnsProcess: ChildProcess, debugPort: Promise<number> };

src/project/iosProject.ts

-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import * as stream from 'stream';
33
import {EventEmitter} from 'events';
44
import {Project, DebugResult} from './project';
55
import * as scanner from './streamScanner';
6-
import {Version} from '../common/version';
76
import {NativeScriptCli} from './nativeScriptCli';
87

98
export class IosProject extends Project {

src/project/nativeScriptCli.ts

+5-54
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,11 @@
11
import {spawn, execSync, ChildProcess} from 'child_process';
2-
import {Version} from '../common/version';
32
import { ILogger } from '../common/logger';
43
import * as utils from '../common/utilities';
54
import * as os from 'os';
65

7-
export enum CliVersionState {
8-
NotExisting,
9-
OlderThanSupported,
10-
Compatible
11-
}
12-
13-
export class CliVersion {
14-
private _cliVersion: Version = undefined;
15-
private _minExpectedCliVersion: Version = undefined;
16-
private _cliVersionState: CliVersionState;
17-
private _cliVersionErrorMessage: string;
18-
19-
constructor(cliVersion: Version, minExpectedCliVersion: Version) {
20-
this._cliVersion = cliVersion;
21-
this._minExpectedCliVersion = minExpectedCliVersion;
22-
23-
// Calculate CLI version state and CLI version error message
24-
this._cliVersionState = CliVersionState.Compatible;
25-
if (minExpectedCliVersion) {
26-
if (this._cliVersion === null) {
27-
this._cliVersionState = CliVersionState.NotExisting;
28-
this._cliVersionErrorMessage = "NativeScript CLI not found, please run 'npm -g install nativescript' to install it.";
29-
}
30-
else if (this._cliVersion.compareBySubminorTo(minExpectedCliVersion) < 0) {
31-
this._cliVersionState = CliVersionState.OlderThanSupported;
32-
this._cliVersionErrorMessage = `The existing NativeScript extension is compatible with NativeScript CLI v${this._minExpectedCliVersion} or greater. The currently installed NativeScript CLI is v${this._cliVersion}. You can update the NativeScript CLI by executing 'npm install -g nativescript'.`;
33-
}
34-
}
35-
}
36-
37-
public get version() { return this._cliVersion; }
38-
39-
public get state() { return this._cliVersionState; }
40-
41-
public get isCompatible() { return this._cliVersionState == CliVersionState.Compatible; }
42-
43-
public get errorMessage() { return this._cliVersionErrorMessage; }
44-
}
45-
466
export class NativeScriptCli {
477
private _path: string;
488
private _shellPath: string;
49-
private _cliVersion: CliVersion;
509
private _logger: ILogger;
5110

5211
constructor(cliPath: string, logger: ILogger) {
@@ -60,26 +19,18 @@ export class NativeScriptCli {
6019
if (utils.getPlatform() === utils.Platform.Windows) {
6120
this._shellPath = "cmd.exe";
6221
}
22+
}
23+
24+
public get path(): string { return this._path; }
6325

64-
let versionStr = null;
26+
public executeGetVersion(): string {
6527
try {
66-
versionStr = this.executeSync(["--version"], undefined);
28+
return this.executeSync(["--version"], undefined);
6729
}
6830
catch(e) {
6931
this._logger.log(e);
7032
throw new Error("NativeScript CLI not found. Use 'nativescript.tnsPath' workspace setting to explicitly set the absolute path to the NativeScript CLI.");
7133
}
72-
let cliVersion: Version = versionStr ? Version.parse(versionStr) : null;
73-
this._cliVersion = new CliVersion(cliVersion, utils.getMinSupportedCliVersion());
74-
if (!this._cliVersion.isCompatible) {
75-
throw new Error(this._cliVersion.errorMessage);
76-
}
77-
}
78-
79-
public get path(): string { return this._path; }
80-
81-
public get version(): CliVersion {
82-
return this._cliVersion;
8334
}
8435

8536
public executeSync(args: string[], cwd: string): string {

src/project/project.ts

-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import {ChildProcess} from 'child_process';
22
import {EventEmitter} from 'events';
3-
import {Version} from '../common/version';
43
import {NativeScriptCli} from './nativeScriptCli';
54
import * as stream from 'stream';
65
import * as scanner from './streamScanner';

src/services/extensionHostServices.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ export class ExtensionHostServices extends BaseServices {
1111
private _iOSTeamService: iOSTeamService;
1212
private _analyticsService: AnalyticsService;
1313

14+
public cliVersion: string;
15+
public extensionVersion: string;
16+
1417
public get globalState(): vscode.Memento { return this._globalState; }
1518

1619
public set globalState(globalState: vscode.Memento) { this._globalState = globalState; }
@@ -26,7 +29,7 @@ export class ExtensionHostServices extends BaseServices {
2629
}
2730

2831
public get analyticsService(): AnalyticsService {
29-
this._analyticsService = this._analyticsService || new AnalyticsService(this.globalState);
32+
this._analyticsService = this._analyticsService || new AnalyticsService(this.globalState, this.cliVersion, this.extensionVersion);
3033
return this._analyticsService;
3134
}
3235
}

0 commit comments

Comments
 (0)