Killed Flipper headless
Reviewed By: nikoant Differential Revision: D24160480 fbshipit-source-id: 221e60473dddc0a49cea674e210beb6f85b1b03c
This commit is contained in:
committed by
Facebook GitHub Bot
parent
41a1af33cb
commit
08b5644253
@@ -14,14 +14,11 @@ import Text from '../ui/components/FlexRow';
|
||||
import Glyph from '../ui/components/Glyph';
|
||||
import {colors, brandColors} from '../ui/components/colors';
|
||||
import isProduction from '../utils/isProduction';
|
||||
import isHeadless from '../utils/isHeadless';
|
||||
import constants from '../fb-stubs/constants';
|
||||
const {shell, remote} = !isHeadless()
|
||||
? require('electron')
|
||||
: {shell: undefined, remote: undefined};
|
||||
import {shell, remote} from 'electron';
|
||||
import {PureComponent} from 'react';
|
||||
import React from 'react';
|
||||
import {Tracked, TrackingScope} from 'flipper-plugin';
|
||||
import {Logger, Tracked, TrackingScope} from 'flipper-plugin';
|
||||
|
||||
const Container = styled(FlexColumn)({
|
||||
height: '100%',
|
||||
@@ -95,7 +92,9 @@ const Logo = styled.img({
|
||||
marginBottom: 20,
|
||||
});
|
||||
|
||||
type Props = {};
|
||||
type Props = {
|
||||
logger: Logger;
|
||||
};
|
||||
type State = {
|
||||
isMounted: boolean;
|
||||
};
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
|
||||
export class WelcomeScreenHeadless {
|
||||
// NoOp
|
||||
}
|
||||
@@ -56,6 +56,7 @@ import {
|
||||
NoDevices,
|
||||
getColorByApp,
|
||||
getFavoritePlugins,
|
||||
isStaticViewActive,
|
||||
} from './sidebarUtils';
|
||||
import {useLocalStorage} from '../../utils/useLocalStorage';
|
||||
import {PluginDefinition, ClientPluginMap, DevicePluginMap} from '../../plugin';
|
||||
@@ -391,13 +392,6 @@ class MainSidebar2 extends PureComponent<Props, State> {
|
||||
}
|
||||
}
|
||||
|
||||
function isStaticViewActive(
|
||||
current: StaticView,
|
||||
selected: StaticView,
|
||||
): boolean {
|
||||
return current && selected && current === selected;
|
||||
}
|
||||
|
||||
function groupPluginsByCategory(
|
||||
plugins: FlipperPlugins,
|
||||
): PluginsByCategoryType {
|
||||
|
||||
@@ -116,7 +116,7 @@ export function isStaticViewActive(
|
||||
current: StaticView,
|
||||
selected: StaticView,
|
||||
): boolean {
|
||||
return current && selected && current === selected;
|
||||
return Boolean(current && selected && current === selected);
|
||||
}
|
||||
|
||||
export const CategoryName = styled(PluginName)({
|
||||
|
||||
@@ -11,7 +11,6 @@ import {Store} from '../reducers/index';
|
||||
import {Logger} from '../fb-interfaces/Logger';
|
||||
import {PluginNotification} from '../reducers/notifications';
|
||||
import {PluginDefinition, isSandyPlugin} from '../plugin';
|
||||
import isHeadless from '../utils/isHeadless';
|
||||
import {setStaticView} from '../reducers/connections';
|
||||
import {ipcRenderer, IpcRendererEvent} from 'electron';
|
||||
import {
|
||||
@@ -158,7 +157,6 @@ export default (store: Store, logger: Logger) => {
|
||||
}))
|
||||
.forEach((n: PluginNotification) => {
|
||||
if (
|
||||
!isHeadless() &&
|
||||
store.getState().connections.selectedPlugin !== 'notifications' &&
|
||||
!knownNotifications.has(n.notification.id) &&
|
||||
blocklistedPlugins.indexOf(n.pluginId) === -1 &&
|
||||
|
||||
@@ -10,6 +10,5 @@
|
||||
export {LogTypes, TrackType, Logger} from 'flipper-plugin';
|
||||
|
||||
export type Args = {
|
||||
isHeadless?: boolean;
|
||||
isTest?: boolean;
|
||||
};
|
||||
|
||||
@@ -8,9 +8,10 @@
|
||||
*/
|
||||
|
||||
import React, {Component} from 'react';
|
||||
import {StaticViewProps} from '../reducers/connections';
|
||||
import {Text} from '../ui';
|
||||
|
||||
export default class extends Component<void, void> {
|
||||
export default class extends Component<StaticViewProps, {}> {
|
||||
render() {
|
||||
return <Text>Build your support request deteails form.</Text>;
|
||||
}
|
||||
|
||||
@@ -8,9 +8,10 @@
|
||||
*/
|
||||
|
||||
import React, {Component} from 'react';
|
||||
import {StaticViewProps} from '../reducers/connections';
|
||||
import {Text} from '../ui';
|
||||
|
||||
export default class extends Component<void, void> {
|
||||
export default class extends Component<StaticViewProps, {}> {
|
||||
render() {
|
||||
return <Text>Build your support request creation form.</Text>;
|
||||
}
|
||||
|
||||
@@ -8,9 +8,10 @@
|
||||
*/
|
||||
|
||||
import React, {Component} from 'react';
|
||||
import {StaticViewProps} from '../reducers/connections';
|
||||
import {Text} from '../ui';
|
||||
|
||||
export default class extends Component<void, void> {
|
||||
export default class extends Component<StaticViewProps, {}> {
|
||||
render() {
|
||||
return <Text>Debug Videos on Watch Bugs.</Text>;
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
* @format
|
||||
*/
|
||||
|
||||
import {ComponentType} from 'react';
|
||||
import {produce} from 'immer';
|
||||
|
||||
import type BaseDevice from '../devices/BaseDevice';
|
||||
@@ -15,28 +16,18 @@ import type Client from '../Client';
|
||||
import {UninitializedClient} from '../UninitializedClient';
|
||||
import {isEqual} from 'lodash';
|
||||
import {performance} from 'perf_hooks';
|
||||
import isHeadless from '../utils/isHeadless';
|
||||
import {Actions} from '.';
|
||||
const WelcomeScreen = isHeadless()
|
||||
? require('../chrome/WelcomeScreenHeadless').default
|
||||
: require('../chrome/WelcomeScreen').default;
|
||||
import NotificationScreen from '../chrome/NotificationScreen';
|
||||
import SupportRequestFormV2 from '../fb-stubs/SupportRequestFormV2';
|
||||
import SupportRequestDetails from '../fb-stubs/SupportRequestDetails';
|
||||
import WelcomeScreen from '../chrome/WelcomeScreen';
|
||||
import {getPluginKey, isDevicePluginDefinition} from '../utils/pluginUtils';
|
||||
import {deconstructClientId} from '../utils/clientUtils';
|
||||
import {PluginDefinition} from '../plugin';
|
||||
import {RegisterPluginAction} from './plugins';
|
||||
import {ConsoleLogs} from '../chrome/ConsoleLogs';
|
||||
import MetroDevice from '../devices/MetroDevice';
|
||||
import {Logger} from 'flipper-plugin';
|
||||
|
||||
export type StaticView =
|
||||
| null
|
||||
| typeof WelcomeScreen
|
||||
| typeof NotificationScreen
|
||||
| typeof SupportRequestFormV2
|
||||
| typeof SupportRequestDetails
|
||||
| typeof ConsoleLogs;
|
||||
export type StaticViewProps = {logger: Logger};
|
||||
|
||||
export type StaticView = null | ComponentType<StaticViewProps>;
|
||||
|
||||
export type State = {
|
||||
devices: Array<BaseDevice>;
|
||||
|
||||
@@ -309,8 +309,7 @@ function ShowSettingsButton() {
|
||||
function SupportFormButton() {
|
||||
const dispatch = useDispatch();
|
||||
const staticView = useStore((state) => state.connections.staticView);
|
||||
// const isVisible =
|
||||
return (
|
||||
return config.isFBBuild ? (
|
||||
<LeftRailButton
|
||||
icon={<BugOutlined />}
|
||||
small
|
||||
@@ -324,7 +323,7 @@ function SupportFormButton() {
|
||||
dispatch(setStaticView(SupportRequestFormV2));
|
||||
}}
|
||||
/>
|
||||
);
|
||||
) : null;
|
||||
}
|
||||
|
||||
function WelcomeScreenButton() {
|
||||
|
||||
@@ -127,7 +127,7 @@ export function SandyApp() {
|
||||
{staticView ? (
|
||||
<TrackingScope
|
||||
scope={
|
||||
staticView.displayName ??
|
||||
(staticView as any).displayName ??
|
||||
staticView.name ??
|
||||
staticView.constructor?.name ??
|
||||
'unknown static view'
|
||||
|
||||
@@ -22,10 +22,7 @@ const {Text, Title} = Typography;
|
||||
|
||||
import constants from '../fb-stubs/constants';
|
||||
import isProduction from '../utils/isProduction';
|
||||
import isHeadless from '../utils/isHeadless';
|
||||
const {shell, remote} = !isHeadless()
|
||||
? require('electron')
|
||||
: {shell: undefined, remote: undefined};
|
||||
import {shell, remote} from 'electron';
|
||||
|
||||
const RowContainer = styled(FlexRow)({
|
||||
alignItems: 'flex-start',
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
|
||||
export default function isHeadless(): boolean {
|
||||
return typeof global.window === 'undefined';
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
/**
|
||||
* 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 {transform} from '@babel/core';
|
||||
const electronStubs = require('../electron-stubs');
|
||||
|
||||
const babelOptions = {
|
||||
ast: true,
|
||||
plugins: [electronStubs],
|
||||
filename: 'index.js',
|
||||
};
|
||||
|
||||
test('transform electron requires to inlined stubs', () => {
|
||||
const src = 'require("electron")';
|
||||
const transformed = transform(src, babelOptions)!.ast;
|
||||
const body = transformed!.program.body[0];
|
||||
expect(body.type).toBe('ExpressionStatement');
|
||||
if (body.type !== 'ExpressionStatement') {
|
||||
return;
|
||||
}
|
||||
expect(body.expression.type).toBe('ObjectExpression');
|
||||
if (body.expression.type !== 'ObjectExpression') {
|
||||
return;
|
||||
}
|
||||
expect(body.expression.properties.map((p) => (p as any).key.name)).toContain(
|
||||
'remote',
|
||||
);
|
||||
});
|
||||
@@ -1,65 +0,0 @@
|
||||
/**
|
||||
* 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 {parseExpression} from '@babel/parser';
|
||||
import {CallExpression} from '@babel/types';
|
||||
import {NodePath} from '@babel/traverse';
|
||||
|
||||
const electronStubs = parseExpression(
|
||||
`{
|
||||
remote: {
|
||||
process: {
|
||||
env: {},
|
||||
},
|
||||
getCurrentWindow: function() {
|
||||
return {
|
||||
isFocused: function() {return true;},
|
||||
on: function() {return true;}
|
||||
};
|
||||
},
|
||||
app: {
|
||||
getVersion: function() {return global.__VERSION__ || '1';},
|
||||
getName: function() {return '';},
|
||||
getAppPath: function() {return process.cwd();}
|
||||
},
|
||||
shell: {
|
||||
openExternal: function() {}
|
||||
},
|
||||
Menu: {
|
||||
buildFromTemplate: function() {
|
||||
return {items: []}
|
||||
},
|
||||
setApplicationMenu: function() {}
|
||||
}
|
||||
},
|
||||
ipcRenderer: {
|
||||
on: function() {return true;}
|
||||
},
|
||||
}
|
||||
`,
|
||||
);
|
||||
|
||||
module.exports = () => ({
|
||||
name: 'replace-electron-requires-with-stubs',
|
||||
visitor: {
|
||||
CallExpression(path: NodePath<CallExpression>) {
|
||||
const node = path.node;
|
||||
if (
|
||||
node.type === 'CallExpression' &&
|
||||
node.callee.type === 'Identifier' &&
|
||||
node.callee.name === 'require' &&
|
||||
node.arguments.length > 0 &&
|
||||
node.arguments[0].type === 'StringLiteral' &&
|
||||
node.arguments[0].value === 'electron'
|
||||
) {
|
||||
path.replaceWith(electronStubs);
|
||||
}
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -12,7 +12,6 @@
|
||||
* They are used in get-cache-key.ts for cache key generation.
|
||||
*/
|
||||
type FlipperEnvVars = {
|
||||
FLIPPER_HEADLESS?: string;
|
||||
FLIPPER_FB?: string;
|
||||
FLIPPER_TEST_RUNNER?: string;
|
||||
FLIPPER_ELECTRON_VERSION?: string;
|
||||
@@ -21,7 +20,6 @@ type FlipperEnvVars = {
|
||||
|
||||
const flipperEnv = new Proxy(
|
||||
{
|
||||
FLIPPER_HEADLESS: undefined,
|
||||
FLIPPER_FB: undefined,
|
||||
FLIPPER_TEST_RUNNER: undefined,
|
||||
FLIPPER_ELECTRON_VERSION: undefined,
|
||||
|
||||
@@ -17,9 +17,6 @@ const plugins = [
|
||||
require('./import-react'),
|
||||
require('./app-flipper-requires'),
|
||||
];
|
||||
if (flipperEnv.FLIPPER_HEADLESS) {
|
||||
plugins.unshift(require('./electron-stubs'));
|
||||
}
|
||||
if (flipperEnv.FLIPPER_FB) {
|
||||
plugins.unshift(require('./fb-stubs'));
|
||||
}
|
||||
|
||||
@@ -13,9 +13,6 @@ import {default as flipperEnv} from './flipper-env';
|
||||
|
||||
const presets = [require('@babel/preset-react')];
|
||||
const plugins = [require('./import-react')];
|
||||
if (flipperEnv.FLIPPER_HEADLESS) {
|
||||
plugins.unshift(require('./electron-stubs'));
|
||||
}
|
||||
if (flipperEnv.FLIPPER_FB) {
|
||||
plugins.unshift(require('./fb-stubs'));
|
||||
}
|
||||
|
||||
@@ -15,9 +15,6 @@ const plugins = [
|
||||
require('./electron-requires'),
|
||||
require('./plugin-flipper-requires'),
|
||||
];
|
||||
if (flipperEnv.FLIPPER_HEADLESS) {
|
||||
plugins.unshift(require('./electron-stubs'));
|
||||
}
|
||||
if (flipperEnv.FLIPPER_FB) {
|
||||
plugins.unshift(require('./fb-stubs'));
|
||||
}
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
{
|
||||
"presets": ["@babel/preset-env"]
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -1,239 +0,0 @@
|
||||
/**
|
||||
* 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 {spawn} from 'child_process';
|
||||
import memoize from 'lodash.memoize';
|
||||
import stringify from 'canonical-json';
|
||||
|
||||
const TEST_TIMEOUT_MS = 30 * 1000;
|
||||
|
||||
const layoutPathsToExcludeFromSnapshots = [
|
||||
'id',
|
||||
'children.*',
|
||||
'extraInfo.linkedNode',
|
||||
'data.View.*.value',
|
||||
'data.View.*.*.value',
|
||||
'data.View.*.*.*.value',
|
||||
'data.Drawable.*.value',
|
||||
'data.LithoView.mountbounds',
|
||||
'data.Layout.height',
|
||||
'data.Layout.width',
|
||||
'data.*.typeface',
|
||||
];
|
||||
|
||||
const params = {
|
||||
bin: process.env.FLIPPER_PATH || '/tmp/flipper-macos',
|
||||
securePort: process.env.SECURE_PORT || '8088',
|
||||
insecurePort: process.env.INSECURE_PORT || '8089',
|
||||
device: process.env.DEVICE,
|
||||
};
|
||||
|
||||
if (!params.device) {
|
||||
console.warn(
|
||||
'No device specified. Test may fail if more than one is present.',
|
||||
);
|
||||
}
|
||||
|
||||
const basicArgs = [
|
||||
'-v',
|
||||
...(params.device ? ['--device', params.device] : []),
|
||||
'--secure-port',
|
||||
params.securePort,
|
||||
'--insecure-port',
|
||||
params.insecurePort,
|
||||
];
|
||||
|
||||
const runHeadless = memoize((args) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
const stdoutChunks = [];
|
||||
const stderrChunks = [];
|
||||
console.info(`Running ${params.bin} ${args.join(' ')}`);
|
||||
const process = spawn(params.bin, args, {});
|
||||
process.stdout.setEncoding('utf8');
|
||||
process.stdout.on('data', (chunk) => {
|
||||
stdoutChunks.push(chunk);
|
||||
});
|
||||
process.stderr.on('data', (chunk) => {
|
||||
stderrChunks.push(chunk);
|
||||
});
|
||||
process.stdout.on('end', (chunk) => {
|
||||
const stdout = stdoutChunks.join('');
|
||||
const stderr = stderrChunks.join('');
|
||||
try {
|
||||
console.log(stderr);
|
||||
resolve({output: JSON.parse(stdout), stderr: stderr});
|
||||
} catch (e) {
|
||||
console.warn(stderr);
|
||||
reject(
|
||||
new Error(
|
||||
`Failed to parse headless output as JSON (${e.message}): ${stdout}`,
|
||||
),
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
setTimeout(() => {
|
||||
process.kill('SIGINT');
|
||||
}, 20000);
|
||||
});
|
||||
});
|
||||
|
||||
function getPluginState(app, plugin) {
|
||||
return runHeadless(basicArgs).then((result) => {
|
||||
const pluginStates = result.output.store.pluginStates;
|
||||
for (const pluginId of Object.keys(pluginStates)) {
|
||||
const matches = /([^#]+)#([^#]+)#([^#]+)#([^#]+)#([^#]+)/.exec(pluginId);
|
||||
if (
|
||||
matches &&
|
||||
matches.length === 6 &&
|
||||
matches[1] === app &&
|
||||
matches[5] === plugin
|
||||
) {
|
||||
const id = matches[0];
|
||||
return pluginStates[id];
|
||||
}
|
||||
}
|
||||
throw new Error(`No matching plugin state for ${app}, ${plugin}`);
|
||||
});
|
||||
}
|
||||
|
||||
test(
|
||||
'Flipper app appears in exported clients',
|
||||
() => {
|
||||
return runHeadless(basicArgs).then((result) => {
|
||||
expect(result.output.clients.map((c) => c.query.app)).toContain(
|
||||
'Flipper',
|
||||
);
|
||||
});
|
||||
},
|
||||
TEST_TIMEOUT_MS,
|
||||
);
|
||||
|
||||
test(
|
||||
'Output includes fileVersion',
|
||||
() => {
|
||||
return runHeadless(basicArgs).then((result) => {
|
||||
expect(result.output.fileVersion).toMatch(/\d+\.\d+\.\d+/);
|
||||
});
|
||||
},
|
||||
TEST_TIMEOUT_MS,
|
||||
);
|
||||
|
||||
test(
|
||||
'Output includes device',
|
||||
() => {
|
||||
return runHeadless(basicArgs).then((result) => {
|
||||
expect(result.output.device).toBeTruthy();
|
||||
});
|
||||
},
|
||||
TEST_TIMEOUT_MS,
|
||||
);
|
||||
|
||||
test(
|
||||
'Output includes flipperReleaseRevision',
|
||||
() => {
|
||||
return runHeadless(basicArgs).then((result) => {
|
||||
expect(result.output.flipperReleaseRevision).toBeTruthy();
|
||||
});
|
||||
},
|
||||
TEST_TIMEOUT_MS,
|
||||
);
|
||||
|
||||
test(
|
||||
'Output includes store',
|
||||
() => {
|
||||
return runHeadless(basicArgs).then((result) => {
|
||||
expect(result.output.store).toBeTruthy();
|
||||
});
|
||||
},
|
||||
TEST_TIMEOUT_MS,
|
||||
);
|
||||
|
||||
function stripUnstableLayoutAttributes(node) {
|
||||
let newNode = node;
|
||||
for (const path of layoutPathsToExcludeFromSnapshots) {
|
||||
const parts = path.split('.');
|
||||
newNode = stripNode(newNode, parts);
|
||||
}
|
||||
return newNode;
|
||||
}
|
||||
|
||||
function stripNode(node, path) {
|
||||
if (path.length === 0) {
|
||||
return 'PLACEHOLDER';
|
||||
}
|
||||
if (path[0] === '*') {
|
||||
if (Array.isArray(node)) {
|
||||
return node.map((e) => stripNode(e, path.slice(1)));
|
||||
}
|
||||
return Object.entries(node).reduce((acc, [key, val]) => {
|
||||
acc[key] = stripNode(val, path.slice(1));
|
||||
return acc;
|
||||
}, {});
|
||||
}
|
||||
if (!node[path[0]]) {
|
||||
return node;
|
||||
}
|
||||
return {...node, [path[0]]: stripNode(node[path[0]], path.slice(1))};
|
||||
}
|
||||
|
||||
test('test layout snapshot stripping', () => {
|
||||
const beforeStripping = {
|
||||
my: {
|
||||
test: {
|
||||
id: 4,
|
||||
node: 7,
|
||||
something: 9,
|
||||
list: [1, 2, 3],
|
||||
},
|
||||
},
|
||||
id: 2,
|
||||
children: [1, 2, 3],
|
||||
extraInfo: {
|
||||
linkedNode: 55,
|
||||
somethingElse: 44,
|
||||
},
|
||||
data: {View: {bounds: {something: {value: 4}}}},
|
||||
other: 8,
|
||||
};
|
||||
const afterStripping = stripUnstableLayoutAttributes(beforeStripping);
|
||||
expect(afterStripping).toEqual({
|
||||
my: {
|
||||
test: {
|
||||
id: 4,
|
||||
node: 7,
|
||||
something: 9,
|
||||
list: [1, 2, 3],
|
||||
},
|
||||
},
|
||||
id: 'PLACEHOLDER',
|
||||
children: ['PLACEHOLDER', 'PLACEHOLDER', 'PLACEHOLDER'],
|
||||
extraInfo: {
|
||||
linkedNode: 'PLACEHOLDER',
|
||||
somethingElse: 44,
|
||||
},
|
||||
data: {View: {bounds: {something: {value: 'PLACEHOLDER'}}}},
|
||||
other: 8,
|
||||
});
|
||||
});
|
||||
|
||||
test('Sample app layout hierarchy matches snapshot', () => {
|
||||
return getPluginState('Flipper', 'Inspector').then((result) => {
|
||||
const state = JSON.parse(result);
|
||||
expect(state.rootAXElement).toBe('com.facebook.flipper.sample');
|
||||
expect(state.rootElement).toBe('com.facebook.flipper.sample');
|
||||
const canonicalizedElements = Object.values(state.elements)
|
||||
.map((e) => {
|
||||
const stableizedElements = stripUnstableLayoutAttributes(e);
|
||||
return stringify(stableizedElements);
|
||||
})
|
||||
.sort();
|
||||
expect(canonicalizedElements).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
@@ -1,26 +0,0 @@
|
||||
{
|
||||
"name": "flipper-headless-tests",
|
||||
"version": "0.0.0",
|
||||
"main": "index.js",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"test": "jest",
|
||||
"test:debug": "node --inspect node_modules/.bin/jest --runInBand"
|
||||
},
|
||||
"jest": {
|
||||
"transform": {
|
||||
"^.+\\.jsx?$": "babel-jest"
|
||||
}
|
||||
},
|
||||
"devDependencies": {
|
||||
"jest": "^26"
|
||||
},
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.12.10",
|
||||
"@babel/preset-env": "^7.12.10",
|
||||
"babel-jest": "^26.2.2",
|
||||
"canonical-json": "^0.0.4",
|
||||
"lodash.memoize": "^4.1.2"
|
||||
}
|
||||
}
|
||||
@@ -1,364 +0,0 @@
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
|
||||
/* eslint-disable flipper/no-relative-imports-across-packages */ // TODO T71355623
|
||||
|
||||
import path from 'path';
|
||||
import {createStore, Dispatch, Middleware, MiddlewareAPI} from 'redux';
|
||||
import {applyMiddleware} from 'redux';
|
||||
import yargs, {Argv} from 'yargs';
|
||||
import dispatcher from '../app/src/dispatcher/index';
|
||||
import reducers, {Actions, State} from '../app/src/reducers/index';
|
||||
import {init as initLogger} from '../app/src/fb-stubs/Logger';
|
||||
import {exportStore} from '../app/src/utils/exportData';
|
||||
import {listDevices} from '../app/src/utils/listDevices';
|
||||
import setup from '../static/setup';
|
||||
import {
|
||||
getPersistentPlugins,
|
||||
pluginsClassMap,
|
||||
} from '../app/src/utils/pluginUtils';
|
||||
import {serialize} from '../app/src/utils/serialization';
|
||||
import {getStringFromErrorLike} from '../app/src/utils/index';
|
||||
import AndroidDevice from '../app/src/devices/AndroidDevice';
|
||||
import {Store} from 'flipper';
|
||||
|
||||
process.env.FLIPPER_HEADLESS = 'true';
|
||||
|
||||
type Action = {exit: boolean; result?: string};
|
||||
|
||||
type UserArguments = {
|
||||
securePort: string;
|
||||
insecurePort: string;
|
||||
dev: boolean;
|
||||
exit: 'sigint' | 'disconnect';
|
||||
verbose: boolean;
|
||||
metrics: boolean;
|
||||
listDevices: boolean;
|
||||
device: string;
|
||||
listPlugins: boolean;
|
||||
selectPlugins: Array<string>;
|
||||
};
|
||||
|
||||
(yargs as Argv<UserArguments>)
|
||||
.usage('$0 [args]')
|
||||
.command<UserArguments>(
|
||||
'*',
|
||||
'Start a headless Flipper instance',
|
||||
(yargs: Argv<UserArguments>) => {
|
||||
yargs.option('secure-port', {
|
||||
default: '8088',
|
||||
describe: 'Secure port the Flipper server should run on.',
|
||||
type: 'string',
|
||||
});
|
||||
yargs.option('insecure-port', {
|
||||
default: '8089',
|
||||
describe: 'Insecure port the Flipper server should run on.',
|
||||
type: 'string',
|
||||
});
|
||||
yargs.option('dev', {
|
||||
default: false,
|
||||
describe:
|
||||
'Enable redux-devtools. Tries to connect to devtools running on port 8181',
|
||||
type: 'boolean',
|
||||
});
|
||||
yargs.option('exit', {
|
||||
describe: 'Controls when to exit and dump the store to stdout.',
|
||||
choices: ['sigint', 'disconnect'],
|
||||
default: 'sigint',
|
||||
});
|
||||
yargs.option('v', {
|
||||
alias: 'verbose',
|
||||
default: false,
|
||||
describe: 'Enable verbose logging',
|
||||
type: 'boolean',
|
||||
});
|
||||
yargs.option('metrics', {
|
||||
default: undefined,
|
||||
describe: 'Will export metrics instead of data when flipper terminates',
|
||||
type: 'string',
|
||||
});
|
||||
yargs.option('list-devices', {
|
||||
default: false,
|
||||
describe: 'Will print the list of devices in the terminal',
|
||||
type: 'boolean',
|
||||
});
|
||||
yargs.option('list-plugins', {
|
||||
default: false,
|
||||
describe: 'Will print the list of supported plugins in the terminal',
|
||||
type: 'boolean',
|
||||
});
|
||||
yargs.option('select-plugins', {
|
||||
default: [],
|
||||
describe:
|
||||
'The data/metrics would be exported only for the selected plugins',
|
||||
type: 'array',
|
||||
});
|
||||
yargs.option('device', {
|
||||
default: undefined,
|
||||
describe:
|
||||
'The identifier passed will be matched against the udid of the available devices and the matched device would be selected',
|
||||
type: 'string',
|
||||
});
|
||||
return yargs;
|
||||
},
|
||||
startFlipper,
|
||||
)
|
||||
.version(global.__VERSION__)
|
||||
.help().argv; // http://yargs.js.org/docs/#api-argv
|
||||
|
||||
function outputAndExit(output: string | null | undefined): void {
|
||||
output = output || '';
|
||||
console.log(`Finished. Outputting ${output.length} characters.`);
|
||||
process.stdout.write(output, () => {
|
||||
process.exit(0);
|
||||
});
|
||||
}
|
||||
|
||||
function errorAndExit(error: any): void {
|
||||
process.stderr.write(getStringFromErrorLike(error), () => {
|
||||
process.exit(1);
|
||||
});
|
||||
}
|
||||
|
||||
async function earlyExitActions(
|
||||
exitClosures: Array<(userArguments: UserArguments) => Promise<Action>>,
|
||||
userArguments: UserArguments,
|
||||
_originalConsole?: typeof global.console,
|
||||
): Promise<void> {
|
||||
for (const exitAction of exitClosures) {
|
||||
try {
|
||||
const action = await exitAction(userArguments);
|
||||
if (action.exit) {
|
||||
outputAndExit(action.result);
|
||||
}
|
||||
} catch (e) {
|
||||
errorAndExit(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function exitActions(
|
||||
exitClosures: Array<
|
||||
(userArguments: UserArguments, store: Store) => Promise<Action>
|
||||
>,
|
||||
userArguments: UserArguments,
|
||||
store: Store,
|
||||
): Promise<void> {
|
||||
const {exit} = userArguments;
|
||||
for (const exitAction of exitClosures) {
|
||||
try {
|
||||
const action = await exitAction(userArguments, store);
|
||||
if (action.exit) {
|
||||
outputAndExit(action.result);
|
||||
}
|
||||
} catch (e) {
|
||||
errorAndExit(e);
|
||||
}
|
||||
}
|
||||
|
||||
if (exit == 'sigint') {
|
||||
process.on('SIGINT', async () => {
|
||||
try {
|
||||
const {serializedString, fetchMetaDataErrors} = await exportStore(
|
||||
store,
|
||||
);
|
||||
console.error('Error while fetching metadata', fetchMetaDataErrors);
|
||||
outputAndExit(serializedString);
|
||||
} catch (e) {
|
||||
errorAndExit(e);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async function storeModifyingActions(
|
||||
storeModifyingClosures: Array<
|
||||
(userArguments: UserArguments, store: Store) => Promise<Action>
|
||||
>,
|
||||
userArguments: UserArguments,
|
||||
store: Store,
|
||||
): Promise<void> {
|
||||
for (const closure of storeModifyingClosures) {
|
||||
try {
|
||||
const action = await closure(userArguments, store);
|
||||
if (action.exit) {
|
||||
outputAndExit(action.result);
|
||||
}
|
||||
} catch (e) {
|
||||
errorAndExit(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function startFlipper(userArguments: UserArguments) {
|
||||
const {verbose, exit, insecurePort, securePort, metrics} = userArguments;
|
||||
console.error(`
|
||||
_____ _ _
|
||||
| __| |_|___ ___ ___ ___
|
||||
| __| | | . | . | -_| _|
|
||||
|__| |_|_| _| _|___|_| v${global.__VERSION__}
|
||||
|_| |_|
|
||||
`);
|
||||
if (metrics) {
|
||||
throw new Error(
|
||||
'--metrics is no longer supported, see D24332440 for details.',
|
||||
);
|
||||
}
|
||||
|
||||
// redirect all logging to stderr
|
||||
const overriddenMethods = ['debug', 'info', 'log', 'warn', 'error'];
|
||||
for (const method of overriddenMethods) {
|
||||
(global.console as {[key: string]: any})[method] =
|
||||
method === 'error' || verbose ? global.console.error : () => {};
|
||||
}
|
||||
|
||||
// Polyfills
|
||||
global.WebSocket = require('ws'); // used for redux devtools
|
||||
global.fetch = require('node-fetch/lib/index');
|
||||
|
||||
process.env.BUNDLED_PLUGIN_PATH =
|
||||
process.env.BUNDLED_PLUGIN_PATH ||
|
||||
path.join(path.dirname(process.execPath), 'plugins');
|
||||
|
||||
process.env.FLIPPER_PORTS = `${insecurePort},${securePort}`;
|
||||
|
||||
// needs to be required after WebSocket polyfill is loaded
|
||||
const devToolsEnhancer = require('remote-redux-devtools');
|
||||
|
||||
const headlessMiddleware: Middleware<{}, State, any> = (
|
||||
store: MiddlewareAPI<Dispatch<Actions>, State>,
|
||||
) => (next: Dispatch<Actions>) => (action: Actions) => {
|
||||
if (exit == 'disconnect' && action.type == 'CLIENT_REMOVED') {
|
||||
// TODO(T42325892): Investigate why the export stalls without exiting the
|
||||
// current eventloop task here.
|
||||
setTimeout(() => {
|
||||
exportStore(store)
|
||||
.then(({serializedString}) => {
|
||||
outputAndExit(serializedString);
|
||||
})
|
||||
.catch((e: Error) => {
|
||||
errorAndExit(e);
|
||||
});
|
||||
}, 10);
|
||||
}
|
||||
return next(action);
|
||||
};
|
||||
|
||||
setup({});
|
||||
const store = createStore<State, Actions, {}, {}>(
|
||||
reducers,
|
||||
devToolsEnhancer.composeWithDevTools(applyMiddleware(headlessMiddleware)),
|
||||
);
|
||||
const logger = initLogger(store, {isHeadless: true});
|
||||
|
||||
const earlyExitClosures: Array<(
|
||||
userArguments: UserArguments,
|
||||
) => Promise<Action>> = [
|
||||
async (userArguments: UserArguments) => {
|
||||
if (userArguments.listDevices) {
|
||||
const devices = await listDevices(store);
|
||||
const mapped = devices.map((device) => {
|
||||
return {
|
||||
os: device.os,
|
||||
title: device.title,
|
||||
deviceType: device.deviceType,
|
||||
serial: device.serial,
|
||||
};
|
||||
});
|
||||
return {exit: true, result: await serialize(mapped)};
|
||||
}
|
||||
return Promise.resolve({exit: false});
|
||||
},
|
||||
];
|
||||
|
||||
await earlyExitActions(earlyExitClosures, userArguments);
|
||||
|
||||
const cleanupDispatchers = dispatcher(store, logger);
|
||||
|
||||
const storeModifyingClosures: Array<(
|
||||
userArguments: UserArguments,
|
||||
store: Store,
|
||||
) => Promise<Action>> = [
|
||||
async (userArguments: UserArguments, store: Store) => {
|
||||
const {device: selectedDeviceID} = userArguments;
|
||||
if (selectedDeviceID) {
|
||||
const devices = await listDevices(store);
|
||||
const matchedDevice = devices.find(
|
||||
(device) => device.serial === selectedDeviceID,
|
||||
);
|
||||
if (matchedDevice) {
|
||||
if (matchedDevice instanceof AndroidDevice) {
|
||||
const ports = store.getState().application.serverPorts;
|
||||
matchedDevice.reverse([ports.secure, ports.insecure]);
|
||||
}
|
||||
matchedDevice.loadDevicePlugins(
|
||||
store.getState().plugins.devicePlugins,
|
||||
);
|
||||
store.dispatch({
|
||||
type: 'REGISTER_DEVICE',
|
||||
payload: matchedDevice,
|
||||
});
|
||||
store.dispatch({
|
||||
type: 'SELECT_DEVICE',
|
||||
payload: matchedDevice,
|
||||
});
|
||||
return {exit: false};
|
||||
}
|
||||
throw new Error(`No device matching the serial ${selectedDeviceID}`);
|
||||
}
|
||||
return {
|
||||
exit: false,
|
||||
};
|
||||
},
|
||||
async (userArguments: UserArguments, store: Store) => {
|
||||
const {selectPlugins} = userArguments;
|
||||
const selectedPlugins = selectPlugins.filter((selectPlugin) => {
|
||||
return selectPlugin != undefined;
|
||||
});
|
||||
if (selectedPlugins) {
|
||||
store.dispatch({
|
||||
type: 'SELECTED_PLUGINS',
|
||||
payload: selectedPlugins,
|
||||
});
|
||||
}
|
||||
return {
|
||||
exit: false,
|
||||
};
|
||||
},
|
||||
];
|
||||
|
||||
const exitActionClosures: Array<(
|
||||
userArguments: UserArguments,
|
||||
store: Store,
|
||||
) => Promise<Action>> = [
|
||||
async (userArguments: UserArguments, store: Store) => {
|
||||
const {listPlugins} = userArguments;
|
||||
if (listPlugins) {
|
||||
return Promise.resolve({
|
||||
exit: true,
|
||||
result: await serialize(
|
||||
getPersistentPlugins(store.getState().plugins),
|
||||
),
|
||||
});
|
||||
}
|
||||
return Promise.resolve({
|
||||
exit: false,
|
||||
});
|
||||
},
|
||||
async (userArguments: UserArguments, store: Store) => {
|
||||
return Promise.resolve({exit: false});
|
||||
},
|
||||
];
|
||||
|
||||
await storeModifyingActions(storeModifyingClosures, userArguments, store);
|
||||
|
||||
await exitActions(exitActionClosures, userArguments, store);
|
||||
|
||||
await cleanupDispatchers();
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
{
|
||||
"name": "flipper-headless",
|
||||
"private": true,
|
||||
"version": "0.0.0",
|
||||
"description": "Headless version of Flipper - Mobile development tool",
|
||||
"productName": "Flipper Headless",
|
||||
"author": "Facebook Inc",
|
||||
"main": "index.tsx",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"node-fetch": "^2.6.1",
|
||||
"redux": "^4.0.0",
|
||||
"remote-redux-devtools": "^0.5.16",
|
||||
"ws": "^7.3.0",
|
||||
"yargs": "^15.4.1"
|
||||
}
|
||||
}
|
||||
@@ -19,8 +19,6 @@
|
||||
"app/src/fb/*",
|
||||
"babel-transformer",
|
||||
"doctor",
|
||||
"headless",
|
||||
"headless-tests",
|
||||
"pkg",
|
||||
"pkg-lib",
|
||||
"flipper-plugin",
|
||||
@@ -212,7 +210,6 @@
|
||||
"node-fetch": "^2.6.1",
|
||||
"p-filter": "^2.1.0",
|
||||
"p-map": "^4.0.0",
|
||||
"pkg": "^4.4.1",
|
||||
"prettier": "^2.0.0",
|
||||
"pretty-format": "^26.1.0",
|
||||
"promisify-child-process": "^4.1.0",
|
||||
@@ -252,9 +249,6 @@
|
||||
"prebuild": "yarn build:pkg && yarn rm-dist && yarn build:themes",
|
||||
"build": "cross-env NODE_ENV=production ./ts-node scripts/build-release.ts $@",
|
||||
"build:dev": "cross-env NODE_ENV=development ./ts-node scripts/build-release.ts $@",
|
||||
"prebuild-headless": "yarn build:pkg",
|
||||
"build-headless": "cross-env NODE_ENV=production ./ts-node scripts/build-headless.ts $@",
|
||||
"build-headless:dev": "cross-env NODE_ENV=development ./ts-node scripts/build-headless.ts $@",
|
||||
"build-plugin": "./ts-node scripts/build-plugin.ts",
|
||||
"resolve-plugin-dir": "./ts-node scripts/resolve-plugin-dir.ts",
|
||||
"list-plugins": "./ts-node scripts/list-plugins.ts",
|
||||
@@ -273,7 +267,7 @@
|
||||
"lint": "yarn lint:eslint && yarn lint:tsc",
|
||||
"bump-versions": "./ts-node scripts/bump-versions.ts",
|
||||
"publish-packages": "./ts-node scripts/publish-packages.ts",
|
||||
"everything": "yarn reset && yarn install && yarn lint && yarn test && yarn test-electron && yarn build --mac --mac-dmg --win --linux --linux-deb && yarn build-headless --mac --linux && yarn start"
|
||||
"everything": "yarn reset && yarn install && yarn lint && yarn test && yarn test-electron && yarn build --mac --mac-dmg --win --linux --linux-deb && yarn start"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"7zip-bin-mac": "^1.0.1"
|
||||
|
||||
@@ -1,110 +0,0 @@
|
||||
/**
|
||||
* 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 fs from 'fs-extra';
|
||||
import path from 'path';
|
||||
import lineReplace from 'line-replace';
|
||||
import yazl from 'yazl';
|
||||
const {exec: createBinary} = require('pkg');
|
||||
import {
|
||||
buildFolder,
|
||||
compileHeadless,
|
||||
getVersionNumber,
|
||||
genMercurialRevision,
|
||||
generatePluginEntryPoints,
|
||||
} from './build-utils';
|
||||
import isFB from './isFB';
|
||||
import {distDir} from './paths';
|
||||
|
||||
function preludeBundle(
|
||||
dir: string,
|
||||
versionNumber: string,
|
||||
buildRevision: string | null,
|
||||
) {
|
||||
const revisionStr =
|
||||
buildRevision == null ? '' : `global.__REVISION__="${buildRevision}";`;
|
||||
return new Promise((resolve) =>
|
||||
lineReplace({
|
||||
file: path.join(dir, 'bundle.js'),
|
||||
line: 1,
|
||||
text: `var __DEV__=false; global.electronRequire = require; global.performance = require("perf_hooks").performance;global.__VERSION__="${versionNumber}";${revisionStr}`,
|
||||
addNewLine: true,
|
||||
callback: resolve,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
async function createZip(buildDir: string, distDir: string, targets: string[]) {
|
||||
return new Promise((resolve) => {
|
||||
const zip = new yazl.ZipFile();
|
||||
|
||||
// add binaries for each target
|
||||
targets.forEach((target) => {
|
||||
const binary = `flipper-${target === 'mac' ? 'macos' : target}`;
|
||||
zip.addFile(path.join(buildDir, binary), binary);
|
||||
});
|
||||
|
||||
// write zip file
|
||||
zip.outputStream
|
||||
.pipe(fs.createWriteStream(path.join(distDir, 'Flipper-headless.zip')))
|
||||
.on('close', resolve);
|
||||
zip.end();
|
||||
});
|
||||
}
|
||||
|
||||
(async () => {
|
||||
if (isFB) {
|
||||
process.env.FLIPPER_FB = 'true';
|
||||
}
|
||||
const targets: {mac?: string; linux?: string; win?: string} = {};
|
||||
let platformPostfix: string = '';
|
||||
if (process.argv.indexOf('--mac') > -1) {
|
||||
targets.mac = 'node10-macos-x64';
|
||||
platformPostfix = '-macos';
|
||||
}
|
||||
if (process.argv.indexOf('--linux') > -1) {
|
||||
targets.linux = 'node10-linux-x64';
|
||||
platformPostfix = '-linux';
|
||||
}
|
||||
if (process.argv.indexOf('--win') > -1) {
|
||||
targets.win = 'node10-win-x64';
|
||||
platformPostfix = '-win';
|
||||
}
|
||||
const length = Object.keys(targets).length;
|
||||
if (length === 0) {
|
||||
throw new Error('No targets specified. eg. --mac, --win, or --linux');
|
||||
} else if (length > 1) {
|
||||
// platformPostfix is automatically added by pkg
|
||||
platformPostfix = '';
|
||||
}
|
||||
process.env.FLIPPER_HEADLESS = 'true';
|
||||
const buildDir = await buildFolder();
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('Created build directory', buildDir);
|
||||
await generatePluginEntryPoints();
|
||||
await compileHeadless(buildDir);
|
||||
const buildNumber = process.argv.join(' ').match(/--version=(\d+)/);
|
||||
const patch = buildNumber && buildNumber.length > 0 ? buildNumber[1] : '0';
|
||||
const versionNumber = getVersionNumber(parseInt(patch, 10));
|
||||
const buildRevision = await genMercurialRevision();
|
||||
await preludeBundle(buildDir, versionNumber, buildRevision);
|
||||
await createBinary([
|
||||
path.join(buildDir, 'bundle.js'),
|
||||
'--output',
|
||||
path.join(buildDir, `flipper${platformPostfix}`),
|
||||
'--targets',
|
||||
Object.values(targets).join(','),
|
||||
'--debug',
|
||||
]);
|
||||
await fs.ensureDir(distDir);
|
||||
await createZip(buildDir, distDir, Object.keys(targets));
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('✨ Done');
|
||||
process.exit();
|
||||
})();
|
||||
@@ -19,7 +19,6 @@ import {
|
||||
appDir,
|
||||
staticDir,
|
||||
defaultPluginsIndexDir,
|
||||
headlessDir,
|
||||
babelTransformationsDir,
|
||||
} from './paths';
|
||||
|
||||
@@ -111,29 +110,6 @@ async function compile(
|
||||
);
|
||||
}
|
||||
|
||||
export async function compileHeadless(buildFolder: string) {
|
||||
console.log(`⚙️ Compiling headless bundle...`);
|
||||
const watchFolders = [
|
||||
headlessDir,
|
||||
...(await getWatchFolders(staticDir)),
|
||||
...(await getAppWatchFolders()),
|
||||
...(await getPluginSourceFolders()),
|
||||
]
|
||||
.filter((value, index, self) => self.indexOf(value) === index)
|
||||
.filter(fs.pathExistsSync);
|
||||
try {
|
||||
await compile(
|
||||
buildFolder,
|
||||
headlessDir,
|
||||
watchFolders,
|
||||
path.join(headlessDir, 'index.tsx'),
|
||||
);
|
||||
console.log('✅ Compiled headless bundle.');
|
||||
} catch (err) {
|
||||
die(err);
|
||||
}
|
||||
}
|
||||
|
||||
export async function compileRenderer(buildFolder: string) {
|
||||
console.log(`⚙️ Compiling renderer bundle...`);
|
||||
const watchFolders = [
|
||||
|
||||
@@ -16,7 +16,6 @@ export const staticDir = path.join(rootDir, 'static');
|
||||
export const defaultPluginsIndexDir = path.join(staticDir, 'defaultPlugins');
|
||||
export const pluginsDir = path.join(rootDir, 'plugins');
|
||||
export const fbPluginsDir = path.join(pluginsDir, 'fb');
|
||||
export const headlessDir = path.join(rootDir, 'headless');
|
||||
export const distDir = path.resolve(rootDir, '..', 'dist');
|
||||
export const babelTransformationsDir = path.resolve(
|
||||
rootDir,
|
||||
|
||||
@@ -561,7 +561,7 @@
|
||||
chalk "^2.0.0"
|
||||
js-tokens "^4.0.0"
|
||||
|
||||
"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.1.6", "@babel/parser@^7.10.4", "@babel/parser@^7.12.1", "@babel/parser@^7.12.3", "@babel/parser@^7.7.0", "@babel/parser@^7.9.4":
|
||||
"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.1.6", "@babel/parser@^7.10.4", "@babel/parser@^7.12.1", "@babel/parser@^7.12.3", "@babel/parser@^7.7.0":
|
||||
version "7.12.3"
|
||||
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.3.tgz#a305415ebe7a6c7023b40b5122a0662d928334cd"
|
||||
integrity sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==
|
||||
@@ -1394,7 +1394,7 @@
|
||||
core-js-pure "^3.0.0"
|
||||
regenerator-runtime "^0.13.4"
|
||||
|
||||
"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
|
||||
"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.1", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.10.4", "@babel/runtime@^7.11.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7":
|
||||
version "7.12.1"
|
||||
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.1.tgz#b4116a6b6711d010b2dad3b7b6e43bf1b9954740"
|
||||
integrity sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==
|
||||
@@ -3768,7 +3768,7 @@ babel-jest@^25.5.1:
|
||||
graceful-fs "^4.2.4"
|
||||
slash "^3.0.0"
|
||||
|
||||
babel-jest@^26.2.2, babel-jest@^26.6.0:
|
||||
babel-jest@^26.6.0:
|
||||
version "26.6.0"
|
||||
resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.0.tgz#eca57ac8af99d6e06047e595b1faf0b5adf8a7bb"
|
||||
integrity sha512-JI66yILI7stzjHccAoQtRKcUwJrJb4oMIxLTirL3GdAjGpaUBQSjZDFi9LsPkN4gftsS4R2AThAJwOjJxadwbg==
|
||||
@@ -4198,11 +4198,6 @@ builder-util@22.8.0:
|
||||
stat-mode "^1.0.0"
|
||||
temp-file "^3.3.7"
|
||||
|
||||
byline@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1"
|
||||
integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=
|
||||
|
||||
bytes@3.1.0:
|
||||
version "3.1.0"
|
||||
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
|
||||
@@ -4285,11 +4280,6 @@ caniuse-lite@^1.0.30001165:
|
||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001166.tgz#ca73e8747acfd16a4fd6c4b784f1b995f9698cf8"
|
||||
integrity sha512-nCL4LzYK7F4mL0TjEMeYavafOGnBa98vTudH5c8lW9izUjnB99InG6pmC1ElAI1p0GlyZajv4ltUdFXvOHIl1A==
|
||||
|
||||
canonical-json@^0.0.4:
|
||||
version "0.0.4"
|
||||
resolved "https://registry.yarnpkg.com/canonical-json/-/canonical-json-0.0.4.tgz#6579c072c3db5c477ec41dc978fbf2b8f41074a3"
|
||||
integrity sha1-ZXnAcsPbXEd+xB3JePvyuPQQdKM=
|
||||
|
||||
capture-exit@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4"
|
||||
@@ -4513,11 +4503,6 @@ clone-response@^1.0.2:
|
||||
dependencies:
|
||||
mimic-response "^1.0.0"
|
||||
|
||||
clone@2.1.1:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb"
|
||||
integrity sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=
|
||||
|
||||
co@^4.6.0:
|
||||
version "4.6.0"
|
||||
resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
|
||||
@@ -6126,11 +6111,6 @@ expand-brackets@^2.1.4:
|
||||
snapdragon "^0.8.1"
|
||||
to-regex "^3.0.1"
|
||||
|
||||
expand-template@^2.0.3:
|
||||
version "2.0.3"
|
||||
resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
|
||||
integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
|
||||
|
||||
expand-tilde@^2.0.2:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
|
||||
@@ -6585,14 +6565,6 @@ fresh@0.5.2:
|
||||
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
|
||||
integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
|
||||
|
||||
from2@^2.3.0:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
|
||||
integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=
|
||||
dependencies:
|
||||
inherits "^2.0.1"
|
||||
readable-stream "^2.0.0"
|
||||
|
||||
fs-constants@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
|
||||
@@ -6702,11 +6674,6 @@ get-package-type@^0.1.0:
|
||||
resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
|
||||
integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
|
||||
|
||||
get-params@^0.1.2:
|
||||
version "0.1.2"
|
||||
resolved "https://registry.yarnpkg.com/get-params/-/get-params-0.1.2.tgz#bae0dfaba588a0c60d7834c0d8dc2ff60eeef2fe"
|
||||
integrity sha1-uuDfq6WIoMYNeDTA2Nwv9g7u8v4=
|
||||
|
||||
get-port@^5.0.0:
|
||||
version "5.1.1"
|
||||
resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193"
|
||||
@@ -6847,7 +6814,7 @@ globby@^10.0.1:
|
||||
merge2 "^1.2.3"
|
||||
slash "^3.0.0"
|
||||
|
||||
globby@^11, globby@^11.0.0, globby@^11.0.1:
|
||||
globby@^11, globby@^11.0.1:
|
||||
version "11.0.1"
|
||||
resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357"
|
||||
integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==
|
||||
@@ -7227,7 +7194,7 @@ inflight@^1.0.4:
|
||||
once "^1.3.0"
|
||||
wrappy "1"
|
||||
|
||||
inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
|
||||
inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
|
||||
version "2.0.4"
|
||||
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
|
||||
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
|
||||
@@ -7295,14 +7262,6 @@ internal-slot@^1.0.2:
|
||||
has "^1.0.3"
|
||||
side-channel "^1.0.2"
|
||||
|
||||
into-stream@^5.1.1:
|
||||
version "5.1.1"
|
||||
resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-5.1.1.tgz#f9a20a348a11f3c13face22763f2d02e127f4db8"
|
||||
integrity sha512-krrAJ7McQxGGmvaYbB7Q1mcA+cRwg9Ij2RfWIeVesNBgVDZmzY/Fa4IpZUT3bmdRzMzdf/mzltCG2Dq99IZGBA==
|
||||
dependencies:
|
||||
from2 "^2.3.0"
|
||||
p-is-promise "^3.0.0"
|
||||
|
||||
invariant@^2.2.2, invariant@^2.2.4:
|
||||
version "2.2.4"
|
||||
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
|
||||
@@ -8527,11 +8486,6 @@ js-yaml@^3.13.1, js-yaml@^3.14.0:
|
||||
argparse "^1.0.7"
|
||||
esprima "^4.0.0"
|
||||
|
||||
jsan@^3.1.13:
|
||||
version "3.1.13"
|
||||
resolved "https://registry.yarnpkg.com/jsan/-/jsan-3.1.13.tgz#4de8c7bf8d1cfcd020c313d438f930cec4b91d86"
|
||||
integrity sha512-9kGpCsGHifmw6oJet+y8HaCl14y7qgAsxVdV3pCHDySNR3BfDC30zgkssd7x5LRVAT22dnpbe9JdzzmXZnq9/g==
|
||||
|
||||
jsbn@~0.1.0:
|
||||
version "0.1.1"
|
||||
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
|
||||
@@ -8837,11 +8791,6 @@ lines-and-columns@^1.1.6:
|
||||
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
|
||||
integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
|
||||
|
||||
linked-list@0.1.0:
|
||||
version "0.1.0"
|
||||
resolved "https://registry.yarnpkg.com/linked-list/-/linked-list-0.1.0.tgz#798b0ff97d1b92a4fd08480f55aea4e9d49d37bf"
|
||||
integrity sha1-eYsP+X0bkqT9CEgPVa6k6dSdN78=
|
||||
|
||||
linkifyjs@^2.1.6:
|
||||
version "2.1.9"
|
||||
resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-2.1.9.tgz#af06e45a2866ff06c4766582590d098a4d584702"
|
||||
@@ -8992,7 +8941,7 @@ lodash.union@^4.6.0:
|
||||
resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88"
|
||||
integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=
|
||||
|
||||
lodash@^4.0.1, lodash@^4.16.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.8.0, lodash@~4.17.12, lodash@~4.17.4:
|
||||
lodash@^4.0.1, lodash@^4.16.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.8.0, lodash@~4.17.12, lodash@~4.17.4:
|
||||
version "4.17.20"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
|
||||
integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
|
||||
@@ -9568,14 +9517,6 @@ ms@2.1.2, ms@^2.1.1:
|
||||
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
|
||||
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
|
||||
|
||||
multistream@^2.1.1:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/multistream/-/multistream-2.1.1.tgz#629d3a29bd76623489980d04519a2c365948148c"
|
||||
integrity sha512-xasv76hl6nr1dEy3lPvy7Ej7K/Lx3O/FCvwge8PeVJpciPPoNCbaANcNiBug3IpdvTveZUcAV0DJzdnUDMesNQ==
|
||||
dependencies:
|
||||
inherits "^2.0.1"
|
||||
readable-stream "^2.0.5"
|
||||
|
||||
mute-stream@0.0.7:
|
||||
version "0.0.7"
|
||||
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
|
||||
@@ -9586,11 +9527,6 @@ mute-stream@0.0.8:
|
||||
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
|
||||
integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
|
||||
|
||||
nanoid@^2.0.0:
|
||||
version "2.1.11"
|
||||
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.1.11.tgz#ec24b8a758d591561531b4176a01e3ab4f0f0280"
|
||||
integrity sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==
|
||||
|
||||
nanomatch@^1.2.9:
|
||||
version "1.2.13"
|
||||
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
|
||||
@@ -9982,7 +9918,7 @@ options@>=0.0.5:
|
||||
resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f"
|
||||
integrity sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=
|
||||
|
||||
os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
|
||||
os-tmpdir@~1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
|
||||
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
|
||||
@@ -10009,11 +9945,6 @@ p-finally@^1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
|
||||
integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
|
||||
|
||||
p-is-promise@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-3.0.0.tgz#58e78c7dfe2e163cf2a04ff869e7c1dba64a5971"
|
||||
integrity sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==
|
||||
|
||||
p-limit@^1.1.0:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
|
||||
@@ -10314,42 +10245,6 @@ pkg-dir@^4.2.0:
|
||||
dependencies:
|
||||
find-up "^4.0.0"
|
||||
|
||||
pkg-fetch@^2.6.6:
|
||||
version "2.6.6"
|
||||
resolved "https://registry.yarnpkg.com/pkg-fetch/-/pkg-fetch-2.6.6.tgz#8cec66bb7c80d8149a55765e317ac554ad834b72"
|
||||
integrity sha512-PdL6lpoSryzP6rMZD1voZQX0LHx6q4pOaD1djaFphmBfYPoQzLalF2+St+wdYxbZ37xRNHACTeQIKNEKA0xdbA==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.9.2"
|
||||
byline "^5.0.0"
|
||||
chalk "^3.0.0"
|
||||
expand-template "^2.0.3"
|
||||
fs-extra "^8.1.0"
|
||||
minimist "^1.2.5"
|
||||
progress "^2.0.3"
|
||||
request "^2.88.0"
|
||||
request-progress "^3.0.0"
|
||||
semver "^6.3.0"
|
||||
unique-temp-dir "^1.0.0"
|
||||
|
||||
pkg@^4.4.1:
|
||||
version "4.4.6"
|
||||
resolved "https://registry.yarnpkg.com/pkg/-/pkg-4.4.6.tgz#14d8c072754605d4aa681c4c27aa8a4c0eb32bf6"
|
||||
integrity sha512-dZtS9w/pe/QBI0hDeXddZ0ENxjySEC9GzI1CuDnPjUid6VpTdiYdn40itOgHqvApVWHN6fuRqlnwpKFTCzi3fQ==
|
||||
dependencies:
|
||||
"@babel/parser" "^7.9.4"
|
||||
"@babel/runtime" "^7.9.2"
|
||||
chalk "^3.0.0"
|
||||
escodegen "^1.14.1"
|
||||
fs-extra "^8.1.0"
|
||||
globby "^11.0.0"
|
||||
into-stream "^5.1.1"
|
||||
minimist "^1.2.5"
|
||||
multistream "^2.1.1"
|
||||
pkg-fetch "^2.6.6"
|
||||
progress "^2.0.3"
|
||||
resolve "^1.15.1"
|
||||
stream-meter "^1.0.4"
|
||||
|
||||
posix-character-classes@^0.1.0:
|
||||
version "0.1.1"
|
||||
resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
|
||||
@@ -10570,7 +10465,7 @@ query-string@^6.13.3:
|
||||
split-on-first "^1.0.0"
|
||||
strict-uri-encode "^2.0.0"
|
||||
|
||||
querystring@0.2.0, querystring@^0.2.0:
|
||||
querystring@0.2.0:
|
||||
version "0.2.0"
|
||||
resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
|
||||
integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
|
||||
@@ -11227,7 +11122,7 @@ read-pkg@^5.2.0:
|
||||
parse-json "^5.0.0"
|
||||
type-fest "^0.6.0"
|
||||
|
||||
readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.1.4, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@~2.3.6:
|
||||
readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@~2.3.6:
|
||||
version "2.3.7"
|
||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
|
||||
integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
|
||||
@@ -11325,30 +11220,11 @@ reduce-function-call@^1.0.1:
|
||||
dependencies:
|
||||
balanced-match "^1.0.0"
|
||||
|
||||
redux-devtools-core@^0.2.1:
|
||||
version "0.2.1"
|
||||
resolved "https://registry.yarnpkg.com/redux-devtools-core/-/redux-devtools-core-0.2.1.tgz#4e43cbe590a1f18c13ee165d2d42e0bc77a164d8"
|
||||
integrity sha512-RAGOxtUFdr/1USAvxrWd+Gq/Euzgw7quCZlO5TgFpDfG7rB5tMhZUrNyBjpzgzL2yMk0eHnPYIGm7NkIfRzHxQ==
|
||||
dependencies:
|
||||
get-params "^0.1.2"
|
||||
jsan "^3.1.13"
|
||||
lodash "^4.17.11"
|
||||
nanoid "^2.0.0"
|
||||
remotedev-serialize "^0.1.8"
|
||||
|
||||
redux-devtools-extension@*:
|
||||
version "2.13.8"
|
||||
resolved "https://registry.yarnpkg.com/redux-devtools-extension/-/redux-devtools-extension-2.13.8.tgz#37b982688626e5e4993ff87220c9bbb7cd2d96e1"
|
||||
integrity sha512-8qlpooP2QqPtZHQZRhx3x3OP5skEV1py/zUdMY28WNAocbafxdG2tRD1MWE7sp8obGMNYuLWanhhQ7EQvT1FBg==
|
||||
|
||||
redux-devtools-instrument@^1.9.4:
|
||||
version "1.9.6"
|
||||
resolved "https://registry.yarnpkg.com/redux-devtools-instrument/-/redux-devtools-instrument-1.9.6.tgz#6b412595f74b9d48cfd4ecc13e585b1588ed6e7e"
|
||||
integrity sha512-MwvY4cLEB2tIfWWBzrUR02UM9qRG2i7daNzywRvabOSVdvAY7s9BxSwMmVRH1Y/7QWjplNtOwgT0apKhHg2Qew==
|
||||
dependencies:
|
||||
lodash "^4.2.0"
|
||||
symbol-observable "^1.0.2"
|
||||
|
||||
redux-mock-store@^1.0.1:
|
||||
version "1.5.4"
|
||||
resolved "https://registry.yarnpkg.com/redux-mock-store/-/redux-mock-store-1.5.4.tgz#90d02495fd918ddbaa96b83aef626287c9ab5872"
|
||||
@@ -11465,25 +11341,6 @@ remark-parse@^9.0.0:
|
||||
dependencies:
|
||||
mdast-util-from-markdown "^0.8.0"
|
||||
|
||||
remote-redux-devtools@^0.5.16:
|
||||
version "0.5.16"
|
||||
resolved "https://registry.yarnpkg.com/remote-redux-devtools/-/remote-redux-devtools-0.5.16.tgz#95b1a4a1988147ca04f3368f3573b661748b3717"
|
||||
integrity sha512-xZ2D1VRIWzat5nsvcraT6fKEX9Cfi+HbQBCwzNnUAM8Uicm/anOc60XGalcaDPrVmLug7nhDl2nimEa3bL3K9w==
|
||||
dependencies:
|
||||
jsan "^3.1.13"
|
||||
querystring "^0.2.0"
|
||||
redux-devtools-core "^0.2.1"
|
||||
redux-devtools-instrument "^1.9.4"
|
||||
rn-host-detect "^1.1.5"
|
||||
socketcluster-client "^14.2.1"
|
||||
|
||||
remotedev-serialize@^0.1.8:
|
||||
version "0.1.8"
|
||||
resolved "https://registry.yarnpkg.com/remotedev-serialize/-/remotedev-serialize-0.1.8.tgz#c99cb184e7f71a906162abc404be8ce33810205f"
|
||||
integrity sha512-3YG/FDcOmiK22bl5oMRM8RRnbGrFEuPGjbcDG+z2xi5aQaNQNZ8lqoRnZTwXVfaZtutXuiAQOgPRrogzQk8edg==
|
||||
dependencies:
|
||||
jsan "^3.1.13"
|
||||
|
||||
remove-trailing-separator@^1.0.1:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
|
||||
@@ -11499,13 +11356,6 @@ repeat-string@1.6.1, repeat-string@^1.6.1:
|
||||
resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
|
||||
integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
|
||||
|
||||
request-progress@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe"
|
||||
integrity sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=
|
||||
dependencies:
|
||||
throttleit "^1.0.0"
|
||||
|
||||
request-promise-core@1.1.4:
|
||||
version "1.1.4"
|
||||
resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f"
|
||||
@@ -11595,7 +11445,7 @@ resolve@1.1.7:
|
||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
|
||||
integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
|
||||
|
||||
resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.15.1, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.8.1:
|
||||
resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.8.1:
|
||||
version "1.18.1"
|
||||
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130"
|
||||
integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==
|
||||
@@ -11667,11 +11517,6 @@ rimraf@^3.0.0, rimraf@^3.0.2:
|
||||
dependencies:
|
||||
glob "^7.1.3"
|
||||
|
||||
rn-host-detect@^1.1.5:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/rn-host-detect/-/rn-host-detect-1.2.0.tgz#8b0396fc05631ec60c1cb8789e5070cdb04d0da0"
|
||||
integrity sha512-btNg5kzHcjZZ7t7mvvV/4wNJ9e3MPgrWivkRgWURzXL0JJ0pwWlU4zrbmdlz3HHzHOxhBhHB4D+/dbMFfu4/4A==
|
||||
|
||||
roarr@^2.14.4:
|
||||
version "2.14.4"
|
||||
resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.14.4.tgz#2d9d26864ce95ce570b4b5c5e548aefd40bb2bf7"
|
||||
@@ -11819,23 +11664,6 @@ saxes@^5.0.0:
|
||||
dependencies:
|
||||
xmlchars "^2.2.0"
|
||||
|
||||
sc-channel@^1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/sc-channel/-/sc-channel-1.2.0.tgz#d9209f3a91e3fa694c66b011ce55c4ad8c3087d9"
|
||||
integrity sha512-M3gdq8PlKg0zWJSisWqAsMmTVxYRTpVRqw4CWAdKBgAfVKumFcTjoCV0hYu7lgUXccCtCD8Wk9VkkE+IXCxmZA==
|
||||
dependencies:
|
||||
component-emitter "1.2.1"
|
||||
|
||||
sc-errors@^2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/sc-errors/-/sc-errors-2.0.1.tgz#3af2d934dfd82116279a4b2c1552c1e021ddcb03"
|
||||
integrity sha512-JoVhq3Ud+3Ujv2SIG7W0XtjRHsrNgl6iXuHHsh0s+Kdt5NwI6N2EGAZD4iteitdDv68ENBkpjtSvN597/wxPSQ==
|
||||
|
||||
sc-formatter@^3.0.1:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/sc-formatter/-/sc-formatter-3.0.2.tgz#9abdb14e71873ce7157714d3002477bbdb33c4e6"
|
||||
integrity sha512-9PbqYBpCq+OoEeRQ3QfFIGE6qwjjBcd2j7UjgDlhnZbtSnuGgHdcRklPKYGuYFH82V/dwd+AIpu8XvA1zqTd+A==
|
||||
|
||||
scheduler@^0.20.1:
|
||||
version "0.20.1"
|
||||
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.1.tgz#da0b907e24026b01181ecbc75efdc7f27b5a000c"
|
||||
@@ -12152,22 +11980,6 @@ socket.io@^2.0.4:
|
||||
socket.io-client "2.3.0"
|
||||
socket.io-parser "~3.4.0"
|
||||
|
||||
socketcluster-client@^14.2.1:
|
||||
version "14.3.1"
|
||||
resolved "https://registry.yarnpkg.com/socketcluster-client/-/socketcluster-client-14.3.1.tgz#bfc3591c0cad2668e7b3512a102f3844f5f2e84d"
|
||||
integrity sha512-Sd/T0K/9UlqTfz+HUuFq90dshA5OBJPQbdkRzGtcKIOm52fkdsBTt0FYpiuzzxv5VrU7PWpRm6KIfNXyPwlLpw==
|
||||
dependencies:
|
||||
buffer "^5.2.1"
|
||||
clone "2.1.1"
|
||||
component-emitter "1.2.1"
|
||||
linked-list "0.1.0"
|
||||
querystring "0.2.0"
|
||||
sc-channel "^1.2.0"
|
||||
sc-errors "^2.0.1"
|
||||
sc-formatter "^3.0.1"
|
||||
uuid "3.2.1"
|
||||
ws "7.1.0"
|
||||
|
||||
sort-keys@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-4.0.0.tgz#56dc5e256637bfe3fec8db0dc57c08b1a2be22d6"
|
||||
@@ -12350,13 +12162,6 @@ stealthy-require@^1.1.1:
|
||||
resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
|
||||
integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=
|
||||
|
||||
stream-meter@^1.0.4:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/stream-meter/-/stream-meter-1.0.4.tgz#52af95aa5ea760a2491716704dbff90f73afdd1d"
|
||||
integrity sha1-Uq+Vql6nYKJJFxZwTb/5D3Ov3R0=
|
||||
dependencies:
|
||||
readable-stream "^2.1.4"
|
||||
|
||||
strict-uri-encode@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
|
||||
@@ -12562,7 +12367,7 @@ supports-hyperlinks@^2.0.0:
|
||||
has-flag "^4.0.0"
|
||||
supports-color "^7.0.0"
|
||||
|
||||
symbol-observable@^1.0.2, symbol-observable@^1.2.0:
|
||||
symbol-observable@^1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
|
||||
integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
|
||||
@@ -12696,11 +12501,6 @@ throat@^5.0.0:
|
||||
resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b"
|
||||
integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==
|
||||
|
||||
throttleit@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c"
|
||||
integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=
|
||||
|
||||
through2@^2.0.1:
|
||||
version "2.0.5"
|
||||
resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
|
||||
@@ -12997,11 +12797,6 @@ uglify-es@^3.1.9:
|
||||
commander "~2.13.0"
|
||||
source-map "~0.6.1"
|
||||
|
||||
uid2@0.0.3:
|
||||
version "0.0.3"
|
||||
resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82"
|
||||
integrity sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=
|
||||
|
||||
ultron@1.0.x:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa"
|
||||
@@ -13072,15 +12867,6 @@ unique-string@^2.0.0:
|
||||
dependencies:
|
||||
crypto-random-string "^2.0.0"
|
||||
|
||||
unique-temp-dir@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz#6dce95b2681ca003eebfb304a415f9cbabcc5385"
|
||||
integrity sha1-bc6VsmgcoAPuv7MEpBX5y6vMU4U=
|
||||
dependencies:
|
||||
mkdirp "^0.5.1"
|
||||
os-tmpdir "^1.0.1"
|
||||
uid2 "0.0.3"
|
||||
|
||||
unist-util-is@^4.0.0:
|
||||
version "4.0.4"
|
||||
resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.4.tgz#3e9e8de6af2eb0039a59f50c9b3e99698a924f50"
|
||||
@@ -13223,11 +13009,6 @@ uuid@3.0.1:
|
||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
|
||||
integrity sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=
|
||||
|
||||
uuid@3.2.1:
|
||||
version "3.2.1"
|
||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
|
||||
integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==
|
||||
|
||||
uuid@^3.3.2:
|
||||
version "3.4.0"
|
||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
|
||||
@@ -13558,7 +13339,7 @@ ws@1.1.5, ws@^1.1.5:
|
||||
options ">=0.0.5"
|
||||
ultron "1.0.x"
|
||||
|
||||
ws@7.1.0, ws@7.3.0, ws@^7, ws@^7.1.2, ws@^7.2.3, ws@^7.3.0, ws@~6.1.0:
|
||||
ws@7.3.0, ws@^7, ws@^7.1.2, ws@^7.2.3, ws@^7.3.0, ws@~6.1.0:
|
||||
version "7.3.0"
|
||||
resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.0.tgz#4b2f7f219b3d3737bc1a2fbf145d825b94d38ffd"
|
||||
integrity sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
#!/bin/bash
|
||||
# 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.
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
if [ `adb devices | wc -l` -lt "3" ]
|
||||
then
|
||||
echo "ERROR: No devices are connected. Make sure emulator is booted with flipper sample app running"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
api_version=$(adb shell getprop ro.build.version.sdk)
|
||||
|
||||
if [ "$api_version" != "24" ]; then
|
||||
echo "WARNING: Emulator has api version $api_version. Should be using API 24 for snapshot test to pass. ( Must match the one we request from oneworld at https://fburl.com/diffusion/op67q916 )"
|
||||
fi
|
||||
|
||||
yarn build-headless --mac
|
||||
unzip -o dist/Flipper-headless.zip -d /tmp
|
||||
(cd headless-tests && yarn test)
|
||||
Reference in New Issue
Block a user