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
This commit is contained in:
Andrey Goncharov
2022-05-10 05:13:24 -07:00
committed by Facebook GitHub Bot
parent c1dc1788a5
commit 1f2f799772
6 changed files with 112 additions and 0 deletions

View File

@@ -0,0 +1,11 @@
/**
* 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
*/
export const styled = () => () => ({});
(styled as any).img = () => {};

View File

@@ -0,0 +1,11 @@
/**
* 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
*/
export * from './fakeEmotionStyled';
export const Layout = {};

View File

@@ -0,0 +1,16 @@
/**
* 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
*/
export class PureComponent {}
export class Component {}
export default {
PureComponent,
Component,
};

View File

@@ -0,0 +1,12 @@
/**
* 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
*/
export const unstable_batchedUpdates = (cb: () => void) => {
return cb();
};

View File

@@ -0,0 +1,11 @@
/**
* 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
*/
export {FlipperServerCompanion} from './companion';
export {initCompanionEnv, FlipperServerCompanionEnv} from './init';

View File

@@ -0,0 +1,51 @@
/**
* 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};
};