From 29f40ee8f8cf7563c4cb7cfeae912d8522e8373b Mon Sep 17 00:00:00 2001 From: DimitarTachev Date: Wed, 30 Oct 2019 11:26:55 +0200 Subject: [PATCH] feat: allow tag and range versions in the preview app plugin versions validation --- lib/definitions/preview-app-livesync.d.ts | 4 +- .../devices/preview-devices-service.ts | 2 +- .../playground/preview-app-plugins-service.ts | 50 +++++++++++-------- .../playground/preview-app-plugins-service.ts | 8 +-- 4 files changed, 38 insertions(+), 26 deletions(-) diff --git a/lib/definitions/preview-app-livesync.d.ts b/lib/definitions/preview-app-livesync.d.ts index 6c8f125aed..ef51843024 100644 --- a/lib/definitions/preview-app-livesync.d.ts +++ b/lib/definitions/preview-app-livesync.d.ts @@ -24,7 +24,7 @@ declare global { interface IGetQrCodeUrlOptions extends IHasUseHotModuleReloadOption, IProjectDir { } interface IPreviewAppPluginsService { - getPluginsUsageWarnings(data: IPreviewAppLiveSyncData, device: Device): string[]; + getPluginsUsageWarnings(data: IPreviewAppLiveSyncData, device: Device): Promise; comparePluginsOnDevice(data: IPreviewAppLiveSyncData, device: Device): Promise; getExternalPlugins(device: Device): string[]; } @@ -56,7 +56,7 @@ declare global { updateConnectedDevices(devices: Device[]): void; getDeviceById(id: string): Device; getDevicesForPlatform(platform: string): Device[]; - getPluginsUsageWarnings(data: IPreviewAppLiveSyncData, device: Device): string[]; + getPluginsUsageWarnings(data: IPreviewAppLiveSyncData, device: Device): Promise; } interface IPreviewSchemaService { diff --git a/lib/services/livesync/playground/devices/preview-devices-service.ts b/lib/services/livesync/playground/devices/preview-devices-service.ts index 8a46afb972..dad2981e95 100644 --- a/lib/services/livesync/playground/devices/preview-devices-service.ts +++ b/lib/services/livesync/playground/devices/preview-devices-service.ts @@ -35,7 +35,7 @@ export class PreviewDevicesService extends EventEmitter implements IPreviewDevic return _.filter(this.connectedDevices, { platform: platform.toLowerCase() }); } - public getPluginsUsageWarnings(data: IPreviewAppLiveSyncData, device: Device): string[] { + public getPluginsUsageWarnings(data: IPreviewAppLiveSyncData, device: Device): Promise { return this.$previewAppPluginsService.getPluginsUsageWarnings(data, device); } diff --git a/lib/services/livesync/playground/preview-app-plugins-service.ts b/lib/services/livesync/playground/preview-app-plugins-service.ts index 89eec630ed..3759bb2b90 100644 --- a/lib/services/livesync/playground/preview-app-plugins-service.ts +++ b/lib/services/livesync/playground/preview-app-plugins-service.ts @@ -10,9 +10,10 @@ export class PreviewAppPluginsService implements IPreviewAppPluginsService { constructor(private $errors: IErrors, private $fs: IFileSystem, private $logger: ILogger, + private $packageInstallationManager: IPackageInstallationManager, private $pluginsService: IPluginsService) { } - public getPluginsUsageWarnings(data: IPreviewAppLiveSyncData, device: Device): string[] { + public async getPluginsUsageWarnings(data: IPreviewAppLiveSyncData, device: Device): Promise { if (!device) { this.$errors.fail("No device provided."); } @@ -23,19 +24,21 @@ export class PreviewAppPluginsService implements IPreviewAppPluginsService { const devicePlugins = this.getDevicePlugins(device); const localPlugins = this.getLocalPlugins(data.projectDir); - const warnings = _.keys(localPlugins) - .map(localPlugin => { - const localPluginVersion = localPlugins[localPlugin]; - const devicePluginVersion = devicePlugins[localPlugin]; - return this.getWarningForPlugin(data, localPlugin, localPluginVersion, devicePluginVersion, device); - }) - .filter(item => !!item); + const warnings: string[] = []; + for (const pluginName in localPlugins) { + const localPluginVersion = localPlugins[pluginName]; + const devicePluginVersion = devicePlugins[pluginName]; + const pluginWarnings = await this.getWarningForPlugin(data, pluginName, localPluginVersion, devicePluginVersion, device); + if (pluginWarnings) { + warnings.push(pluginWarnings); + } + } return warnings; } public async comparePluginsOnDevice(data: IPreviewAppLiveSyncData, device: Device): Promise { - const warnings = this.getPluginsUsageWarnings(data, device); + const warnings = await this.getPluginsUsageWarnings(data, device); _.map(warnings, warning => this.$logger.warn(warning)); } @@ -69,19 +72,23 @@ export class PreviewAppPluginsService implements IPreviewAppPluginsService { } } - private getWarningForPlugin(data: IPreviewAppLiveSyncData, localPlugin: string, localPluginVersion: string, devicePluginVersion: string, device: Device): string { + private async getWarningForPlugin(data: IPreviewAppLiveSyncData, localPlugin: string, localPluginVersion: string, devicePluginVersion: string, device: Device): Promise { const pluginPackageJsonPath = path.join(data.projectDir, NODE_MODULES_DIR_NAME, localPlugin, PACKAGE_JSON_FILE_NAME); const isNativeScriptPlugin = this.$pluginsService.isNativeScriptPlugin(pluginPackageJsonPath); const shouldCompare = isNativeScriptPlugin && this.hasNativeCode(localPlugin, device.platform, data.projectDir); + let warning = null; + if (shouldCompare) { + warning = await this.getWarningForPluginCore(localPlugin, localPluginVersion, devicePluginVersion, device.id); + } - return shouldCompare ? this.getWarningForPluginCore(localPlugin, localPluginVersion, devicePluginVersion, device.id) : null; + return warning; } - private getWarningForPluginCore(localPlugin: string, localPluginVersion: string, devicePluginVersion: string, deviceId: string): string { - this.$logger.trace(`Comparing plugin ${localPlugin} with localPluginVersion ${localPluginVersion} and devicePluginVersion ${devicePluginVersion}`); + private async getWarningForPluginCore(pluginName: string, localPluginVersion: string, devicePluginVersion: string, deviceId: string): Promise { + this.$logger.trace(`Comparing plugin ${pluginName} with localPluginVersion ${localPluginVersion} and devicePluginVersion ${devicePluginVersion}`); if (!devicePluginVersion) { - return util.format(PluginComparisonMessages.PLUGIN_NOT_INCLUDED_IN_PREVIEW_APP, localPlugin, deviceId); + return util.format(PluginComparisonMessages.PLUGIN_NOT_INCLUDED_IN_PREVIEW_APP, pluginName, deviceId); } const shouldSkipCheck = !semver.valid(localPluginVersion) && !semver.validRange(localPluginVersion); @@ -89,13 +96,16 @@ export class PreviewAppPluginsService implements IPreviewAppPluginsService { return null; } - const localPluginVersionData = semver.coerce(localPluginVersion); - const devicePluginVersionData = semver.coerce(devicePluginVersion); + const localPluginVersionData = await this.$packageInstallationManager.getMaxSatisfyingVersionSafe(pluginName, localPluginVersion); + const devicePluginVersionData = await this.$packageInstallationManager.getMaxSatisfyingVersionSafe(pluginName, devicePluginVersion); + + if (semver.valid(localPluginVersionData) && semver.valid(devicePluginVersionData)) { + if (semver.major(localPluginVersionData) !== semver.major(devicePluginVersionData)) { + return util.format(PluginComparisonMessages.LOCAL_PLUGIN_WITH_DIFFERENCE_IN_MAJOR_VERSION, pluginName, localPluginVersion, devicePluginVersion); + } else if (semver.minor(localPluginVersionData) > semver.minor(devicePluginVersionData)) { + return util.format(PluginComparisonMessages.LOCAL_PLUGIN_WITH_GREATHER_MINOR_VERSION, pluginName, localPluginVersion, devicePluginVersion); + } - if (localPluginVersionData.major !== devicePluginVersionData.major) { - return util.format(PluginComparisonMessages.LOCAL_PLUGIN_WITH_DIFFERENCE_IN_MAJOR_VERSION, localPlugin, localPluginVersion, devicePluginVersion); - } else if (localPluginVersionData.minor > devicePluginVersionData.minor) { - return util.format(PluginComparisonMessages.LOCAL_PLUGIN_WITH_GREATHER_MINOR_VERSION, localPlugin, localPluginVersion, devicePluginVersion); } return null; diff --git a/test/services/playground/preview-app-plugins-service.ts b/test/services/playground/preview-app-plugins-service.ts index 75c52f4bf6..a42125848d 100644 --- a/test/services/playground/preview-app-plugins-service.ts +++ b/test/services/playground/preview-app-plugins-service.ts @@ -4,13 +4,13 @@ import { Device } from "nativescript-preview-sdk"; import { assert } from "chai"; import * as util from "util"; import { PluginComparisonMessages } from "../../../lib/services/livesync/playground/preview-app-constants"; -import { ErrorsStub } from "../../stubs"; +import { ErrorsStub, PackageInstallationManagerStub } from "../../stubs"; let readJsonParams: string[] = []; let warnParams: string[] = []; const deviceId = "myTestDeviceId"; -const projectDir = "testProjectDir"; +const projectDir = "testProjectDir"; function createTestInjector(localPlugins: IStringDictionary, options?: { isNativeScriptPlugin?: boolean, hasPluginNativeCode?: boolean }): IInjector { options = options || {}; @@ -42,8 +42,10 @@ function createTestInjector(localPlugins: IStringDictionary, options?: { isNativ }); injector.register("logger", { trace: () => ({}), - warn: (message: string) => warnParams.push(message) + warn: (message: string) => warnParams.push(message) }); + + injector.register("packageInstallationManager", PackageInstallationManagerStub); injector.register("errors", ErrorsStub); injector.register("previewAppPluginsService", PreviewAppPluginsService); return injector;