Make sure that limited top-level exports are exposed from flipper-plugin

Summary: This prefixes APIs of `flipper-plugin`, that are used by Flipper, but should not be used by plugins directly, with `_`. Also added tests to make sure we are always intentional when extending the exposed APIs

Reviewed By: passy

Differential Revision: D24991700

fbshipit-source-id: ed3700efa188fca7f5a14d5c68250598cf011e42
This commit is contained in:
Michel Weststrate
2020-11-16 13:08:05 -08:00
committed by Facebook GitHub Bot
parent cc438e60ad
commit 45db64f0d0
21 changed files with 156 additions and 90 deletions

View File

@@ -36,7 +36,7 @@ import {processMessagesLater} from './utils/messageQueue';
import {emitBytesReceived} from './dispatcher/tracking';
import {debounce} from 'lodash';
import {batch} from 'react-redux';
import {SandyPluginInstance} from 'flipper-plugin';
import {_SandyPluginInstance} from 'flipper-plugin';
import {flipperMessagesClientPlugin} from './utils/self-inspection/plugins/FlipperMessagesClientPlugin';
import {getFlipperLibImplementation} from './utils/flipperLibImplementation';
@@ -148,11 +148,11 @@ export default class Client extends EventEmitter {
plugin:
| typeof FlipperPlugin
| typeof FlipperDevicePlugin
| SandyPluginInstance;
| _SandyPluginInstance;
messages: Params[];
}
> = {};
sandyPluginStates = new Map<string /*pluginID*/, SandyPluginInstance>();
sandyPluginStates = new Map<string /*pluginID*/, _SandyPluginInstance>();
requestCallbacks: Map<
number,
@@ -251,7 +251,7 @@ export default class Client extends EventEmitter {
// TODO: needs to be wrapped in error tracking T68955280
this.sandyPluginStates.set(
plugin.id,
new SandyPluginInstance(
new _SandyPluginInstance(
getFlipperLibImplementation(),
plugin,
this,
@@ -301,7 +301,7 @@ export default class Client extends EventEmitter {
// TODO: needs to be wrapped in error tracking T68955280
this.sandyPluginStates.set(
plugin.id,
new SandyPluginInstance(getFlipperLibImplementation(), plugin, this),
new _SandyPluginInstance(getFlipperLibImplementation(), plugin, this),
);
}
}

View File

@@ -26,11 +26,11 @@ import electron, {MenuItemConstructorOptions} from 'electron';
import {notNull} from './utils/typeUtils';
import constants from './fb-stubs/constants';
import {Logger} from './fb-interfaces/Logger';
import {NormalizedMenuEntry, buildInMenuEntries} from 'flipper-plugin';
import {NormalizedMenuEntry, _buildInMenuEntries} from 'flipper-plugin';
import {StyleGuide} from './sandy-chrome/StyleGuide';
import {showEmulatorLauncher} from './sandy-chrome/appinspect/LaunchEmulator';
export type DefaultKeyboardAction = keyof typeof buildInMenuEntries;
export type DefaultKeyboardAction = keyof typeof _buildInMenuEntries;
export type TopLevelMenu = 'Edit' | 'View' | 'Window' | 'Help';
export type KeyboardAction = {
@@ -70,7 +70,7 @@ export function setupMenuBar(
.map((plugin) => plugin.keyboardActions || [])
.flat()
.map((action: DefaultKeyboardAction | KeyboardAction) =>
typeof action === 'string' ? buildInMenuEntries[action] : action,
typeof action === 'string' ? _buildInMenuEntries[action] : action,
)
.filter(notNull),
);

View File

@@ -46,7 +46,7 @@ import {Message} from './reducers/pluginMessageQueue';
import {Idler} from './utils/Idler';
import {processMessageQueue} from './utils/messageQueue';
import {ToggleButton, SmallText, Layout} from './ui';
import {SandyPluginRenderer} from 'flipper-plugin';
import {_SandyPluginRenderer} from 'flipper-plugin';
import {isDevicePluginDefinition} from './utils/pluginUtils';
import ArchivedDevice from './devices/ArchivedDevice';
import {ContentContainer} from './sandy-chrome/ContentContainer';
@@ -377,7 +377,9 @@ class PluginContainer extends PureComponent<Props, State> {
// happens if we selected a plugin that is not enabled on a specific app or not supported on a specific device.
return this.renderNoPluginActive();
}
pluginElement = <SandyPluginRenderer key={pluginKey} plugin={instance} />;
pluginElement = (
<_SandyPluginRenderer key={pluginKey} plugin={instance} />
);
} else {
const props: PluginProps<Object> & {
key: string;

View File

@@ -12,7 +12,7 @@ import produce from 'immer';
import {FlipperPlugin} from '../plugin';
import {renderMockFlipperWithPlugin} from '../test-utils/createMockFlipperWithPlugin';
import {
SandyPluginDefinition,
_SandyPluginDefinition,
PluginClient,
TestUtils,
usePlugin,
@@ -141,7 +141,7 @@ test('PluginContainer can render Sandy plugins', async () => {
};
};
const definition = new SandyPluginDefinition(
const definition = new _SandyPluginDefinition(
TestUtils.createMockPluginDetails(),
{
plugin,
@@ -339,7 +339,7 @@ test('PluginContainer triggers correct lifecycles for background plugin', async
return {connectedStub, disconnectedStub, activatedStub, deactivatedStub};
};
const definition = new SandyPluginDefinition(
const definition = new _SandyPluginDefinition(
TestUtils.createMockPluginDetails(),
{
plugin,
@@ -480,7 +480,7 @@ test('PluginContainer + Sandy plugin supports deeplink', async () => {
};
};
const definition = new SandyPluginDefinition(
const definition = new _SandyPluginDefinition(
TestUtils.createMockPluginDetails(),
{
plugin,
@@ -636,7 +636,7 @@ test('PluginContainer can render Sandy device plugins', async () => {
return {activatedStub, deactivatedStub, lastLogMessage};
};
const definition = new SandyPluginDefinition(
const definition = new _SandyPluginDefinition(
TestUtils.createMockPluginDetails(),
{
supportsDevice: () => true,
@@ -750,7 +750,7 @@ test('PluginContainer + Sandy device plugin supports deeplink', async () => {
};
};
const definition = new SandyPluginDefinition(
const definition = new _SandyPluginDefinition(
TestUtils.createMockPluginDetails(),
{
devicePlugin,

View File

@@ -28,7 +28,7 @@ import LauncherSettingsPanel from '../fb-stubs/LauncherSettingsPanel';
import SandySettingsPanel from '../fb-stubs/SandySettingsPanel';
import {reportUsage} from '../utils/metrics';
import {Modal} from 'antd';
import {Layout, NuxManagerContext} from 'flipper-plugin';
import {Layout, _NuxManagerContext} from 'flipper-plugin';
const Container = styled(FlexColumn)({
padding: 20,
@@ -358,7 +358,7 @@ export default connect<StateFromProps, DispatchFromProps, OwnProps, Store>(
)(SettingsSheet);
function ResetTooltips() {
const nuxManager = useContext(NuxManagerContext);
const nuxManager = useContext(_NuxManagerContext);
return (
<Button

View File

@@ -10,8 +10,8 @@
import stream from 'stream';
import {
DeviceLogEntry,
SandyDevicePluginInstance,
SandyPluginDefinition,
_SandyDevicePluginInstance,
_SandyPluginDefinition,
DeviceType,
DeviceLogListener,
} from 'flipper-plugin';
@@ -66,9 +66,9 @@ export default class BaseDevice {
// sorted list of supported device plugins
devicePlugins: string[] = [];
sandyPluginStates: Map<string, SandyDevicePluginInstance> = new Map<
sandyPluginStates: Map<string, _SandyDevicePluginInstance> = new Map<
string,
SandyDevicePluginInstance
_SandyDevicePluginInstance
>();
supportsOS(os: OS) {
@@ -175,12 +175,12 @@ export default class BaseDevice {
}
loadDevicePlugin(plugin: DevicePluginDefinition) {
if (plugin instanceof SandyPluginDefinition) {
if (plugin instanceof _SandyPluginDefinition) {
if (plugin.asDevicePluginModule().supportsDevice(this as any)) {
this.devicePlugins.push(plugin.id);
this.sandyPluginStates.set(
plugin.id,
new SandyDevicePluginInstance(
new _SandyDevicePluginInstance(
getFlipperLibImplementation(),
plugin,
this,

View File

@@ -26,7 +26,7 @@ import configureStore from 'redux-mock-store';
import {TEST_PASSING_GK, TEST_FAILING_GK} from '../../fb-stubs/GK';
import TestPlugin from './TestPlugin';
import {resetConfigForTesting} from '../../utils/processConfig';
import {SandyPluginDefinition} from 'flipper-plugin';
import {_SandyPluginDefinition} from 'flipper-plugin';
import {mocked} from 'ts-jest/utils';
import loadDynamicPlugins from '../../utils/loadDynamicPlugins';
@@ -246,9 +246,9 @@ test('requirePlugin loads valid Sandy plugin', () => {
),
version: '1.0.0',
flipperSDKVersion: '0.0.0',
}) as SandyPluginDefinition;
}) as _SandyPluginDefinition;
expect(plugin).not.toBeNull();
expect(plugin).toBeInstanceOf(SandyPluginDefinition);
expect(plugin).toBeInstanceOf(_SandyPluginDefinition);
expect(plugin.id).toBe('Sample');
expect(plugin.details).toMatchObject({
flipperSDKVersion: '0.0.0',
@@ -296,9 +296,9 @@ test('requirePlugin loads valid Sandy Device plugin', () => {
),
version: '1.0.0',
flipperSDKVersion: '0.0.0',
}) as SandyPluginDefinition;
}) as _SandyPluginDefinition;
expect(plugin).not.toBeNull();
expect(plugin).toBeInstanceOf(SandyPluginDefinition);
expect(plugin).toBeInstanceOf(_SandyPluginDefinition);
expect(plugin.id).toBe('Sample');
expect(plugin.details).toMatchObject({
flipperSDKVersion: '0.0.0',

View File

@@ -32,7 +32,7 @@ import semver from 'semver';
import {PluginDetails} from 'flipper-plugin-lib';
import {tryCatchReportPluginFailures, reportUsage} from '../utils/metrics';
import * as FlipperPluginSDK from 'flipper-plugin';
import {SandyPluginDefinition} from 'flipper-plugin';
import {_SandyPluginDefinition} from 'flipper-plugin';
import loadDynamicPlugins from '../utils/loadDynamicPlugins';
import Immer from 'immer';
@@ -223,7 +223,7 @@ const requirePluginInternal = (
: reqFn(pluginDetails.entry);
if (pluginDetails.flipperSDKVersion) {
// Sandy plugin
return new SandyPluginDefinition(pluginDetails, plugin);
return new _SandyPluginDefinition(pluginDetails, plugin);
} else {
// classic plugin
if (plugin.default) {

View File

@@ -34,7 +34,7 @@ import {PopoverProvider} from './ui/components/PopoverProvider';
import {initializeFlipperLibImplementation} from './utils/flipperLibImplementation';
import {enableConsoleHook} from './chrome/ConsoleLogs';
import {sideEffect} from './utils/sideEffect';
import {NuxManagerContext, createNuxManager} from 'flipper-plugin';
import {_NuxManagerContext, _createNuxManager} from 'flipper-plugin';
if (process.env.NODE_ENV === 'development' && os.platform() === 'darwin') {
// By default Node.JS has its internal certificate storage and doesn't use
@@ -57,9 +57,9 @@ const AppFrame = () => (
<TooltipProvider>
<PopoverProvider>
<ContextMenuProvider>
<NuxManagerContext.Provider value={createNuxManager()}>
<_NuxManagerContext.Provider value={_createNuxManager()}>
<App logger={logger} />
</NuxManagerContext.Provider>
</_NuxManagerContext.Provider>
</ContextMenuProvider>
</PopoverProvider>
</TooltipProvider>

View File

@@ -21,7 +21,7 @@ import {State as ReduxState} from './reducers';
import {DEFAULT_MAX_QUEUE_SIZE} from './reducers/pluginMessageQueue';
import {PluginDetails} from 'flipper-plugin-lib';
import {Settings} from './reducers/settings';
import {SandyPluginDefinition} from 'flipper-plugin';
import {_SandyPluginDefinition} from 'flipper-plugin';
type Parameters = {[key: string]: any};
@@ -29,19 +29,19 @@ export type PluginDefinition = ClientPluginDefinition | DevicePluginDefinition;
export type DevicePluginDefinition =
| typeof FlipperDevicePlugin
| SandyPluginDefinition;
| _SandyPluginDefinition;
export type ClientPluginDefinition =
| typeof FlipperPlugin
| SandyPluginDefinition;
| _SandyPluginDefinition;
export type ClientPluginMap = Map<string, ClientPluginDefinition>;
export type DevicePluginMap = Map<string, DevicePluginDefinition>;
export function isSandyPlugin(
plugin?: PluginDefinition | null,
): plugin is SandyPluginDefinition {
return plugin instanceof SandyPluginDefinition;
): plugin is _SandyPluginDefinition {
return plugin instanceof _SandyPluginDefinition;
}
// This function is intended to be called from outside of the plugin.

View File

@@ -11,8 +11,8 @@ import {createMockFlipperWithPlugin} from '../../test-utils/createMockFlipperWit
import {Store} from '../../';
import {selectPlugin} from '../../reducers/connections';
import {
SandyPluginDefinition,
SandyDevicePluginInstance,
_SandyPluginDefinition,
_SandyDevicePluginInstance,
DevicePluginClient,
TestUtils,
} from 'flipper-plugin';
@@ -42,7 +42,7 @@ function devicePlugin(client: DevicePluginClient) {
destroyStub,
};
}
const TestPlugin = new SandyPluginDefinition(pluginDetails, {
const TestPlugin = new _SandyPluginDefinition(pluginDetails, {
supportsDevice: jest.fn().mockImplementation(() => true),
devicePlugin: jest
.fn()
@@ -69,7 +69,7 @@ test('it should initialize device sandy plugins', async () => {
// already started, so initialized immediately
expect(initialized).toBe(true);
expect(device.sandyPluginStates.get(TestPlugin.id)).toBeInstanceOf(
SandyDevicePluginInstance,
_SandyDevicePluginInstance,
);
expect(TestPlugin.asDevicePluginModule().supportsDevice).toBeCalledTimes(1);
const instanceApi: PluginApi = device.sandyPluginStates.get(TestPlugin.id)!

View File

@@ -12,8 +12,8 @@ import {Store, Client} from '../../';
import {selectPlugin, starPlugin} from '../../reducers/connections';
import {registerPlugins} from '../../reducers/plugins';
import {
SandyPluginDefinition,
SandyPluginInstance,
_SandyPluginDefinition,
_SandyPluginInstance,
PluginClient,
TestUtils,
} from 'flipper-plugin';
@@ -49,7 +49,7 @@ function plugin(client: PluginClient<any, any>) {
messages,
};
}
const TestPlugin = new SandyPluginDefinition(pluginDetails, {
const TestPlugin = new _SandyPluginDefinition(pluginDetails, {
plugin: jest.fn().mockImplementation(plugin) as typeof plugin,
Component: jest.fn().mockImplementation(() => null),
});
@@ -82,7 +82,7 @@ test('it should initialize starred sandy plugins', async () => {
// already started, so initialized immediately
expect(initialized).toBe(true);
expect(client.sandyPluginStates.get(TestPlugin.id)).toBeInstanceOf(
SandyPluginInstance,
_SandyPluginInstance,
);
const instanceApi: PluginApi = client.sandyPluginStates.get(TestPlugin.id)!
.instanceApi;
@@ -132,7 +132,7 @@ test('it should cleanup if client is removed', async () => {
test('it should not initialize a sandy plugin if not enabled', async () => {
const {client, store} = await createMockFlipperWithPlugin(TestPlugin);
const Plugin2 = new SandyPluginDefinition(
const Plugin2 = new _SandyPluginDefinition(
TestUtils.createMockPluginDetails({
name: 'Plugin2',
id: 'Plugin2',
@@ -146,7 +146,7 @@ test('it should not initialize a sandy plugin if not enabled', async () => {
);
const pluginState1 = client.sandyPluginStates.get(TestPlugin.id);
expect(pluginState1).toBeInstanceOf(SandyPluginInstance);
expect(pluginState1).toBeInstanceOf(_SandyPluginInstance);
store.dispatch(registerPlugins([Plugin2]));
await client.refreshPlugins();
// not yet enabled, so not yet started
@@ -161,7 +161,7 @@ test('it should not initialize a sandy plugin if not enabled', async () => {
);
expect(client.sandyPluginStates.get(Plugin2.id)).toBeInstanceOf(
SandyPluginInstance,
_SandyPluginInstance,
);
const instance = client.sandyPluginStates.get(Plugin2.id)!
.instanceApi as PluginApi;
@@ -238,7 +238,7 @@ test('it can send messages from sandy clients', async () => {
test('it should initialize "Navigation" plugin if not enabled', async () => {
const {client, store} = await createMockFlipperWithPlugin(TestPlugin);
const Plugin2 = new SandyPluginDefinition(
const Plugin2 = new _SandyPluginDefinition(
TestUtils.createMockPluginDetails({
name: 'Plugin2',
id: 'Navigation',
@@ -252,7 +252,7 @@ test('it should initialize "Navigation" plugin if not enabled', async () => {
);
const pluginState1 = client.sandyPluginStates.get(TestPlugin.id);
expect(pluginState1).toBeInstanceOf(SandyPluginInstance);
expect(pluginState1).toBeInstanceOf(_SandyPluginInstance);
store.dispatch(registerPlugins([Plugin2]));
await client.refreshPlugins();
// not enabled, but Navigation is an exception, so we still get an instance

View File

@@ -16,7 +16,7 @@ import {findBestClient, findBestDevice, findMetroDevice} from '../AppInspect';
import {FlipperPlugin} from '../../../plugin';
import MetroDevice from '../../../devices/MetroDevice';
import BaseDevice from '../../../devices/BaseDevice';
import {SandyPluginDefinition} from 'flipper-plugin';
import {_SandyPluginDefinition} from 'flipper-plugin';
import {createMockPluginDetails} from 'flipper-plugin/src/test-utils/test-utils';
import {selectPlugin, starPlugin} from '../../../reducers/connections';
import {registerMetroDevice} from '../../../dispatcher/metroDevice';
@@ -25,7 +25,7 @@ import {addGatekeepedPlugins, registerPlugins} from '../../../reducers/plugins';
// eslint-disable-next-line
import * as LogsPluginModule from '../../../../../plugins/logs/index';
const logsPlugin = new SandyPluginDefinition(
const logsPlugin = new _SandyPluginDefinition(
createMockPluginDetails({id: 'DeviceLogs'}),
LogsPluginModule,
);
@@ -179,7 +179,7 @@ describe('basic findBestDevice with metro present', () => {
},
};
const unsupportedDevicePlugin = new SandyPluginDefinition(
const unsupportedDevicePlugin = new _SandyPluginDefinition(
createMockPluginDetails({
id: 'unsupportedDevicePlugin',
title: 'Unsupported Device Plugin',
@@ -197,7 +197,7 @@ describe('basic findBestDevice with metro present', () => {
},
);
const unsupportedPlugin = new SandyPluginDefinition(
const unsupportedPlugin = new _SandyPluginDefinition(
createMockPluginDetails({
id: 'unsupportedPlugin',
title: 'Unsupported Plugin',
@@ -211,7 +211,7 @@ describe('basic findBestDevice with metro present', () => {
gatekeeper: 'not for you',
});
const plugin1 = new SandyPluginDefinition(
const plugin1 = new _SandyPluginDefinition(
createMockPluginDetails({
id: 'plugin1',
title: 'Plugin 1',
@@ -224,7 +224,7 @@ describe('basic findBestDevice with metro present', () => {
},
);
const plugin2 = new SandyPluginDefinition(
const plugin2 = new _SandyPluginDefinition(
createMockPluginDetails({
id: 'plugin2',
title: 'Plugin 2',

View File

@@ -24,7 +24,7 @@ import {
PluginDefinition,
} from './plugin';
import {deconstructPluginKey} from './utils/clientUtils';
import {SandyPluginDefinition} from 'flipper-plugin';
import {_SandyPluginDefinition} from 'flipper-plugin';
import BaseDevice from './devices/BaseDevice';
import {State as PluginStates} from './reducers/pluginStates';
@@ -171,7 +171,7 @@ function updateDevicePlugin(state: StoreState, plugin: DevicePluginDefinition) {
}
function supportsDevice(plugin: DevicePluginDefinition, device: BaseDevice) {
if (plugin instanceof SandyPluginDefinition) {
if (plugin instanceof _SandyPluginDefinition) {
return (
plugin.isDevicePlugin &&
plugin.asDevicePluginModule().supportsDevice(device as any)

View File

@@ -24,7 +24,7 @@ import {State as PluginsState} from '../../reducers/plugins';
import {renderMockFlipperWithPlugin} from '../../test-utils/createMockFlipperWithPlugin';
import {
TestUtils,
SandyPluginDefinition,
_SandyPluginDefinition,
createState,
PluginClient,
} from 'flipper-plugin';
@@ -1052,7 +1052,7 @@ test('test determinePluginsToProcess to ignore archived clients', async () => {
]);
});
const sandyTestPlugin = new SandyPluginDefinition(
const sandyTestPlugin = new _SandyPluginDefinition(
TestUtils.createMockPluginDetails(),
{
plugin(

View File

@@ -21,10 +21,10 @@ import {getPluginKey} from '../pluginUtils';
import {TestIdler} from '../Idler';
import {registerPlugins} from '../../reducers/plugins';
import {
SandyPluginDefinition,
_SandyPluginDefinition,
TestUtils,
PluginClient,
SandyPluginInstance,
_SandyPluginInstance,
} from 'flipper-plugin';
type Events = {
@@ -47,7 +47,7 @@ function plugin(client: PluginClient<Events, {}>) {
};
}
const TestPlugin = new SandyPluginDefinition(
const TestPlugin = new _SandyPluginDefinition(
TestUtils.createMockPluginDetails(),
{
plugin,
@@ -211,7 +211,7 @@ test('queue - events are NOT processed immediately if plugin is NOT selected (bu
});
test('queue - events ARE processed immediately if plugin is NOT selected / enabled BUT NAVIGATION', async () => {
const NavigationPlugin = new SandyPluginDefinition(
const NavigationPlugin = new _SandyPluginDefinition(
TestUtils.createMockPluginDetails({
id: 'Navigation',
}),
@@ -599,7 +599,7 @@ test('client - incoming messages are buffered and flushed together', async () =>
}
`);
expect(client.messageBuffer[pluginKey].plugin).toBeInstanceOf(
SandyPluginInstance,
_SandyPluginInstance,
);
await sleep(500);

View File

@@ -24,7 +24,7 @@ import {Idler, BaseIdler} from './Idler';
import {pluginIsStarred, getSelectedPluginKey} from '../reducers/connections';
import {deconstructPluginKey} from './clientUtils';
import {defaultEnabledBackgroundPlugins} from './pluginUtils';
import {SandyPluginInstance} from 'flipper-plugin';
import {_SandyPluginInstance} from 'flipper-plugin';
import {addBackgroundStat} from './pluginStats';
function processMessageClassic(
@@ -54,7 +54,7 @@ function processMessageClassic(
function processMessagesSandy(
pluginKey: string,
plugin: SandyPluginInstance,
plugin: _SandyPluginInstance,
messages: Message[],
) {
const reducerStartTime = Date.now();
@@ -83,10 +83,10 @@ export function processMessagesImmediately(
id: string;
persistedStateReducer: PersistedStateReducer | null;
}
| SandyPluginInstance,
| _SandyPluginInstance,
messages: Message[],
) {
if (plugin instanceof SandyPluginInstance) {
if (plugin instanceof _SandyPluginInstance) {
processMessagesSandy(pluginKey, plugin, messages);
} else {
const persistedState = getCurrentPluginState(store, plugin, pluginKey);
@@ -116,11 +116,11 @@ export function processMessagesLater(
persistedStateReducer: PersistedStateReducer | null;
maxQueueSize?: number;
}
| SandyPluginInstance,
| _SandyPluginInstance,
messages: Message[],
) {
const pluginId =
plugin instanceof SandyPluginInstance ? plugin.definition.id : plugin.id;
plugin instanceof _SandyPluginInstance ? plugin.definition.id : plugin.id;
const isSelected =
pluginKey === getSelectedPluginKey(store.getState().connections);
switch (true) {
@@ -130,7 +130,7 @@ export function processMessagesLater(
processMessagesImmediately(store, pluginKey, plugin, messages);
break;
case isSelected:
case plugin instanceof SandyPluginInstance:
case plugin instanceof _SandyPluginInstance:
case plugin instanceof FlipperDevicePlugin:
case (plugin as any).prototype instanceof FlipperDevicePlugin:
case pluginIsStarred(
@@ -142,7 +142,7 @@ export function processMessagesLater(
queueMessages(
pluginKey,
messages,
plugin instanceof SandyPluginInstance
plugin instanceof _SandyPluginInstance
? DEFAULT_MAX_QUEUE_SIZE
: plugin.maxQueueSize,
),
@@ -164,13 +164,13 @@ export async function processMessageQueue(
id: string;
persistedStateReducer: PersistedStateReducer | null;
}
| SandyPluginInstance,
| _SandyPluginInstance,
pluginKey: string,
store: MiddlewareAPI,
progressCallback?: (progress: {current: number; total: number}) => void,
idler: BaseIdler = new Idler(),
): Promise<boolean> {
if (!SandyPluginInstance.is(plugin) && !plugin.persistedStateReducer) {
if (!_SandyPluginInstance.is(plugin) && !plugin.persistedStateReducer) {
return true;
}
const total = getPendingMessages(store, pluginKey).length;
@@ -182,13 +182,13 @@ export async function processMessageQueue(
}
// there are messages to process! lets do so until we have to idle
// persistedState is irrelevant for SandyPlugins, as they store state locally
const persistedState = SandyPluginInstance.is(plugin)
const persistedState = _SandyPluginInstance.is(plugin)
? undefined
: getCurrentPluginState(store, plugin, pluginKey);
let offset = 0;
let newPluginState = persistedState;
do {
if (SandyPluginInstance.is(plugin)) {
if (_SandyPluginInstance.is(plugin)) {
// Optimization: we could send a batch of messages here
processMessagesSandy(pluginKey, plugin, [messages[offset]]);
} else {
@@ -212,7 +212,7 @@ export async function processMessageQueue(
// resistent to kicking off this process twice; grabbing, processing messages, saving state is done synchronosly
// until the idler has to break
store.dispatch(clearMessageQueue(pluginKey, offset));
if (!SandyPluginInstance.is(plugin) && newPluginState !== persistedState) {
if (!_SandyPluginInstance.is(plugin) && newPluginState !== persistedState) {
store.dispatch(
setPluginState({
pluginKey,

View File

@@ -18,7 +18,7 @@ import {State as PluginStatesState} from '../reducers/pluginStates';
import {State as PluginsState} from '../reducers/plugins';
import {State as PluginMessageQueueState} from '../reducers/pluginMessageQueue';
import {deconstructPluginKey, deconstructClientId} from './clientUtils';
import {SandyPluginDefinition} from 'flipper-plugin';
import {_SandyPluginDefinition} from 'flipper-plugin';
type Client = import('../Client').default;
@@ -239,6 +239,6 @@ export function isDevicePluginDefinition(
): definition is DevicePluginDefinition {
return (
(definition as any).prototype instanceof FlipperDevicePlugin ||
(definition instanceof SandyPluginDefinition && definition.isDevicePlugin)
(definition instanceof _SandyPluginDefinition && definition.isDevicePlugin)
);
}

View File

@@ -0,0 +1,53 @@
/**
* 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 * as FlipperPluginModule from '../index';
test('Correct top level API exposed', () => {
const exposedAPIs: string[] = [];
const exposedTypes: string[] = [];
Object.entries(FlipperPluginModule).forEach(([key, value]) => {
if (key[0] === '_') {
return;
}
if (value === undefined) {
exposedTypes.push(key);
} else {
exposedAPIs.push(key);
}
});
expect(exposedAPIs.sort()).toMatchInlineSnapshot(`
Array [
"Layout",
"NUX",
"TestUtils",
"createState",
"renderReactRoot",
"theme",
"usePlugin",
"useValue",
]
`);
expect(exposedTypes.sort()).toMatchInlineSnapshot(`
Array [
"Atom",
"DefaultKeyboardAction",
"Device",
"DeviceLogEntry",
"DeviceLogListener",
"DevicePluginClient",
"DeviceType",
"FlipperLib",
"LogLevel",
"MenuEntry",
"NormalizedMenuEntry",
"PluginClient",
]
`);
});

View File

@@ -10,31 +10,41 @@
import './plugin/PluginBase';
import * as TestUtilites from './test-utils/test-utils';
export {SandyPluginInstance, PluginClient} from './plugin/Plugin';
export {
SandyPluginInstance as _SandyPluginInstance,
PluginClient,
} from './plugin/Plugin';
export {
Device,
DeviceLogEntry,
DeviceLogListener,
DevicePluginClient,
LogLevel,
SandyDevicePluginInstance,
SandyDevicePluginInstance as _SandyDevicePluginInstance,
DeviceType,
} from './plugin/DevicePlugin';
export {SandyPluginDefinition} from './plugin/SandyPluginDefinition';
export {SandyPluginRenderer} from './plugin/PluginRenderer';
export {SandyPluginContext, usePlugin} from './plugin/PluginContext';
export {SandyPluginDefinition as _SandyPluginDefinition} from './plugin/SandyPluginDefinition';
export {SandyPluginRenderer as _SandyPluginRenderer} from './plugin/PluginRenderer';
export {
SandyPluginContext as _SandyPluginContext,
usePlugin,
} from './plugin/PluginContext';
export {createState, useValue, Atom} from './state/atom';
export {FlipperLib} from './plugin/FlipperLib';
export {
MenuEntry,
NormalizedMenuEntry,
buildInMenuEntries,
buildInMenuEntries as _buildInMenuEntries,
DefaultKeyboardAction,
} from './plugin/MenuEntry';
export {theme} from './ui/theme';
export {Layout} from './ui/Layout';
export {NUX, NuxManagerContext, createNuxManager} from './ui/NUX';
export {
NUX,
NuxManagerContext as _NuxManagerContext,
createNuxManager as _createNuxManager,
} from './ui/NUX';
export {renderReactRoot} from './utils/renderReactRoot';

View File

@@ -10,7 +10,6 @@
import React, {createContext, useCallback, useContext} from 'react';
import {Badge, Tooltip, Typography, Button} from 'antd';
import styled from '@emotion/styled';
import {SandyPluginInstance, theme} from 'flipper-plugin';
import {keyframes} from 'emotion';
import reactElementToJSXString from 'react-element-to-jsx-string';
import {SandyPluginContext} from '../plugin/PluginContext';
@@ -20,6 +19,8 @@ import {Layout} from './Layout';
import {BulbTwoTone} from '@ant-design/icons';
import {createHash} from 'crypto';
import type {TooltipPlacement} from 'antd/lib/tooltip';
import {SandyPluginInstance} from '../plugin/Plugin';
import {theme} from './theme';
const {Text} = Typography;