Files
flipper/desktop/flipper-server-companion/src/init.tsx
Andrey Goncharov 1f2f799772 Setup globals and initialize flipper-server-companion
Summary:
We want Flipper plugins to share imports with Flipper:
- They must share the same React otherwise different Reacts could conflict with each other
- Other common modules are shared to decrease the bundle size for each plugin.

`setGlobalObject` provides shared modules to Flipper Plugins by adding them to the global context (window or process or global this).

In the headless context, we do not have React and other DOM-related libraries, so we provide stubs instead.

Reviewed By: passy

Differential Revision: D36130161

fbshipit-source-id: d30c59a6c3ae02e7f9244bc0bb5790079b771107
2022-05-10 05:13:24 -07:00

52 lines
1.8 KiB
TypeScript

/**
* Copyright (c) Meta Platforms, Inc. and 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 {FlipperServer, getLogger} from 'flipper-common';
import {getRenderHostInstance, setGlobalObject} from 'flipper-frontend-core';
import * as FlipperPluginSDK from 'flipper-plugin';
import * as Immer from 'immer';
import {HeadlessPluginInitializer} from './HeadlessPluginInitializer';
import {initializeFlipperLibImplementation} from './initializeFlipperLibImplementation';
import {initializeRenderHost} from './initializeRenderHost';
import * as React from './globalsReplacements/fakeReact';
import * as ReactDOM from './globalsReplacements/fakeReactDOM';
import {styled} from './globalsReplacements/fakeEmotionStyled';
import * as legacyExports from './globalsReplacements/fakeLegacyExports';
export interface FlipperServerCompanionEnv {
pluginInitializer: HeadlessPluginInitializer;
}
export const initCompanionEnv = async (
flipperServer: FlipperServer,
): Promise<FlipperServerCompanionEnv> => {
// Anything DOM-related (like React or ant) does not exist and should not be used in a headless context because there is no DOM to use
setGlobalObject({
React: React,
ReactDOM: ReactDOM,
ReactDOMClient: {},
ReactIs: {},
Flipper: legacyExports,
FlipperPlugin: FlipperPluginSDK,
Immer,
antd: {},
emotion_styled: {default: styled},
antdesign_icons: {},
});
const flipperServerConfig = await flipperServer.exec('get-config');
initializeRenderHost(flipperServer, flipperServerConfig);
initializeFlipperLibImplementation(getRenderHostInstance(), getLogger());
const pluginInitializer = new HeadlessPluginInitializer();
await pluginInitializer.init();
return {pluginInitializer};
};