diff --git a/desktop/flipper-server-companion/src/globalsReplacements/fakeEmotionStyled.tsx b/desktop/flipper-server-companion/src/globalsReplacements/fakeEmotionStyled.tsx new file mode 100644 index 000000000..01c22a6af --- /dev/null +++ b/desktop/flipper-server-companion/src/globalsReplacements/fakeEmotionStyled.tsx @@ -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 = () => {}; diff --git a/desktop/flipper-server-companion/src/globalsReplacements/fakeLegacyExports.tsx b/desktop/flipper-server-companion/src/globalsReplacements/fakeLegacyExports.tsx new file mode 100644 index 000000000..40703cd35 --- /dev/null +++ b/desktop/flipper-server-companion/src/globalsReplacements/fakeLegacyExports.tsx @@ -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 = {}; diff --git a/desktop/flipper-server-companion/src/globalsReplacements/fakeReact.tsx b/desktop/flipper-server-companion/src/globalsReplacements/fakeReact.tsx new file mode 100644 index 000000000..1dcb388cd --- /dev/null +++ b/desktop/flipper-server-companion/src/globalsReplacements/fakeReact.tsx @@ -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, +}; diff --git a/desktop/flipper-server-companion/src/globalsReplacements/fakeReactDOM.tsx b/desktop/flipper-server-companion/src/globalsReplacements/fakeReactDOM.tsx new file mode 100644 index 000000000..cf6fbc190 --- /dev/null +++ b/desktop/flipper-server-companion/src/globalsReplacements/fakeReactDOM.tsx @@ -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(); +}; diff --git a/desktop/flipper-server-companion/src/index.tsx b/desktop/flipper-server-companion/src/index.tsx new file mode 100644 index 000000000..210a9bf25 --- /dev/null +++ b/desktop/flipper-server-companion/src/index.tsx @@ -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'; diff --git a/desktop/flipper-server-companion/src/init.tsx b/desktop/flipper-server-companion/src/init.tsx new file mode 100644 index 000000000..48a2e19cf --- /dev/null +++ b/desktop/flipper-server-companion/src/init.tsx @@ -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 => { + // 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}; +};