├── .circleci └── config.yml ├── .eslintrc.js ├── .github ├── CONTRIBUTING.md ├── ISSUE_TEMPLATE │ ├── bug_report.yml │ └── config.yml ├── PULL_REQUEST_TEMPLATE.md └── workflows │ ├── cleanup-all-temp-trusted-branches.yml │ ├── trust-fork-pr-cleanup.yml │ └── trust-fork-pr.yml ├── .gitignore ├── .nxignore ├── .prettierignore ├── .prettierrc ├── .tool-versions ├── .yarn ├── patches │ ├── electron-webpack-npm-2.8.2-1bda600605.patch │ ├── react-hotkeys-npm-2.0.0-8e6c50bd05.patch │ └── webpack-npm-4.47.0-42e477a08c.patch └── releases │ └── yarn-4.1.1.cjs ├── .yarnrc.yml ├── LICENSE ├── README.md ├── apps ├── example-app │ ├── .gitignore │ ├── .prettierignore │ ├── App.tsx │ ├── README.md │ ├── app.json │ ├── app │ │ ├── app.tsx │ │ ├── components │ │ │ ├── Button.tsx │ │ │ ├── Icon.tsx │ │ │ ├── ListItem.tsx │ │ │ ├── ListView.tsx │ │ │ ├── Repo.tsx │ │ │ ├── Screen.tsx │ │ │ ├── Text.tsx │ │ │ └── index.ts │ │ ├── config │ │ │ ├── config.base.ts │ │ │ ├── config.dev.ts │ │ │ ├── config.prod.ts │ │ │ └── index.ts │ │ ├── devtools │ │ │ ├── ReactotronClient.ts │ │ │ ├── ReactotronClient.web.ts │ │ │ └── ReactotronConfig.ts │ │ ├── i18n │ │ │ ├── en.ts │ │ │ ├── i18n.ts │ │ │ ├── index.ts │ │ │ └── translate.ts │ │ ├── mobxStateTree │ │ │ ├── LogoStore.ts │ │ │ ├── RepoStore.ts │ │ │ ├── RootStore.ts │ │ │ ├── helpers │ │ │ │ ├── getRootStore.ts │ │ │ │ ├── setupRootStore.ts │ │ │ │ └── useStores.ts │ │ │ └── index.ts │ │ ├── navigators │ │ │ ├── AppNavigator.tsx │ │ │ ├── index.ts │ │ │ └── navigationUtilities.ts │ │ ├── redux │ │ │ ├── errorSlice.ts │ │ │ ├── index.ts │ │ │ ├── logoSlice.ts │ │ │ └── repoSlice.ts │ │ ├── screens │ │ │ ├── AsyncStorageScreen.tsx │ │ │ ├── BenchmarkingScreen.tsx │ │ │ ├── CustomCommandsScreen.tsx │ │ │ ├── ErrorGeneratorScreen.tsx │ │ │ ├── ErrorScreen │ │ │ │ ├── ErrorBoundary.tsx │ │ │ │ └── ErrorDetails.tsx │ │ │ ├── LoggingScreen.tsx │ │ │ ├── MobxStateTreeScreen.tsx │ │ │ ├── NetworkingScreen.tsx │ │ │ ├── ReduxScreen.tsx │ │ │ ├── WelcomeScreen.tsx │ │ │ └── index.ts │ │ ├── services │ │ │ └── api │ │ │ │ ├── api.ts │ │ │ │ ├── api.types.ts │ │ │ │ ├── apiProblem.test.ts │ │ │ │ ├── apiProblem.ts │ │ │ │ └── index.ts │ │ ├── theme │ │ │ ├── colors.ts │ │ │ ├── index.ts │ │ │ ├── spacing.ts │ │ │ ├── timing.ts │ │ │ └── typography.ts │ │ └── utils │ │ │ ├── crashReporting.ts │ │ │ ├── delay.ts │ │ │ ├── formatDate.ts │ │ │ ├── ignoreWarnings.ts │ │ │ ├── openLinkInBrowser.ts │ │ │ ├── storage │ │ │ ├── index.ts │ │ │ ├── storage.test.ts │ │ │ └── storage.ts │ │ │ ├── useIsMounted.ts │ │ │ └── useSafeAreaInsetsStyle.ts │ ├── assets │ │ ├── icons │ │ │ ├── caretRight@2x.png │ │ │ ├── caretRight@3x.png │ │ │ ├── ladybug.png │ │ │ ├── ladybug@2x.png │ │ │ └── ladybug@3x.png │ │ └── images │ │ │ ├── app-icon-all.png │ │ │ ├── app-icon-android-adaptive-background.png │ │ │ ├── app-icon-android-adaptive-foreground.png │ │ │ ├── app-icon-android-legacy.png │ │ │ ├── app-icon-ios.png │ │ │ ├── app-icon-web-favicon.png │ │ │ ├── logo.png │ │ │ ├── logo@2x.png │ │ │ ├── logo@3x.png │ │ │ ├── sad-face.png │ │ │ ├── sad-face@2x.png │ │ │ ├── sad-face@3x.png │ │ │ ├── splash-logo-all.png │ │ │ ├── splash-logo-android-universal.png │ │ │ ├── splash-logo-ios-mobile.png │ │ │ ├── splash-logo-ios-tablet.png │ │ │ └── splash-logo-web.png │ ├── babel.config.js │ ├── eas.json │ ├── index.js │ ├── jest.config.js │ ├── metro.config.js │ ├── package.json │ ├── plugins │ │ └── withSplashScreen.ts │ ├── react-native.config.js │ ├── test │ │ ├── i18n.test.ts │ │ ├── mockFile.ts │ │ ├── setup.ts │ │ └── test-tsconfig.json │ ├── tsconfig.json │ └── types │ │ └── lib.es5.d.ts └── reactotron-app │ ├── .gitattributes │ ├── .github │ └── ISSUE_TEMPLATE │ │ └── issue_template.md │ ├── .gitignore │ ├── .storybook │ ├── addons.js │ ├── config.js │ └── webpack.config.js │ ├── CHANGELOG.md │ ├── Gemfile │ ├── Gemfile.lock │ ├── LICENSE │ ├── README.md │ ├── entitlements.mac.plist │ ├── fastlane │ └── Fastfile │ ├── icon.icns │ ├── icon.png │ ├── package.json │ ├── project.json │ ├── scripts │ ├── build.release.js │ └── release.artifacts.js │ ├── src │ ├── main │ │ ├── index.ts │ │ ├── menu.ts │ │ └── utils.ts │ └── renderer │ │ ├── App.tsx │ │ ├── KeybindHandler.tsx │ │ ├── ReactotronBrain.tsx │ │ ├── RootModals.tsx │ │ ├── components │ │ ├── ConnectionSelector │ │ │ ├── ConnectionSelector.story.tsx │ │ │ └── index.tsx │ │ ├── Footer │ │ │ ├── Footer.story.tsx │ │ │ ├── Stateless.tsx │ │ │ └── index.tsx │ │ ├── SideBar │ │ │ ├── SideBar.story.tsx │ │ │ ├── Sidebar.tsx │ │ │ └── index.tsx │ │ └── SideBarButton │ │ │ ├── SideBarButton.story.tsx │ │ │ ├── Stateless.tsx │ │ │ └── index.tsx │ │ ├── config.ts │ │ ├── contexts │ │ ├── Layout │ │ │ ├── index.tsx │ │ │ ├── useLayout.test.ts │ │ │ └── useLayout.ts │ │ ├── Standalone │ │ │ ├── index.tsx │ │ │ ├── useStandalone.test.ts │ │ │ └── useStandalone.ts │ │ ├── index.tsx │ │ └── utility.ts │ │ ├── global.css │ │ ├── images │ │ ├── Reactotron-128.png │ │ ├── index.ts │ │ ├── storybook-logo-color.png │ │ └── storybook-logo.png │ │ ├── index.tsx │ │ ├── pages │ │ ├── customCommands │ │ │ └── index.tsx │ │ ├── help │ │ │ ├── SharedStyles.ts │ │ │ ├── components │ │ │ │ ├── AndroidDeviceHelp.tsx │ │ │ │ ├── Keybind.tsx │ │ │ │ └── KeybindGroup.tsx │ │ │ └── index.tsx │ │ ├── home │ │ │ ├── index.tsx │ │ │ └── welcome.tsx │ │ ├── reactNative │ │ │ ├── Overlay.tsx │ │ │ ├── Storybook.tsx │ │ │ └── components │ │ │ │ ├── OverlayAlignment.tsx │ │ │ │ ├── OverlayAlignmentButton.tsx │ │ │ │ ├── OverlayButton.tsx │ │ │ │ ├── OverlayLayoutType.tsx │ │ │ │ ├── OverlayMargins.tsx │ │ │ │ ├── OverlayOpacity.tsx │ │ │ │ ├── OverlayResizeMode.tsx │ │ │ │ ├── OverlayScale.tsx │ │ │ │ └── Shared.tsx │ │ ├── state │ │ │ ├── Snapshots.tsx │ │ │ └── Subscriptions.tsx │ │ └── timeline │ │ │ └── index.tsx │ │ └── util │ │ └── connectionHelpers.ts │ ├── tsconfig.json │ └── webpack.config.js ├── docs ├── _category_.json ├── contributing │ ├── _category_.json │ ├── architecture.md │ ├── ci.md │ ├── images │ │ ├── architecture-app-mobile-diagram.png │ │ ├── architecture-workspace-chart.png │ │ ├── ci-copy-fork-branch.png │ │ └── ci-tests-running.png │ ├── index.md │ ├── monorepo.md │ └── releasing.md ├── custom-commands.md ├── index.md ├── plugins │ ├── _category_.json │ ├── apisauce.md │ ├── async-storage.md │ ├── benchmark.md │ ├── images │ │ ├── apisauce │ │ │ └── apisauce.jpg │ │ ├── benchmarking │ │ │ └── benchmark-output.png │ │ ├── readme │ │ │ ├── Reactotron-128.png │ │ │ ├── Reactotron-64.png │ │ │ ├── ir_logo_500w.png │ │ │ ├── reactotron-demo-app.gif │ │ │ └── reactotron-demo-cli.gif │ │ ├── redux-saga │ │ │ ├── expanded.png │ │ │ └── simple.png │ │ ├── redux │ │ │ ├── dispatching.jpg │ │ │ ├── redux-keys-values.jpg │ │ │ └── subscriptions.jpg │ │ └── track-global-errors │ │ │ └── stack-trace.jpg │ ├── index.md │ ├── mst.md │ ├── networking.md │ ├── open-in-editor.md │ ├── overlay.md │ ├── react-native-mmkv.md │ ├── redux.md │ ├── storybook.md │ ├── track-global-errors.md │ └── track-global-logs.md ├── quick-start │ ├── _category_.json │ ├── getting-started.md │ ├── images │ │ ├── react-js │ │ │ ├── first-connect.jpg │ │ │ ├── hello-1.jpg │ │ │ ├── hello-2.jpg │ │ │ ├── installing.jpg │ │ │ ├── react-demo-js-reactotron.jpg │ │ │ ├── react-demo-js.jpg │ │ │ └── spammy.jpg │ │ └── react-native │ │ │ ├── first-connect.jpg │ │ │ ├── hello-1.jpg │ │ │ ├── hello-2.jpg │ │ │ ├── react-demo-native-reactotron.jpg │ │ │ ├── react-demo-native.jpg │ │ │ └── spammy.jpg │ ├── react-js.md │ └── react-native.md ├── tips.md └── troubleshooting.md ├── lib ├── eslint-plugin-reactotron │ ├── .babelrc │ ├── .gitignore │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── package.json │ ├── project.json │ ├── rollup.config.ts │ ├── src │ │ ├── index.ts │ │ └── rules │ │ │ └── no-tron-in-production.ts │ ├── tests │ │ └── no-tron-in-production.test.ts │ └── tsconfig.json ├── reactotron-apisauce │ ├── .babelrc │ ├── .gitignore │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── package.json │ ├── project.json │ ├── rollup.config.js │ ├── src │ │ └── index.ts │ ├── test │ │ └── plugin.test.ts │ ├── tsconfig.json │ └── wallaby.js ├── reactotron-core-client │ ├── .babelrc │ ├── .gitignore │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── package.json │ ├── project.json │ ├── rollup.config.js │ ├── src │ │ ├── client-options.ts │ │ ├── index.ts │ │ ├── plugins │ │ │ ├── api-response.ts │ │ │ ├── benchmark.ts │ │ │ ├── clear.ts │ │ │ ├── image.ts │ │ │ ├── logger.ts │ │ │ ├── repl.ts │ │ │ └── state-responses.ts │ │ ├── reactotron-core-client.ts │ │ ├── serialize.ts │ │ ├── stopwatch.ts │ │ └── validate.ts │ ├── test │ │ ├── api-response.test.ts │ │ ├── configure.test.ts │ │ ├── connect.test.ts │ │ ├── create-closing-server.ts │ │ ├── fixtures │ │ │ └── large.js │ │ ├── on-command.test.ts │ │ ├── on-connect.test.ts │ │ ├── on-disconnect.test.ts │ │ ├── plugin-benchmark.test.ts │ │ ├── plugin-clear.test.ts │ │ ├── plugin-features.test.ts │ │ ├── plugin-image.test.ts │ │ ├── plugin-interface.test.ts │ │ ├── plugin-logger.test.ts │ │ ├── plugin-on-command.test.ts │ │ ├── plugin-on-connect.test.ts │ │ ├── plugin-on-disconnect.test.ts │ │ ├── plugin-on-plugin.test.ts │ │ ├── plugin-send.test.ts │ │ ├── plugin-state-responses.test.ts │ │ ├── send.test.ts │ │ ├── serialize.test.ts │ │ ├── start-timer.test.ts │ │ └── stopwatch.test.ts │ ├── tsconfig.json │ ├── types │ │ └── reactotron.d.ts │ └── wallaby.js ├── reactotron-core-contract │ ├── .babelrc │ ├── .gitignore │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── package.json │ ├── project.json │ ├── rollup.config.js │ ├── src │ │ ├── command.ts │ │ ├── diff.ts │ │ ├── index.ts │ │ ├── log.ts │ │ ├── openInEditor.ts │ │ ├── reactotron-core-contract.ts │ │ ├── server-events.ts │ │ └── state.ts │ └── tsconfig.json ├── reactotron-core-server │ ├── .babelrc │ ├── .gitignore │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── package.json │ ├── project.json │ ├── rollup.config.js │ ├── src │ │ ├── index.ts │ │ ├── reactotron-core-server.ts │ │ ├── repair-serialization.ts │ │ └── validation.ts │ ├── test │ │ ├── configure.test.ts │ │ ├── connections.test.ts │ │ ├── send.test.ts │ │ └── started.test.ts │ └── tsconfig.json ├── reactotron-core-ui │ ├── .babelrc │ ├── .gitignore │ ├── .storybook │ │ ├── addons.js │ │ └── config.js │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── package.json │ ├── project.json │ ├── rollup.config.js │ ├── src │ │ ├── components │ │ │ ├── ActionButton │ │ │ │ ├── ActionButton.story.tsx │ │ │ │ └── index.tsx │ │ │ ├── Checkbox │ │ │ │ ├── Checkbox.story.tsx │ │ │ │ └── index.tsx │ │ │ ├── ContentView │ │ │ │ ├── ContentView.story.tsx │ │ │ │ └── index.tsx │ │ │ ├── EmptyState │ │ │ │ ├── EmptyState.story.tsx │ │ │ │ └── index.tsx │ │ │ ├── Header │ │ │ │ ├── Header.story.tsx │ │ │ │ └── index.tsx │ │ │ ├── HeaderTabButton │ │ │ │ ├── SideBarButton.story.tsx │ │ │ │ └── index.tsx │ │ │ ├── Modal │ │ │ │ ├── Modal.story.tsx │ │ │ │ └── index.tsx │ │ │ ├── RandomJoke │ │ │ │ ├── RandomJoke.tsx │ │ │ │ └── index.ts │ │ │ ├── ReactotronAppProvider │ │ │ │ └── index.tsx │ │ │ ├── TimelineCommand │ │ │ │ ├── TimelineCommand.story.tsx │ │ │ │ └── index.tsx │ │ │ ├── TimelineCommandTabButton │ │ │ │ ├── TimelineCommandTabButton.story.tsx │ │ │ │ └── index.tsx │ │ │ ├── Timestamp │ │ │ │ ├── Timestamp.story.tsx │ │ │ │ └── index.tsx │ │ │ ├── Tooltip │ │ │ │ └── index.tsx │ │ │ ├── TreeView │ │ │ │ ├── TreeView.story.tsx │ │ │ │ └── index.tsx │ │ │ └── TreeViewDiff │ │ │ │ └── index.tsx │ │ ├── contexts │ │ │ ├── CustomCommands │ │ │ │ ├── index.tsx │ │ │ │ ├── useCustomCommands.test.tsx │ │ │ │ └── useCustomCommands.ts │ │ │ ├── ReactNative │ │ │ │ ├── index.tsx │ │ │ │ ├── useOverlay.ts │ │ │ │ ├── useStorybook.test.tsx │ │ │ │ └── useStorybook.ts │ │ │ ├── Reactotron │ │ │ │ ├── index.tsx │ │ │ │ ├── useReactotron.test.ts │ │ │ │ └── useReactotron.ts │ │ │ ├── State │ │ │ │ ├── index.tsx │ │ │ │ ├── useSnapshots.test.tsx │ │ │ │ ├── useSnapshots.ts │ │ │ │ ├── useSubscriptions.test.tsx │ │ │ │ └── useSubscriptions.ts │ │ │ └── Timeline │ │ │ │ ├── index.tsx │ │ │ │ ├── useTimeline.test.ts │ │ │ │ └── useTimeline.ts │ │ ├── hooks │ │ │ ├── useColorScheme.test.tsx │ │ │ └── useColorScheme.tsx │ │ ├── index.ts │ │ ├── modals │ │ │ ├── DispatchActionModal │ │ │ │ ├── DispatchActionModal.story.tsx │ │ │ │ └── index.tsx │ │ │ ├── SnapshotRenameModal │ │ │ │ ├── SnapshotRenameModal.story.tsx │ │ │ │ └── index.tsx │ │ │ ├── SubscriptionAddModal │ │ │ │ ├── SubscriptionAddModal.story.tsx │ │ │ │ └── index.tsx │ │ │ └── TimelineFilterModal │ │ │ │ ├── TimelineFilterModal.story.tsx │ │ │ │ └── index.tsx │ │ ├── themes.ts │ │ ├── timelineCommands │ │ │ ├── ApiResponseCommand │ │ │ │ ├── ApiResponseCommand.story.tsx │ │ │ │ └── index.tsx │ │ │ ├── AsyncStorageMutationCommand │ │ │ │ ├── AsyncStorageMutationCommand.story.tsx │ │ │ │ └── index.tsx │ │ │ ├── BaseCommand.tsx │ │ │ ├── BenchmarkReportCommand │ │ │ │ ├── BenchmarkReportCommand.story.tsx │ │ │ │ └── index.tsx │ │ │ ├── ClientIntroCommand │ │ │ │ ├── ClientIntroCommand.story.tsx │ │ │ │ └── index.tsx │ │ │ ├── DisplayCommand │ │ │ │ ├── DisplayCommand.story.tsx │ │ │ │ └── index.tsx │ │ │ ├── ImageCommand │ │ │ │ ├── ImageCommand.story.tsx │ │ │ │ └── index.tsx │ │ │ ├── LogCommand │ │ │ │ ├── LogCommand.story.tsx │ │ │ │ └── index.tsx │ │ │ ├── SagaTaskCompleteCommand │ │ │ │ ├── SagaTaskCompleteCommand.story.tsx │ │ │ │ ├── Stateless.tsx │ │ │ │ └── index.tsx │ │ │ ├── StateActionCompleteCommand │ │ │ │ ├── StateActionCompleteCommand.story.tsx │ │ │ │ └── index.tsx │ │ │ ├── StateKeysResponseCommand │ │ │ │ ├── StateKeysResponseCommand.story.tsx │ │ │ │ └── index.tsx │ │ │ ├── StateValuesChangeCommand │ │ │ │ ├── StateValuesChangeCommand.story.tsx │ │ │ │ └── index.tsx │ │ │ ├── StateValuesResponseCommand │ │ │ │ ├── StateValuesResponseCommand.story.tsx │ │ │ │ └── index.tsx │ │ │ └── index.ts │ │ └── utils │ │ │ ├── api-to-curl.ts │ │ │ ├── api-to-markdown.ts │ │ │ ├── escape-regex.test.ts │ │ │ ├── escape-regex.ts │ │ │ ├── filterCommands │ │ │ ├── filterCommands.test.ts │ │ │ └── index.ts │ │ │ ├── isShallow.ts │ │ │ ├── makeTable.tsx │ │ │ ├── pad.ts │ │ │ └── repair-serialization.ts │ └── tsconfig.json ├── reactotron-mst │ ├── .babelrc │ ├── .gitignore │ ├── CHANGELOG.md │ ├── LICENSE │ ├── package.json │ ├── project.json │ ├── rollup.config.ts │ ├── src │ │ ├── index.ts │ │ └── reactotron-mst.ts │ ├── test │ │ ├── actions.test.ts │ │ ├── backup.test.ts │ │ ├── dispatch-action.test.ts │ │ ├── filter.test.ts │ │ ├── fixtures │ │ │ ├── command.ts │ │ │ ├── create-mst-plugin.ts │ │ │ ├── index.ts │ │ │ ├── test-company-model.ts │ │ │ └── test-user-model.ts │ │ ├── helpers │ │ │ └── delay.ts │ │ ├── mocks │ │ │ └── create-mock-reactotron.ts │ │ ├── plugin-interface.test.ts │ │ ├── request-keys.test.ts │ │ ├── request-values.test.ts │ │ ├── restore.test.ts │ │ ├── sanity.test.ts │ │ └── subscribe.test.ts │ └── tsconfig.json ├── reactotron-react-js │ ├── .babelrc │ ├── .gitignore │ ├── .prettierignore │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── package.json │ ├── project.json │ ├── rollup.config.js │ ├── src │ │ ├── index.ts │ │ └── plugins │ │ │ └── track-global-errors.ts │ ├── test │ │ └── replaceme.test.ts │ ├── tsconfig.json │ └── wallaby.js ├── reactotron-react-native-mmkv │ ├── .babelrc │ ├── .gitignore │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── package.json │ ├── project.json │ ├── rollup.config.ts │ ├── src │ │ ├── index.ts │ │ └── reactotron-react-native-mmkv.ts │ └── tsconfig.json ├── reactotron-react-native │ ├── .babelrc │ ├── .gitignore │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── package.json │ ├── project.json │ ├── rollup.config.js │ ├── src │ │ ├── helpers │ │ │ ├── getReactNativeDimensions.test.ts │ │ │ ├── getReactNativeDimensions.ts │ │ │ ├── getReactNativeDimensionsWithDimensions.ts │ │ │ ├── getReactNativePlatformConstants.ts │ │ │ ├── getReactNativeVersion.test.ts │ │ │ ├── getReactNativeVersion.ts │ │ │ ├── getReactNativeVersionWithModules.ts │ │ │ ├── parseErrorStack.ts │ │ │ ├── parseURL.test.ts │ │ │ ├── parseURL.ts │ │ │ └── symbolicateStackTrace.ts │ │ ├── index.ts │ │ ├── plugins │ │ │ ├── asyncStorage.ts │ │ │ ├── devTools.ts │ │ │ ├── networking.ts │ │ │ ├── openInEditor.ts │ │ │ ├── overlay │ │ │ │ ├── index.tsx │ │ │ │ └── overlay.tsx │ │ │ ├── storybook │ │ │ │ ├── index.tsx │ │ │ │ └── storybook.tsx │ │ │ ├── trackGlobalErrors.ts │ │ │ └── trackGlobalLogs.ts │ │ └── reactotron-react-native.ts │ ├── tsconfig.json │ └── wallaby.js └── reactotron-redux │ ├── .babelrc │ ├── .gitignore │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── package.json │ ├── project.json │ ├── renovate.json │ ├── rollup.config.js │ ├── src │ ├── commandHandler.test.ts │ ├── commandHandler.ts │ ├── customDispatch.test.ts │ ├── customDispatch.ts │ ├── enhancer.test.ts │ ├── enhancer.ts │ ├── helpers │ │ ├── pathObject.test.ts │ │ ├── pathObject.ts │ │ ├── stateCleaner.test.ts │ │ └── stateCleaner.ts │ ├── index.ts │ ├── pluginConfig.ts │ ├── reducer.test.ts │ ├── reducer.ts │ ├── sendAction.test.ts │ ├── sendAction.ts │ ├── subscriptionsHandler.test.ts │ ├── subscriptionsHandler.ts │ └── testHelpers.ts │ ├── tsconfig.json │ └── wallaby.js ├── nx.json ├── package.json ├── scripts ├── clean.sh ├── copy-prettier-ignore.mjs ├── generate-plugin.mjs ├── git-clone-fork-to-trusted-branch.sh ├── install-workspace-packages-in-target.mjs ├── package.validate.mjs ├── postinstall.sh ├── release.artifacts.mjs ├── release.tags.push.mjs ├── reset.sh ├── template │ ├── .babelrc │ ├── .gitignore │ ├── LICENSE │ ├── README.md │ ├── package.json │ ├── project.json │ ├── rollup.config.ts │ ├── src │ │ ├── index.ts │ │ └── reactotron-template.ts │ └── tsconfig.json └── tools │ ├── git.mjs │ ├── path.mjs │ └── workspace.mjs ├── tsconfig.base.json ├── types └── react-native │ └── Libraries │ ├── Core │ ├── Devtools │ │ └── parseHermesStack.d.ts │ └── NativeExceptionsManager.d.ts │ ├── LogBox │ ├── Data │ │ └── parseLogBoxLog.d.ts │ └── LogBox.d.ts │ └── NativeModules │ └── specs │ └── NativeDevMenu.d.ts └── yarn.lock /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing Guide 2 | 3 | Our current contributing guide can be found here: https://docs.infinite.red/reactotron/contributing/ 4 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yml: -------------------------------------------------------------------------------- 1 | name: Bug report 2 | description: For issues with running reactotron on your computer 3 | labels: ["bug"] 4 | body: 5 | - type: markdown 6 | attributes: 7 | value: > 8 | Before creating a **bug report**, please check the following: 9 | * Ensure you're running the latest version release of both the Reactotron app and any Reactotron npm packages you are using. 10 | * Ensure there isn't an existing issue for your bug. If there is, leave a comment on the existing issue. 11 | 12 | If you're unsure whether you've hit a bug, check out the #react-native and #reactotron channels in our [Slack Community](https://community.infinite.red). 13 | 14 | - type: textarea 15 | attributes: 16 | label: Describe the bug 17 | description: Also include a description of how to reproduce the bug 18 | validations: 19 | required: true 20 | 21 | - type: input 22 | id: version 23 | attributes: 24 | label: Reactotron version 25 | description: If you're not on release, provide the commit hash 26 | placeholder: 3.5.1 27 | validations: 28 | required: true 29 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Discussions 4 | url: https://github.com/infinitered/reactotron/discussions 5 | about: For questions and discussion about Reactotron 6 | - name: Slack Community 7 | url: https://community.infinite.red/ 8 | about: Check out our community for more real-time discussion 9 | - name: Twitter Community 10 | url: https://twitter.com/i/communities/1509407040095068166 11 | about: We post news, tips, requests for help, and other discussions. 12 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ## Please verify the following: 2 | 3 | - [ ] `yarn build-and-test:local` passes 4 | - [ ] I have added tests for any new features, if relevant 5 | - [ ] `README.md` (or relevant documentation) has been updated with your changes 6 | 7 | ## Describe your PR 8 | -------------------------------------------------------------------------------- /.nxignore: -------------------------------------------------------------------------------- 1 | scripts/template 2 | apps/example-app -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | **/.vscode 2 | **/android 3 | **/build 4 | **/compiled 5 | **/dist 6 | **/ios 7 | **/package.json 8 | **/release 9 | **/CHANGELOG.md 10 | 11 | /.nx/cache -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 100, 3 | "semi": false, 4 | "singleQuote": false, 5 | "trailingComma": "es5" 6 | } 7 | -------------------------------------------------------------------------------- /.tool-versions: -------------------------------------------------------------------------------- 1 | nodejs 21.6.2 2 | -------------------------------------------------------------------------------- /.yarn/patches/electron-webpack-npm-2.8.2-1bda600605.patch: -------------------------------------------------------------------------------- 1 | diff --git a/out/main.js b/out/main.js 2 | index 91a37868f883d36ccd2565eb32d1b50ef52b6266..983c1b324d34d89cb3033f09d0d3d5872963ed13 100644 3 | --- a/out/main.js 4 | +++ b/out/main.js 5 | @@ -217,7 +217,7 @@ class WebpackConfigurator { 6 | this.rules = []; 7 | this.plugins = []; // js must be first - e.g. iView has two files loading-bar.js and loading-bar.vue - when we require "loading-bar", js file must be resolved and not vue 8 | 9 | - this.extensions = [".js", ".json", ".node"]; 10 | + this.extensions = [".ts", ".tsx", ".js", ".json", ".node"]; 11 | this._electronVersion = null; 12 | this.entryFiles = []; 13 | 14 | diff --git a/out/targets/BaseTarget.js b/out/targets/BaseTarget.js 15 | index e4c6b00396be2326f03fe8d6dbe55bec55c77be3..3b485d5de154f86251b1a85514f4c25a26f36072 100644 16 | --- a/out/targets/BaseTarget.js 17 | +++ b/out/targets/BaseTarget.js 18 | @@ -95,7 +95,7 @@ class BaseTarget { 19 | } 20 | 21 | rules.push({ 22 | - test: /\.js$/, 23 | + test: /\.[tj]sx?$/, 24 | exclude: /(node_modules|bower_components)/, 25 | use: babelLoader 26 | }, { 27 | -------------------------------------------------------------------------------- /.yarn/patches/react-hotkeys-npm-2.0.0-8e6c50bd05.patch: -------------------------------------------------------------------------------- 1 | diff --git a/index.d.ts b/index.d.ts 2 | index 9760ab72bd6de4f79abcfbbf7cf24054f9ba3ab4..7446f7714ab855319d5f4e6ace8ebb0471b2f7d8 100644 3 | --- a/index.d.ts 4 | +++ b/index.d.ts 5 | @@ -8,12 +8,12 @@ export type KeyName = string; 6 | export type KeyEventName = 'keyup' | 'keydown' | 'keypress'; 7 | 8 | export interface KeyMapOptions { 9 | - sequence: MouseTrapKeySequence; 10 | + sequence?: MouseTrapKeySequence; 11 | action: KeyEventName; 12 | } 13 | 14 | export interface ExtendedKeyMapOptions extends KeyMapOptions { 15 | - sequences: Array | Array; 16 | + sequences?: Array | Array; 17 | name?: string; 18 | group?: string; 19 | description?: string; 20 | -------------------------------------------------------------------------------- /.yarnrc.yml: -------------------------------------------------------------------------------- 1 | compressionLevel: mixed 2 | 3 | enableGlobalCache: false 4 | 5 | nodeLinker: node-modules 6 | # allow NPM_TOKEN env to be set, but provide '' as fallback. This allows CI to publish packages, but not require env var. 7 | # See https://yarnpkg.com/configuration/yarnrc 8 | npmAuthToken: "${NPM_TOKEN-}" 9 | 10 | npmPublishAccess: public 11 | 12 | yarnPath: .yarn/releases/yarn-4.1.1.cjs 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 - 3016 Infinite Red LLC. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /apps/example-app/.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | ios 3 | android 4 | .vscode 5 | ignite/ignite.json 6 | package.json 7 | -------------------------------------------------------------------------------- /apps/example-app/App.tsx: -------------------------------------------------------------------------------- 1 | import App from "./app/app" 2 | import React from "react" 3 | import * as SplashScreen from "expo-splash-screen" 4 | 5 | SplashScreen.preventAutoHideAsync() 6 | 7 | function IgniteApp() { 8 | return 9 | } 10 | 11 | export default IgniteApp 12 | -------------------------------------------------------------------------------- /apps/example-app/README.md: -------------------------------------------------------------------------------- 1 | # Welcome to the Reactotron Example App 2 | 3 | The sole purpose of this app is to aid in developing Reactotron. It contains an example configuration and code for exercising the functionality of Reactotron's packages. 4 | 5 | The example app was generated with [Ignite](https://github.com/infinitered/ignite); the boilerplate that [Infinite Red](https://infinite.red) uses as a way to test bleeding-edge changes to our React Native stack. 6 | 7 | ## Quick Start 8 | 9 | :::info 10 | Before you start, run `yarn` in the root directory of the repo to make sure all of the dependencies have been installed successfully. 11 | ::: 12 | 13 | 1. From the parent directory, run `yarn build && yarn start` This will build the latest version of Reactotron and open it. 14 | 2. From the parent directory, run `yarn start:example` or inside of example app directory `yarn start`. (Check the example app's `package.json` for additional options.) 15 | 3. Select the host platform you'd like to build for. 16 | 4. Once the build has completed, there should be a connection on the home screen of Reactotron from the example app. 17 | -------------------------------------------------------------------------------- /apps/example-app/app/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./Button" 2 | export * from "./Icon" 3 | export * from "./ListItem" 4 | export * from "./ListView" 5 | export * from "./Screen" 6 | export * from "./Text" 7 | -------------------------------------------------------------------------------- /apps/example-app/app/config/config.base.ts: -------------------------------------------------------------------------------- 1 | export interface ConfigBaseProps { 2 | persistNavigation: "always" | "dev" | "prod" | "never" 3 | catchErrors: "always" | "dev" | "prod" | "never" 4 | exitRoutes: string[] 5 | } 6 | 7 | export type PersistNavigationConfig = ConfigBaseProps["persistNavigation"] 8 | 9 | const BaseConfig: ConfigBaseProps = { 10 | // This feature is particularly useful in development mode, but 11 | // can be used in production as well if you prefer. 12 | persistNavigation: "dev", 13 | 14 | /** 15 | * Only enable if we're catching errors in the right environment 16 | */ 17 | catchErrors: "always", 18 | 19 | /** 20 | * This is a list of all the route names that will exit the app if the back button 21 | * is pressed while in that screen. Only affects Android. 22 | */ 23 | exitRoutes: ["Welcome"], 24 | } 25 | 26 | export default BaseConfig 27 | -------------------------------------------------------------------------------- /apps/example-app/app/config/config.dev.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * These are configuration settings for the dev environment. 3 | * 4 | * Do not include API secrets in this file or anywhere in your JS. 5 | * 6 | * https://reactnative.dev/docs/security#storing-sensitive-info 7 | */ 8 | export default { 9 | API_URL: "https://api.rss2json.com/v1/", 10 | } 11 | -------------------------------------------------------------------------------- /apps/example-app/app/config/config.prod.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * These are configuration settings for the production environment. 3 | * 4 | * Do not include API secrets in this file or anywhere in your JS. 5 | * 6 | * https://reactnative.dev/docs/security#storing-sensitive-info 7 | */ 8 | export default { 9 | API_URL: "CHANGEME", 10 | } 11 | -------------------------------------------------------------------------------- /apps/example-app/app/config/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This file imports configuration objects from either the config.dev.js file 3 | * or the config.prod.js file depending on whether we are in __DEV__ or not. 4 | * 5 | * Note that we do not gitignore these files. Unlike on web servers, just because 6 | * these are not checked into your repo doesn't mean that they are secure. 7 | * In fact, you're shipping a JavaScript bundle with every 8 | * config variable in plain text. Anyone who downloads your app can easily 9 | * extract them. 10 | * 11 | * If you doubt this, just bundle your app, and then go look at the bundle and 12 | * search it for one of your config variable values. You'll find it there. 13 | * 14 | * Read more here: https://reactnative.dev/docs/security#storing-sensitive-info 15 | */ 16 | import BaseConfig from "./config.base" 17 | import ProdConfig from "./config.prod" 18 | import DevConfig from "./config.dev" 19 | 20 | let ExtraConfig = ProdConfig 21 | 22 | if (__DEV__) { 23 | ExtraConfig = DevConfig 24 | } 25 | 26 | const Config = { ...BaseConfig, ...ExtraConfig } 27 | 28 | export default Config 29 | -------------------------------------------------------------------------------- /apps/example-app/app/devtools/ReactotronClient.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is loaded in React Native and exports the RN version 3 | * of Reactotron's client. 4 | * 5 | * Web is loaded from ReactotronClient.web.ts. 6 | */ 7 | import Reactotron from "reactotron-react-native" 8 | export { Reactotron } 9 | -------------------------------------------------------------------------------- /apps/example-app/app/devtools/ReactotronClient.web.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is loaded in web and exports the React.js version 3 | * of Reactotron's client. 4 | * 5 | * React Native is loaded from ReactotronClient.ts. 6 | * 7 | * If your project does not need web support, you can delete this file and 8 | * remove reactotron-react-js from your package.json dependencies. 9 | */ 10 | import Reactotron from "reactotron-react-js" 11 | export { Reactotron } 12 | -------------------------------------------------------------------------------- /apps/example-app/app/i18n/index.ts: -------------------------------------------------------------------------------- 1 | import "./i18n" 2 | export * from "./i18n" 3 | export * from "./translate" 4 | -------------------------------------------------------------------------------- /apps/example-app/app/i18n/translate.ts: -------------------------------------------------------------------------------- 1 | import i18n from "i18n-js" 2 | import { TxKeyPath } from "./i18n" 3 | 4 | /** 5 | * Translates text. 6 | * 7 | * @param key The i18n key. 8 | * @param options The i18n options. 9 | * @returns The translated text. 10 | * 11 | * @example 12 | * Translations: 13 | * 14 | * ```en.ts 15 | * { 16 | * "hello": "Hello, {{name}}!" 17 | * } 18 | * ``` 19 | * 20 | * Usage: 21 | * ```ts 22 | * import { translate } from "i18n-js" 23 | * 24 | * translate("common.ok", { name: "world" }) 25 | * // => "Hello world!" 26 | * ``` 27 | */ 28 | export function translate(key: TxKeyPath, options?: i18n.TranslateOptions) { 29 | return i18n.t(key, options) 30 | } 31 | -------------------------------------------------------------------------------- /apps/example-app/app/mobxStateTree/LogoStore.ts: -------------------------------------------------------------------------------- 1 | import { Instance, SnapshotOut, types } from "mobx-state-tree" 2 | 3 | export const LogoStoreModel = types 4 | .model("LogoStore") 5 | .props({ 6 | size: types.optional(types.number, 80), 7 | speed: types.optional(types.number, 25), 8 | }) 9 | .actions((store) => ({ 10 | faster: () => { 11 | store.speed = 10 12 | }, 13 | slower: () => { 14 | store.speed = 50 15 | }, 16 | bigger: () => { 17 | store.size = 140 18 | }, 19 | smaller: () => { 20 | store.size = 40 21 | }, 22 | reset: () => { 23 | store.size = 80 24 | store.speed = 25 25 | }, 26 | })) 27 | 28 | export interface LogoStore extends Instance {} 29 | export interface LogoStoreSnapshot extends SnapshotOut {} 30 | -------------------------------------------------------------------------------- /apps/example-app/app/mobxStateTree/RootStore.ts: -------------------------------------------------------------------------------- 1 | import { Instance, SnapshotOut, types } from "mobx-state-tree" 2 | import { LogoStoreModel } from "./LogoStore" 3 | import { RepoStoreModel } from "./RepoStore" 4 | 5 | /** 6 | * A RootStore model. 7 | */ 8 | export const RootStoreModel = types.model("RootStore").props({ 9 | repo: types.optional(RepoStoreModel, {}), 10 | logo: types.optional(LogoStoreModel, {}), 11 | }) 12 | 13 | /** 14 | * The RootStore instance. 15 | */ 16 | export interface RootStore extends Instance {} 17 | /** 18 | * The data of a RootStore. 19 | */ 20 | export interface RootStoreSnapshot extends SnapshotOut {} 21 | -------------------------------------------------------------------------------- /apps/example-app/app/mobxStateTree/helpers/getRootStore.ts: -------------------------------------------------------------------------------- 1 | import { getRoot, IStateTreeNode } from "mobx-state-tree" 2 | import { RootStore, RootStoreModel } from "../RootStore" 3 | 4 | /** 5 | * Returns a RootStore object in strongly typed way 6 | * for stores to access other stores. 7 | */ 8 | export const getRootStore = (self: IStateTreeNode): RootStore => { 9 | return getRoot(self) 10 | } 11 | -------------------------------------------------------------------------------- /apps/example-app/app/mobxStateTree/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./RootStore" 2 | export * from "./helpers/getRootStore" 3 | export * from "./helpers/useStores" 4 | export * from "./helpers/setupRootStore" 5 | -------------------------------------------------------------------------------- /apps/example-app/app/navigators/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./AppNavigator" 2 | export * from "./navigationUtilities" 3 | // export other navigators from here 4 | -------------------------------------------------------------------------------- /apps/example-app/app/redux/index.ts: -------------------------------------------------------------------------------- 1 | import { configureStore } from "@reduxjs/toolkit" 2 | import type { GetDefaultEnhancers } from "@reduxjs/toolkit/dist/getDefaultEnhancers" 3 | import logoReducer from "../redux/logoSlice" 4 | import repoReducer from "../redux/repoSlice" 5 | import errorReducer from "../redux/errorSlice" 6 | 7 | const createEnhancers = (getDefaultEnhancers: GetDefaultEnhancers) => { 8 | if (__DEV__) { 9 | const reactotron = require("../devtools/ReactotronConfig").default 10 | return getDefaultEnhancers().concat(reactotron.createEnhancer()) 11 | } else { 12 | return getDefaultEnhancers() 13 | } 14 | } 15 | 16 | export const store = configureStore({ 17 | reducer: { 18 | logo: logoReducer, 19 | repo: repoReducer, 20 | error: errorReducer, 21 | }, 22 | enhancers: createEnhancers, 23 | }) 24 | 25 | export type RootState = ReturnType 26 | export type AppDispatch = typeof store.dispatch 27 | -------------------------------------------------------------------------------- /apps/example-app/app/redux/logoSlice.ts: -------------------------------------------------------------------------------- 1 | import { type PayloadAction, createSlice } from "@reduxjs/toolkit" 2 | 3 | export interface LogoState { 4 | size: number 5 | speed: number 6 | } 7 | 8 | const initialState: LogoState = { 9 | size: 80, 10 | speed: 25, 11 | } 12 | 13 | const logoSlice = createSlice({ 14 | name: "logo", 15 | initialState, 16 | reducers: { 17 | changeSpeed: (store, action: PayloadAction) => { 18 | store.speed = action.payload 19 | }, 20 | changeSize: (store, action: PayloadAction) => { 21 | store.size = action.payload 22 | }, 23 | faster: (store) => { 24 | store.speed = 10 25 | }, 26 | slower: (store) => { 27 | store.speed = 50 28 | }, 29 | bigger: (store) => { 30 | store.size = 140 31 | }, 32 | smaller: (store) => { 33 | store.size = 40 34 | }, 35 | reset: (store) => { 36 | store.size = 80 37 | store.speed = 25 38 | }, 39 | }, 40 | }) 41 | 42 | export const { changeSize, changeSpeed, faster, slower, bigger, smaller, reset } = logoSlice.actions 43 | export default logoSlice.reducer 44 | -------------------------------------------------------------------------------- /apps/example-app/app/screens/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./WelcomeScreen" 2 | export * from "./LoggingScreen" 3 | export * from "./NetworkingScreen" 4 | export * from "./BenchmarkingScreen" 5 | export * from "./CustomCommandsScreen" 6 | export * from "./MobxStateTreeScreen" 7 | export * from "./ReduxScreen" 8 | export * from "./ErrorGeneratorScreen" 9 | export * from "./AsyncStorageScreen" 10 | 11 | export * from "./ErrorScreen/ErrorBoundary" 12 | // export other screens here 13 | -------------------------------------------------------------------------------- /apps/example-app/app/services/api/api.types.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * These types indicate the shape of the data you expect to receive from your 3 | * API endpoint, assuming it's a JSON object like we have. 4 | */ 5 | export interface EpisodeItem { 6 | title: string 7 | pubDate: string 8 | link: string 9 | guid: string 10 | author: string 11 | thumbnail: string 12 | description: string 13 | content: string 14 | enclosure: { 15 | link: string 16 | type: string 17 | length: number 18 | duration: number 19 | rating: { scheme: string; value: string } 20 | } 21 | categories: string[] 22 | } 23 | 24 | export interface ApiFeedResponse { 25 | status: string 26 | feed: { 27 | url: string 28 | title: string 29 | link: string 30 | author: string 31 | description: string 32 | image: string 33 | } 34 | items: EpisodeItem[] 35 | } 36 | 37 | /** 38 | * The options used to configure apisauce. 39 | */ 40 | export interface ApiConfig { 41 | /** 42 | * The URL of the api. 43 | */ 44 | url: string 45 | 46 | /** 47 | * Milliseconds before we timeout the request. 48 | */ 49 | timeout: number 50 | } 51 | -------------------------------------------------------------------------------- /apps/example-app/app/services/api/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./api" 2 | export * from "./api.types" 3 | -------------------------------------------------------------------------------- /apps/example-app/app/theme/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./colors" 2 | export * from "./spacing" 3 | export * from "./typography" 4 | export * from "./timing" 5 | -------------------------------------------------------------------------------- /apps/example-app/app/theme/spacing.ts: -------------------------------------------------------------------------------- 1 | /** 2 | Use these spacings for margins/paddings and other whitespace throughout your app. 3 | */ 4 | export const spacing = { 5 | xxxs: 2, 6 | xxs: 4, 7 | xs: 8, 8 | sm: 12, 9 | md: 16, 10 | lg: 24, 11 | xl: 32, 12 | xxl: 48, 13 | xxxl: 64, 14 | } as const 15 | 16 | export type Spacing = keyof typeof spacing 17 | -------------------------------------------------------------------------------- /apps/example-app/app/theme/timing.ts: -------------------------------------------------------------------------------- 1 | export const timing = { 2 | /** 3 | * The duration (ms) for quick animations. 4 | */ 5 | quick: 300, 6 | } 7 | -------------------------------------------------------------------------------- /apps/example-app/app/utils/delay.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * A "modern" sleep statement. 3 | * 4 | * @param ms The number of milliseconds to wait. 5 | */ 6 | export const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)) 7 | -------------------------------------------------------------------------------- /apps/example-app/app/utils/formatDate.ts: -------------------------------------------------------------------------------- 1 | // Note the syntax of these imports from the date-fns library. 2 | // If you import with the syntax: import { format } from "date-fns" the ENTIRE library 3 | // will be included in your production bundle (even if you only use one function). 4 | // This is because react-native does not support tree-shaking. 5 | import type { Locale } from "date-fns" 6 | import format from "date-fns/format" 7 | import parseISO from "date-fns/parseISO" 8 | import en from "date-fns/locale/en-US" 9 | 10 | type Options = Parameters[2] 11 | 12 | const getLocale = (): Locale => { 13 | return en 14 | } 15 | 16 | export const formatDate = (date: string, dateFormat?: string, options?: Options) => { 17 | const locale = getLocale() 18 | const dateOptions = { 19 | ...options, 20 | locale, 21 | } 22 | return format(parseISO(date), dateFormat ?? "MMM dd, yyyy", dateOptions) 23 | } 24 | -------------------------------------------------------------------------------- /apps/example-app/app/utils/ignoreWarnings.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Ignore some yellowbox warnings. Some of these are for deprecated functions 3 | * that we haven't gotten around to replacing yet. 4 | */ 5 | import { LogBox } from "react-native" 6 | 7 | // prettier-ignore 8 | LogBox.ignoreLogs([ 9 | "Require cycle:", 10 | ]) 11 | -------------------------------------------------------------------------------- /apps/example-app/app/utils/openLinkInBrowser.ts: -------------------------------------------------------------------------------- 1 | import { Linking } from "react-native" 2 | 3 | /** 4 | * Helper for opening a give URL in an external browser. 5 | */ 6 | export function openLinkInBrowser(url: string) { 7 | Linking.canOpenURL(url).then((canOpen) => canOpen && Linking.openURL(url)) 8 | } 9 | -------------------------------------------------------------------------------- /apps/example-app/app/utils/storage/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./storage" 2 | -------------------------------------------------------------------------------- /apps/example-app/app/utils/useIsMounted.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useCallback, useRef } from "react" 2 | 3 | export function useIsMounted() { 4 | const isMounted = useRef(false) 5 | 6 | useEffect(() => { 7 | isMounted.current = true 8 | 9 | return () => { 10 | isMounted.current = false 11 | } 12 | }, []) 13 | 14 | return useCallback(() => isMounted.current, []) 15 | } 16 | -------------------------------------------------------------------------------- /apps/example-app/assets/icons/caretRight@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/example-app/assets/icons/caretRight@2x.png -------------------------------------------------------------------------------- /apps/example-app/assets/icons/caretRight@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/example-app/assets/icons/caretRight@3x.png -------------------------------------------------------------------------------- /apps/example-app/assets/icons/ladybug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/example-app/assets/icons/ladybug.png -------------------------------------------------------------------------------- /apps/example-app/assets/icons/ladybug@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/example-app/assets/icons/ladybug@2x.png -------------------------------------------------------------------------------- /apps/example-app/assets/icons/ladybug@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/example-app/assets/icons/ladybug@3x.png -------------------------------------------------------------------------------- /apps/example-app/assets/images/app-icon-all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/example-app/assets/images/app-icon-all.png -------------------------------------------------------------------------------- /apps/example-app/assets/images/app-icon-android-adaptive-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/example-app/assets/images/app-icon-android-adaptive-background.png -------------------------------------------------------------------------------- /apps/example-app/assets/images/app-icon-android-adaptive-foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/example-app/assets/images/app-icon-android-adaptive-foreground.png -------------------------------------------------------------------------------- /apps/example-app/assets/images/app-icon-android-legacy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/example-app/assets/images/app-icon-android-legacy.png -------------------------------------------------------------------------------- /apps/example-app/assets/images/app-icon-ios.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/example-app/assets/images/app-icon-ios.png -------------------------------------------------------------------------------- /apps/example-app/assets/images/app-icon-web-favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/example-app/assets/images/app-icon-web-favicon.png -------------------------------------------------------------------------------- /apps/example-app/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/example-app/assets/images/logo.png -------------------------------------------------------------------------------- /apps/example-app/assets/images/logo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/example-app/assets/images/logo@2x.png -------------------------------------------------------------------------------- /apps/example-app/assets/images/logo@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/example-app/assets/images/logo@3x.png -------------------------------------------------------------------------------- /apps/example-app/assets/images/sad-face.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/example-app/assets/images/sad-face.png -------------------------------------------------------------------------------- /apps/example-app/assets/images/sad-face@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/example-app/assets/images/sad-face@2x.png -------------------------------------------------------------------------------- /apps/example-app/assets/images/sad-face@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/example-app/assets/images/sad-face@3x.png -------------------------------------------------------------------------------- /apps/example-app/assets/images/splash-logo-all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/example-app/assets/images/splash-logo-all.png -------------------------------------------------------------------------------- /apps/example-app/assets/images/splash-logo-android-universal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/example-app/assets/images/splash-logo-android-universal.png -------------------------------------------------------------------------------- /apps/example-app/assets/images/splash-logo-ios-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/example-app/assets/images/splash-logo-ios-mobile.png -------------------------------------------------------------------------------- /apps/example-app/assets/images/splash-logo-ios-tablet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/example-app/assets/images/splash-logo-ios-tablet.png -------------------------------------------------------------------------------- /apps/example-app/assets/images/splash-logo-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/example-app/assets/images/splash-logo-web.png -------------------------------------------------------------------------------- /apps/example-app/babel.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('@babel/core').TransformOptions['plugins']} */ 2 | const plugins = [] 3 | 4 | /** @type {import('@babel/core').TransformOptions} */ 5 | module.exports = function (api) { 6 | api.cache(true) 7 | return { 8 | assumptions: { 9 | setPublicClassFields: true, 10 | privateFieldsAsSymbols: true, 11 | }, 12 | presets: ["babel-preset-expo"], 13 | env: { 14 | production: {}, 15 | }, 16 | plugins, 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /apps/example-app/eas.json: -------------------------------------------------------------------------------- 1 | { 2 | "cli": { 3 | "version": ">= 3.15.1" 4 | }, 5 | "build": { 6 | "development": { 7 | "extends": "production", 8 | "distribution": "internal", 9 | "android": { 10 | "gradleCommand": ":app:assembleDebug" 11 | }, 12 | "ios": { 13 | "buildConfiguration": "Debug", 14 | "simulator": true 15 | } 16 | }, 17 | "development:device": { 18 | "extends": "development", 19 | "distribution": "internal", 20 | "ios": { 21 | "buildConfiguration": "Debug", 22 | "simulator": false 23 | } 24 | }, 25 | "preview": { 26 | "extends": "production", 27 | "distribution": "internal", 28 | "ios": { "simulator": true }, 29 | "android": { "buildType": "apk" } 30 | }, 31 | "preview:device": { 32 | "extends": "preview", 33 | "ios": { "simulator": false } 34 | }, 35 | "production": {} 36 | }, 37 | "submit": { 38 | "production": {} 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /apps/example-app/index.js: -------------------------------------------------------------------------------- 1 | import { registerRootComponent } from "expo" 2 | 3 | import App from "./App" 4 | 5 | // registerRootComponent calls AppRegistry.registerComponent('main', () => App); 6 | // It also ensures that whether you load the app in Expo Go or in a native build, 7 | // the environment is set up appropriately 8 | registerRootComponent(App) 9 | -------------------------------------------------------------------------------- /apps/example-app/jest.config.js: -------------------------------------------------------------------------------- 1 | const { defaults: tsjPreset } = require("ts-jest/presets") 2 | 3 | /** @type {import('@jest/types').Config.ProjectConfig} */ 4 | module.exports = { 5 | ...tsjPreset, 6 | preset: "jest-expo", 7 | transformIgnorePatterns: [ 8 | "/node_modules/(react-clone-referenced-element|@react-native-community|react-navigation|@react-navigation/.*|@unimodules/.*|native-base|react-native-code-push)", 9 | "jest-runner", 10 | ], 11 | testPathIgnorePatterns: ["/node_modules/", "/.maestro/", "@react-native"], 12 | testEnvironment: "jsdom", 13 | setupFiles: ["/test/setup.ts"], 14 | transform: { 15 | "^.+\\.test.tsx?$": [ 16 | "ts-jest", 17 | { 18 | tsconfig: "/test/test-tsconfig.json", 19 | }, 20 | ], 21 | }, 22 | } 23 | -------------------------------------------------------------------------------- /apps/example-app/metro.config.js: -------------------------------------------------------------------------------- 1 | // Learn more https://docs.expo.io/guides/customizing-metro 2 | const { getDefaultConfig } = require("expo/metro-config") 3 | const path = require("path") 4 | 5 | // Find the project and workspace directories 6 | const projectRoot = __dirname 7 | 8 | // This can be replaced with `find-yarn-workspace-root` 9 | const workspaceRoot = path.resolve(projectRoot, "../..") 10 | 11 | /** @type {import('expo/metro-config').MetroConfig} */ 12 | const config = getDefaultConfig(projectRoot) 13 | 14 | // 1. Watch all files within the monorepo 15 | config.watchFolders = [workspaceRoot] 16 | 17 | // 2. Let Metro know where to resolve packages and in what order 18 | config.resolver.nodeModulesPaths = [ 19 | path.resolve(projectRoot, "node_modules"), 20 | path.resolve(workspaceRoot, "node_modules"), 21 | ] 22 | 23 | config.transformer.getTransformOptions = async () => ({ 24 | transform: { 25 | experimentalImportSupport: false, 26 | inlineRequires: true, 27 | }, 28 | }) 29 | 30 | module.exports = config 31 | -------------------------------------------------------------------------------- /apps/example-app/react-native.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | assets: [ 3 | // TODO: link documentation about fonts to this section 4 | // If you need to add non-google fonts (those not available through the `@expo-google-fonts/**` 5 | // packages, you can add them to the referenced path below and uncomment this line. 6 | // "./assets/fonts/" 7 | ], 8 | 9 | // This prevents FlashList from rendering a large red box. 10 | // See: https://github.com/reactwg/react-native-new-architecture/discussions/135 11 | // Remove when FlashList fully supports the new architecture. 12 | // https://github.com/Shopify/flash-list/pull/550 13 | // 14 | project: { 15 | android: { 16 | unstable_reactLegacyComponentNames: ["CellContainer", "AutoLayoutView"], 17 | }, 18 | ios: { 19 | unstable_reactLegacyComponentNames: ["CellContainer", "AutoLayoutView"], 20 | }, 21 | }, 22 | } 23 | -------------------------------------------------------------------------------- /apps/example-app/test/mockFile.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | height: 100, 3 | width: 100, 4 | scale: 2.0, 5 | uri: "https://placekitten.com/200/200", 6 | } 7 | -------------------------------------------------------------------------------- /apps/example-app/test/test-tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": false, 5 | "allowSyntheticDefaultImports": true, 6 | "experimentalDecorators": true, 7 | "jsx": "react-native", 8 | "module": "es2015", 9 | "moduleResolution": "node", 10 | "noImplicitAny": false, 11 | "noImplicitReturns": true, 12 | "noImplicitThis": true, 13 | "noUnusedLocals": false, 14 | "sourceMap": true, 15 | "target": "esnext", 16 | "lib": ["esnext", "dom"], 17 | "skipLibCheck": true, 18 | "resolveJsonModule": true 19 | }, 20 | "include": ["**/*.test.ts", "**/*.test.tsx"] 21 | } 22 | -------------------------------------------------------------------------------- /apps/example-app/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["../../tsconfig.base.json", "expo/tsconfig.base"], 3 | "compilerOptions": { 4 | "allowJs": false, 5 | "allowSyntheticDefaultImports": true, 6 | "experimentalDecorators": true, 7 | "jsx": "react-native", 8 | "module": "es2015", 9 | "moduleResolution": "node", 10 | "strict": true, 11 | "noImplicitAny": true, 12 | "noImplicitReturns": true, 13 | "noImplicitThis": true, 14 | "noUnusedLocals": true, 15 | "sourceMap": true, 16 | "target": "esnext", 17 | "lib": ["esnext", "dom"], 18 | "skipLibCheck": true, 19 | "resolveJsonModule": true, 20 | "baseUrl": ".", 21 | "paths": { 22 | "app/*": ["./app/*"], 23 | "assets/*": ["./assets/*"] 24 | } 25 | }, 26 | "ts-node": { 27 | "compilerOptions": { 28 | // compilerOptions specified here will override those declared above, 29 | // but *only* in ts-node. Useful if you want ts-node and tsc to use 30 | // different options with a single tsconfig.json. 31 | "module": "commonjs" 32 | } 33 | }, 34 | "include": ["index.js", "App.tsx", "app", "types", "plugins", "app.config.ts"], 35 | "exclude": ["node_modules", "test/**/*"] 36 | } 37 | -------------------------------------------------------------------------------- /apps/reactotron-app/.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | *.bat text eol=crlf 3 | -------------------------------------------------------------------------------- /apps/reactotron-app/.github/ISSUE_TEMPLATE/issue_template.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: File An Issue 3 | about: Report an issue with Reactotron 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | If you have a general question, please ask it in the #reactotron channel of the 11 | [Infinite Red Community slack](https://community.infinite.red/). 12 | 13 | When reporting a bug, please include steps to reproduce the issue. 14 | -------------------------------------------------------------------------------- /apps/reactotron-app/.gitignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | jsconfig.json 3 | 4 | # Logs 5 | logs 6 | *.log 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | 13 | # Directory for instrumented libs generated by jscoverage/JSCover 14 | lib-cov 15 | 16 | # Coverage directory used by tools like istanbul 17 | coverage 18 | 19 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 20 | .grunt 21 | 22 | # node-waf configuration 23 | .lock-wscript 24 | 25 | # Compiled binary addons (http://nodejs.org/api/addons.html) 26 | build/Release 27 | .eslintcache 28 | 29 | # Dependency directory 30 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 31 | node_modules 32 | yarn-error.log 33 | 34 | # OSX 35 | .DS_Store 36 | 37 | # flow-typed 38 | flow-typed/npm/* 39 | !flow-typed/npm/module_vx.x.x.js 40 | 41 | # App packaged 42 | release 43 | src/main.prod.js 44 | src/main.prod.js.map 45 | src/renderer.prod.js 46 | src/renderer.prod.js.map 47 | src/style.css 48 | src/style.css.map 49 | dist 50 | dll 51 | main.js 52 | main.js.map 53 | 54 | .idea 55 | npm-debug.log.* 56 | 57 | TODO 58 | -------------------------------------------------------------------------------- /apps/reactotron-app/.storybook/addons.js: -------------------------------------------------------------------------------- 1 | import "@storybook/addon-actions/register" 2 | import "@storybook/addon-links/register" 3 | import "@storybook/addon-knobs/register" 4 | -------------------------------------------------------------------------------- /apps/reactotron-app/.storybook/config.js: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | import { configure, addDecorator } from "@storybook/react" 3 | import { withKnobs } from "@storybook/addon-knobs" 4 | import { ReactotronProvider } from "reactotron-core-ui" 5 | 6 | const StyledDecorator = (storyFn) => {storyFn()} 7 | addDecorator(StyledDecorator) 8 | addDecorator(withKnobs) 9 | 10 | configure(require.context("../src", true, /\.story\.tsx$/), module) 11 | -------------------------------------------------------------------------------- /apps/reactotron-app/.storybook/webpack.config.js: -------------------------------------------------------------------------------- 1 | module.exports = async ({ config }) => { 2 | const newConfig = { 3 | ...config, 4 | module: { 5 | ...config.module, 6 | rules: [ 7 | ...config.module.rules.map((rule) => { 8 | if (!rule.use || !rule.use.some((loader) => loader.loader === "babel-loader")) return rule 9 | 10 | return { 11 | ...rule, 12 | test: /\.(mjs|jsx?|tsx?)$/, 13 | use: [ 14 | ...rule.use.map((loader) => { 15 | if (loader.loader !== "babel-loader") return loader 16 | 17 | return { 18 | ...loader, 19 | options: { 20 | ...loader.options, 21 | presets: [...loader.options.presets, "@babel/preset-typescript"], 22 | }, 23 | } 24 | }), 25 | ], 26 | } 27 | }), 28 | ], 29 | }, 30 | resolve: { 31 | ...config.resolve, 32 | extensions: [".ts", ".tsx", ...config.resolve.extensions], 33 | }, 34 | } 35 | 36 | return newConfig 37 | } 38 | -------------------------------------------------------------------------------- /apps/reactotron-app/Gemfile: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | source "https://rubygems.org" 4 | 5 | git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } 6 | 7 | # gem "rails" 8 | 9 | # Added at 2018-12-05 20:29:42 -0500 by richardevans: 10 | gem "fastlane", "~> 2.109" 11 | -------------------------------------------------------------------------------- /apps/reactotron-app/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 - 3016 Infinite Red LLC. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /apps/reactotron-app/entitlements.mac.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.cs.allow-jit 6 | 7 | com.apple.security.cs.debugger 8 | 9 | com.apple.security.cs.allow-unsigned-executable-memory 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /apps/reactotron-app/fastlane/Fastfile: -------------------------------------------------------------------------------- 1 | fastlane_version "2.44.1" 2 | 3 | lane :setup do 4 | setup_circle_ci 5 | import_certificate( 6 | keychain_name: ENV["MATCH_KEYCHAIN_NAME"], 7 | keychain_password: ENV["MATCH_KEYCHAIN_PASSWORD"], 8 | certificate_path: 'Certificates.p12', 9 | certificate_password: ENV["CERTIFICATE_PASSWORD"] || "", 10 | log_output: true 11 | ) 12 | end 13 | -------------------------------------------------------------------------------- /apps/reactotron-app/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/reactotron-app/icon.icns -------------------------------------------------------------------------------- /apps/reactotron-app/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/infinitered/reactotron/c0a2e102a2ac55557122ee005e9ce4058314999a/apps/reactotron-app/icon.png -------------------------------------------------------------------------------- /apps/reactotron-app/project.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "reactotron-app", 3 | "$schema": "../../node_modules/nx/schemas/project-schema.json", 4 | "targets": { 5 | "version": { 6 | "executor": "@jscutlery/semver:version" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /apps/reactotron-app/src/renderer/components/Footer/index.tsx: -------------------------------------------------------------------------------- 1 | import React, { useContext, useState } from "react" 2 | 3 | import StandaloneContext from "../../contexts/Standalone" 4 | 5 | import Footer from "./Stateless" 6 | 7 | export default function ConnectedFooter() { 8 | const { serverStatus, connections, selectedConnection, selectConnection } = 9 | useContext(StandaloneContext) 10 | const [isOpen, setIsOpen] = useState(false) 11 | 12 | return ( 13 |