From 899fcd0783aa913d241f11507ab6c6e1e4554621 Mon Sep 17 00:00:00 2001 From: Anton Nikolaev Date: Tue, 16 Feb 2021 10:46:11 -0800 Subject: [PATCH] Device plugin management (1/n): use static metadata for checking plugin compatibility with devices Summary: *Stack summary*: this stack adds ability to manage device plugins in the same way as client plugins: install, update, uninstall, enable (star) and disable (unstar) them. *Diff summary*: changed the way how plugin compatibility with devices is checked from dynamic call to "supportsDevice" to static checks of "supportedDevices" metadata property which make it possible to check compatibility without even downloading plugin from Marketplace. Changelog: plugin compatibility with devices is now checked according to metadata in property "supportedDevices" in package.json Reviewed By: mweststrate Differential Revision: D26315848 fbshipit-source-id: 6e4b052c4ea0507ee185fc17999b6211cdb11093 --- desktop/app/src/__tests__/disconnect.node.tsx | 2 +- desktop/app/src/devices/BaseDevice.tsx | 78 ++++++--- .../src/devices/__tests__/BaseDevice.node.tsx | 152 ++++++++++++++++++ desktop/app/src/dispatcher/pluginManager.tsx | 16 +- desktop/app/src/plugin.tsx | 1 + .../reducers/__tests__/connections.node.tsx | 5 + .../__tests__/sandydeviceplugins.node.tsx | 1 - .../appinspect/__tests__/PluginList.spec.tsx | 6 + desktop/app/src/test-utils/MockFlipper.tsx | 10 +- .../src/utils/__tests__/exportData.node.tsx | 9 +- desktop/app/src/utils/pluginUtils.tsx | 25 ++- .../src/plugin/SandyPluginDefinition.tsx | 4 +- .../src/test-utils/test-utils.tsx | 3 +- desktop/plugin-lib/src/PluginDetails.ts | 2 +- .../src/__tests__/getPluginDetails.node.ts | 10 +- desktop/plugin-lib/src/getPluginDetails.ts | 4 +- 16 files changed, 263 insertions(+), 65 deletions(-) create mode 100644 desktop/app/src/devices/__tests__/BaseDevice.node.tsx diff --git a/desktop/app/src/__tests__/disconnect.node.tsx b/desktop/app/src/__tests__/disconnect.node.tsx index 1a3bc94ff..286188acf 100644 --- a/desktop/app/src/__tests__/disconnect.node.tsx +++ b/desktop/app/src/__tests__/disconnect.node.tsx @@ -72,7 +72,7 @@ test('Devices can disconnect', async () => { test('New device with same serial removes & cleans the old one', async () => { const deviceplugin = new _SandyPluginDefinition( - TestUtils.createMockPluginDetails(), + TestUtils.createMockPluginDetails({pluginType: 'device'}), { devicePlugin(client: DevicePluginClient) { const destroy = jest.fn(); diff --git a/desktop/app/src/devices/BaseDevice.tsx b/desktop/app/src/devices/BaseDevice.tsx index 27833d25f..a68c307c0 100644 --- a/desktop/app/src/devices/BaseDevice.tsx +++ b/desktop/app/src/devices/BaseDevice.tsx @@ -17,9 +17,13 @@ import { Idler, createState, } from 'flipper-plugin'; -import type {DevicePluginDefinition, DevicePluginMap} from '../plugin'; +import { + DevicePluginDefinition, + DevicePluginMap, + FlipperDevicePlugin, +} from '../plugin'; import {getFlipperLibImplementation} from '../utils/flipperLibImplementation'; -import {DeviceSpec, OS as PluginOS} from 'flipper-plugin-lib'; +import {DeviceSpec, OS as PluginOS, PluginDetails} from 'flipper-plugin-lib'; export type DeviceShell = { stdout: stream.Readable; @@ -175,6 +179,38 @@ export default class BaseDevice { return null; } + supportsPlugin(plugin: DevicePluginDefinition | PluginDetails) { + let pluginDetails: PluginDetails; + if (isDevicePluginDefinition(plugin)) { + pluginDetails = plugin.details; + if (!pluginDetails.pluginType && !pluginDetails.supportedDevices) { + // TODO T84453692: this branch is to support plugins defined with the legacy approach. Need to remove this branch after some transition period when + // all the plugins will be migrated to the new approach with static compatibility metadata in package.json. + if (plugin instanceof _SandyPluginDefinition) { + return ( + plugin.isDevicePlugin && + plugin.asDevicePluginModule().supportsDevice(this as any) + ); + } else { + return plugin.supportsDevice(this); + } + } + } else { + pluginDetails = plugin; + } + return ( + pluginDetails.pluginType === 'device' && + (!pluginDetails.supportedDevices || + pluginDetails.supportedDevices?.some( + (d) => + (!d.os || d.os === this.os) && + (!d.type || d.type === this.deviceType) && + (d.archived === undefined || d.archived === this.isArchived) && + (!d.specs || d.specs.every((spec) => this.specs.includes(spec))), + )) + ); + } + loadDevicePlugins( devicePlugins?: DevicePluginMap, pluginStates?: Record, @@ -189,23 +225,20 @@ export default class BaseDevice { } loadDevicePlugin(plugin: DevicePluginDefinition, initialState?: any) { + if (!this.supportsPlugin(plugin)) { + return; + } + this.devicePlugins.push(plugin.id); if (plugin instanceof _SandyPluginDefinition) { - if (plugin.asDevicePluginModule().supportsDevice(this as any)) { - this.devicePlugins.push(plugin.id); - this.sandyPluginStates.set( - plugin.id, - new _SandyDevicePluginInstance( - getFlipperLibImplementation(), - plugin, - this, - initialState, - ), - ); - } - } else { - if (plugin.supportsDevice(this)) { - this.devicePlugins.push(plugin.id); - } + this.sandyPluginStates.set( + plugin.id, + new _SandyDevicePluginInstance( + getFlipperLibImplementation(), + plugin, + this, + initialState, + ), + ); } } @@ -231,3 +264,12 @@ export default class BaseDevice { this.sandyPluginStates.clear(); } } + +function isDevicePluginDefinition( + definition: any, +): definition is DevicePluginDefinition { + return ( + (definition as any).prototype instanceof FlipperDevicePlugin || + (definition instanceof _SandyPluginDefinition && definition.isDevicePlugin) + ); +} diff --git a/desktop/app/src/devices/__tests__/BaseDevice.node.tsx b/desktop/app/src/devices/__tests__/BaseDevice.node.tsx new file mode 100644 index 000000000..b96f87de6 --- /dev/null +++ b/desktop/app/src/devices/__tests__/BaseDevice.node.tsx @@ -0,0 +1,152 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +import BaseDevice from '../BaseDevice'; +import * as DeviceTestPluginModule from '../../test-utils/DeviceTestPlugin'; +import {TestUtils, _SandyPluginDefinition} from 'flipper-plugin'; +import ArchivedDevice from '../ArchivedDevice'; + +const physicalDevicePluginDetails = TestUtils.createMockPluginDetails({ + id: 'physicalDevicePlugin', + name: 'flipper-plugin-physical-device', + version: '0.0.1', + pluginType: 'device', + supportedDevices: [ + { + os: 'iOS', + type: 'physical', + archived: false, + }, + { + os: 'Android', + type: 'physical', + }, + ], +}); +const physicalDevicePlugin = new _SandyPluginDefinition( + physicalDevicePluginDetails, + DeviceTestPluginModule, +); + +const iosPhysicalDevicePluginDetails = TestUtils.createMockPluginDetails({ + id: 'iosPhysicalDevicePlugin', + name: 'flipper-plugin-ios-physical-device', + version: '0.0.1', + pluginType: 'device', + supportedDevices: [ + { + os: 'iOS', + type: 'physical', + }, + ], +}); +const iosPhysicalDevicePlugin = new _SandyPluginDefinition( + iosPhysicalDevicePluginDetails, + DeviceTestPluginModule, +); + +const iosEmulatorlDevicePluginDetails = TestUtils.createMockPluginDetails({ + id: 'iosEmulatorDevicePlugin', + name: 'flipper-plugin-ios-emulator-device', + version: '0.0.1', + pluginType: 'device', + supportedDevices: [ + { + os: 'iOS', + type: 'emulator', + }, + ], +}); +const iosEmulatorDevicePlugin = new _SandyPluginDefinition( + iosEmulatorlDevicePluginDetails, + DeviceTestPluginModule, +); +const androiKaiosPhysicalDevicePluginDetails = TestUtils.createMockPluginDetails( + { + id: 'androidPhysicalDevicePlugin', + name: 'flipper-plugin-android-physical-device', + version: '0.0.1', + pluginType: 'device', + supportedDevices: [ + { + os: 'Android', + type: 'physical', + specs: ['KaiOS'], + }, + ], + }, +); +const androidKaiosPhysicalDevicePlugin = new _SandyPluginDefinition( + androiKaiosPhysicalDevicePluginDetails, + DeviceTestPluginModule, +); + +const androidEmulatorlDevicePluginDetails = TestUtils.createMockPluginDetails({ + id: 'androidEmulatorDevicePlugin', + name: 'flipper-plugin-android-emulator-device', + version: '0.0.1', + pluginType: 'device', + supportedDevices: [ + { + os: 'Android', + type: 'emulator', + }, + ], +}); +const androidEmulatorDevicePlugin = new _SandyPluginDefinition( + androidEmulatorlDevicePluginDetails, + DeviceTestPluginModule, +); +test('ios physical device compatibility', () => { + const device = new BaseDevice('serial', 'physical', 'test device', 'iOS'); + expect(device.supportsPlugin(physicalDevicePlugin)).toBeTruthy(); + expect(device.supportsPlugin(iosPhysicalDevicePlugin)).toBeTruthy(); + expect(device.supportsPlugin(iosEmulatorDevicePlugin)).toBeFalsy(); + expect(device.supportsPlugin(androidKaiosPhysicalDevicePlugin)).toBeFalsy(); + expect(device.supportsPlugin(androidEmulatorDevicePlugin)).toBeFalsy(); +}); + +test('archived device compatibility', () => { + const device = new ArchivedDevice({ + serial: 'serial', + deviceType: 'physical', + title: 'test device', + os: 'iOS', + screenshotHandle: null, + }); + expect(device.supportsPlugin(physicalDevicePlugin)).toBeFalsy(); + expect(device.supportsPlugin(iosPhysicalDevicePlugin)).toBeTruthy(); + expect(device.supportsPlugin(iosEmulatorDevicePlugin)).toBeFalsy(); + expect(device.supportsPlugin(androidKaiosPhysicalDevicePlugin)).toBeFalsy(); + expect(device.supportsPlugin(androidEmulatorDevicePlugin)).toBeFalsy(); +}); + +test('android emulator device compatibility', () => { + const device = new BaseDevice('serial', 'emulator', 'test device', 'Android'); + expect(device.supportsPlugin(physicalDevicePlugin)).toBeFalsy(); + expect(device.supportsPlugin(iosPhysicalDevicePlugin)).toBeFalsy(); + expect(device.supportsPlugin(iosEmulatorDevicePlugin)).toBeFalsy(); + expect(device.supportsPlugin(androidKaiosPhysicalDevicePlugin)).toBeFalsy(); + expect(device.supportsPlugin(androidEmulatorDevicePlugin)).toBeTruthy(); +}); + +test('android KaiOS device compatibility', () => { + const device = new BaseDevice( + 'serial', + 'physical', + 'test device', + 'Android', + ['KaiOS'], + ); + expect(device.supportsPlugin(physicalDevicePlugin)).toBeTruthy(); + expect(device.supportsPlugin(iosPhysicalDevicePlugin)).toBeFalsy(); + expect(device.supportsPlugin(iosEmulatorDevicePlugin)).toBeFalsy(); + expect(device.supportsPlugin(androidKaiosPhysicalDevicePlugin)).toBeTruthy(); + expect(device.supportsPlugin(androidEmulatorDevicePlugin)).toBeFalsy(); +}); diff --git a/desktop/app/src/dispatcher/pluginManager.tsx b/desktop/app/src/dispatcher/pluginManager.tsx index 0b1de800b..b102f87a9 100644 --- a/desktop/app/src/dispatcher/pluginManager.tsx +++ b/desktop/app/src/dispatcher/pluginManager.tsx @@ -41,7 +41,6 @@ import { registerInstalledPlugins, } from '../reducers/plugins'; import {_SandyPluginDefinition} from 'flipper-plugin'; -import type BaseDevice from '../devices/BaseDevice'; import {pluginStarred, pluginUnstarred} from '../reducers/connections'; import {deconstructClientId} from '../utils/clientUtils'; import {clearMessageQueue} from '../reducers/pluginMessageQueue'; @@ -239,13 +238,13 @@ function updateClientPlugin( function updateDevicePlugin(store: Store, plugin: DevicePluginDefinition) { const devices = store.getState().connections.devices; const devicesWithEnabledPlugin = devices.filter((d) => - supportsDevice(plugin, d), + d.supportsPlugin(plugin), ); devicesWithEnabledPlugin.forEach((d) => { d.unloadDevicePlugin(plugin.id); }); store.dispatch(clearPluginState({pluginId: plugin.id})); - const previousVersion = store.getState().plugins.clientPlugins.get(plugin.id); + const previousVersion = store.getState().plugins.devicePlugins.get(plugin.id); if (previousVersion) { // unload previous version from Electron cache unloadPluginModule(previousVersion.details); @@ -305,14 +304,3 @@ export function isDevicePluginDefinition( (definition instanceof _SandyPluginDefinition && definition.isDevicePlugin) ); } - -function supportsDevice(plugin: DevicePluginDefinition, device: BaseDevice) { - if (plugin instanceof _SandyPluginDefinition) { - return ( - plugin.isDevicePlugin && - plugin.asDevicePluginModule().supportsDevice(device as any) - ); - } else { - return plugin.supportsDevice(device); - } -} diff --git a/desktop/app/src/plugin.tsx b/desktop/app/src/plugin.tsx index f35912e58..b1f63387b 100644 --- a/desktop/app/src/plugin.tsx +++ b/desktop/app/src/plugin.tsx @@ -241,6 +241,7 @@ export class FlipperDevicePlugin< this.teardown(); } + // TODO T84453692: remove this function after some transition period in favor of BaseDevice.supportsPlugin. static supportsDevice(_device: BaseDevice): boolean { throw new Error( 'supportsDevice is unimplemented in FlipperDevicePlugin class', diff --git a/desktop/app/src/reducers/__tests__/connections.node.tsx b/desktop/app/src/reducers/__tests__/connections.node.tsx index 427994c0f..846705462 100644 --- a/desktop/app/src/reducers/__tests__/connections.node.tsx +++ b/desktop/app/src/reducers/__tests__/connections.node.tsx @@ -13,6 +13,7 @@ import BaseDevice from '../../devices/BaseDevice'; import MacDevice from '../../devices/MacDevice'; import {FlipperDevicePlugin} from '../../plugin'; import MetroDevice from '../../devices/MetroDevice'; +import {TestUtils} from 'flipper-plugin'; test('doing a double REGISTER_DEVICE keeps the last', () => { const device1 = new BaseDevice('serial', 'physical', 'title', 'Android'); @@ -61,6 +62,10 @@ test('triggering REGISTER_DEVICE before REGISTER_PLUGINS still registers device static supportsDevice() { return true; } + static details = TestUtils.createMockPluginDetails({ + id: 'test', + pluginType: 'device', + }); } const stateWithDevice = reducer(undefined, { diff --git a/desktop/app/src/reducers/__tests__/sandydeviceplugins.node.tsx b/desktop/app/src/reducers/__tests__/sandydeviceplugins.node.tsx index dcbb8303d..5470ff09a 100644 --- a/desktop/app/src/reducers/__tests__/sandydeviceplugins.node.tsx +++ b/desktop/app/src/reducers/__tests__/sandydeviceplugins.node.tsx @@ -71,7 +71,6 @@ test('it should initialize device sandy plugins', async () => { expect(device.sandyPluginStates.get(TestPlugin.id)).toBeInstanceOf( _SandyDevicePluginInstance, ); - expect(TestPlugin.asDevicePluginModule().supportsDevice).toBeCalledTimes(1); const instanceApi: PluginApi = device.sandyPluginStates.get(TestPlugin.id)! .instanceApi; diff --git a/desktop/app/src/sandy-chrome/appinspect/__tests__/PluginList.spec.tsx b/desktop/app/src/sandy-chrome/appinspect/__tests__/PluginList.spec.tsx index ceac7ebfa..9942f76d1 100644 --- a/desktop/app/src/sandy-chrome/appinspect/__tests__/PluginList.spec.tsx +++ b/desktop/app/src/sandy-chrome/appinspect/__tests__/PluginList.spec.tsx @@ -88,12 +88,18 @@ describe('basic findBestDevice with metro present', () => { beforeEach(async () => { flipper = await createMockFlipperWithPlugin(logsPlugin); + flipper.device.supportsPlugin = (p) => { + return p.id !== 'unsupportedDevicePlugin'; + }; testDevice = flipper.device; // flipper.store.dispatch(registerPlugins([LogsPlugin])) await registerMetroDevice(undefined, flipper.store, flipper.logger); metro = findMetroDevice( flipper.store.getState().connections.devices, )! as MetroDevice; + metro.supportsPlugin = (p) => { + return p.id !== 'unsupportedDevicePlugin'; + }; }); test('findMetroDevice', () => { diff --git a/desktop/app/src/test-utils/MockFlipper.tsx b/desktop/app/src/test-utils/MockFlipper.tsx index 5bd91649e..df545ca25 100644 --- a/desktop/app/src/test-utils/MockFlipper.tsx +++ b/desktop/app/src/test-utils/MockFlipper.tsx @@ -19,6 +19,7 @@ import {registerPlugins} from '../reducers/plugins'; import {getInstance} from '../fb-stubs/Logger'; import {initializeFlipperLibImplementation} from '../utils/flipperLibImplementation'; import pluginManager from '../dispatcher/pluginManager'; +import {PluginDetails} from 'flipper-plugin-lib'; export interface AppOptions { plugins?: PluginDefinition[]; @@ -35,6 +36,7 @@ export interface ClientOptions { export interface DeviceOptions { serial?: string; + isSupportedByPlugin?: (p: PluginDetails) => boolean; } export default class MockFlipper { @@ -105,13 +107,19 @@ export default class MockFlipper { this.unsubscribePluginManager && this.unsubscribePluginManager(); } - public createDevice({serial}: DeviceOptions = {}): BaseDevice { + public createDevice({ + serial, + isSupportedByPlugin, + }: DeviceOptions = {}): BaseDevice { const device = new BaseDevice( serial ?? `serial_${++this._deviceCounter}`, 'physical', 'MockAndroidDevice', 'Android', ); + device.supportsPlugin = !isSupportedByPlugin + ? () => true + : isSupportedByPlugin; this._store.dispatch({ type: 'REGISTER_DEVICE', payload: device, diff --git a/desktop/app/src/utils/__tests__/exportData.node.tsx b/desktop/app/src/utils/__tests__/exportData.node.tsx index ad8df1e7f..84a028597 100644 --- a/desktop/app/src/utils/__tests__/exportData.node.tsx +++ b/desktop/app/src/utils/__tests__/exportData.node.tsx @@ -1333,7 +1333,7 @@ test('Sandy plugins are imported properly', async () => { }); const sandyDeviceTestPlugin = new _SandyPluginDefinition( - TestUtils.createMockPluginDetails(), + TestUtils.createMockPluginDetails({pluginType: 'device'}), { supportsDevice: () => true, devicePlugin(client: DevicePluginClient) { @@ -1536,7 +1536,7 @@ test('Sandy plugin with custom import', async () => { test('Sandy device plugin with custom import', async () => { const plugin = new _SandyPluginDefinition( - TestUtils.createMockPluginDetails(), + TestUtils.createMockPluginDetails({pluginType: 'device'}), { supportsDevice: () => true, devicePlugin(client: DevicePluginClient) { @@ -1665,7 +1665,10 @@ test('Sandy plugins with complex data are imported / exported correctly', async test('Sandy device plugins with complex data are imported / exported correctly', async () => { const deviceplugin = new _SandyPluginDefinition( - TestUtils.createMockPluginDetails({id: 'deviceplugin'}), + TestUtils.createMockPluginDetails({ + id: 'deviceplugin', + pluginType: 'device', + }), { supportsDevice() { return true; diff --git a/desktop/app/src/utils/pluginUtils.tsx b/desktop/app/src/utils/pluginUtils.tsx index 8e39d9e91..e31c6e731 100644 --- a/desktop/app/src/utils/pluginUtils.tsx +++ b/desktop/app/src/utils/pluginUtils.tsx @@ -27,7 +27,6 @@ import type { PluginDetails, } from 'flipper-plugin-lib'; import {filterNewestVersionOfEachPlugin} from '../dispatcher/plugins'; -import ArchivedDevice from '../devices/ArchivedDevice'; export const defaultEnabledBackgroundPlugins = ['Navigation']; // The navigation plugin is enabled always, to make sure the navigation features works @@ -182,12 +181,12 @@ export function computePluginLists( userStarredPlugins: State['connections']['userStarredPlugins'], _pluginsChanged?: number, // this argument is purely used to invalidate the memoization cache ) { - const devicePlugins: DevicePluginDefinition[] = - device?.devicePlugins.map((name) => plugins.devicePlugins.get(name)!) ?? []; - const metroPlugins: DevicePluginDefinition[] = - metroDevice?.devicePlugins.map( - (name) => plugins.devicePlugins.get(name)!, - ) ?? []; + const devicePlugins: DevicePluginDefinition[] = [ + ...plugins.devicePlugins.values(), + ].filter((p) => device?.supportsPlugin(p)); + const metroPlugins: DevicePluginDefinition[] = [ + ...plugins.devicePlugins.values(), + ].filter((p) => metroDevice?.supportsPlugin(p)); const enabledPlugins: ClientPluginDefinition[] = []; const disabledPlugins: ClientPluginDefinition[] = []; const unavailablePlugins: [plugin: PluginDetails, reason: string][] = []; @@ -198,16 +197,12 @@ export function computePluginLists( if (device) { // find all device plugins that aren't part of the current device / metro - const detectedDevicePlugins = new Set([ - ...device.devicePlugins, - ...(metroDevice?.devicePlugins ?? []), - ]); - for (const [name, definition] of plugins.devicePlugins.entries()) { - if (!detectedDevicePlugins.has(name)) { + for (const p of plugins.devicePlugins.values()) { + if (!device.supportsPlugin(p) && !metroDevice?.supportsPlugin(p)) { unavailablePlugins.push([ - definition.details, + p.details, `Device plugin '${getPluginTitle( - definition.details, + p.details, )}' is not supported by the current device type.`, ]); } diff --git a/desktop/flipper-plugin/src/plugin/SandyPluginDefinition.tsx b/desktop/flipper-plugin/src/plugin/SandyPluginDefinition.tsx index 0dbe8d3e8..ef9f53976 100644 --- a/desktop/flipper-plugin/src/plugin/SandyPluginDefinition.tsx +++ b/desktop/flipper-plugin/src/plugin/SandyPluginDefinition.tsx @@ -16,7 +16,7 @@ import {DevicePluginPredicate, DevicePluginFactory} from './DevicePlugin'; */ export type FlipperDevicePluginModule = { /** predicate that determines if this plugin applies to the currently selcted device */ - supportsDevice: DevicePluginPredicate; + supportsDevice: DevicePluginPredicate; // TODO T84453692: remove this function after some transition period in favor of BaseDevice.supportsPlugin. /** the factory function that initializes a plugin instance */ devicePlugin: DevicePluginFactory; /** the component type that can render this plugin */ @@ -52,7 +52,7 @@ export class SandyPluginDefinition { constructor(details: ActivatablePluginDetails, module: any) { this.id = details.id; this.details = details; - if (module.supportsDevice) { + if (details.pluginType === 'device' || module.supportsDevice) { // device plugin this.isDevicePlugin = true; if (!module.devicePlugin || typeof module.devicePlugin !== 'function') { diff --git a/desktop/flipper-plugin/src/test-utils/test-utils.tsx b/desktop/flipper-plugin/src/test-utils/test-utils.tsx index a1752cee2..ffd8f6af8 100644 --- a/desktop/flipper-plugin/src/test-utils/test-utils.tsx +++ b/desktop/flipper-plugin/src/test-utils/test-utils.tsx @@ -297,7 +297,7 @@ export function startDevicePlugin( options?: StartPluginOptions, ): StartDevicePluginResult { const definition = new SandyPluginDefinition( - createMockPluginDetails(), + createMockPluginDetails({pluginType: 'device'}), module, ); if (!definition.isDevicePlugin) { @@ -402,7 +402,6 @@ export function createMockPluginDetails( dir: '', name: 'TestPlugin', specVersion: 0, - pluginType: 'client', entry: '', isBundled: false, isActivatable: true, diff --git a/desktop/plugin-lib/src/PluginDetails.ts b/desktop/plugin-lib/src/PluginDetails.ts index 0193ff62f..6d650837f 100644 --- a/desktop/plugin-lib/src/PluginDetails.ts +++ b/desktop/plugin-lib/src/PluginDetails.ts @@ -27,7 +27,7 @@ export interface PluginDetails { url?: string; }; flipperSDKVersion?: string; - pluginType: PluginType; + pluginType?: PluginType; supportedDevices?: SupportedDevice[]; } diff --git a/desktop/plugin-lib/src/__tests__/getPluginDetails.node.ts b/desktop/plugin-lib/src/__tests__/getPluginDetails.node.ts index 0d815d97b..ec306e7d0 100644 --- a/desktop/plugin-lib/src/__tests__/getPluginDetails.node.ts +++ b/desktop/plugin-lib/src/__tests__/getPluginDetails.node.ts @@ -49,7 +49,7 @@ test('getPluginDetailsV1', async () => { "isBundled": false, "main": "dist/bundle.js", "name": "flipper-plugin-test", - "pluginType": "client", + "pluginType": undefined, "source": "src/index.tsx", "specVersion": 1, "supportedDevices": undefined, @@ -90,7 +90,7 @@ test('getPluginDetailsV2', async () => { "isBundled": false, "main": "dist/bundle.js", "name": "flipper-plugin-test", - "pluginType": "client", + "pluginType": undefined, "source": "src/index.tsx", "specVersion": 2, "supportedDevices": undefined, @@ -131,7 +131,7 @@ test('id used as title if the latter omited', async () => { "isBundled": false, "main": "dist/bundle.js", "name": "flipper-plugin-test", - "pluginType": "client", + "pluginType": undefined, "source": "src/index.tsx", "specVersion": 2, "supportedDevices": undefined, @@ -171,7 +171,7 @@ test('name without "flipper-plugin-" prefix is used as title if the latter omite "isBundled": false, "main": "dist/bundle.js", "name": "flipper-plugin-test", - "pluginType": "client", + "pluginType": undefined, "source": "src/index.tsx", "specVersion": 2, "supportedDevices": undefined, @@ -214,7 +214,7 @@ test('flipper-plugin-version is parsed', async () => { "isBundled": false, "main": "dist/bundle.js", "name": "flipper-plugin-test", - "pluginType": "client", + "pluginType": undefined, "source": "src/index.tsx", "specVersion": 2, "supportedDevices": undefined, diff --git a/desktop/plugin-lib/src/getPluginDetails.ts b/desktop/plugin-lib/src/getPluginDetails.ts index 7d837dafa..043238b09 100644 --- a/desktop/plugin-lib/src/getPluginDetails.ts +++ b/desktop/plugin-lib/src/getPluginDetails.ts @@ -87,7 +87,7 @@ function getPluginDetailsV1(packageJson: any): PluginDetails { category: packageJson.category, bugs: packageJson.bugs, flipperSDKVersion: packageJson?.peerDependencies?.['flipper-plugin'], - pluginType: packageJson?.pluginType || 'client', + pluginType: packageJson?.pluginType, supportedDevices: packageJson?.supportedDevices, }; } @@ -109,7 +109,7 @@ function getPluginDetailsV2(packageJson: any): PluginDetails { category: packageJson.category, bugs: packageJson.bugs, flipperSDKVersion: packageJson?.peerDependencies?.['flipper-plugin'], - pluginType: packageJson?.pluginType || 'client', + pluginType: packageJson?.pluginType, supportedDevices: packageJson?.supportedDevices, }; }