Skip to content

Commit 3c68261

Browse files
author
Dimitar Tachev
authored
Merge pull request #5104 from NativeScript/tachev/fix-preview-plugins-version
feat: allow tag and range versions in the preview app plugin versions validation
2 parents e490b0e + 29f40ee commit 3c68261

File tree

4 files changed

+38
-26
lines changed

4 files changed

+38
-26
lines changed

lib/definitions/preview-app-livesync.d.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ declare global {
2424
interface IGetQrCodeUrlOptions extends IHasUseHotModuleReloadOption, IProjectDir { }
2525

2626
interface IPreviewAppPluginsService {
27-
getPluginsUsageWarnings(data: IPreviewAppLiveSyncData, device: Device): string[];
27+
getPluginsUsageWarnings(data: IPreviewAppLiveSyncData, device: Device): Promise<string[]>;
2828
comparePluginsOnDevice(data: IPreviewAppLiveSyncData, device: Device): Promise<void>;
2929
getExternalPlugins(device: Device): string[];
3030
}
@@ -56,7 +56,7 @@ declare global {
5656
updateConnectedDevices(devices: Device[]): void;
5757
getDeviceById(id: string): Device;
5858
getDevicesForPlatform(platform: string): Device[];
59-
getPluginsUsageWarnings(data: IPreviewAppLiveSyncData, device: Device): string[];
59+
getPluginsUsageWarnings(data: IPreviewAppLiveSyncData, device: Device): Promise<string[]>;
6060
}
6161

6262
interface IPreviewSchemaService {

lib/services/livesync/playground/devices/preview-devices-service.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export class PreviewDevicesService extends EventEmitter implements IPreviewDevic
3535
return _.filter(this.connectedDevices, { platform: platform.toLowerCase() });
3636
}
3737

38-
public getPluginsUsageWarnings(data: IPreviewAppLiveSyncData, device: Device): string[] {
38+
public getPluginsUsageWarnings(data: IPreviewAppLiveSyncData, device: Device): Promise<string[]> {
3939
return this.$previewAppPluginsService.getPluginsUsageWarnings(data, device);
4040
}
4141

lib/services/livesync/playground/preview-app-plugins-service.ts

+30-20
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ export class PreviewAppPluginsService implements IPreviewAppPluginsService {
1010
constructor(private $errors: IErrors,
1111
private $fs: IFileSystem,
1212
private $logger: ILogger,
13+
private $packageInstallationManager: IPackageInstallationManager,
1314
private $pluginsService: IPluginsService) { }
1415

15-
public getPluginsUsageWarnings(data: IPreviewAppLiveSyncData, device: Device): string[] {
16+
public async getPluginsUsageWarnings(data: IPreviewAppLiveSyncData, device: Device): Promise<string[]> {
1617
if (!device) {
1718
this.$errors.fail("No device provided.");
1819
}
@@ -23,19 +24,21 @@ export class PreviewAppPluginsService implements IPreviewAppPluginsService {
2324

2425
const devicePlugins = this.getDevicePlugins(device);
2526
const localPlugins = this.getLocalPlugins(data.projectDir);
26-
const warnings = _.keys(localPlugins)
27-
.map(localPlugin => {
28-
const localPluginVersion = localPlugins[localPlugin];
29-
const devicePluginVersion = devicePlugins[localPlugin];
30-
return this.getWarningForPlugin(data, localPlugin, localPluginVersion, devicePluginVersion, device);
31-
})
32-
.filter(item => !!item);
27+
const warnings: string[] = [];
28+
for (const pluginName in localPlugins) {
29+
const localPluginVersion = localPlugins[pluginName];
30+
const devicePluginVersion = devicePlugins[pluginName];
31+
const pluginWarnings = await this.getWarningForPlugin(data, pluginName, localPluginVersion, devicePluginVersion, device);
32+
if (pluginWarnings) {
33+
warnings.push(pluginWarnings);
34+
}
35+
}
3336

3437
return warnings;
3538
}
3639

3740
public async comparePluginsOnDevice(data: IPreviewAppLiveSyncData, device: Device): Promise<void> {
38-
const warnings = this.getPluginsUsageWarnings(data, device);
41+
const warnings = await this.getPluginsUsageWarnings(data, device);
3942
_.map(warnings, warning => this.$logger.warn(warning));
4043
}
4144

@@ -69,33 +72,40 @@ export class PreviewAppPluginsService implements IPreviewAppPluginsService {
6972
}
7073
}
7174

72-
private getWarningForPlugin(data: IPreviewAppLiveSyncData, localPlugin: string, localPluginVersion: string, devicePluginVersion: string, device: Device): string {
75+
private async getWarningForPlugin(data: IPreviewAppLiveSyncData, localPlugin: string, localPluginVersion: string, devicePluginVersion: string, device: Device): Promise<string> {
7376
const pluginPackageJsonPath = path.join(data.projectDir, NODE_MODULES_DIR_NAME, localPlugin, PACKAGE_JSON_FILE_NAME);
7477
const isNativeScriptPlugin = this.$pluginsService.isNativeScriptPlugin(pluginPackageJsonPath);
7578
const shouldCompare = isNativeScriptPlugin && this.hasNativeCode(localPlugin, device.platform, data.projectDir);
79+
let warning = null;
80+
if (shouldCompare) {
81+
warning = await this.getWarningForPluginCore(localPlugin, localPluginVersion, devicePluginVersion, device.id);
82+
}
7683

77-
return shouldCompare ? this.getWarningForPluginCore(localPlugin, localPluginVersion, devicePluginVersion, device.id) : null;
84+
return warning;
7885
}
7986

80-
private getWarningForPluginCore(localPlugin: string, localPluginVersion: string, devicePluginVersion: string, deviceId: string): string {
81-
this.$logger.trace(`Comparing plugin ${localPlugin} with localPluginVersion ${localPluginVersion} and devicePluginVersion ${devicePluginVersion}`);
87+
private async getWarningForPluginCore(pluginName: string, localPluginVersion: string, devicePluginVersion: string, deviceId: string): Promise<string> {
88+
this.$logger.trace(`Comparing plugin ${pluginName} with localPluginVersion ${localPluginVersion} and devicePluginVersion ${devicePluginVersion}`);
8289

8390
if (!devicePluginVersion) {
84-
return util.format(PluginComparisonMessages.PLUGIN_NOT_INCLUDED_IN_PREVIEW_APP, localPlugin, deviceId);
91+
return util.format(PluginComparisonMessages.PLUGIN_NOT_INCLUDED_IN_PREVIEW_APP, pluginName, deviceId);
8592
}
8693

8794
const shouldSkipCheck = !semver.valid(localPluginVersion) && !semver.validRange(localPluginVersion);
8895
if (shouldSkipCheck) {
8996
return null;
9097
}
9198

92-
const localPluginVersionData = semver.coerce(localPluginVersion);
93-
const devicePluginVersionData = semver.coerce(devicePluginVersion);
99+
const localPluginVersionData = await this.$packageInstallationManager.getMaxSatisfyingVersionSafe(pluginName, localPluginVersion);
100+
const devicePluginVersionData = await this.$packageInstallationManager.getMaxSatisfyingVersionSafe(pluginName, devicePluginVersion);
101+
102+
if (semver.valid(localPluginVersionData) && semver.valid(devicePluginVersionData)) {
103+
if (semver.major(localPluginVersionData) !== semver.major(devicePluginVersionData)) {
104+
return util.format(PluginComparisonMessages.LOCAL_PLUGIN_WITH_DIFFERENCE_IN_MAJOR_VERSION, pluginName, localPluginVersion, devicePluginVersion);
105+
} else if (semver.minor(localPluginVersionData) > semver.minor(devicePluginVersionData)) {
106+
return util.format(PluginComparisonMessages.LOCAL_PLUGIN_WITH_GREATHER_MINOR_VERSION, pluginName, localPluginVersion, devicePluginVersion);
107+
}
94108

95-
if (localPluginVersionData.major !== devicePluginVersionData.major) {
96-
return util.format(PluginComparisonMessages.LOCAL_PLUGIN_WITH_DIFFERENCE_IN_MAJOR_VERSION, localPlugin, localPluginVersion, devicePluginVersion);
97-
} else if (localPluginVersionData.minor > devicePluginVersionData.minor) {
98-
return util.format(PluginComparisonMessages.LOCAL_PLUGIN_WITH_GREATHER_MINOR_VERSION, localPlugin, localPluginVersion, devicePluginVersion);
99109
}
100110

101111
return null;

test/services/playground/preview-app-plugins-service.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ import { Device } from "nativescript-preview-sdk";
44
import { assert } from "chai";
55
import * as util from "util";
66
import { PluginComparisonMessages } from "../../../lib/services/livesync/playground/preview-app-constants";
7-
import { ErrorsStub } from "../../stubs";
7+
import { ErrorsStub, PackageInstallationManagerStub } from "../../stubs";
88

99
let readJsonParams: string[] = [];
1010
let warnParams: string[] = [];
1111

1212
const deviceId = "myTestDeviceId";
13-
const projectDir = "testProjectDir";
13+
const projectDir = "testProjectDir";
1414

1515
function createTestInjector(localPlugins: IStringDictionary, options?: { isNativeScriptPlugin?: boolean, hasPluginNativeCode?: boolean }): IInjector {
1616
options = options || {};
@@ -42,8 +42,10 @@ function createTestInjector(localPlugins: IStringDictionary, options?: { isNativ
4242
});
4343
injector.register("logger", {
4444
trace: () => ({}),
45-
warn: (message: string) => warnParams.push(message)
45+
warn: (message: string) => warnParams.push(message)
4646
});
47+
48+
injector.register("packageInstallationManager", PackageInstallationManagerStub);
4749
injector.register("errors", ErrorsStub);
4850
injector.register("previewAppPluginsService", PreviewAppPluginsService);
4951
return injector;

0 commit comments

Comments
 (0)