Summary: This diff adds `types` fields on the compiler config for every project. This way we can make sure that for example node types and packages are not available in flipper-ui-core. Without an explicit types field, all types would be shared between all packages, and implicitly included into the compilation of everything. For the same reason `types/index.d.ts` has been removed, we want to be intentional on which types are being used in which package. This diff does most of the work, the next diff will fine tune the globals, and do some further cleanup. As an alternative solution I first tried a `nohoist: **/node_modules/types/**` and make sure every package list explicitly the types used in package json, which works but is much more error prone, as for example two different react types versions in two packages will cause the most unreadable compiler error due to the types not being shared and not literally the same. Reviewed By: lawrencelomax Differential Revision: D33124441 fbshipit-source-id: c2b9d768f845ac28005d8331ef5fa1066c7e4cd7
194 lines
5.0 KiB
TypeScript
194 lines
5.0 KiB
TypeScript
/**
|
|
* 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
|
|
*/
|
|
|
|
// jest-setup-after will run after Jest has been initialized, so that it can be adapted.
|
|
|
|
// eslint-disable-next-line node/no-extraneous-import
|
|
import {cleanup} from '@testing-library/react';
|
|
import {resolve} from 'path';
|
|
import os from 'os';
|
|
|
|
(window as any).FlipperRenderHostInstance = createStubRenderHost();
|
|
|
|
import {TestUtils} from 'flipper-plugin';
|
|
import {
|
|
FlipperServerConfig,
|
|
ReleaseChannel,
|
|
Tristate,
|
|
parseEnvironmentVariables,
|
|
} from 'flipper-common';
|
|
|
|
// Only import the type!
|
|
// eslint-disable-next-line node/no-extraneous-import
|
|
import type {RenderHost} from 'flipper-ui-core';
|
|
|
|
const test = global.test;
|
|
if (!test) {
|
|
throw new Error('Failed jest test object');
|
|
}
|
|
/**
|
|
* This test will not be executed on Github / SandCastle,
|
|
* since, for example, it relies on precise timer reliability
|
|
*/
|
|
(test as any).local = function local() {
|
|
const fn = process.env.SANDCASTLE || process.env.CI ? test.skip : test;
|
|
// eslint-disable-next-line
|
|
return fn.apply(null, arguments as any);
|
|
};
|
|
|
|
/**
|
|
* This test will only run on non-windows machines
|
|
*/
|
|
(test as any).unix = function local() {
|
|
const fn = process.platform === 'win32' ? test.skip : test;
|
|
// eslint-disable-next-line
|
|
return fn.apply(null, arguments as any);
|
|
};
|
|
|
|
beforeEach(() => {
|
|
// Fresh mock flipperServer for every test
|
|
(window as any).FlipperRenderHostInstance = createStubRenderHost();
|
|
});
|
|
|
|
afterEach(cleanup);
|
|
|
|
console.debug = function () {
|
|
// Intentional noop, we don't want debug statements in Jest runs
|
|
};
|
|
|
|
// make perf tools available in Node (it is available in Browser / Electron just fine)
|
|
const {PerformanceObserver, performance} = require('perf_hooks');
|
|
Object.freeze(performance);
|
|
Object.freeze(Object.getPrototypeOf(performance));
|
|
// Something in our unit tests is messing with the performance global
|
|
// This fixes that.....
|
|
Object.defineProperty(global, 'performance', {
|
|
get() {
|
|
return performance;
|
|
},
|
|
set() {
|
|
throw new Error('Attempt to overwrite global.performance');
|
|
},
|
|
});
|
|
|
|
global.PerformanceObserver = PerformanceObserver;
|
|
|
|
// https://jestjs.io/docs/manual-mocks#mocking-methods-which-are-not-implemented-in-jsdom
|
|
Object.defineProperty(window, 'matchMedia', {
|
|
writable: true,
|
|
value: jest.fn().mockImplementation((query) => ({
|
|
matches: false,
|
|
media: query,
|
|
onchange: null,
|
|
addListener: jest.fn(), // deprecated
|
|
removeListener: jest.fn(), // deprecated
|
|
addEventListener: jest.fn(),
|
|
removeEventListener: jest.fn(),
|
|
dispatchEvent: jest.fn(),
|
|
})),
|
|
});
|
|
|
|
function createStubRenderHost(): RenderHost {
|
|
const rootPath = resolve(__dirname, '..');
|
|
const stubConfig: FlipperServerConfig = {
|
|
environmentInfo: {
|
|
processId: process.pid,
|
|
appVersion: '0.0.0',
|
|
isProduction: false,
|
|
releaseChannel: ReleaseChannel.DEFAULT,
|
|
flipperReleaseRevision: '000',
|
|
os: {
|
|
arch: process.arch,
|
|
platform: process.platform,
|
|
unixname: os.userInfo().username,
|
|
},
|
|
versions: {
|
|
node: process.versions.node,
|
|
platform: os.release(),
|
|
},
|
|
},
|
|
env: parseEnvironmentVariables(process.env),
|
|
gatekeepers: {
|
|
TEST_PASSING_GK: true,
|
|
TEST_FAILING_GK: false,
|
|
},
|
|
launcherSettings: {
|
|
ignoreLocalPin: false,
|
|
releaseChannel: ReleaseChannel.DEFAULT,
|
|
},
|
|
paths: {
|
|
appPath: rootPath,
|
|
desktopPath: `/dev/null`,
|
|
execPath: process.execPath,
|
|
homePath: `/dev/null`,
|
|
staticPath: resolve(rootPath, 'static'),
|
|
tempPath: os.tmpdir(),
|
|
},
|
|
processConfig: {
|
|
disabledPlugins: [],
|
|
lastWindowPosition: null,
|
|
launcherEnabled: false,
|
|
launcherMsg: null,
|
|
screenCapturePath: `/dev/null`,
|
|
},
|
|
settings: {
|
|
androidHome: `/dev/null`,
|
|
darkMode: 'light',
|
|
enableAndroid: false,
|
|
enableIOS: false,
|
|
enablePhysicalIOS: false,
|
|
enablePrefetching: Tristate.False,
|
|
idbPath: `/dev/null`,
|
|
reactNative: {
|
|
shortcuts: {enabled: false, openDevMenu: '', reload: ''},
|
|
},
|
|
showWelcomeAtStartup: false,
|
|
suppressPluginErrors: false,
|
|
},
|
|
validWebSocketOrigins: [],
|
|
};
|
|
|
|
return {
|
|
readTextFromClipboard() {
|
|
return '';
|
|
},
|
|
writeTextToClipboard() {},
|
|
async importFile() {
|
|
return undefined;
|
|
},
|
|
async exportFile() {
|
|
return undefined;
|
|
},
|
|
hasFocus() {
|
|
return true;
|
|
},
|
|
onIpcEvent() {},
|
|
sendIpcEvent() {},
|
|
shouldUseDarkColors() {
|
|
return false;
|
|
},
|
|
restartFlipper() {},
|
|
openLink() {},
|
|
serverConfig: stubConfig,
|
|
loadDefaultPlugins() {
|
|
return {};
|
|
},
|
|
GK(gk: string) {
|
|
return stubConfig.gatekeepers[gk] ?? false;
|
|
},
|
|
flipperServer: TestUtils.createFlipperServerMock(),
|
|
async requirePlugin(path: string) {
|
|
return require(path);
|
|
},
|
|
getStaticResourceUrl(relativePath): string {
|
|
return 'file://' + resolve(rootPath, 'static', relativePath);
|
|
},
|
|
};
|
|
}
|