diff --git a/babel.config.js b/babel.config.js index 8dcd082..b6556ea 100644 --- a/babel.config.js +++ b/babel.config.js @@ -49,15 +49,16 @@ module.exports = api => { } return { plugins, - sourceType: "unambiguous", - ignore: [ - /\/node_modules\//, - ], + sourceType: 'unambiguous', + ignore: [/\/node_modules\//], presets: [ - ['@babel/preset-env', { - useBuiltIns: 'entry', - targets, - }], + [ + '@babel/preset-env', + { + useBuiltIns: 'entry', + targets, + }, + ], '@babel/preset-react', '@babel/preset-flow', ], diff --git a/packages/relay-devtools-core/src/backend.js b/packages/relay-devtools-core/src/backend.js index d7b0a4d..570bee0 100644 --- a/packages/relay-devtools-core/src/backend.js +++ b/packages/relay-devtools-core/src/backend.js @@ -28,7 +28,10 @@ installHook(window); const hook: DevToolsHook = window.__RELAY_DEVTOOLS_HOOK__; -function debug(methodName: string, ...args: [] | [any] | [string] | [Array]) { +function debug( + methodName: string, + ...args: [] | [any] | [string] | [Array] +) { if (__DEBUG__) { console.log( `%c[core/backend] %c${methodName}`, @@ -40,7 +43,12 @@ function debug(methodName: string, ...args: [] | [any] | [string] | [Array true} = options || {}; + const { + host = 'localhost', + port = 8097, + websocket, + isAppActive = () => true, + } = options || {}; let retryTimeoutID: TimeoutID | null = null; diff --git a/packages/relay-devtools-core/webpack.backend.js b/packages/relay-devtools-core/webpack.backend.js index 4556005..b0eaea2 100644 --- a/packages/relay-devtools-core/webpack.backend.js +++ b/packages/relay-devtools-core/webpack.backend.js @@ -39,9 +39,9 @@ module.exports = { // This name is important; standalone references it in order to connect. library: { - name:'RelayDevToolsBackend', + name: 'RelayDevToolsBackend', type: 'umd', - } + }, }, resolve: { alias: { diff --git a/shells/dev/relay-app/FriendsList/createInBrowserNetwork.js b/shells/dev/relay-app/FriendsList/createInBrowserNetwork.js index f093e80..71190c7 100644 --- a/shells/dev/relay-app/FriendsList/createInBrowserNetwork.js +++ b/shells/dev/relay-app/FriendsList/createInBrowserNetwork.js @@ -7,8 +7,10 @@ * @flow */ -import type { INetwork } from "../../../../node_modules/relay-runtime/network/RelayNetworkTypes";import type { Variables } from "../../../../node_modules/relay-runtime/util/RelayRuntimeTypes"; -import type { RequestParameters } from "../../../../node_modules/relay-runtime/util/RelayConcreteNode";/** +import type { INetwork } from '../../../../node_modules/relay-runtime/network/RelayNetworkTypes'; +import type { Variables } from '../../../../node_modules/relay-runtime/util/RelayRuntimeTypes'; +import type { RequestParameters } from '../../../../node_modules/relay-runtime/util/RelayConcreteNode'; +/** * This file implements the Relay "network" as a server running in the browser. * This allows the test app to send network requests that can be observed without * running a separate server. @@ -102,17 +104,17 @@ function createInBrowserNetwork(): INetwork { } friends(): { - count: number, - edges: Array<{ cursor: number, node: User, ... }>, - pageInfo: () => { - endCursor: string, - hasNextPage: boolean, - hasPreviousPage: boolean, - startCursor: string, - ... - }, - ... -} { + count: number, + edges: Array<{ cursor: number, node: User, ... }>, + pageInfo: () => { + endCursor: string, + hasNextPage: boolean, + hasPreviousPage: boolean, + startCursor: string, + ... + }, + ... + } { if (!this._friends) { this._friends = []; for (let i = 0; i < 4; i++) { @@ -146,14 +148,14 @@ function createInBrowserNetwork(): INetwork { } const userMap = new Map(); - function createUser(id: string |void) { + function createUser(id: string | void) { const user = new User(id); userMap.set(user.id, user); return user; } const root = { - node: ({ id }: {id : string | void}) => { + node: ({ id }: { id: string | void }) => { if (id == null || !userMap.has(id)) { return createUser(id); } @@ -161,10 +163,20 @@ function createInBrowserNetwork(): INetwork { }, }; - function fetchQuery(request: RequestParameters, variables: Variables): $FlowFixMe { + function fetchQuery( + request: RequestParameters, + variables: Variables + ): $FlowFixMe { return new Promise(resolve => { setTimeout(() => { - resolve(graphql({schema, source: request.text, rootValue:root, variableValues: variables})); + resolve( + graphql({ + schema, + source: request.text, + rootValue: root, + variableValues: variables, + }) + ); }, 1000 + Math.round(Math.random() * 1000)); }); } diff --git a/shells/dev/relay-app/index.js b/shells/dev/relay-app/index.js index 2da1ea7..e36824b 100644 --- a/shells/dev/relay-app/index.js +++ b/shells/dev/relay-app/index.js @@ -20,7 +20,7 @@ import './styles.css'; const roots = []; -function mountHelper(App: ((_: mixed) => React$MixedElement)) { +function mountHelper(App: (_: mixed) => React$MixedElement) { const container = document.createElement('div'); ((document.body: any): HTMLBodyElement).appendChild(container); diff --git a/shells/dev/src/devtools.js b/shells/dev/src/devtools.js index 359d19d..96b544f 100644 --- a/shells/dev/src/devtools.js +++ b/shells/dev/src/devtools.js @@ -50,7 +50,7 @@ inject('dist/app.js', () => { connect(cb) { const bridge = new Bridge({ listen(fn) { - const listener = ({data}: any) => { + const listener = ({ data }: any) => { fn(data); }; // Preserve the reference to the window we subscribe to, so we can unsubscribe from it when required. diff --git a/shells/dev/webpack.config.js b/shells/dev/webpack.config.js index 9e1241a..ed8ad86 100644 --- a/shells/dev/webpack.config.js +++ b/shells/dev/webpack.config.js @@ -44,7 +44,10 @@ const config = { resolve: { alias: { src: path.resolve(__dirname, '../../src'), - '@babel/runtime': path.resolve(__dirname, '../../node_modules/@babel/runtime'), + '@babel/runtime': path.resolve( + __dirname, + '../../node_modules/@babel/runtime' + ), }, }, plugins: [ @@ -93,7 +96,7 @@ config.output = { if (TARGET === 'local') { config.devServer = { static: { - directory:path.join(__dirname, '/'), + directory: path.join(__dirname, '/'), }, hot: true, port: 8080, diff --git a/src/__tests__/bridge-test.js b/src/__tests__/bridge-test.js index 796993c..1328382 100644 --- a/src/__tests__/bridge-test.js +++ b/src/__tests__/bridge-test.js @@ -7,7 +7,8 @@ * @flow */ -import type { WallEvent } from "../types";describe('Bridge', () => { +import type { WallEvent } from '../types'; +describe('Bridge', () => { let Bridge; beforeEach(() => { diff --git a/src/__tests__/store-test.js b/src/__tests__/store-test.js index 81d6cf2..baeac79 100644 --- a/src/__tests__/store-test.js +++ b/src/__tests__/store-test.js @@ -7,7 +7,8 @@ * @flow */ -import type { WallEvent } from "../types";describe('Store', () => { +import type { WallEvent } from '../types'; +describe('Store', () => { let Store; let Bridge; diff --git a/src/backend/EnvironmentWrapper.js b/src/backend/EnvironmentWrapper.js index ef5af52..5e996e0 100644 --- a/src/backend/EnvironmentWrapper.js +++ b/src/backend/EnvironmentWrapper.js @@ -90,19 +90,14 @@ export function attach( function flushInitialOperations() { // TODO(damassart): Make this a modular function if (pendingEventsQueue != null) { - pendingEventsQueue.forEach( - pendingEvent => { - hook.emit( - 'environment.event', - { - id: rendererID, - envName: environment.configName, - data: pendingEvent, - eventType: 'environment', - }, - ); - }, - ); + pendingEventsQueue.forEach(pendingEvent => { + hook.emit('environment.event', { + id: rendererID, + envName: environment.configName, + data: pendingEvent, + eventType: 'environment', + }); + }); pendingEventsQueue = null; } sendStoreRecords(); @@ -111,6 +106,6 @@ export function attach( return { cleanup, sendStoreRecords, - flushInitialOperations + flushInitialOperations, }; } diff --git a/src/devtools/cache.js b/src/devtools/cache.js index b10ba5d..db91970 100644 --- a/src/devtools/cache.js +++ b/src/devtools/cache.js @@ -90,7 +90,9 @@ function getEntriesForResource( if (entriesForResource === undefined) { const config = resourceConfigs.get(resource); entriesForResource = - config !== undefined && config.useWeakMap ? (new WeakMap(): $FlowFixMe) : new Map(); + config !== undefined && config.useWeakMap + ? (new WeakMap(): $FlowFixMe) + : new Map(); entries.set(resource, entriesForResource); } return entriesForResource; diff --git a/src/devtools/views/ButtonIcon.js b/src/devtools/views/ButtonIcon.js index ddf84fc..f1f94eb 100644 --- a/src/devtools/views/ButtonIcon.js +++ b/src/devtools/views/ButtonIcon.js @@ -103,7 +103,10 @@ function getPathData(type: IconType) { } } -export default function ButtonIcon({ className = '', type }: Props): React$MixedElement { +export default function ButtonIcon({ + className = '', + type, +}: Props): React$MixedElement { const pathData = getPathData(type); return ( + | $IMPORTED_TYPE$_Element<'div'> | Array> - | Array> { + | Array> { const [isOpen, setIsOpen] = useState(false); const [wasOpen, setWasOpen] = useState(isOpen); if (isOpen && !wasOpen) { @@ -77,7 +78,9 @@ export default function KeyValue({ if (Array.isArray(value)) { const hasChildren = value.length > 0; - const children: any | Array> = wasOpen + const children: + | any + | Array> = wasOpen ? value.map((innerValue, index) => ( 0; const displayName = 'Object'; - const children: Array> | Array> = wasOpen + const children: + | Array> + | Array> = wasOpen ? entries.map(([entriesName, entriesVal]) => ( : null; } diff --git a/src/devtools/views/Network/Network.js b/src/devtools/views/Network/Network.js index f3504a3..4de8784 100644 --- a/src/devtools/views/Network/Network.js +++ b/src/devtools/views/Network/Network.js @@ -93,7 +93,10 @@ function appearsInResponse(searchText: string, response: Object): boolean { return false; } -function Network(props: {| +portalContainer: mixed, currentEnvID: ?number |}): React$MixedElement | null { +function Network(props: {| + +portalContainer: mixed, + currentEnvID: ?number, +|}): React$MixedElement | null { const store = useContext(StoreContext); const [, forceUpdate] = useState({}); diff --git a/src/devtools/views/Settings/GeneralSettings.js b/src/devtools/views/Settings/GeneralSettings.js index 3b500f3..d6a7d32 100644 --- a/src/devtools/views/Settings/GeneralSettings.js +++ b/src/devtools/views/Settings/GeneralSettings.js @@ -18,13 +18,13 @@ export default function GeneralSettings(_: {||}): React$MixedElement { ); const updateDisplayDensity = useCallback( - ({currentTarget}: any) => { + ({ currentTarget }: any) => { setDisplayDensity(currentTarget.value); }, [setDisplayDensity] ); const updateTheme = useCallback( - ({currentTarget}: any) => { + ({ currentTarget }: any) => { setTheme(currentTarget.value); }, [setTheme] diff --git a/src/devtools/views/Settings/SettingsContext.js b/src/devtools/views/Settings/SettingsContext.js index 5eb869f..e6f4514 100644 --- a/src/devtools/views/Settings/SettingsContext.js +++ b/src/devtools/views/Settings/SettingsContext.js @@ -27,7 +27,9 @@ type Context = {| setTheme(value: Theme): void, |}; -const SettingsContext: $FlowFixMe = createContext(((null: any): Context)); +const SettingsContext: $FlowFixMe = createContext( + ((null: any): Context) +); SettingsContext.displayName = 'SettingsContext'; type DocumentElements = Array; diff --git a/src/devtools/views/Settings/SettingsModalContext.js b/src/devtools/views/Settings/SettingsModalContext.js index 1196b70..ea49f23 100644 --- a/src/devtools/views/Settings/SettingsModalContext.js +++ b/src/devtools/views/Settings/SettingsModalContext.js @@ -17,7 +17,9 @@ type Context = { setIsModalShowing: (value: boolean) => void, }; -const SettingsModalContext: $FlowFixMe = createContext(((null: any): Context)); +const SettingsModalContext: $FlowFixMe = createContext( + ((null: any): Context) +); SettingsModalContext.displayName = 'SettingsModalContext'; function SettingsModalContextController({ diff --git a/src/devtools/views/StoreInspector/EventLogger/AllEventsList.js b/src/devtools/views/StoreInspector/EventLogger/AllEventsList.js index 48b717b..6ed7b28 100644 --- a/src/devtools/views/StoreInspector/EventLogger/AllEventsList.js +++ b/src/devtools/views/StoreInspector/EventLogger/AllEventsList.js @@ -29,7 +29,11 @@ const networkEventNames = [ 'network.unsubscribe', ]; -function eventsAreLinked(events: any | $ReadOnlyArray, selectedEventID: any | number, index: any | number) { +function eventsAreLinked( + events: any | $ReadOnlyArray, + selectedEventID: any | number, + index: any | number +) { const currentEvent = events[index]; const selectedEvent = events[selectedEventID]; return ( @@ -81,7 +85,7 @@ function StoreEventDisplay({ events: $ReadOnlyArray, index: number, selectedEventID: number, - setSelectedEventID: (number) => void, + setSelectedEventID: number => void, |}) { return (
, @@ -22,7 +22,11 @@ export type Props = {| checked: { [string]: boolean }, |}; -function AllEventsDetails({ events, selectedEventID, setSelectedEventID }: {| +function AllEventsDetails({ + events, + selectedEventID, + setSelectedEventID, +}: {| events: $ReadOnlyArray, selectedEventID: number, setSelectedEventID: ReactSetStateFunction, diff --git a/src/devtools/views/StoreInspector/KeyValue.js b/src/devtools/views/StoreInspector/KeyValue.js index 1c8a10a..1865919 100644 --- a/src/devtools/views/StoreInspector/KeyValue.js +++ b/src/devtools/views/StoreInspector/KeyValue.js @@ -49,10 +49,10 @@ export default function KeyValue({ records, setSelectedRecordID, }: KeyValueProps): - | React.Element<"div"> + | React.Element<'div'> | Array | Array> - | Array> { + | Array> { const [isOpen, setIsOpen] = useState(false); const [wasEverOpen, setWasEverOpen] = useState(isOpen); useEffect(() => { @@ -133,7 +133,9 @@ export default function KeyValue({ if (Array.isArray(value)) { const hasChildren = value.length > 0; - const children: Array | Array> = wasEverOpen + const children: + | Array + | Array> = wasEverOpen ? value.map((innerValue, mapIndex): React.Node => ( > | Array> = wasEverOpen + const children: + | Array> + | Array> = wasEverOpen ? sortedEntries.map(([entriesName, entriesVal]) => ( ({}); - const [plusMinusCollapse, setPlusMinusCollapse] = useState<{[string]: any}>({}); + const [recordListStyles, setRecordListStyles] = useState<{ [string]: any }>( + {} + ); + const [plusMinusCollapse, setPlusMinusCollapse] = useState<{ [string]: any }>( + {} + ); if (records == null || recordsByType == null) { return
Loading...
; diff --git a/src/devtools/views/StoreInspector/Snapshot.js b/src/devtools/views/StoreInspector/Snapshot.js index 6581e84..81b4846 100644 --- a/src/devtools/views/StoreInspector/Snapshot.js +++ b/src/devtools/views/StoreInspector/Snapshot.js @@ -12,7 +12,7 @@ import RecordList from './RecordList'; import RecordDetails from './RecordDetails'; import styles from './Snapshot.css'; -import type { ReactSetStateFunction } from "react"; +import type { ReactSetStateFunction } from 'react'; export type Props = {| envSnapshotList: Object, diff --git a/src/devtools/views/StoreInspector/StoreInspector.js b/src/devtools/views/StoreInspector/StoreInspector.js index 1f5c4d2..9860f41 100644 --- a/src/devtools/views/StoreInspector/StoreInspector.js +++ b/src/devtools/views/StoreInspector/StoreInspector.js @@ -23,7 +23,7 @@ import { deepCopyFunction } from './utils'; import EventLogger from './EventLogger/EventLogger'; import { logEvent } from '../../../Logger'; import styles from './StoreInspector.css'; -import type { ReactSetStateFunction } from "react"; +import type { ReactSetStateFunction } from 'react'; export type TabID = | 'explorer' @@ -61,14 +61,19 @@ const recorderTab = { const tabs = [explorerTab, snapshotTab, optimisticTab, recorderTab]; -function FilterButtons({ checked, setChecked, isRecording, store }: {| +function FilterButtons({ + checked, + setChecked, + isRecording, + store, +}: {| checked: any | {| networkEvents: boolean, storeEvents: boolean |}, isRecording: any | boolean, setChecked: | any | ReactSetStateFunction< - any | {| networkEvents: boolean, storeEvents: boolean |}, - >, + any | {| networkEvents: boolean, storeEvents: boolean |} + >, store: any, |}) { const updateChecked = useCallback( @@ -119,7 +124,7 @@ function RecordEventsMenu({ checked: any | {| networkEvents: boolean, storeEvents: boolean |}, isRecording: boolean, setChecked: ReactSetStateFunction< - any | {| networkEvents: boolean, storeEvents: boolean |}, + any | {| networkEvents: boolean, storeEvents: boolean |} >, startRecording: () => void, stopAndClearRecording: () => void, @@ -186,8 +191,12 @@ export default function StoreInspector(props: {| [setTab] ); const [, forceUpdate] = useState({}); - const [envSnapshotList, setEnvSnapshotList] = useState<{[$FlowFixMe]: any}>({}); - const [envSnapshotListByType, setEnvSnapshotListByType] = useState<{[$FlowFixMe]: any}>({}); + const [envSnapshotList, setEnvSnapshotList] = useState<{ [$FlowFixMe]: any }>( + {} + ); + const [envSnapshotListByType, setEnvSnapshotListByType] = useState<{ + [$FlowFixMe]: any, + }>({}); const [isRecording, setIsRecording] = useState(false); const [checked, setChecked] = useState({ networkEvents: true, @@ -230,7 +239,10 @@ export default function StoreInspector(props: {| recordsArr.push(deepCopyFunction(records)); const recordsTypeArr = envSnapshotListByType[currEnvID] || []; recordsTypeArr.push(deepCopyFunction(recordsByType)); - setEnvSnapshotList({ ...envSnapshotList, [(currEnvID: $FlowFixMe)]: recordsArr }); + setEnvSnapshotList({ + ...envSnapshotList, + [(currEnvID: $FlowFixMe)]: recordsArr, + }); setEnvSnapshotListByType({ ...envSnapshotListByType, [(currEnvID: $FlowFixMe)]: recordsTypeArr, diff --git a/src/devtools/views/StoreInspector/StoreTabBar.js b/src/devtools/views/StoreInspector/StoreTabBar.js index 156afa5..e73cb4f 100644 --- a/src/devtools/views/StoreInspector/StoreTabBar.js +++ b/src/devtools/views/StoreInspector/StoreTabBar.js @@ -36,13 +36,13 @@ export default function TabBar({ selectTab, size, tabs, -}: Props): React$MixedElement{ +}: Props): React$MixedElement { if (!tabs.some(tab => tab.id === tabID)) { selectTab(tabs[0]); } const onChange = useCallback( - ({currentTarget}: any) => selectTab(currentTarget.value), + ({ currentTarget }: any) => selectTab(currentTarget.value), [selectTab] ); diff --git a/src/devtools/views/StoreInspector/utils.js b/src/devtools/views/StoreInspector/utils.js index 3e2e7e9..bee5a2d 100644 --- a/src/devtools/views/StoreInspector/utils.js +++ b/src/devtools/views/StoreInspector/utils.js @@ -10,7 +10,9 @@ import type Store from '../../store'; import type { LogEvent } from '../../../types'; -export function deepCopyFunction(inObject: any): any | Map | { ... } { +export function deepCopyFunction( + inObject: any +): any | Map | { ... } { if (typeof inObject !== 'object' || inObject === null) { return inObject; } @@ -40,7 +42,9 @@ export function deepCopyFunction(inObject: any): any | Map | { ... } } -export function serializeEventLoggerRecording(store: Store): Array<[string, mixed]> { +export function serializeEventLoggerRecording( + store: Store +): Array<[string, mixed]> { const allEvents = Array.from(store.getAllEventsMap().entries()); return (allEvents.map(entry => { const envID = entry[0]; @@ -51,7 +55,10 @@ export function serializeEventLoggerRecording(store: Store): Array<[string, mixe }): Array<[string, mixed]>); } -export function deserializeEventLoggerRecording(raw: string, store: Store): Array { +export function deserializeEventLoggerRecording( + raw: string, + store: Store +): Array { const parsedDataRecording = ((new Map(JSON.parse(raw)): any): Map< string, Array diff --git a/src/devtools/views/TabBar.js b/src/devtools/views/TabBar.js index d0dab4d..a5cc1a9 100644 --- a/src/devtools/views/TabBar.js +++ b/src/devtools/views/TabBar.js @@ -46,7 +46,7 @@ export default function TabBar({ } const onChange = useCallback( - ({currentTarget}: any) => selectTab(currentTarget.value), + ({ currentTarget }: any) => selectTab(currentTarget.value), [selectTab] ); diff --git a/src/devtools/views/context.js b/src/devtools/views/context.js index 1c82a97..63e0ff0 100644 --- a/src/devtools/views/context.js +++ b/src/devtools/views/context.js @@ -17,5 +17,7 @@ export const BridgeContext: $FlowFixMe = createContext( ); BridgeContext.displayName = 'BridgeContext'; -export const StoreContext: $FlowFixMe = createContext(((null: any): Store)); +export const StoreContext: $FlowFixMe = createContext( + ((null: any): Store) +); StoreContext.displayName = 'StoreContext'; diff --git a/src/devtools/views/portaledContent.js b/src/devtools/views/portaledContent.js index 45aa905..b04af33 100644 --- a/src/devtools/views/portaledContent.js +++ b/src/devtools/views/portaledContent.js @@ -15,9 +15,7 @@ export type Props = { portalContainer?: Element, }; -export default function portaledContent( - Component: any, -): any { +export default function portaledContent(Component: any): any { return function PortaledContent({ portalContainer, ...rest }: Props) { const children = ( diff --git a/src/hook.js b/src/hook.js index ce2a2dd..91d7326 100644 --- a/src/hook.js +++ b/src/hook.js @@ -11,8 +11,8 @@ import type { RelayEnvironment as $IMPORTED_TYPE$_RelayEnvironment, EnvironmentWrapper, EnvironmentID, -} from "src/backend/types"; -import type { RelayEnvironment, Handler } from "src/backend/types"; +} from 'src/backend/types'; +import type { RelayEnvironment, Handler } from 'src/backend/types'; /** * Install the hook on window, which is an event emitter. * Note because Chrome content scripts cannot directly modify the window object, @@ -28,8 +28,11 @@ export function installHook(target: any): DevToolsHook | null { if (target.hasOwnProperty('__RELAY_DEVTOOLS_HOOK__')) { return null; } - const listeners: {[string]: Array} = {}; - const environments = new Map(); + const listeners: { [string]: Array } = {}; + const environments = new Map< + EnvironmentID, + $IMPORTED_TYPE$_RelayEnvironment + >(); let uidCounter = 0;