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, }; }