├── .nvmrc ├── src ├── devtools │ ├── client │ │ ├── debugger │ │ │ ├── src │ │ │ │ ├── main.js │ │ │ │ ├── utils │ │ │ │ │ ├── dbg.d.ts │ │ │ │ │ ├── tabs.ts │ │ │ │ │ ├── pause │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── frames │ │ │ │ │ │ │ ├── getFrameUrl.ts │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── assert.js │ │ │ │ ├── global-types.js │ │ │ │ ├── components │ │ │ │ │ ├── SecondaryPanes │ │ │ │ │ │ ├── NewObjectInspector.module.css │ │ │ │ │ │ ├── Frames │ │ │ │ │ │ │ └── FrameIndent.tsx │ │ │ │ │ │ └── Points │ │ │ │ │ │ │ └── LogpointsPane.module.css │ │ │ │ │ ├── SourceOutline │ │ │ │ │ │ ├── SourceOutline.module.css │ │ │ │ │ │ └── isFunctionOutline.tsx │ │ │ │ │ ├── Editor │ │ │ │ │ │ ├── ShortcutsContext.ts │ │ │ │ │ │ └── NewSourceNag.module.css │ │ │ │ │ ├── A11yIntention.css │ │ │ │ │ └── shared │ │ │ │ │ │ ├── Dropdown.d.ts │ │ │ │ │ │ ├── Badge.js │ │ │ │ │ │ └── Button │ │ │ │ │ │ └── index.js │ │ │ │ ├── actions │ │ │ │ │ └── sources │ │ │ │ │ │ └── index.ts │ │ │ │ └── selectors │ │ │ │ │ └── index.ts │ │ │ └── images │ │ │ │ ├── expand.svg │ │ │ │ ├── chevron-down.svg │ │ │ │ ├── view-list.svg │ │ │ │ ├── diamond-pause.svg │ │ │ │ ├── arrow-up-2.svg │ │ │ │ ├── arrow-down-2.svg │ │ │ │ ├── document.svg │ │ │ │ ├── document-text.svg │ │ │ │ ├── plus.svg │ │ │ │ ├── rewind-button.svg │ │ │ │ ├── window.svg │ │ │ │ ├── resume.svg │ │ │ │ ├── arrow.svg │ │ │ │ ├── rewind.svg │ │ │ │ ├── arrow-up.svg │ │ │ │ ├── pause-circle-16x16.svg │ │ │ │ ├── tab.svg │ │ │ │ ├── arrow-down.svg │ │ │ │ ├── folder.svg │ │ │ │ ├── column-marker.svg │ │ │ │ ├── sources │ │ │ │ ├── vuejs.svg │ │ │ │ └── prefix-picker.svg │ │ │ │ ├── breakpoint.svg │ │ │ │ ├── markup-breakpoint.svg │ │ │ │ ├── file-small.svg │ │ │ │ ├── replay-pause.svg │ │ │ │ └── search.svg │ │ ├── themes │ │ │ ├── package.json │ │ │ ├── variables.css │ │ │ └── images │ │ │ │ ├── arrowhead-right.svg │ │ │ │ ├── pencil-sm.svg │ │ │ │ ├── location-marker.svg │ │ │ │ ├── plus-circle.svg │ │ │ │ ├── chat-alt.svg │ │ │ │ ├── paper-airplane.svg │ │ │ │ ├── menu.svg │ │ │ │ ├── login.svg │ │ │ │ ├── trash.svg │ │ │ │ ├── arrow-right.svg │ │ │ │ ├── dropmarker.svg │ │ │ │ ├── sort-ascending-arrow.svg │ │ │ │ ├── sort-descending-arrow.svg │ │ │ │ ├── animation-fast-track.svg │ │ │ │ ├── grid.svg │ │ │ │ ├── add.svg │ │ │ │ ├── arrow-white.svg │ │ │ │ ├── arrow-e.svg │ │ │ │ ├── arrow-big.svg │ │ │ │ ├── arrow.svg │ │ │ │ ├── item-arrow-dark-ltr.svg │ │ │ │ ├── item-arrow-dark-rtl.svg │ │ │ │ ├── item-arrow-ltr.svg │ │ │ │ ├── item-arrow-rtl.svg │ │ │ │ ├── tool-debugger.svg │ │ │ │ ├── more.svg │ │ │ │ ├── debugging-tabs.svg │ │ │ │ ├── tool-explorer.svg │ │ │ │ ├── vview-edit.svg │ │ │ │ ├── webconsole │ │ │ │ └── run.svg │ │ │ │ ├── badge-blue.svg │ │ │ │ ├── breadcrumbs-scrollbutton.svg │ │ │ │ ├── play.svg │ │ │ │ ├── folder.svg │ │ │ │ ├── security-state-secure.svg │ │ │ │ ├── tool-comments.svg │ │ │ │ ├── vview-delete.svg │ │ │ │ ├── vview-lock.svg │ │ │ │ └── tool-accessibility.svg │ │ ├── shared │ │ │ └── components │ │ │ │ ├── .eslintrc.js │ │ │ │ └── reps │ │ │ │ └── images │ │ │ │ └── open-inspector.svg │ │ ├── inspector │ │ │ ├── markup │ │ │ │ └── selectors │ │ │ │ │ └── markup.ts │ │ │ ├── rules │ │ │ │ └── components │ │ │ │ │ └── value │ │ │ │ │ ├── FontFamily.tsx │ │ │ │ │ └── Url.tsx │ │ │ └── computed │ │ │ │ └── components │ │ │ │ └── ComputedApp.tsx │ │ └── webconsole │ │ │ └── actions │ │ │ └── index.ts │ └── shared │ │ └── generate-uuid.js ├── reset.d.ts ├── ui │ ├── constants.ts │ ├── components │ │ ├── Events │ │ │ ├── Events.css │ │ │ ├── index.ts │ │ │ ├── ReplayInfo.module.css │ │ │ ├── EventsDropDownMenu.module.css │ │ │ └── Event.module.css │ │ ├── Header │ │ │ └── index.tsx │ │ ├── TestSuite │ │ │ ├── views │ │ │ │ ├── TestRecording │ │ │ │ │ ├── types.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── TestSection.module.css │ │ │ │ │ └── TestRecordingEvents │ │ │ │ │ │ └── NavigationEventRow.module.css │ │ │ │ ├── GroupedTestCases │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── types.ts │ │ │ │ │ └── TestRecordingTree.module.css │ │ │ │ └── TestSuitePanel.module.css │ │ │ ├── index.ts │ │ │ ├── utils │ │ │ │ ├── formatTitle.ts │ │ │ │ └── isTestSuiteReplay.ts │ │ │ └── components │ │ │ │ ├── LabeledIcon.module.css │ │ │ │ └── TestResultIcon.module.css │ │ ├── Comments │ │ │ ├── CommentPreview.module.css │ │ │ ├── VideoComments │ │ │ │ └── index.ts │ │ │ ├── ReplyCard.module.css │ │ │ ├── TranscriptComments │ │ │ │ └── types.ts │ │ │ ├── CommentDropDownMenu.module.css │ │ │ └── CommentReplyButton.module.css │ │ ├── Timeline │ │ │ ├── ContextMenu.module.css │ │ │ ├── LoadingProgressBars.module.css │ │ │ └── EditableTimeInput.module.css │ │ ├── NetworkMonitor │ │ │ ├── NetworkContextMenu.module.css │ │ │ ├── ContextMenu.module.css │ │ │ ├── HttpBody.module.css │ │ │ └── NetworkMonitorList.module.css │ │ ├── UploadScreen │ │ │ ├── index.ts │ │ │ ├── libraryConstants.ts │ │ │ └── ExpiredWorkspaces.module.css │ │ ├── CommandPalette │ │ │ ├── index.ts │ │ │ └── CommandPalette.module.css │ │ ├── shared │ │ │ ├── SharingModal │ │ │ │ ├── index.tsx │ │ │ │ └── LibraryDropdown.module.css │ │ │ ├── SettingsModal │ │ │ │ └── index.tsx │ │ │ ├── Confirm │ │ │ │ ├── index.ts │ │ │ │ └── ConfirmModal.tsx │ │ │ ├── Forms │ │ │ │ ├── index.ts │ │ │ │ └── Radio.tsx │ │ │ ├── LoginModal.css │ │ │ ├── Hoverboard.tsx │ │ │ ├── ModalBackground.tsx │ │ │ ├── ModalBackground.module.css │ │ │ ├── Modals │ │ │ │ └── SourcemapSetup.module.css │ │ │ ├── AppContainerPortal.tsx │ │ │ ├── Base64Image.tsx │ │ │ └── Dialog.css │ │ ├── SecondaryToolbox │ │ │ ├── react-devtools │ │ │ │ └── components │ │ │ │ │ ├── ReactDevToolsList.module.css │ │ │ │ │ ├── Badge.tsx │ │ │ │ │ ├── ContextPropsStateRenderer.module.css │ │ │ │ │ └── Badge.module.css │ │ │ ├── ReactDevTools.module.css │ │ │ └── SecondaryToolbox.module.css │ │ ├── ProtocolViewer │ │ │ ├── index.ts │ │ │ └── components │ │ │ │ └── ProtocolViewer.module.css │ │ ├── Toolbar.module.css │ │ ├── reactjs-popup.css │ │ ├── Toolbox.tsx │ │ ├── Avatar.module.css │ │ └── MaintenanceMode.tsx │ ├── utils │ │ ├── LoadingStatus.ts │ │ ├── tour.ts │ │ ├── user.ts │ │ ├── dom.ts │ │ ├── formatEstimatedProcessingDuration.ts │ │ ├── awaitWithTimeout.ts │ │ └── thunk.ts │ ├── graphql │ │ ├── sessions.ts │ │ └── utils.ts │ ├── state │ │ └── reactDevTools.ts │ └── hooks │ │ └── comments │ │ └── index.ts └── ssr.ts ├── .gitattributes ├── __mocks__ ├── styleMock.js └── fileMock.js ├── packages ├── accordion │ ├── website │ │ ├── .eslintrc.json │ │ ├── styles │ │ │ └── Home.module.css │ │ ├── next.config.js │ │ ├── public │ │ │ └── favicon.ico │ │ ├── pages │ │ │ ├── _app.js │ │ │ └── api │ │ │ │ └── hello.js │ │ ├── postcss.config.js │ │ ├── tailwind.config.js │ │ └── .babelrc │ └── constants.tsx ├── e2e-tests │ ├── examples │ │ ├── .gitignore │ │ ├── mapped_styles │ │ │ ├── styles.css │ │ │ ├── bundle_input.js │ │ │ ├── package.json │ │ │ ├── .gitignore │ │ │ └── webpack.config.js │ │ ├── rdt-react-versions │ │ │ ├── src │ │ │ │ └── vite-env.d.ts │ │ │ ├── postcss.config.js │ │ │ ├── react-15-app │ │ │ │ ├── postcss.config.js │ │ │ │ ├── src │ │ │ │ │ ├── main.tsx │ │ │ │ │ └── appInjector.tsx │ │ │ │ └── index.html │ │ │ ├── react-16-app │ │ │ │ ├── postcss.config.js │ │ │ │ ├── src │ │ │ │ │ ├── main.tsx │ │ │ │ │ └── appInjector.tsx │ │ │ │ └── index.html │ │ │ ├── react-17-app │ │ │ │ ├── postcss.config.js │ │ │ │ ├── src │ │ │ │ │ ├── main.tsx │ │ │ │ │ └── appInjector.tsx │ │ │ │ └── index.html │ │ │ └── tsconfig.node.json │ │ ├── redux-fundamentals │ │ │ ├── src │ │ │ │ ├── vite-env.d.ts │ │ │ │ ├── features │ │ │ │ │ └── filters │ │ │ │ │ │ └── colors.ts │ │ │ │ └── exampleAddons │ │ │ │ │ └── middleware.js │ │ │ ├── prettier.config.js │ │ │ ├── postcss.config.js │ │ │ ├── tsconfig.node.json │ │ │ ├── tests │ │ │ │ └── playwright-example.test.ts │ │ │ ├── index.html │ │ │ ├── vite.config.ts │ │ │ └── .gitignore │ │ ├── cra │ │ │ ├── public │ │ │ │ ├── robots.txt │ │ │ │ ├── favicon.ico │ │ │ │ ├── logo192.png │ │ │ │ └── logo512.png │ │ │ └── src │ │ │ │ ├── index.js │ │ │ │ └── index.css │ │ ├── redux-vite │ │ │ ├── vite.config.js │ │ │ ├── index.html │ │ │ └── package.json │ │ ├── prod_bundle │ │ │ ├── package.json │ │ │ ├── webpack.config.js │ │ │ └── .gitignore │ │ ├── mapped_minified │ │ │ ├── package.json │ │ │ ├── webpack.config.js │ │ │ ├── .gitignore │ │ │ └── bundle_input.js │ │ └── exceptions_bundle │ │ │ ├── package.json │ │ │ ├── webpack.config.js │ │ │ └── .gitignore │ ├── tsconfig.eslint.json │ ├── scripts │ │ ├── buildkite_run_tests_from_reason-macos-arm64.ts │ │ ├── buildkite_run_tests_from_reason-linux-x86_64.ts │ │ └── aws_secrets.ts │ ├── helpers │ │ └── types.ts │ └── tsconfig.json ├── replay-next │ ├── components │ │ ├── Loader.module.css │ │ ├── inspector │ │ │ ├── index.tsx │ │ │ ├── Inspector.module.css │ │ │ ├── ScopesInspector.module.css │ │ │ └── values │ │ │ │ └── types.ts │ │ ├── console │ │ │ ├── index.tsx │ │ │ ├── ErrorStackRenderer.module.css │ │ │ ├── EagerEvaluationResult.module.css │ │ │ ├── Source.module.css │ │ │ ├── CurrentTimeIndicator.module.css │ │ │ ├── filters │ │ │ │ ├── FilterText.module.css │ │ │ │ └── EventCategory.module.css │ │ │ └── ContextMenu.module.css │ │ ├── Icon.module.css │ │ ├── SyntaxHighlighter │ │ │ ├── index.ts │ │ │ ├── SyntaxHighlighterLine.module.css │ │ │ ├── SyntaxHighlighter.module.css │ │ │ └── JsonViewer.module.css │ │ ├── elements │ │ │ ├── index.ts │ │ │ ├── NoContentFallback.module.css │ │ │ ├── NoContentFallback.tsx │ │ │ └── ElementList.module.css │ │ ├── sources │ │ │ ├── SourceListRowFormattedText.module.css │ │ │ ├── log-point-panel │ │ │ │ ├── ContextMenu.module.css │ │ │ │ └── LogPointPanelDoubleBuffer.module.css │ │ │ ├── utils │ │ │ │ ├── formatHitCount.ts │ │ │ │ ├── classNameToTokenTypes.ts │ │ │ │ ├── clipboard.ts │ │ │ │ └── getBadgeStyleVars.ts │ │ │ ├── SourceList.module.css │ │ │ ├── SourceLineLoadingPlaceholder.tsx │ │ │ └── SourceLineLoadingPlaceholder.module.css │ │ ├── lexical │ │ │ └── plugins │ │ │ │ ├── code-completion │ │ │ │ ├── styles.module.css │ │ │ │ ├── isExactMatch.ts │ │ │ │ └── types.ts │ │ │ │ ├── loom-link │ │ │ │ └── LoomLink.module.css │ │ │ │ ├── mentions │ │ │ │ ├── styles.module.css │ │ │ │ ├── isExactMatch.ts │ │ │ │ ├── utils │ │ │ │ │ ├── $isMentionsTextNode.ts │ │ │ │ │ └── $createMentionsTextNode.ts │ │ │ │ └── types.ts │ │ │ │ ├── typeahead │ │ │ │ ├── commands.ts │ │ │ │ └── utils │ │ │ │ │ └── $isSimpleText.ts │ │ │ │ ├── code │ │ │ │ └── utils │ │ │ │ │ ├── $createCodeNode.ts │ │ │ │ │ ├── $isCodeNode.ts │ │ │ │ │ └── $convertCodeElement.ts │ │ │ │ ├── comment │ │ │ │ ├── types.ts │ │ │ │ └── constants.ts │ │ │ │ └── auto-link │ │ │ │ └── AutoLink.module.css │ │ ├── errors │ │ │ ├── UnexpectedErrorFormImage.png │ │ │ └── ReportProblemLink.module.css │ │ ├── search-files │ │ │ ├── HighlightMatch.module.css │ │ │ └── ResultsList.module.css │ │ ├── LoadingProgressBar.module.css │ │ ├── Initializer.module.css │ │ ├── PanelLoader.module.css │ │ ├── AvatarImage.module.css │ │ ├── ExternalLink.tsx │ │ ├── Spinner.module.css │ │ └── Loader.tsx │ ├── .gitignore │ ├── jest.setupEnv.js │ ├── postcss.config.js │ └── src │ │ ├── types.ts │ │ ├── hooks │ │ ├── useForceUpdate.ts │ │ └── usePreferredFontSize.ts │ │ ├── utils │ │ ├── code.ts │ │ └── group.ts │ │ ├── contexts │ │ ├── GraphQLClientContext.tsx │ │ └── LayoutContext.tsx │ │ └── suspense │ │ └── PaintHashCache.ts ├── shared │ ├── theme │ │ ├── types.ts │ │ ├── getSystemColorScheme.ts │ │ └── useTheme.ts │ ├── package.json │ ├── user-data │ │ ├── GraphQL │ │ │ ├── constants.ts │ │ │ └── queries.ts │ │ ├── IndexedDB │ │ │ └── types.ts │ │ └── LocalStorage │ │ │ └── types.ts │ ├── constants.ts │ ├── utils │ │ ├── url.ts │ │ └── points.ts │ └── client │ │ └── ReplayClientContext.tsx ├── docs │ ├── pages │ │ └── index.ts │ ├── next.config.mjs │ ├── package.json │ └── README.md ├── protocol │ ├── package.json │ └── execution-point-utils.ts ├── third-party │ ├── README.md │ └── sourcemap-visualizer │ │ └── sourcemapVisualizer.d.ts ├── node-protocol │ └── package.json ├── import-sort-style-replay │ └── package.json ├── design │ ├── index.ts │ ├── svgs │ │ ├── navigation.svg │ │ ├── debug-pause.svg │ │ ├── tune.svg │ │ ├── person.svg │ │ ├── calendar.svg │ │ ├── delete.svg │ │ ├── key.svg │ │ ├── trash.svg │ │ ├── file.svg │ │ ├── external.svg │ │ ├── video.svg │ │ ├── card.svg │ │ ├── rewind.svg │ │ ├── legal.svg │ │ ├── fast-forward.svg │ │ ├── debug-play.svg │ │ ├── share.svg │ │ └── cog.svg │ ├── Badge │ │ ├── Badge.module.css │ │ └── index.tsx │ ├── Icon │ │ └── index.tsx │ ├── package.json │ ├── PrefixBadgePicker │ │ └── Picker.module.css │ └── SystemProvider │ │ └── index.tsx └── playwright-recorder │ ├── tsconfig.json │ ├── src │ └── config.ts │ └── package.json ├── test └── examples │ └── node │ ├── error.js │ ├── basic.js │ ├── worker.js │ ├── exceptions.js │ ├── async.js │ └── run_worker.js ├── docs ├── flow.md ├── case_study.md └── codebase-notes │ └── README.md ├── public ├── images │ ├── grid.png │ ├── clear.png │ ├── stars.png │ ├── avatar-fallback.png │ ├── passport │ │ ├── passportBG.png │ │ ├── share-complete.png │ │ ├── find_file-complete.png │ │ ├── tour_grad-complete.png │ │ ├── tour_grad-default.png │ │ ├── add_a_comment-complete.png │ │ ├── jump_to_code-complete.png │ │ ├── jump_to_event-complete.png │ │ ├── use_focus_mode-complete.png │ │ ├── explore_sources-complete.png │ │ ├── inspect_element-complete.png │ │ ├── record_a_replay-complete.png │ │ ├── add_a_unicorn_badge-complete.png │ │ ├── search_source_text-complete.png │ │ ├── set_a_print_statement-complete.png │ │ ├── inspect_network_request-complete.png │ │ ├── inspect_react_component-complete.png │ │ ├── jump_to_network_request-complete.png │ │ ├── launch_command_palette-complete.png │ │ └── time_travel_in_the_console-complete.png │ ├── illustrations │ │ ├── ready1.png │ │ ├── ready2.png │ │ ├── ready3.png │ │ ├── ready4.png │ │ ├── ready5.png │ │ └── larry_wave.png │ ├── icon-windows.svg │ ├── today.svg │ ├── playback-pause.svg │ ├── f.svg │ ├── comment-onboarding-arrow.svg │ ├── k.svg │ ├── dotted-mask-dark.svg │ ├── dotted-mask-light.svg │ └── timer.svg ├── test │ └── examples │ │ ├── doc_prod_bundle.html │ │ ├── worker.js │ │ ├── cra │ │ └── dist │ │ │ ├── robots.txt │ │ │ ├── favicon.ico │ │ │ ├── logo192.png │ │ │ ├── logo512.png │ │ │ └── static │ │ │ └── css │ │ │ └── main.e6c13ad2.css │ │ ├── blackbox.js │ │ ├── doc_exceptions_bundle.html │ │ ├── doc_inspector_sourcemapped.html │ │ ├── rdt-react-versions │ │ └── dist │ │ │ ├── react15 │ │ │ ├── assets │ │ │ │ ├── react15.js.map │ │ │ │ ├── index-4ab65188.js │ │ │ │ ├── __federation_expose_AppInjector-7dddba10.js │ │ │ │ └── index-4ab65188.js.map │ │ │ └── index.html │ │ │ ├── react16 │ │ │ ├── assets │ │ │ │ ├── react16.js.map │ │ │ │ ├── index-4d2a71e4.js │ │ │ │ ├── __federation_expose_AppInjector-f0210664.js │ │ │ │ └── index-4d2a71e4.js.map │ │ │ └── index.html │ │ │ └── react17 │ │ │ ├── assets │ │ │ ├── react17.js.map │ │ │ ├── index-36b1bcdb.js │ │ │ ├── __federation_expose_AppInjector-3adc3cc9.js │ │ │ └── index-36b1bcdb.js.map │ │ │ └── index.html │ │ ├── shorthand_styles.css │ │ ├── doc_minified.html │ │ ├── prod_bundle.js │ │ ├── doc_async_stack.html │ │ ├── doc_exceptions.html │ │ ├── doc_recursion.html │ │ ├── doc_events.html │ │ ├── doc_events_chromium.html │ │ ├── doc_debugger_statements.html │ │ ├── redux │ │ └── dist │ │ │ └── index.html │ │ ├── iframe.html │ │ └── README.md ├── fonts │ ├── inter │ │ ├── inter-v7-latin-100.eot │ │ ├── inter-v7-latin-100.ttf │ │ ├── inter-v7-latin-100.woff │ │ ├── inter-v7-latin-200.eot │ │ ├── inter-v7-latin-200.ttf │ │ ├── inter-v7-latin-200.woff │ │ ├── inter-v7-latin-300.eot │ │ ├── inter-v7-latin-300.ttf │ │ ├── inter-v7-latin-300.woff │ │ ├── inter-v7-latin-500.eot │ │ ├── inter-v7-latin-500.ttf │ │ ├── inter-v7-latin-500.woff │ │ ├── inter-v7-latin-600.eot │ │ ├── inter-v7-latin-600.ttf │ │ ├── inter-v7-latin-600.woff │ │ ├── inter-v7-latin-700.eot │ │ ├── inter-v7-latin-700.ttf │ │ ├── inter-v7-latin-700.woff │ │ ├── inter-v7-latin-800.eot │ │ ├── inter-v7-latin-800.ttf │ │ ├── inter-v7-latin-800.woff │ │ ├── inter-v7-latin-900.eot │ │ ├── inter-v7-latin-900.ttf │ │ ├── inter-v7-latin-900.woff │ │ ├── inter-v7-latin-100.woff2 │ │ ├── inter-v7-latin-200.woff2 │ │ ├── inter-v7-latin-300.woff2 │ │ ├── inter-v7-latin-500.woff2 │ │ ├── inter-v7-latin-600.woff2 │ │ ├── inter-v7-latin-700.woff2 │ │ ├── inter-v7-latin-800.woff2 │ │ ├── inter-v7-latin-900.woff2 │ │ ├── inter-v7-latin-regular.eot │ │ ├── inter-v7-latin-regular.ttf │ │ ├── inter-v7-latin-regular.woff │ │ └── inter-v7-latin-regular.woff2 │ └── material_icons │ │ ├── MaterialIcons-Regular.ttf │ │ ├── MaterialIcons-Regular.woff2 │ │ ├── MaterialIconsOutlined-Regular.otf │ │ └── MaterialIconsOutlined-Regular.woff2 └── icons │ └── video.svg ├── .dockerignore ├── .trunk └── .gitignore ├── tsconfig.eslint.json ├── vercel.json ├── postcss.config.js ├── .vscode └── settings.json ├── next-env.d.ts ├── .stylelintrc.json ├── .markdownlint.yaml ├── .semgrepignore ├── .prettierignore ├── .github ├── ISSUE_TEMPLATE │ ├── config.yml │ └── bug_report.md └── workflows │ ├── mirror.yml │ └── nightly.yaml ├── .eslintignore └── scripts └── perf-analysis └── tsconfig.json /.nvmrc: -------------------------------------------------------------------------------- 1 | 16.13.1 -------------------------------------------------------------------------------- /src/devtools/client/debugger/src/main.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.json linguist-generated=true -------------------------------------------------------------------------------- /__mocks__/styleMock.js: -------------------------------------------------------------------------------- 1 | module.exports = {}; 2 | -------------------------------------------------------------------------------- /packages/accordion/website/.eslintrc.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /src/devtools/client/themes/package.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /packages/accordion/website/styles/Home.module.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/.gitignore: -------------------------------------------------------------------------------- 1 | .yarn/ 2 | dist/ -------------------------------------------------------------------------------- /src/reset.d.ts: -------------------------------------------------------------------------------- 1 | import "@total-typescript/ts-reset"; 2 | -------------------------------------------------------------------------------- /__mocks__/fileMock.js: -------------------------------------------------------------------------------- 1 | module.exports = "test-file-stub"; 2 | -------------------------------------------------------------------------------- /src/ui/constants.ts: -------------------------------------------------------------------------------- 1 | export const timelineMarkerWidth = 11; 2 | -------------------------------------------------------------------------------- /packages/replay-next/components/Loader.module.css: -------------------------------------------------------------------------------- 1 | .Loader { 2 | } 3 | -------------------------------------------------------------------------------- /test/examples/node/error.js: -------------------------------------------------------------------------------- 1 | function foo() { 2 | a = b; 3 | } 4 | foo(); 5 | -------------------------------------------------------------------------------- /packages/shared/theme/types.ts: -------------------------------------------------------------------------------- 1 | export type Theme = "light" | "dark" | "system"; 2 | -------------------------------------------------------------------------------- /packages/e2e-tests/tsconfig.eslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | } 4 | -------------------------------------------------------------------------------- /packages/replay-next/.gitignore: -------------------------------------------------------------------------------- 1 | .yarn 2 | fail 3 | playwright-report* 4 | test-results 5 | -------------------------------------------------------------------------------- /src/ui/components/Events/Events.css: -------------------------------------------------------------------------------- 1 | .event:hover .event-match { 2 | opacity: 100; 3 | } 4 | -------------------------------------------------------------------------------- /docs/flow.md: -------------------------------------------------------------------------------- 1 | TODO the flow of information when the recording is being loaded, played and inspected -------------------------------------------------------------------------------- /public/images/grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/grid.png -------------------------------------------------------------------------------- /src/devtools/client/debugger/src/utils/dbg.d.ts: -------------------------------------------------------------------------------- 1 | export function setupDebuggerHelper(): any; 2 | -------------------------------------------------------------------------------- /packages/accordion/website/next.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | reactStrictMode: true, 3 | }; 4 | -------------------------------------------------------------------------------- /packages/docs/pages/index.ts: -------------------------------------------------------------------------------- 1 | export default function Index() { 2 | return "Hello Docs 👋"; 3 | } 4 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/mapped_styles/styles.css: -------------------------------------------------------------------------------- 1 | 2 | div { 3 | background-color: blue; 4 | } 5 | -------------------------------------------------------------------------------- /public/images/clear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/clear.png -------------------------------------------------------------------------------- /public/images/stars.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/stars.png -------------------------------------------------------------------------------- /src/ui/components/Events/index.ts: -------------------------------------------------------------------------------- 1 | import Events from "./Events"; 2 | 3 | export default Events; 4 | -------------------------------------------------------------------------------- /src/ui/components/Header/index.tsx: -------------------------------------------------------------------------------- 1 | import Header from "./Header"; 2 | 3 | export default Header; 4 | -------------------------------------------------------------------------------- /src/ui/components/TestSuite/views/TestRecording/types.ts: -------------------------------------------------------------------------------- 1 | export type Position = "after" | "before"; 2 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/rdt-react-versions/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/redux-fundamentals/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /src/ui/components/Comments/CommentPreview.module.css: -------------------------------------------------------------------------------- 1 | .Preview { 2 | margin: 0 0.5rem 0.5rem; 3 | } 4 | -------------------------------------------------------------------------------- /packages/shared/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "name": "shared", 4 | "version": "0.0.0" 5 | } 6 | -------------------------------------------------------------------------------- /packages/shared/user-data/GraphQL/constants.ts: -------------------------------------------------------------------------------- 1 | export const LOCAL_STORAGE_KEY = "Replay:UserPreferences"; 2 | -------------------------------------------------------------------------------- /public/test/examples/doc_prod_bundle.html: -------------------------------------------------------------------------------- 1 |
Hello World!
2 | 3 | -------------------------------------------------------------------------------- /public/test/examples/worker.js: -------------------------------------------------------------------------------- 1 | 2 | self.addEventListener("message", e => { 3 | postMessage("ack"); 4 | }); 5 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | .github 2 | .next 3 | .storybook 4 | .trunk 5 | .vscode 6 | .yarn 7 | .yarnrc.yml 8 | node_modules 9 | -------------------------------------------------------------------------------- /packages/docs/next.config.mjs: -------------------------------------------------------------------------------- 1 | export default { 2 | compiler: { 3 | styledComponents: true, 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /packages/protocol/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "name": "protocol", 4 | "version": "0.0.0" 5 | } 6 | -------------------------------------------------------------------------------- /src/ui/components/Timeline/ContextMenu.module.css: -------------------------------------------------------------------------------- 1 | .SmallerIcon { 2 | height: 1rem; 3 | width: 1.5rem; 4 | } 5 | -------------------------------------------------------------------------------- /packages/third-party/README.md: -------------------------------------------------------------------------------- 1 | ### Third Party 2 | 3 | This package includes files that come from third party vendors. 4 | -------------------------------------------------------------------------------- /public/images/avatar-fallback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/avatar-fallback.png -------------------------------------------------------------------------------- /public/test/examples/cra/dist/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /src/ui/components/TestSuite/views/GroupedTestCases/index.ts: -------------------------------------------------------------------------------- 1 | import Panel from "./Panel"; 2 | 3 | export default Panel; 4 | -------------------------------------------------------------------------------- /src/ui/components/TestSuite/views/TestRecording/index.ts: -------------------------------------------------------------------------------- 1 | import Panel from "./Panel"; 2 | 3 | export default Panel; 4 | -------------------------------------------------------------------------------- /.trunk/.gitignore: -------------------------------------------------------------------------------- 1 | *out 2 | *logs 3 | *actions 4 | *notifications 5 | *tools 6 | plugins 7 | user_trunk.yaml 8 | user.yaml 9 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/cra/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /packages/replay-next/components/inspector/index.tsx: -------------------------------------------------------------------------------- 1 | import Inspector from "./Inspector"; 2 | 3 | export default Inspector; 4 | -------------------------------------------------------------------------------- /public/images/passport/passportBG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/passport/passportBG.png -------------------------------------------------------------------------------- /public/test/examples/blackbox.js: -------------------------------------------------------------------------------- 1 | function blackboxed(...args) { 2 | for (const arg of args) { 3 | arg(); 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /src/devtools/client/themes/variables.css: -------------------------------------------------------------------------------- 1 | /* Migration note: this document moved to packages/replay-next/variables.css */ 2 | -------------------------------------------------------------------------------- /src/ui/components/NetworkMonitor/NetworkContextMenu.module.css: -------------------------------------------------------------------------------- 1 | .CommentIcon { 2 | width: 1.5rem; 3 | height: 1rem; 4 | } 5 | -------------------------------------------------------------------------------- /src/ui/components/UploadScreen/index.ts: -------------------------------------------------------------------------------- 1 | import UploadScreen from "./UploadScreen"; 2 | 3 | export default UploadScreen; 4 | -------------------------------------------------------------------------------- /tsconfig.eslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": ["src", "packages", "pages", "scripts"] 4 | } 5 | -------------------------------------------------------------------------------- /packages/node-protocol/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "name": "node-protocol", 4 | "version": "0.0.0" 5 | } 6 | -------------------------------------------------------------------------------- /packages/replay-next/components/console/index.tsx: -------------------------------------------------------------------------------- 1 | import ConsoleRoot from "./ConsoleRoot"; 2 | 3 | export default ConsoleRoot; 4 | -------------------------------------------------------------------------------- /public/images/illustrations/ready1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/illustrations/ready1.png -------------------------------------------------------------------------------- /public/images/illustrations/ready2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/illustrations/ready2.png -------------------------------------------------------------------------------- /public/images/illustrations/ready3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/illustrations/ready3.png -------------------------------------------------------------------------------- /public/images/illustrations/ready4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/illustrations/ready4.png -------------------------------------------------------------------------------- /public/images/illustrations/ready5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/illustrations/ready5.png -------------------------------------------------------------------------------- /src/ui/components/CommandPalette/index.ts: -------------------------------------------------------------------------------- 1 | import CommandPalette from "./CommandPalette"; 2 | 3 | export default CommandPalette; 4 | -------------------------------------------------------------------------------- /src/ui/components/TestSuite/index.ts: -------------------------------------------------------------------------------- 1 | import TestSuitePanel from "./views/TestSuitePanel"; 2 | 3 | export default TestSuitePanel; 4 | -------------------------------------------------------------------------------- /src/ui/components/shared/SharingModal/index.tsx: -------------------------------------------------------------------------------- 1 | import SharingModal from "./SharingModal"; 2 | 3 | export default SharingModal; 4 | -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-100.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-100.eot -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-100.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-100.ttf -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-100.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-100.woff -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-200.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-200.eot -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-200.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-200.ttf -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-200.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-200.woff -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-300.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-300.eot -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-300.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-300.ttf -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-300.woff -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-500.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-500.eot -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-500.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-500.ttf -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-500.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-500.woff -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-600.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-600.eot -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-600.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-600.ttf -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-600.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-600.woff -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-700.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-700.eot -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-700.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-700.ttf -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-700.woff -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-800.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-800.eot -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-800.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-800.ttf -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-800.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-800.woff -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-900.eot -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-900.ttf -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-900.woff -------------------------------------------------------------------------------- /public/images/illustrations/larry_wave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/illustrations/larry_wave.png -------------------------------------------------------------------------------- /public/images/passport/share-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/passport/share-complete.png -------------------------------------------------------------------------------- /public/test/examples/cra/dist/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/test/examples/cra/dist/favicon.ico -------------------------------------------------------------------------------- /public/test/examples/cra/dist/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/test/examples/cra/dist/logo192.png -------------------------------------------------------------------------------- /public/test/examples/cra/dist/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/test/examples/cra/dist/logo512.png -------------------------------------------------------------------------------- /src/ui/components/Events/ReplayInfo.module.css: -------------------------------------------------------------------------------- 1 | .icon { 2 | font-size: 1.25rem; 3 | height: 1.25rem; 4 | width: 1.25rem; 5 | } 6 | -------------------------------------------------------------------------------- /src/ui/components/SecondaryToolbox/react-devtools/components/ReactDevToolsList.module.css: -------------------------------------------------------------------------------- 1 | .List:focus { 2 | outline: none; 3 | } 4 | -------------------------------------------------------------------------------- /src/ui/components/shared/SettingsModal/index.tsx: -------------------------------------------------------------------------------- 1 | import SettingsModal from "./SettingsModal"; 2 | 3 | export default SettingsModal; 4 | -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "functions": { 3 | "pages/api/*": { 4 | "memory": 3008, 5 | "maxDuration": 60 6 | } 7 | } 8 | } -------------------------------------------------------------------------------- /docs/case_study.md: -------------------------------------------------------------------------------- 1 | TODO an example (a demo recording of some simple app and a walkthrough of how objects from the execution get represented) -------------------------------------------------------------------------------- /packages/accordion/website/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/packages/accordion/website/public/favicon.ico -------------------------------------------------------------------------------- /packages/replay-next/components/Icon.module.css: -------------------------------------------------------------------------------- 1 | .DefaultIcon { 2 | width: 1.5rem; 3 | height: 1.5rem; 4 | fill: currentColor; 5 | } 6 | -------------------------------------------------------------------------------- /packages/replay-next/components/SyntaxHighlighter/index.ts: -------------------------------------------------------------------------------- 1 | import { JsonViewer } from "./JsonViewer"; 2 | 3 | export default JsonViewer; 4 | -------------------------------------------------------------------------------- /packages/replay-next/components/elements/index.ts: -------------------------------------------------------------------------------- 1 | import { ElementsPanel } from "./ElementsPanel"; 2 | 3 | export default ElementsPanel; 4 | -------------------------------------------------------------------------------- /packages/replay-next/components/sources/SourceListRowFormattedText.module.css: -------------------------------------------------------------------------------- 1 | .Text { 2 | display: block; 3 | white-space: pre; 4 | } 5 | -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-100.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-100.woff2 -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-200.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-200.woff2 -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-300.woff2 -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-500.woff2 -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-600.woff2 -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-700.woff2 -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-800.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-800.woff2 -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-900.woff2 -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-regular.eot -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-regular.ttf -------------------------------------------------------------------------------- /public/images/passport/find_file-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/passport/find_file-complete.png -------------------------------------------------------------------------------- /public/images/passport/tour_grad-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/passport/tour_grad-complete.png -------------------------------------------------------------------------------- /public/images/passport/tour_grad-default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/passport/tour_grad-default.png -------------------------------------------------------------------------------- /public/test/examples/doc_exceptions_bundle.html: -------------------------------------------------------------------------------- 1 |
Hello Bundled World!
2 | 3 | -------------------------------------------------------------------------------- /src/ui/components/Comments/VideoComments/index.ts: -------------------------------------------------------------------------------- 1 | import CommentsOverlay from "./CommentsOverlay"; 2 | 3 | export default CommentsOverlay; 4 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/redux-fundamentals/prettier.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "semi": false, 3 | "singleQuote": true 4 | } 5 | -------------------------------------------------------------------------------- /packages/replay-next/components/sources/log-point-panel/ContextMenu.module.css: -------------------------------------------------------------------------------- 1 | .SmallerIcon { 2 | height: 1rem; 3 | width: 1.5rem; 4 | } 5 | -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-regular.woff -------------------------------------------------------------------------------- /public/fonts/inter/inter-v7-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/inter/inter-v7-latin-regular.woff2 -------------------------------------------------------------------------------- /packages/e2e-tests/examples/cra/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/packages/e2e-tests/examples/cra/public/favicon.ico -------------------------------------------------------------------------------- /packages/e2e-tests/examples/cra/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/packages/e2e-tests/examples/cra/public/logo192.png -------------------------------------------------------------------------------- /packages/e2e-tests/examples/cra/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/packages/e2e-tests/examples/cra/public/logo512.png -------------------------------------------------------------------------------- /packages/replay-next/components/console/ErrorStackRenderer.module.css: -------------------------------------------------------------------------------- 1 | .ErrorStack { 2 | color: var(--color-error); 3 | margin-left: 2rem; 4 | } 5 | -------------------------------------------------------------------------------- /public/images/passport/add_a_comment-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/passport/add_a_comment-complete.png -------------------------------------------------------------------------------- /public/images/passport/jump_to_code-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/passport/jump_to_code-complete.png -------------------------------------------------------------------------------- /public/images/passport/jump_to_event-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/passport/jump_to_event-complete.png -------------------------------------------------------------------------------- /public/images/passport/use_focus_mode-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/passport/use_focus_mode-complete.png -------------------------------------------------------------------------------- /src/devtools/client/shared/components/.eslintrc.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | module.exports = { 4 | globals: { 5 | define: true, 6 | }, 7 | }; 8 | -------------------------------------------------------------------------------- /src/ui/components/ProtocolViewer/index.ts: -------------------------------------------------------------------------------- 1 | import { ProtocolViewerPanel } from "./ProtocolViewerPanel"; 2 | 3 | export default ProtocolViewerPanel; 4 | -------------------------------------------------------------------------------- /src/ui/components/shared/Confirm/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./ConfirmDialog"; 2 | export * from "./ConfirmHook"; 3 | export * from "./ConfirmModal"; 4 | -------------------------------------------------------------------------------- /public/images/passport/explore_sources-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/passport/explore_sources-complete.png -------------------------------------------------------------------------------- /public/images/passport/inspect_element-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/passport/inspect_element-complete.png -------------------------------------------------------------------------------- /public/images/passport/record_a_replay-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/passport/record_a_replay-complete.png -------------------------------------------------------------------------------- /public/test/examples/doc_inspector_sourcemapped.html: -------------------------------------------------------------------------------- 1 | 2 |
HELLO
3 | 4 | 5 | -------------------------------------------------------------------------------- /packages/docs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "docs", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /public/fonts/material_icons/MaterialIcons-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/material_icons/MaterialIcons-Regular.ttf -------------------------------------------------------------------------------- /public/fonts/material_icons/MaterialIcons-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/material_icons/MaterialIcons-Regular.woff2 -------------------------------------------------------------------------------- /public/images/passport/add_a_unicorn_badge-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/passport/add_a_unicorn_badge-complete.png -------------------------------------------------------------------------------- /public/images/passport/search_source_text-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/passport/search_source_text-complete.png -------------------------------------------------------------------------------- /public/images/passport/set_a_print_statement-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/passport/set_a_print_statement-complete.png -------------------------------------------------------------------------------- /src/ui/utils/LoadingStatus.ts: -------------------------------------------------------------------------------- 1 | export enum LoadingStatus { 2 | IDLE = "idle", 3 | LOADING = "loading", 4 | LOADED = "loaded", 5 | ERRORED = "errored", 6 | } 7 | -------------------------------------------------------------------------------- /packages/replay-next/components/lexical/plugins/code-completion/styles.module.css: -------------------------------------------------------------------------------- 1 | .Popup { 2 | } 3 | 4 | .Item { 5 | font-family: var(--font-family-monospace); 6 | } 7 | -------------------------------------------------------------------------------- /packages/shared/user-data/IndexedDB/types.ts: -------------------------------------------------------------------------------- 1 | export interface IDBOptions { 2 | databaseName: string; 3 | databaseVersion: number; 4 | storeNames: string[]; 5 | } 6 | -------------------------------------------------------------------------------- /packages/shared/user-data/LocalStorage/types.ts: -------------------------------------------------------------------------------- 1 | import { config } from "shared/user-data/LocalStorage/config"; 2 | 3 | export type PreferencesKey = keyof typeof config; 4 | -------------------------------------------------------------------------------- /public/images/passport/inspect_network_request-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/passport/inspect_network_request-complete.png -------------------------------------------------------------------------------- /public/images/passport/inspect_react_component-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/passport/inspect_react_component-complete.png -------------------------------------------------------------------------------- /public/images/passport/jump_to_network_request-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/passport/jump_to_network_request-complete.png -------------------------------------------------------------------------------- /public/images/passport/launch_command_palette-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/passport/launch_command_palette-complete.png -------------------------------------------------------------------------------- /public/test/examples/rdt-react-versions/dist/react15/assets/react15.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"assets/react15.js","mappings":"","names":[],"sources":[],"sourcesContent":[]} -------------------------------------------------------------------------------- /public/test/examples/rdt-react-versions/dist/react16/assets/react16.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"assets/react16.js","mappings":"","names":[],"sources":[],"sourcesContent":[]} -------------------------------------------------------------------------------- /public/test/examples/rdt-react-versions/dist/react17/assets/react17.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"assets/react17.js","mappings":"","names":[],"sources":[],"sourcesContent":[]} -------------------------------------------------------------------------------- /src/ui/components/UploadScreen/libraryConstants.ts: -------------------------------------------------------------------------------- 1 | export const MY_LIBRARY = "Your Library"; 2 | export const personalWorkspace = { id: MY_LIBRARY, name: MY_LIBRARY }; 3 | -------------------------------------------------------------------------------- /packages/replay-next/jest.setupEnv.js: -------------------------------------------------------------------------------- 1 | import "@testing-library/jest-dom"; 2 | 3 | delete window.location; 4 | window.location = new URL("http://localhost?recordingId=fake"); 5 | -------------------------------------------------------------------------------- /packages/replay-next/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: { 4 | flexbox: false, 5 | grid: false, 6 | }, 7 | }, 8 | }; 9 | -------------------------------------------------------------------------------- /public/fonts/material_icons/MaterialIconsOutlined-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/material_icons/MaterialIconsOutlined-Regular.otf -------------------------------------------------------------------------------- /public/images/passport/time_travel_in_the_console-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/images/passport/time_travel_in_the_console-complete.png -------------------------------------------------------------------------------- /src/ui/components/NetworkMonitor/ContextMenu.module.css: -------------------------------------------------------------------------------- 1 | .SmallIcon { 2 | width: 1rem; 3 | } 4 | 5 | .IconSpacer { 6 | display: inline-block; 7 | width: 1rem; 8 | } 9 | -------------------------------------------------------------------------------- /src/ui/utils/tour.ts: -------------------------------------------------------------------------------- 1 | import { Nag } from "ui/hooks/users"; 2 | 3 | export function shouldShowNag(nags: Nag[], key: Nag) { 4 | return nags && !nags.includes(key); 5 | } 6 | -------------------------------------------------------------------------------- /public/fonts/material_icons/MaterialIconsOutlined-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/public/fonts/material_icons/MaterialIconsOutlined-Regular.woff2 -------------------------------------------------------------------------------- /packages/replay-next/components/errors/UnexpectedErrorFormImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/replayio/devtools/HEAD/packages/replay-next/components/errors/UnexpectedErrorFormImage.png -------------------------------------------------------------------------------- /packages/replay-next/components/lexical/plugins/loom-link/LoomLink.module.css: -------------------------------------------------------------------------------- 1 | .Image { 2 | max-width: 400px !important; 3 | width: 100%; 4 | cursor: pointer !important; 5 | } 6 | -------------------------------------------------------------------------------- /packages/accordion/constants.tsx: -------------------------------------------------------------------------------- 1 | export const MIN_HEIGHT = 150; 2 | export const BORDER_HEIGHT = 1; 3 | export const HANDLE_HEIGHT = 4; 4 | export const HEADER_HEIGHT = 36 + BORDER_HEIGHT; 5 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: { 5 | flexbox: false, 6 | grid: false, 7 | }, 8 | }, 9 | }; 10 | -------------------------------------------------------------------------------- /packages/replay-next/components/SyntaxHighlighter/SyntaxHighlighterLine.module.css: -------------------------------------------------------------------------------- 1 | .Line { 2 | font-size: inherit; 3 | font-family: var(--font-family-monospace); 4 | display: block; 5 | } 6 | -------------------------------------------------------------------------------- /packages/replay-next/components/sources/log-point-panel/LogPointPanelDoubleBuffer.module.css: -------------------------------------------------------------------------------- 1 | .LogPointPanelDoubleBuffer { 2 | visibility: hidden; 3 | z-index: -1; 4 | position: absolute; 5 | } 6 | -------------------------------------------------------------------------------- /packages/accordion/website/pages/_app.js: -------------------------------------------------------------------------------- 1 | import "../styles/globals.css"; 2 | 3 | function MyApp({ Component, pageProps }) { 4 | return ; 5 | } 6 | 7 | export default MyApp; 8 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/mapped_styles/bundle_input.js: -------------------------------------------------------------------------------- 1 | require("./styles.css"); 2 | 3 | setTimeout(recordingFinished, 0); 4 | function recordingFinished() { 5 | console.log("ExampleFinished"); 6 | } 7 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/redux-vite/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | 3 | export default defineConfig({ 4 | base: "./", 5 | build: { 6 | sourcemap: true, 7 | }, 8 | }); 9 | -------------------------------------------------------------------------------- /packages/replay-next/components/lexical/plugins/mentions/styles.module.css: -------------------------------------------------------------------------------- 1 | .Popup { 2 | } 3 | 4 | .Item { 5 | } 6 | 7 | .Node { 8 | color: var(--primary-accent); 9 | font-weight: bold; 10 | } 11 | -------------------------------------------------------------------------------- /src/ui/components/shared/Forms/index.ts: -------------------------------------------------------------------------------- 1 | import SelectMenu from "./SelectMenu"; 2 | import TextInput from "./TextInput"; 3 | import Toggle from "./Toggle"; 4 | 5 | export { SelectMenu, TextInput, Toggle }; 6 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/rdt-react-versions/postcss.config.js: -------------------------------------------------------------------------------- 1 | // This file needed to work around ancestor folders having PostCSS. 2 | // Ref: https://github.com/sanity-io/sanity/issues/3884 3 | module.exports = {} -------------------------------------------------------------------------------- /packages/e2e-tests/examples/redux-fundamentals/postcss.config.js: -------------------------------------------------------------------------------- 1 | // This file needed to work around ancestor folders having PostCSS. 2 | // Ref: https://github.com/sanity-io/sanity/issues/3884 3 | module.exports = {} -------------------------------------------------------------------------------- /packages/third-party/sourcemap-visualizer/sourcemapVisualizer.d.ts: -------------------------------------------------------------------------------- 1 | export default function renderSourcemap( 2 | source: string, 3 | sourcemap: string, 4 | url: string | undefined, 5 | document: any 6 | ); 7 | -------------------------------------------------------------------------------- /src/ui/components/NetworkMonitor/HttpBody.module.css: -------------------------------------------------------------------------------- 1 | .copy-container .copy-icon { 2 | display: none; 3 | } 4 | 5 | .copy-container:hover .copy-icon { 6 | display: inline-block; 7 | cursor: pointer; 8 | } 9 | -------------------------------------------------------------------------------- /src/ui/components/NetworkMonitor/NetworkMonitorList.module.css: -------------------------------------------------------------------------------- 1 | .Container { 2 | height: 100%; 3 | display: flex; 4 | flex-direction: column; 5 | } 6 | 7 | .ListWrapper { 8 | flex: 1 1 auto; 9 | } 10 | -------------------------------------------------------------------------------- /packages/accordion/website/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: { 5 | flexbox: false, 6 | grid: false, 7 | }, 8 | }, 9 | }; 10 | -------------------------------------------------------------------------------- /packages/import-sort-style-replay/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "import-sort-style-replay", 3 | "private": true, 4 | "version": "0.0.0", 5 | "main": "./import-sort-style-replay.js", 6 | "sideEffects": false 7 | } 8 | -------------------------------------------------------------------------------- /public/test/examples/shorthand_styles.css: -------------------------------------------------------------------------------- 1 | .parent { 2 | margin-left: 10px; 3 | font: italic small-caps bold 24px courier; 4 | } 5 | 6 | .child { 7 | font-size: 20px; 8 | font-family: sans-serif; 9 | } 10 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/expand.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "mochaExplorer.launcherScript": "test/vscodeTestLauncher", 3 | "mochaExplorer.env": { 4 | "TEST_ONLY_TARGET": "gecko", 5 | "RECORD_REPLAY_PLAYWRIGHT_HEADLESS": "true" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /packages/accordion/website/tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | content: ["./pages/**/*.{js,ts,jsx,tsx}", "./components/**/*.{js,ts,jsx,tsx}"], 3 | theme: { 4 | extend: {}, 5 | }, 6 | plugins: [], 7 | }; 8 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/rdt-react-versions/react-15-app/postcss.config.js: -------------------------------------------------------------------------------- 1 | // This file needed to work around ancestor folders having PostCSS. 2 | // Ref: https://github.com/sanity-io/sanity/issues/3884 3 | module.exports = {} -------------------------------------------------------------------------------- /packages/e2e-tests/examples/rdt-react-versions/react-16-app/postcss.config.js: -------------------------------------------------------------------------------- 1 | // This file needed to work around ancestor folders having PostCSS. 2 | // Ref: https://github.com/sanity-io/sanity/issues/3884 3 | module.exports = {} -------------------------------------------------------------------------------- /packages/e2e-tests/examples/rdt-react-versions/react-17-app/postcss.config.js: -------------------------------------------------------------------------------- 1 | // This file needed to work around ancestor folders having PostCSS. 2 | // Ref: https://github.com/sanity-io/sanity/issues/3884 3 | module.exports = {} -------------------------------------------------------------------------------- /packages/replay-next/components/inspector/Inspector.module.css: -------------------------------------------------------------------------------- 1 | .Inspector { 2 | font-family: var(--font-family-monospace); 3 | font-size: var(--font-size-regular); 4 | white-space: nowrap; 5 | overflow: hidden; 6 | } 7 | -------------------------------------------------------------------------------- /packages/design/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./AddCommentButton"; 2 | export * from "./Badge"; 3 | export * from "./Checkbox"; 4 | export * from "./PrefixBadgePicker"; 5 | export * from "./Icon"; 6 | export * from "./SystemProvider"; 7 | -------------------------------------------------------------------------------- /public/test/examples/rdt-react-versions/dist/react15/assets/index-4ab65188.js: -------------------------------------------------------------------------------- 1 | import{R as e,j as t,a}from"./App-74b00b74.js";e.render(t.jsx(a,{}),document.getElementById("root")); 2 | //# sourceMappingURL=index-4ab65188.js.map 3 | -------------------------------------------------------------------------------- /public/test/examples/rdt-react-versions/dist/react16/assets/index-4d2a71e4.js: -------------------------------------------------------------------------------- 1 | import{R as e,j as t,a}from"./App-52499ea0.js";e.render(t.jsx(a,{}),document.getElementById("root")); 2 | //# sourceMappingURL=index-4d2a71e4.js.map 3 | -------------------------------------------------------------------------------- /public/test/examples/rdt-react-versions/dist/react17/assets/index-36b1bcdb.js: -------------------------------------------------------------------------------- 1 | import{R as e,j as t,a}from"./App-ba7ddcc9.js";e.render(t.jsx(a,{}),document.getElementById("root")); 2 | //# sourceMappingURL=index-36b1bcdb.js.map 3 | -------------------------------------------------------------------------------- /src/ui/components/TestSuite/utils/formatTitle.ts: -------------------------------------------------------------------------------- 1 | export function formatTitle(title: string): string { 2 | if (title.includes("/")) { 3 | return title.split("/").pop()!; 4 | } else { 5 | return title; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /packages/accordion/website/pages/api/hello.js: -------------------------------------------------------------------------------- 1 | // Next.js API route support: https://nextjs.org/docs/api-routes/introduction 2 | 3 | export default function handler(req, res) { 4 | res.status(200).json({ name: "John Doe" }); 5 | } 6 | -------------------------------------------------------------------------------- /packages/replay-next/components/lexical/plugins/typeahead/commands.ts: -------------------------------------------------------------------------------- 1 | import { LexicalCommand } from "lexical"; 2 | 3 | export const INSERT_ITEM_COMMAND: LexicalCommand<{ 4 | item: any; 5 | }> = { 6 | type: "INSERT_ITEM", 7 | }; 8 | -------------------------------------------------------------------------------- /packages/replay-next/src/types.ts: -------------------------------------------------------------------------------- 1 | import { ExecutionPoint } from "@replayio/protocol"; 2 | 3 | export type ExecutionPointRange = [start: ExecutionPoint, end: ExecutionPoint]; 4 | export type TimeRange = [start: number, end: number]; 5 | -------------------------------------------------------------------------------- /test/examples/node/basic.js: -------------------------------------------------------------------------------- 1 | 2 | function foo() { 3 | for (let i = 0; i < 3; i++) { 4 | bar(i); 5 | } 6 | } 7 | 8 | function bar(num) { 9 | console.log("HELLO", num, { num }); 10 | } 11 | 12 | setTimeout(foo, 0); 13 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/redux-fundamentals/src/features/filters/colors.ts: -------------------------------------------------------------------------------- 1 | export const availableColors = ['green', 'blue', 'orange', 'purple', 'red'] 2 | 3 | export const capitalize = (s: string) => s[0].toUpperCase() + s.slice(1) 4 | -------------------------------------------------------------------------------- /packages/shared/theme/getSystemColorScheme.ts: -------------------------------------------------------------------------------- 1 | export function getSystemColorScheme() { 2 | const prefersDarkTheme = window.matchMedia("(prefers-color-scheme:dark)").matches; 3 | 4 | return prefersDarkTheme ? "dark" : "light"; 5 | } 6 | -------------------------------------------------------------------------------- /packages/e2e-tests/scripts/buildkite_run_tests_from_reason-macos-arm64.ts: -------------------------------------------------------------------------------- 1 | /* Copyright 2020-2024 Record Replay Inc. */ 2 | 3 | import { build_from_reason } from "./buildkite_run_tests_from_reason"; 4 | 5 | build_from_reason("macOS", "arm64"); 6 | -------------------------------------------------------------------------------- /packages/replay-next/components/SyntaxHighlighter/SyntaxHighlighter.module.css: -------------------------------------------------------------------------------- 1 | .SyntaxHighlighter { 2 | font-family: var(--font-family-monospace); 3 | font-size: var(--font-size-regular); 4 | white-space: pre; 5 | display: block; 6 | } 7 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/src/utils/tabs.ts: -------------------------------------------------------------------------------- 1 | import type { Tab } from "../reducers/tabs"; 2 | 3 | export function persistTabs(tabs: Tab[]): Tab[] { 4 | return tabs.filter(tab => tab.url).map(tab => ({ url: tab.url, sourceId: "" })); 5 | } 6 | -------------------------------------------------------------------------------- /src/ui/components/shared/LoginModal.css: -------------------------------------------------------------------------------- 1 | .login-modal { 2 | position: absolute; 3 | width: 100%; 4 | height: 100%; 5 | } 6 | 7 | .login-modal .modal-content { 8 | min-height: min-content; 9 | min-width: min-content; 10 | } 11 | -------------------------------------------------------------------------------- /test/examples/node/worker.js: -------------------------------------------------------------------------------- 1 | const { parentPort } = require("worker_threads"); 2 | 3 | parentPort.on("message", async ({ kind }) => { 4 | console.log("WorkerReceivedMessage", kind); 5 | parentPort.postMessage({ kind: "pong" }); 6 | }); 7 | -------------------------------------------------------------------------------- /packages/e2e-tests/scripts/buildkite_run_tests_from_reason-linux-x86_64.ts: -------------------------------------------------------------------------------- 1 | /* Copyright 2020-2024 Record Replay Inc. */ 2 | 3 | import { build_from_reason } from "./buildkite_run_tests_from_reason"; 4 | 5 | build_from_reason("linux", "x86_64"); 6 | -------------------------------------------------------------------------------- /src/ui/components/shared/Hoverboard.tsx: -------------------------------------------------------------------------------- 1 | import { Colorway, Hoverboard } from "@replayio/overboard"; 2 | 3 | const OverboardHoverboard = ({ color }: { color: Colorway }) => ; 4 | 5 | export default OverboardHoverboard; 6 | -------------------------------------------------------------------------------- /src/ui/components/shared/ModalBackground.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | import styles from "./ModalBackground.module.css"; 4 | 5 | export default function ModalBackground() { 6 | return
; 7 | } 8 | -------------------------------------------------------------------------------- /.stylelintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "configBasedir": ".", 3 | "extends": ["stylelint-config-prettier"], 4 | "ignoreFiles": [ 5 | "pages/**/*.css", 6 | "src/**/*.css" 7 | ], 8 | "rules": { 9 | "unit-disallowed-list": ["em"] 10 | } 11 | } -------------------------------------------------------------------------------- /packages/design/svgs/navigation.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/ui/components/TestSuite/views/GroupedTestCases/types.ts: -------------------------------------------------------------------------------- 1 | import { TestRecording } from "shared/test-suites/RecordingTestMetadata"; 2 | 3 | export type TestTree = { 4 | scopes: { [name: string]: TestTree }; 5 | testRecordings: TestRecording[]; 6 | }; 7 | -------------------------------------------------------------------------------- /packages/replay-next/components/search-files/HighlightMatch.module.css: -------------------------------------------------------------------------------- 1 | .Match { 2 | background-color: var(--background-color-source-search); 3 | border-bottom: 1px solid var(--border-color-source-search); 4 | color: inherit; 5 | font-weight: bold; 6 | } 7 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/rdt-react-versions/react-15-app/src/main.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from "react"; 2 | import ReactDOM from "react-dom"; 3 | 4 | import App from "./App"; 5 | 6 | ReactDOM.render(, document.getElementById("root")!); 7 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/rdt-react-versions/react-16-app/src/main.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from "react"; 2 | import ReactDOM from "react-dom"; 3 | 4 | import App from "./App"; 5 | 6 | ReactDOM.render(, document.getElementById("root")!); 7 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/rdt-react-versions/react-17-app/src/main.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from "react"; 2 | import ReactDOM from "react-dom"; 3 | 4 | import App from "./App"; 5 | 6 | ReactDOM.render(, document.getElementById("root")!); 7 | -------------------------------------------------------------------------------- /packages/replay-next/components/LoadingProgressBar.module.css: -------------------------------------------------------------------------------- 1 | .Wrapper { 2 | width: 100%; 3 | flex: 0 0 2px; 4 | height: 2px; 5 | } 6 | 7 | .Bar { 8 | height: 100%; 9 | background: var(--primary-accent); 10 | transition-duration: 200ms; 11 | } 12 | -------------------------------------------------------------------------------- /packages/replay-next/components/console/EagerEvaluationResult.module.css: -------------------------------------------------------------------------------- 1 | .Wrapper { 2 | white-space: pre; 3 | opacity: 0.5; 4 | pointer-events: none; 5 | overflow: hidden; 6 | text-overflow: ellipsis; 7 | font-family: var(--font-family-monospace); 8 | } 9 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/chevron-down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/devtools/client/inspector/markup/selectors/markup.ts: -------------------------------------------------------------------------------- 1 | import { UIState } from "ui/state"; 2 | 3 | export const getSelectedNodeId = (state: UIState) => state.markup.selectedNode; 4 | export const getHighlightedNodeIds = (state: UIState) => state.markup.highlightedNodes; 5 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/arrowhead-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/ui/components/Comments/ReplyCard.module.css: -------------------------------------------------------------------------------- 1 | .ReplyCard { 2 | width: 100%; 3 | flex-grow: 1; 4 | cursor: pointer; 5 | padding: 0.25rem 0; 6 | } 7 | 8 | .Unpublished { 9 | background-color: var(--comment-reply-unpublished-background-color); 10 | } 11 | -------------------------------------------------------------------------------- /packages/replay-next/components/inspector/ScopesInspector.module.css: -------------------------------------------------------------------------------- 1 | .ScopesInspector { 2 | font-family: var(--font-family-monospace); 3 | font-size: var(--font-size-regular); 4 | color: var(--color-default); 5 | } 6 | 7 | .Expandable { 8 | width: 100%; 9 | } 10 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/src/global-types.js: -------------------------------------------------------------------------------- 1 | /* This Source Code Form is subject to the terms of the Mozilla Public 2 | * License, v. 2.0. If a copy of the MPL was not distributed with this 3 | * file, You can obtain one at . */ 4 | 5 | // 6 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/pencil-sm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/ui/components/shared/SharingModal/LibraryDropdown.module.css: -------------------------------------------------------------------------------- 1 | :root:global(.theme-dark) .dropdownDivider { 2 | border-bottom: 1px solid var(--chrome); 3 | } 4 | 5 | :root:global(.theme-light) .dropdownDivider { 6 | border-bottom: 1px solid var(--theme-base-90); 7 | } 8 | -------------------------------------------------------------------------------- /src/ui/utils/user.ts: -------------------------------------------------------------------------------- 1 | export function getAvatarColor(avatarID?: number) { 2 | if (!avatarID) { 3 | return "#696969"; 4 | } 5 | const avatarColors = ["#2D4551", "#509A8F", "#E4C478", "#E9A56C", "#D97559"]; 6 | return avatarColors[avatarID % avatarColors.length]; 7 | } 8 | -------------------------------------------------------------------------------- /.markdownlint.yaml: -------------------------------------------------------------------------------- 1 | # Autoformatter friendly markdownlint config (all formatting rules disabled) 2 | default: true 3 | blank_lines: false 4 | bullet: false 5 | html: false 6 | indentation: false 7 | line_length: false 8 | spaces: false 9 | url: false 10 | whitespace: false 11 | -------------------------------------------------------------------------------- /packages/replay-next/components/SyntaxHighlighter/JsonViewer.module.css: -------------------------------------------------------------------------------- 1 | .JsonViewer { 2 | padding: 0.5rem 0; 3 | } 4 | 5 | .Line { 6 | font-size: inherit; 7 | font-family: var(--font-family-monospace); 8 | overflow-x: hidden; 9 | text-overflow: ellipsis; 10 | } 11 | -------------------------------------------------------------------------------- /packages/replay-next/components/elements/NoContentFallback.module.css: -------------------------------------------------------------------------------- 1 | .Message { 2 | height: 1rem; 3 | line-height: 1rem; 4 | font-family: var(--font-family-monospace); 5 | font-size: var(--font-size-regular-monospace); 6 | font-style: italic; 7 | padding: 0 0.5rem; 8 | } 9 | -------------------------------------------------------------------------------- /public/images/icon-windows.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/design/svgs/debug-pause.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/view-list.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/ui/components/TestSuite/views/TestRecording/TestSection.module.css: -------------------------------------------------------------------------------- 1 | .Title { 2 | font-size: var(--font-size-small); 3 | color: var(--color-dimmer); 4 | text-transform: uppercase; 5 | font-weight: bold; 6 | line-height: 2rem; 7 | 8 | padding-left: 0.75rem; 9 | } 10 | -------------------------------------------------------------------------------- /packages/replay-next/components/lexical/plugins/code/utils/$createCodeNode.ts: -------------------------------------------------------------------------------- 1 | import { $applyNodeReplacement } from "lexical"; 2 | 3 | import CodeNode from "../CodeNode"; 4 | 5 | export default function $createCodeNode(): CodeNode { 6 | return $applyNodeReplacement(new CodeNode()); 7 | } 8 | -------------------------------------------------------------------------------- /packages/replay-next/src/hooks/useForceUpdate.ts: -------------------------------------------------------------------------------- 1 | import { useCallback, useState } from "react"; 2 | 3 | export function useForceUpdate() { 4 | const [_, setCount] = useState(0); 5 | 6 | return useCallback(() => { 7 | setCount(prevCount => prevCount + 1); 8 | }, []); 9 | } 10 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/location-marker.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/ui/components/Toolbar.module.css: -------------------------------------------------------------------------------- 1 | .toolboxToolbarContainer { 2 | display: flex; 3 | flex-direction: column; 4 | } 5 | 6 | .toolboxToolbar { 7 | flex: 1; 8 | } 9 | 10 | .MaterialIcon { 11 | display: flex; 12 | align-items: center; 13 | justify-content: center; 14 | } 15 | -------------------------------------------------------------------------------- /packages/replay-next/components/lexical/plugins/code-completion/isExactMatch.ts: -------------------------------------------------------------------------------- 1 | import { Match } from "./types"; 2 | 3 | export default function isExactMatch(query: string, match: Match): boolean { 4 | // Remove leading "." 5 | query = query.slice(1); 6 | 7 | return match === query; 8 | } 9 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/src/components/SecondaryPanes/NewObjectInspector.module.css: -------------------------------------------------------------------------------- 1 | .Popup { 2 | color: var(--color-default); 3 | display: flex; 4 | flex-direction: column; 5 | padding: 0 0.25rem; 6 | } 7 | 8 | .Empty { 9 | font-family: var(--font-family-default); 10 | } 11 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/src/components/SourceOutline/SourceOutline.module.css: -------------------------------------------------------------------------------- 1 | .Warning { 2 | margin: 4px 8px; 3 | padding: 4px 8px; 4 | border: 1px solid var(--theme-warning-border); 5 | background-color: var(--theme-warning-background); 6 | color: var(--theme-warning-color); 7 | } 8 | -------------------------------------------------------------------------------- /src/ui/components/shared/ModalBackground.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | pointer-events: none; 3 | position: absolute; 4 | height: 100%; 5 | width: 100%; 6 | margin: 0; 7 | padding: 0; 8 | background: var(--chrome); 9 | color: var(--body-color); 10 | padding: 20px; 11 | } 12 | -------------------------------------------------------------------------------- /packages/replay-next/components/lexical/plugins/comment/types.ts: -------------------------------------------------------------------------------- 1 | export type FormattedText = { 2 | format: number | null; 3 | isMention: boolean; 4 | text: string; 5 | }; 6 | 7 | export type FormattedTextRange = FormattedText & { 8 | beginIndex: number; 9 | endIndex: number; 10 | }; 11 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/src/components/Editor/ShortcutsContext.ts: -------------------------------------------------------------------------------- 1 | import { createContext } from "react"; 2 | 3 | import KeyShortcuts from "devtools/client/shared/key-shortcuts"; 4 | 5 | const ShortcutsContext = createContext(null); 6 | 7 | export default ShortcutsContext; 8 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/plus-circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/ui/utils/dom.ts: -------------------------------------------------------------------------------- 1 | export function isVisible(parent: HTMLElement, child: HTMLElement) { 2 | const { top, bottom } = child.getBoundingClientRect(); 3 | const scrolledParentRect = parent.getBoundingClientRect(); 4 | return top >= scrolledParentRect.top && bottom <= scrolledParentRect.bottom; 5 | } 6 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/prod_bundle/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "prod_bundle", 3 | "scripts": { 4 | "build": "webpack", 5 | "updateExample": "node updateExample.js" 6 | }, 7 | "devDependencies": { 8 | "@replayio/replay": "^0.15.0", 9 | "webpack": "^5.88.2" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/diamond-pause.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/chat-alt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.semgrepignore: -------------------------------------------------------------------------------- 1 | public/ 2 | .git/ 3 | src/devtools/client/debugger/**/fixtures/** 4 | node_modules 5 | src/devtools/client/shared/vendor/ 6 | src/devtools/client/shared/sourceeditor/codemirror 7 | src/test/harness.js 8 | src/ui/components/SecondaryToolbox/**/*.raw.js 9 | packages/e2e-tests/helpers/authentication.ts -------------------------------------------------------------------------------- /packages/e2e-tests/examples/mapped_styles/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mapped_styles", 3 | "scripts": { 4 | "build": "webpack", 5 | "updateExample": "node updateExample.js" 6 | }, 7 | "devDependencies": { 8 | "@replayio/replay": "^0.15.0", 9 | "webpack": "^5.88.2" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /packages/replay-next/components/lexical/plugins/typeahead/utils/$isSimpleText.ts: -------------------------------------------------------------------------------- 1 | import { $isTextNode, LexicalNode } from "lexical"; 2 | 3 | export default function $isSimpleText(node: LexicalNode): boolean { 4 | return $isTextNode(node) && typeof node.isSimpleText === "function" && node.isSimpleText(); 5 | } 6 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/src/components/SourceOutline/isFunctionOutline.tsx: -------------------------------------------------------------------------------- 1 | import { ClassOutline, FunctionOutline } from "@replayio/protocol"; 2 | 3 | export function isFunctionOutline( 4 | symbol: FunctionOutline | ClassOutline 5 | ): symbol is FunctionOutline { 6 | return "parameters" in symbol; 7 | } 8 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/src/utils/pause/index.js: -------------------------------------------------------------------------------- 1 | /* This Source Code Form is subject to the terms of the Mozilla Public 2 | * License, v. 2.0. If a copy of the MPL was not distributed with this 3 | * file, You can obtain one at . */ 4 | 5 | // 6 | 7 | export * from "./why"; 8 | -------------------------------------------------------------------------------- /src/ui/components/ProtocolViewer/components/ProtocolViewer.module.css: -------------------------------------------------------------------------------- 1 | .Container { 2 | display: flex; 3 | flex-direction: column; 4 | height: 100%; 5 | width: 100%; 6 | overflow: hidden; 7 | } 8 | 9 | .PanelResizeHandle { 10 | height: 0.5rem; 11 | background-color: var(--chrome); 12 | } 13 | -------------------------------------------------------------------------------- /src/ui/components/shared/Modals/SourcemapSetup.module.css: -------------------------------------------------------------------------------- 1 | .Text { 2 | font-size: var(--font-size-regular); 3 | font-weight: normal; 4 | display: flex; 5 | flex-direction: column; 6 | gap: 0.5rem; 7 | } 8 | 9 | .Link { 10 | color: var(--color-link); 11 | text-decoration: underline; 12 | } 13 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .next 2 | node_modules 3 | public 4 | .github 5 | src/global-css.ts 6 | 7 | test/examples 8 | src/ui/utils/intercom.ts 9 | index.html 10 | packages/third-party/ 11 | pages/_app.tsx 12 | *.tsbuildinfo 13 | *.json 14 | *.yaml 15 | src/**/*.raw.js 16 | src/ui/components/TestSuite/suspense/assets/*.js -------------------------------------------------------------------------------- /packages/e2e-tests/examples/mapped_minified/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mapped_minified", 3 | "scripts": { 4 | "build": "webpack", 5 | "updateExample": "node updateExample.js" 6 | }, 7 | "devDependencies": { 8 | "@replayio/replay": "^0.15.0", 9 | "webpack": "^5.88.2" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/redux-fundamentals/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true 8 | }, 9 | "include": ["vite.config.ts"] 10 | } -------------------------------------------------------------------------------- /packages/replay-next/components/lexical/plugins/code/utils/$isCodeNode.ts: -------------------------------------------------------------------------------- 1 | import { LexicalNode } from "lexical"; 2 | 3 | import CodeTextNode from "../CodeNode"; 4 | 5 | export default function $isCodeNode(node: LexicalNode | null | undefined): node is CodeTextNode { 6 | return node instanceof CodeTextNode; 7 | } 8 | -------------------------------------------------------------------------------- /packages/replay-next/components/lexical/plugins/comment/constants.ts: -------------------------------------------------------------------------------- 1 | // Subset of styles we support; copied from LexicalConstants 2 | export const IS_BOLD = 1; 3 | export const IS_ITALIC = 1 << 1; 4 | export const IS_STRIKETHROUGH = 1 << 2; 5 | export const IS_UNDERLINE = 1 << 3; 6 | export const IS_CODE = 1 << 4; 7 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/paper-airplane.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/exceptions_bundle/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "exceptions_bundle", 3 | "scripts": { 4 | "build": "webpack", 5 | "updateExample": "node updateExample.js" 6 | }, 7 | "devDependencies": { 8 | "@replayio/replay": "^0.15.0", 9 | "webpack": "^5.88.2" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /packages/replay-next/components/sources/utils/formatHitCount.ts: -------------------------------------------------------------------------------- 1 | export function formatHitCount(count: number): string { 2 | if (count === 10_000) { 3 | return "10k+"; 4 | } else if (count < 1_000) { 5 | return `${count}`; 6 | } else { 7 | return `${Math.round(count / 100) / 10}k`; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /public/images/today.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/devtools/client/inspector/rules/components/value/FontFamily.tsx: -------------------------------------------------------------------------------- 1 | interface FFProps { 2 | fontFamilySpanClassName: string; 3 | value: string; 4 | } 5 | 6 | export default function FontFamily({ fontFamilySpanClassName, value }: FFProps) { 7 | return {value}; 8 | } 9 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/rdt-react-versions/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true 8 | }, 9 | "include": ["vite.config.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /packages/replay-next/components/console/Source.module.css: -------------------------------------------------------------------------------- 1 | .Source { 2 | cursor: pointer; 3 | text-decoration: underline; 4 | flex-shrink: 1; 5 | text-align: right; 6 | color: var(--color-default); 7 | } 8 | 9 | .UnknownSourceLabel { 10 | text-decoration: underline; 11 | color: var(--color-dim); 12 | } 13 | -------------------------------------------------------------------------------- /public/images/playback-pause.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/src/components/A11yIntention.css: -------------------------------------------------------------------------------- 1 | /* This Source Code Form is subject to the terms of the Mozilla Public 2 | * License, v. 2.0. If a copy of the MPL was not distributed with this 3 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 | 5 | .A11y-mouse :focus { 6 | outline: 0; 7 | } 8 | -------------------------------------------------------------------------------- /src/ui/components/Comments/TranscriptComments/types.ts: -------------------------------------------------------------------------------- 1 | import { Comment, Reply } from "shared/graphql/types"; 2 | 3 | export type CommentData = 4 | | { type: "comment"; comment: Comment } 5 | | { type: "new_comment"; comment: Comment } 6 | | { type: "reply"; comment: Reply } 7 | | { type: "new_reply"; comment: Reply }; 8 | -------------------------------------------------------------------------------- /packages/replay-next/components/elements/NoContentFallback.tsx: -------------------------------------------------------------------------------- 1 | import styles from "./NoContentFallback.module.css"; 2 | 3 | export function NoContentFallback() { 4 | return ( 5 |
6 | Elements are not available 7 |
8 | ); 9 | } 10 | -------------------------------------------------------------------------------- /packages/replay-next/src/utils/code.ts: -------------------------------------------------------------------------------- 1 | export function validateCode(code: string): boolean { 2 | try { 3 | // Wrapping brackets is necessary to support certain types of expressions, e.g. inline objects 4 | new Function(`[${code}]`); 5 | return true; 6 | } catch (error) { 7 | return false; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /packages/accordion/website/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | [ 4 | "next/babel", 5 | { 6 | "preset-env": { 7 | "targets": { 8 | "chrome": "95" 9 | } 10 | } 11 | } 12 | ] 13 | ], 14 | "plugins": ["@babel/plugin-transform-react-display-name"] 15 | } 16 | -------------------------------------------------------------------------------- /packages/design/svgs/tune.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/replay-next/components/Initializer.module.css: -------------------------------------------------------------------------------- 1 | .Loader { 2 | position: absolute; 3 | top: 0; 4 | bottom: 0; 5 | left: 0; 6 | right: 0; 7 | 8 | display: flex; 9 | align-items: center; 10 | justify-content: center; 11 | 12 | font-size: var(--font-size-large); 13 | color: var(--color-dimmer); 14 | } 15 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/menu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/devtools/shared/generate-uuid.js: -------------------------------------------------------------------------------- 1 | /* This Source Code Form is subject to the terms of the Mozilla Public 2 | * License, v. 2.0. If a copy of the MPL was not distributed with this 3 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 | 5 | export function generateUUID() { 6 | return `uuid-${Math.random()}`; 7 | } 8 | -------------------------------------------------------------------------------- /src/ui/components/TestSuite/views/TestSuitePanel.module.css: -------------------------------------------------------------------------------- 1 | .Panel { 2 | height: 100%; 3 | display: flex; 4 | flex-direction: column; 5 | overflow: auto; 6 | } 7 | 8 | .Loading { 9 | height: 100%; 10 | display: flex; 11 | flex-direction: column; 12 | align-items: center; 13 | justify-content: center; 14 | } 15 | -------------------------------------------------------------------------------- /packages/replay-next/components/console/CurrentTimeIndicator.module.css: -------------------------------------------------------------------------------- 1 | .CurrentTimeIndicator { 2 | width: 100%; 3 | height: 2px; 4 | background-color: var(--color-current); 5 | 6 | /* Ensure current time indicator is always above console rows */ 7 | position: absolute; 8 | z-index: 3; 9 | margin-top: -1px; 10 | } 11 | -------------------------------------------------------------------------------- /packages/shared/constants.ts: -------------------------------------------------------------------------------- 1 | // The PageStyle actor flattens the DOM CSS objects a little bit, merging Rules and their Styles into one actor. 2 | // For elements (which have a style but no associated rule) we fake a rule with the following style id. 3 | export const ELEMENT_STYLE = 100; 4 | 5 | export const TOO_MANY_POINTS_TO_FIND = 10_000; 6 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/src/actions/sources/index.ts: -------------------------------------------------------------------------------- 1 | /* This Source Code Form is subject to the terms of the Mozilla Public 2 | * License, v. 2.0. If a copy of the MPL was not distributed with this 3 | * file, You can obtain one at . */ 4 | 5 | export * from "./newSources"; 6 | export * from "./select"; 7 | -------------------------------------------------------------------------------- /src/ssr.ts: -------------------------------------------------------------------------------- 1 | function requiresWindow(cb: (win: Window) => void) { 2 | if (typeof window !== "undefined") { 3 | return cb(window); 4 | } 5 | } 6 | 7 | function usesWindow(cb: (win?: Window) => T) { 8 | return cb(typeof window !== "undefined" ? window : undefined); 9 | } 10 | 11 | export { requiresWindow, usesWindow }; 12 | -------------------------------------------------------------------------------- /src/ui/utils/formatEstimatedProcessingDuration.ts: -------------------------------------------------------------------------------- 1 | import prettyMilliseconds from "pretty-ms"; 2 | 3 | const MS_IN_MINUTE = 60_000; 4 | 5 | export function formatEstimatedProcessingDuration(ms: number) { 6 | const minutes = Math.ceil(ms / MS_IN_MINUTE) || 1; 7 | return prettyMilliseconds(minutes * MS_IN_MINUTE, { verbose: true }); 8 | } 9 | -------------------------------------------------------------------------------- /public/images/f.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /public/test/examples/doc_minified.html: -------------------------------------------------------------------------------- 1 |
Hello World!
-------------------------------------------------------------------------------- /src/devtools/client/inspector/rules/components/value/Url.tsx: -------------------------------------------------------------------------------- 1 | interface UrlProps { 2 | href: string; 3 | value: string; 4 | } 5 | 6 | export default function Url({ href, value }: UrlProps) { 7 | return ( 8 | 9 | {value} 10 | 11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/src/components/shared/Dropdown.d.ts: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | 3 | interface DropdownProps { 4 | panel: React.ReactNode; 5 | icon: React.ReactNode; 6 | panelStyles: React.CSSProperties; 7 | } 8 | 9 | export class Dropdown extends Component {} 10 | export default Dropdown; 11 | -------------------------------------------------------------------------------- /src/ui/components/shared/AppContainerPortal.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | import { createPortal } from "react-dom"; 3 | 4 | export default function AppContainerPortal({ children }: { children: ReactNode }) { 5 | const containerNode = document.querySelector("#app-container")!; 6 | return createPortal(children, containerNode); 7 | } 8 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/cra/src/index.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom/client"; 3 | 4 | import App from "./App"; 5 | import "./index.css"; 6 | 7 | const root = ReactDOM.createRoot(document.getElementById("root")); 8 | root.render( 9 | 10 | 11 | 12 | ); 13 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/prod_bundle/webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | 3 | module.exports = { 4 | context: __dirname, 5 | entry: "./bundle_input.js", 6 | output: { 7 | filename: "prod_bundle.js", 8 | path: path.resolve(__dirname, "dist"), 9 | }, 10 | devtool: "source-map", 11 | mode: "production", 12 | }; 13 | -------------------------------------------------------------------------------- /test/examples/node/exceptions.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | function finished() { 4 | process.exit(0); 5 | } 6 | let number = 0; 7 | setTimeout(foo, 0); 8 | function foo() { 9 | try { 10 | bar(); 11 | } catch (e) {} 12 | setTimeout(number == 10 ? recordingFinished : foo, 0); 13 | } 14 | function bar() { 15 | number++; 16 | throw { number }; 17 | } 18 | -------------------------------------------------------------------------------- /packages/design/svgs/person.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/replay-next/components/lexical/plugins/mentions/isExactMatch.ts: -------------------------------------------------------------------------------- 1 | import { Collaborator } from "./types"; 2 | 3 | export default function isExactMatch(query: string, collaborator: Collaborator): boolean { 4 | // Strip the "@" prefix off of the query before searching. 5 | query = query.slice(1); 6 | 7 | return collaborator.name === query; 8 | } 9 | -------------------------------------------------------------------------------- /src/ui/components/SecondaryToolbox/ReactDevTools.module.css: -------------------------------------------------------------------------------- 1 | .Messages { 2 | display: flex; 3 | flex-direction: column; 4 | gap: 1rem; 5 | text-align: center; 6 | } 7 | 8 | .Message { 9 | color: var(--color-dim); 10 | transition: height 0.3s; 11 | } 12 | 13 | .DiscordLink { 14 | text-decoration: underline; 15 | cursor: pointer; 16 | } 17 | -------------------------------------------------------------------------------- /packages/design/Badge/Badge.module.css: -------------------------------------------------------------------------------- 1 | .Badge { 2 | display: inline-block; 3 | padding: 0 0.25rem; 4 | border-radius: 0.25rem; 5 | font-size: var(--font-size-small); 6 | background-color: var(--theme-menu-highlight); 7 | } 8 | 9 | .Badge[data-error] { 10 | background-color: var(--background-color-error); 11 | color: var(--color-error); 12 | } 13 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/mapped_minified/webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | 3 | module.exports = { 4 | context: __dirname, 5 | entry: "./bundle_input.js", 6 | output: { 7 | filename: "mapped_minified.js", 8 | path: path.resolve(__dirname, "dist"), 9 | }, 10 | devtool: "source-map", 11 | mode: "development", 12 | }; 13 | -------------------------------------------------------------------------------- /packages/replay-next/src/contexts/GraphQLClientContext.tsx: -------------------------------------------------------------------------------- 1 | import { createContext } from "react"; 2 | 3 | import { GraphQLClientInterface, graphQLClient } from "shared/graphql/GraphQLClient"; 4 | 5 | export type GraphQLClientContextType = GraphQLClientInterface; 6 | 7 | export const GraphQLClientContext = createContext(graphQLClient); 8 | -------------------------------------------------------------------------------- /public/test/examples/prod_bundle.js: -------------------------------------------------------------------------------- 1 | (()=>{function o(){const o={barprop1:2,barprop2:3,nested:{nestedprop1:4}},n=[5,6,o];var t;return console.log(o),t=n,o.barprop1="updated",t.push("new"),console.log(o),setTimeout(e,500),n}function e(){console.log("ExampleFinished")}setTimeout((function(){console.log(o())}),0),window.bar=o})(); 2 | //# sourceMappingURL=prod_bundle.js.map -------------------------------------------------------------------------------- /src/devtools/client/themes/images/login.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/ui/components/shared/Forms/Radio.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export default function Radio(overrides: React.HTMLProps) { 4 | return ( 5 | 10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /packages/design/svgs/calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/exceptions_bundle/webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | 3 | module.exports = { 4 | context: __dirname, 5 | entry: "./bundle_input.js", 6 | output: { 7 | filename: "exceptions_bundle.js", 8 | path: path.resolve(__dirname, "./dist"), 9 | }, 10 | devtool: "source-map", 11 | mode: "development", 12 | }; 13 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/redux-fundamentals/tests/playwright-example.test.ts: -------------------------------------------------------------------------------- 1 | import { Locator, Page, expect, test } from '@playwright/test' 2 | 3 | import testFunction from './example-script' 4 | 5 | test('Basic todo app mouse and keyboard interactions', async ({ page }) => { 6 | await page.goto('http://localhost:5173') 7 | await testFunction(page, expect) 8 | }) 9 | -------------------------------------------------------------------------------- /src/ui/components/Comments/CommentDropDownMenu.module.css: -------------------------------------------------------------------------------- 1 | .Button { 2 | background: none; 3 | border: none; 4 | outline: none; 5 | flex: 0 0 1rem; 6 | cursor: pointer; 7 | } 8 | 9 | .Icon { 10 | height: 1rem; 11 | width: 1rem; 12 | } 13 | .Icon[data-selected] { 14 | color: var(--color-link); 15 | } 16 | 17 | .Checkbox { 18 | gap: 1ch; 19 | } 20 | -------------------------------------------------------------------------------- /packages/replay-next/components/lexical/plugins/mentions/utils/$isMentionsTextNode.ts: -------------------------------------------------------------------------------- 1 | import { LexicalNode } from "lexical"; 2 | 3 | import MentionsTextNode from "../MentionsTextNode"; 4 | 5 | export default function $isMentionsTextNode( 6 | node: LexicalNode | null | undefined 7 | ): node is MentionsTextNode { 8 | return node instanceof MentionsTextNode; 9 | } 10 | -------------------------------------------------------------------------------- /packages/replay-next/src/contexts/LayoutContext.tsx: -------------------------------------------------------------------------------- 1 | import { createContext } from "react"; 2 | 3 | export type LayoutContextType = { 4 | // whether console and sources can be shown at the same time 5 | canShowConsoleAndSources: boolean; 6 | }; 7 | 8 | export const LayoutContext = createContext({ 9 | canShowConsoleAndSources: true, 10 | }); 11 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: GitHub Discussions 4 | url: https://github.com/RecordReplay/devtools/discussions 5 | about: Share product feedback, feature requests, ask questions 6 | - name: Discord Community 7 | url: https://discord.gg/hw3eDwvChz 8 | about: Stop by if you would like to discuss Replay 9 | -------------------------------------------------------------------------------- /packages/e2e-tests/helpers/types.ts: -------------------------------------------------------------------------------- 1 | export type Expected = string | boolean | number; 2 | 3 | // TODO [FE-626] Would be nice to share this type with the production Console renderers 4 | export type MessageType = 5 | | "console-error" 6 | | "console-log" 7 | | "console-warning" 8 | | "event" 9 | | "exception" 10 | | "log-point" 11 | | "terminal-expression"; 12 | -------------------------------------------------------------------------------- /packages/shared/utils/url.ts: -------------------------------------------------------------------------------- 1 | export function getFlag(flagName: string): string | null { 2 | if (typeof window !== "undefined") { 3 | const url = new URL(window.location.href); 4 | return url.searchParams.get(flagName); 5 | } 6 | return null; 7 | } 8 | 9 | export function hasFlag(flagName: string): boolean { 10 | return getFlag(flagName) !== null; 11 | } 12 | -------------------------------------------------------------------------------- /public/images/comment-onboarding-arrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /public/test/examples/rdt-react-versions/dist/react15/assets/__federation_expose_AppInjector-7dddba10.js: -------------------------------------------------------------------------------- 1 | import{R as e,j as n,a as o}from"./App-74b00b74.js";const s=t=>e.render(n.jsx(o,{}),document.getElementById(t)),c=t=>e.unmountComponentAtNode(document.getElementById(t));export{s as inject,c as unmount}; 2 | //# sourceMappingURL=__federation_expose_AppInjector-7dddba10.js.map 3 | -------------------------------------------------------------------------------- /public/test/examples/rdt-react-versions/dist/react16/assets/__federation_expose_AppInjector-f0210664.js: -------------------------------------------------------------------------------- 1 | import{R as e,j as n,a as o}from"./App-52499ea0.js";const s=t=>e.render(n.jsx(o,{}),document.getElementById(t)),c=t=>e.unmountComponentAtNode(document.getElementById(t));export{s as inject,c as unmount}; 2 | //# sourceMappingURL=__federation_expose_AppInjector-f0210664.js.map 3 | -------------------------------------------------------------------------------- /public/test/examples/rdt-react-versions/dist/react17/assets/__federation_expose_AppInjector-3adc3cc9.js: -------------------------------------------------------------------------------- 1 | import{R as e,j as n,a as o}from"./App-ba7ddcc9.js";const s=t=>e.render(n.jsx(o,{}),document.getElementById(t)),c=t=>e.unmountComponentAtNode(document.getElementById(t));export{s as inject,c as unmount}; 2 | //# sourceMappingURL=__federation_expose_AppInjector-3adc3cc9.js.map 3 | -------------------------------------------------------------------------------- /src/ui/components/TestSuite/views/TestRecording/TestRecordingEvents/NavigationEventRow.module.css: -------------------------------------------------------------------------------- 1 | .Indented { 2 | padding-left: 1rem; 3 | } 4 | .Text { 5 | flex: 1; 6 | color: var(--color-dim); 7 | } 8 | 9 | .Name { 10 | flex: 0 1 auto; 11 | overflow: hidden; 12 | text-overflow: ellipsis; 13 | word-break: break-all; 14 | color: var(--color-link); 15 | } 16 | -------------------------------------------------------------------------------- /src/ui/components/Timeline/LoadingProgressBars.module.css: -------------------------------------------------------------------------------- 1 | .LoadingRegion, 2 | .IndexedAndLoadedRegion { 3 | position: absolute; 4 | height: 5px; 5 | } 6 | 7 | .LoadingRegion { 8 | background-color: var(--focus-mode-loading-color); 9 | width: 100%; 10 | } 11 | 12 | .IndexedAndLoadedRegion { 13 | background-color: var(--focus-mode-loaded-indexed-color); 14 | } 15 | -------------------------------------------------------------------------------- /public/test/examples/doc_async_stack.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
Hello World!
4 | 5 | 13 | 14 | -------------------------------------------------------------------------------- /src/ui/components/shared/Base64Image.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export default function Base64Image({ 4 | src, 5 | format, 6 | ...rest 7 | }: React.ImgHTMLAttributes & { format?: string | null }) { 8 | if (!src || !format) { 9 | return null; 10 | } 11 | 12 | return ; 13 | } 14 | -------------------------------------------------------------------------------- /packages/design/svgs/delete.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/ui/components/SecondaryToolbox/react-devtools/components/Badge.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | 3 | import styles from "./Badge.module.css"; 4 | 5 | export function Badge({ children, title = children }: { children: string; title?: string }) { 6 | return ( 7 | 8 | {children} 9 | 10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /src/ui/components/TestSuite/components/LabeledIcon.module.css: -------------------------------------------------------------------------------- 1 | .LabeledIcon { 2 | display: inline-flex; 3 | align-items: center; 4 | gap: 1ch; 5 | overflow: hidden; 6 | } 7 | 8 | .Icon { 9 | width: 1rem; 10 | height: 1rem; 11 | } 12 | 13 | .Label { 14 | overflow: hidden; 15 | text-overflow: ellipsis; 16 | word-break: break-all; 17 | white-space: nowrap; 18 | } 19 | -------------------------------------------------------------------------------- /src/ui/components/shared/Dialog.css: -------------------------------------------------------------------------------- 1 | .dialog { 2 | border-radius: 8px; 3 | background: #fff; 4 | color: #38383d; 5 | border-radius: 8px; 6 | box-shadow: 0px 20px 25px -5px rgba(0, 0, 0, 0.1), 0px 10px 10px -5px rgba(0, 0, 0, 0.04); 7 | height: max-content; 8 | padding: 8px; 9 | padding-bottom: 32px; 10 | width: max-content; 11 | backdrop-filter: blur(8px); 12 | } 13 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | src/devtools/client/debugger/**/fixtures/** 2 | node_modules 3 | src/devtools/client/shared/vendor/ 4 | src/devtools/client/shared/sourceeditor/codemirror 5 | packages/third-party/ 6 | public/test/examples 7 | packages/accordion/website/ 8 | packages/shared/graphql/generated 9 | **/*.config.js 10 | **/.eslintrc* 11 | **/*.d.ts 12 | src/ui/components/SecondaryToolbox/**/*.raw.js -------------------------------------------------------------------------------- /packages/replay-next/components/search-files/ResultsList.module.css: -------------------------------------------------------------------------------- 1 | .Results, 2 | .ResultsPending { 3 | flex: 1 1 auto; 4 | display: flex; 5 | flex-direction: column; 6 | cursor: default; 7 | user-select: none; 8 | transition-duration: 200ms; 9 | } 10 | .ResultsPending { 11 | opacity: 0.5; 12 | } 13 | 14 | .List { 15 | overflow: hidden; 16 | flex: 1 1 auto; 17 | } 18 | -------------------------------------------------------------------------------- /public/test/examples/cra/dist/static/css/main.e6c13ad2.css: -------------------------------------------------------------------------------- 1 | body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;margin:0}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace} 2 | /*# sourceMappingURL=main.e6c13ad2.css.map*/ -------------------------------------------------------------------------------- /src/devtools/client/themes/images/trash.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/playwright-recorder/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "strict": true, 5 | "target": "ES2022", 6 | "lib": ["es2023"], 7 | "moduleResolution": "Node", 8 | "downlevelIteration": true, 9 | "esModuleInterop": true, 10 | "resolveJsonModule": true, 11 | "rootDir": "./src", 12 | "outDir": "./dist", 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/arrow-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/ui/utils/awaitWithTimeout.ts: -------------------------------------------------------------------------------- 1 | export const AwaitTimeout = Symbol("await-timeout"); 2 | export async function awaitWithTimeout( 3 | promise: PromiseLike, 4 | timeout = 500 5 | ): Promise { 6 | return Promise.race([ 7 | new Promise(resolve => setTimeout(() => resolve(AwaitTimeout), timeout)), 8 | promise, 9 | ]); 10 | } 11 | -------------------------------------------------------------------------------- /packages/playwright-recorder/src/config.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | backendUrl: process.env.DISPATCH_ADDRESS || "wss://dispatch.replay.io", 3 | graphqlUrl: process.env.GRAPHQL_ADDRESS || "https://api.replay.io/v1/graphql", 4 | browserPath: process.env.RECORD_REPLAY_PATH, 5 | driverPath: process.env.RECORD_REPLAY_DRIVER, 6 | headless: process.env.RECORD_REPLAY_PLAYWRIGHT_HEADLESS != "false", 7 | }; 8 | -------------------------------------------------------------------------------- /packages/replay-next/components/PanelLoader.module.css: -------------------------------------------------------------------------------- 1 | .Wrapper { 2 | display: flex; 3 | flex-direction: column; 4 | align-items: center; 5 | justify-content: center; 6 | height: 100%; 7 | color: var(--color-dimmer); 8 | } 9 | 10 | .Loader { 11 | flex: 1 1 auto; 12 | display: flex; 13 | flex-direction: column; 14 | align-items: center; 15 | justify-content: center; 16 | } 17 | -------------------------------------------------------------------------------- /packages/replay-next/components/lexical/plugins/code-completion/types.ts: -------------------------------------------------------------------------------- 1 | import type { Spread } from "lexical"; 2 | import { SerializedTextNode } from "lexical"; 3 | 4 | export type SerializedCodeCompletionTextNode = Spread< 5 | { 6 | text: string; 7 | type: "code-completion-item"; 8 | version: 1; 9 | }, 10 | SerializedTextNode 11 | >; 12 | 13 | export type Match = string; 14 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/arrow-up-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/ui/components/reactjs-popup.css: -------------------------------------------------------------------------------- 1 | #popup-root .popup-content { 2 | background: var(--theme-popup-color); 3 | color: var(--theme-popup-background-color); 4 | font-family: "Inter", sans-serif; 5 | font-size: 12px; 6 | width: auto; 7 | padding: 8px 12px; 8 | border: none; 9 | } 10 | 11 | #popup-root .popup-arrow { 12 | color: var(--theme-popup-color); 13 | filter: none; 14 | } 15 | -------------------------------------------------------------------------------- /src/ui/graphql/sessions.ts: -------------------------------------------------------------------------------- 1 | import { gql } from "@apollo/client"; 2 | 3 | export const GET_ACTIVE_SESSIONS = gql` 4 | query GetActiveSessions($recordingId: UUID!) { 5 | recording(uuid: $recordingId) { 6 | uuid 7 | activeSessions { 8 | id 9 | user { 10 | id 11 | name 12 | picture 13 | } 14 | } 15 | } 16 | } 17 | `; 18 | -------------------------------------------------------------------------------- /packages/design/svgs/key.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/prod_bundle/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | 4 | .yarn/* 5 | !.yarn/patches 6 | !.yarn/plugins 7 | !.yarn/releases 8 | !.yarn/sdks 9 | !.yarn/versions 10 | 11 | # Swap the comments on the following lines if you don't wish to use zero-installs 12 | # Documentation here: https://yarnpkg.com/features/zero-installs 13 | #!.yarn/cache 14 | #.pnp.* 15 | 16 | ./bundle_input.js -------------------------------------------------------------------------------- /packages/replay-next/components/inspector/values/types.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Object as ProtocolObject, 3 | PauseId as ProtocolPauseId, 4 | Value as ProtocolValue, 5 | } from "@replayio/protocol"; 6 | 7 | export type ObjectPreviewRendererProps = { 8 | context: "console" | "default" | "nested"; 9 | object: ProtocolObject; 10 | pauseId: ProtocolPauseId; 11 | protocolValue: ProtocolValue; 12 | }; 13 | -------------------------------------------------------------------------------- /packages/shared/utils/points.ts: -------------------------------------------------------------------------------- 1 | import { Point } from "shared/client/types"; 2 | 3 | export function isValidPoint(maybePoint: unknown): maybePoint is Point { 4 | return ( 5 | typeof maybePoint === "object" && 6 | maybePoint !== null && 7 | maybePoint.hasOwnProperty("badge") && 8 | maybePoint.hasOwnProperty("condition") && 9 | maybePoint.hasOwnProperty("content") 10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /public/images/k.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/arrow-down-2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/ui/components/SecondaryToolbox/react-devtools/components/ContextPropsStateRenderer.module.css: -------------------------------------------------------------------------------- 1 | .PropertyName { 2 | color: var(--object-inspector-expanded-key); 3 | } 4 | .PropertyName[data-changed] { 5 | background-color: var(--background-color-highlight-change); 6 | color: var(--color-highlight-change); 7 | } 8 | 9 | .Separator { 10 | color: var(--object-inspector-separator-color); 11 | } 12 | -------------------------------------------------------------------------------- /src/ui/state/reactDevTools.ts: -------------------------------------------------------------------------------- 1 | import { ExecutionPoint } from "@replayio/protocol"; 2 | 3 | export interface Annotation { 4 | point: ExecutionPoint; 5 | time: number; 6 | message: any; 7 | } 8 | 9 | export interface ReactDevToolsState { 10 | annotations: Annotation[]; 11 | hasReactComponents: boolean; 12 | reactInitPoint: ExecutionPoint | null; 13 | protocolCheckFailed: boolean; 14 | } 15 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/exceptions_bundle/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | 4 | .yarn/* 5 | !.yarn/patches 6 | !.yarn/plugins 7 | !.yarn/releases 8 | !.yarn/sdks 9 | !.yarn/versions 10 | 11 | # Swap the comments on the following lines if you don't wish to use zero-installs 12 | # Documentation here: https://yarnpkg.com/features/zero-installs 13 | #!.yarn/cache 14 | #.pnp.* 15 | 16 | ./bundle_input.js -------------------------------------------------------------------------------- /packages/e2e-tests/examples/mapped_minified/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | 4 | .yarn/* 5 | !.yarn/patches 6 | !.yarn/plugins 7 | !.yarn/releases 8 | !.yarn/sdks 9 | !.yarn/versions 10 | 11 | # Swap the comments on the following lines if you don't wish to use zero-installs 12 | # Documentation here: https://yarnpkg.com/features/zero-installs 13 | #!.yarn/cache 14 | #.pnp.* 15 | 16 | ./bundle_input.js -------------------------------------------------------------------------------- /packages/e2e-tests/examples/mapped_styles/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist/ 3 | 4 | .yarn/* 5 | !.yarn/patches 6 | !.yarn/plugins 7 | !.yarn/releases 8 | !.yarn/sdks 9 | !.yarn/versions 10 | 11 | # Swap the comments on the following lines if you don't wish to use zero-installs 12 | # Documentation here: https://yarnpkg.com/features/zero-installs 13 | #!.yarn/cache 14 | #.pnp.* 15 | 16 | ./bundle_input.js -------------------------------------------------------------------------------- /packages/replay-next/components/AvatarImage.module.css: -------------------------------------------------------------------------------- 1 | .Image { 2 | background-color: var(--theme-base-85); 3 | } 4 | 5 | .Name { 6 | background-color: var(--background-color-contrast-3); 7 | color: var(--color-default); 8 | border-radius: 100%; 9 | font-size: var(--font-size-tiny); 10 | display: flex; 11 | align-items: center; 12 | justify-content: center; 13 | overflow: hidden; 14 | } 15 | -------------------------------------------------------------------------------- /packages/replay-next/components/sources/utils/classNameToTokenTypes.ts: -------------------------------------------------------------------------------- 1 | import { TokenType } from "../../lexical/plugins/code/types"; 2 | 3 | export default function classNameToTokenTypes(className: string): TokenType[] { 4 | // e.g. "tok-comment" -> ["comment"] 5 | // e.g. "tok-variable tok-definition" -> ["variable", "definition"] 6 | return className.split(" ").map(name => name.slice(4) as TokenType); 7 | } 8 | -------------------------------------------------------------------------------- /packages/design/svgs/trash.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/playwright-recorder/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@devtools-repo/playwright-recorder", 3 | "private": true, 4 | "version": "0.0.0", 5 | "main": "./dist/index.js", 6 | "dependencies": { 7 | "@playwright/test": "^1.37.0", 8 | "@replayio/replay": "^0.22.4", 9 | "axios": "^0.21.1", 10 | "chalk": "^4", 11 | "strip-ansi": "^6.0.0" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /packages/design/Badge/index.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | 3 | import styles from "./Badge.module.css"; 4 | 5 | export function Badge({ 6 | label, 7 | showErrorBadge = false, 8 | }: { 9 | label: ReactNode; 10 | showErrorBadge?: boolean; 11 | }) { 12 | return ( 13 |
14 | {label} 15 |
16 | ); 17 | } 18 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/dropmarker.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/ui/components/SecondaryToolbox/react-devtools/components/Badge.module.css: -------------------------------------------------------------------------------- 1 | .Badge { 2 | background: var(--background-color-current-execution-point); 3 | color: var(--value-type-html-tag); 4 | font-family: var(--font-family-default); 5 | font-size: var(--font-size-tiny); 6 | padding: 0 0.25rem; 7 | border-radius: 0.25rem; 8 | margin-left: 1ch; 9 | height: 0.8rem; 10 | line-height: 0.8rem; 11 | } 12 | -------------------------------------------------------------------------------- /packages/replay-next/components/ExternalLink.tsx: -------------------------------------------------------------------------------- 1 | import React, { AnchorHTMLAttributes, ReactNode } from "react"; 2 | 3 | export default function ExternalLink({ 4 | children, 5 | ...props 6 | }: Omit, "target" | "rel"> & { children: ReactNode }) { 7 | return ( 8 | 9 | {children} 10 | 11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /packages/replay-next/components/Spinner.module.css: -------------------------------------------------------------------------------- 1 | .Spinner { 2 | width: 1rem; 3 | height: 1rem; 4 | color: var(--color-dim); 5 | animation: spin 1s linear infinite; 6 | } 7 | 8 | .Circle { 9 | opacity: 0.2; 10 | } 11 | 12 | .Path { 13 | opacity: 0.85; 14 | } 15 | 16 | @keyframes spin { 17 | from { 18 | transform: rotate(0deg); 19 | } 20 | to { 21 | transform: rotate(360deg); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /packages/replay-next/components/console/filters/FilterText.module.css: -------------------------------------------------------------------------------- 1 | .Input { 2 | flex: 1; 3 | height: 1.25rem; 4 | background-color: var(--background-color-inputs); 5 | color: var(--color-default); 6 | padding: 0 0.25rem; 7 | margin: 0.25rem; 8 | border: 2px solid transparent; 9 | border-radius: 0.25rem; 10 | outline: none; 11 | } 12 | .Input:focus { 13 | border-color: var(--primary-accent); 14 | } 15 | -------------------------------------------------------------------------------- /packages/replay-next/components/sources/utils/clipboard.ts: -------------------------------------------------------------------------------- 1 | export function copyToClipboard(text: string): void { 2 | const doCopy = function (event: ClipboardEvent) { 3 | event.clipboardData?.setData("text/plain", text); 4 | event.preventDefault(); 5 | }; 6 | 7 | document.addEventListener("copy", doCopy); 8 | document.execCommand("copy", false); 9 | document.removeEventListener("copy", doCopy); 10 | } 11 | -------------------------------------------------------------------------------- /packages/e2e-tests/scripts/aws_secrets.ts: -------------------------------------------------------------------------------- 1 | /* Copyright 2024 Record Replay Inc. */ 2 | 3 | import { execSync } from "child_process"; 4 | 5 | export function getSecret(key: string, region: string) { 6 | return execSync( 7 | `aws secretsmanager get-secret-value --secret-id "${key}" --region ${region} --output json --query "SecretString"` 8 | ) 9 | .toString() 10 | .trim() 11 | .replace(/"/g, ""); 12 | } 13 | -------------------------------------------------------------------------------- /packages/e2e-tests/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict": true, 4 | "target": "es2018", 5 | "moduleResolution": "Node", 6 | "downlevelIteration": true, 7 | "esModuleInterop": true, 8 | "resolveJsonModule": true, 9 | "types": ["cypress", "node"], 10 | "paths": { 11 | "@devtools-repo/playwright-recorder": ["../playwright-recorder/src/index.ts"], 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /public/images/dotted-mask-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/images/dotted-mask-light.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /public/images/timer.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /docs/codebase-notes/README.md: -------------------------------------------------------------------------------- 1 | # Codebase Structure Running Notes 2 | 3 | I'm taking some general notes on the structure of the codebase as it currently exists (2022-03) and adding them here for reference. 4 | 5 | These may very quickly get outdated depending on how we continue doing cleaning up and refactoring, but hopefully this can both help with the refactoring process and serve as a guide to what's going on inside the codebase atm. 6 | -------------------------------------------------------------------------------- /packages/shared/theme/useTheme.ts: -------------------------------------------------------------------------------- 1 | import { getSystemColorScheme } from "shared/theme/getSystemColorScheme"; 2 | import { useGraphQLUserData } from "shared/user-data/GraphQL/useGraphQLUserData"; 3 | 4 | export function useTheme(): "dark" | "light" { 5 | const [theme] = useGraphQLUserData("global_theme"); 6 | if (theme === "system") { 7 | return getSystemColorScheme(); 8 | } else { 9 | return theme; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /scripts/perf-analysis/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict": true, 4 | "target": "ES2022", 5 | "lib": ["es2023"], 6 | "moduleResolution": "Node", 7 | "downlevelIteration": true, 8 | "esModuleInterop": true, 9 | "resolveJsonModule": true, 10 | "paths": { 11 | "@devtools-repo/playwright-recorder": ["../../packages/playwright-recorder/src/index.ts"], 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/sort-ascending-arrow.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/sort-descending-arrow.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /public/test/examples/doc_exceptions.html: -------------------------------------------------------------------------------- 1 |
Hello World!
2 | 19 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/document.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/src/selectors/index.ts: -------------------------------------------------------------------------------- 1 | export * from "../reducers/tabs"; 2 | export * from "../reducers/pause"; 3 | export * from "../reducers/threads"; 4 | export * from "../reducers/ui"; 5 | export * from "../reducers/ast"; 6 | export * from "../reducers/source-tree"; 7 | export * from "../reducers/preview"; 8 | 9 | export * from "../reducers/quick-open"; 10 | 11 | export { getSelectedFrameSuspense } from "./pause"; 12 | -------------------------------------------------------------------------------- /src/ui/components/UploadScreen/ExpiredWorkspaces.module.css: -------------------------------------------------------------------------------- 1 | .wrapper { 2 | position: absolute; 3 | top: -4rem; 4 | background-color: #fffbd2; 5 | color: #6e4400; 6 | border: 1px solid #f7ea9c; 7 | border-radius: 0.5rem; 8 | padding: 0.5rem 1rem; 9 | cursor: default; 10 | } 11 | 12 | .warning { 13 | font-weight: bold; 14 | } 15 | 16 | .wrapper a { 17 | margin-left: 0.3rem; 18 | text-decoration: underline; 19 | } 20 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: New Issue 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Description:** 11 | 12 | 13 | **Steps to Reproduce:** 14 | 15 | 16 | **Expected Result:** 17 | 18 | **Additional Context:** 19 | 20 | * Screenshots: 21 | * Video (Loom): 22 | * Replay ([replay.io/record-bugs](https://replay.io/record-bugs) for instructions): 23 | -------------------------------------------------------------------------------- /.github/workflows/mirror.yml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | branches: 4 | - 'main' 5 | 6 | jobs: 7 | mirror_job: 8 | runs-on: ubuntu-latest 9 | name: Mirror main branch to staging branch 10 | steps: 11 | - name: Mirror action step 12 | id: mirror 13 | uses: google/mirror-branch-action@v1.0 14 | with: 15 | github-token: ${{ secrets.GITHUB_TOKEN }} 16 | source: 'main' 17 | dest: 'staging' -------------------------------------------------------------------------------- /public/test/examples/doc_recursion.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
Hello World!
4 | 5 | 18 | 19 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/animation-fast-track.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/redux-fundamentals/src/exampleAddons/middleware.js: -------------------------------------------------------------------------------- 1 | export const print1 = (storeAPI) => (next) => (action) => { 2 | console.log('1') 3 | return next(action) 4 | } 5 | 6 | export const print2 = (storeAPI) => (next) => (action) => { 7 | console.log('2') 8 | return next(action) 9 | } 10 | 11 | export const print3 = (storeAPI) => (next) => (action) => { 12 | console.log('3') 13 | return next(action) 14 | } 15 | -------------------------------------------------------------------------------- /packages/replay-next/components/lexical/plugins/mentions/types.ts: -------------------------------------------------------------------------------- 1 | import type { Spread } from "lexical"; 2 | import { SerializedTextNode } from "lexical"; 3 | 4 | export type Collaborator = { 5 | id: string; 6 | name: string; 7 | }; 8 | 9 | export type SerializedMentionsTextNode = Spread< 10 | { 11 | id: string; 12 | name: string; 13 | type: "mentions-item"; 14 | version: 1; 15 | }, 16 | SerializedTextNode 17 | >; 18 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/src/components/shared/Badge.js: -------------------------------------------------------------------------------- 1 | /* This Source Code Form is subject to the terms of the Mozilla Public 2 | * License, v. 2.0. If a copy of the MPL was not distributed with this 3 | * file, You can obtain one at . */ 4 | 5 | // 6 | import React from "react"; 7 | 8 | const Badge = ({ children }) => {children}; 9 | 10 | export default Badge; 11 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/grid.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/ui/graphql/utils.ts: -------------------------------------------------------------------------------- 1 | import { ApolloError } from "@apollo/client"; 2 | 3 | export function getBackendErrorMessage(err: ApolloError) { 4 | const networkError = err.networkError as any; 5 | 6 | // The apollo client doesn't expose the network error details via its type 7 | // so we're cautiously walking down the object to see if the backend threw 8 | // a specific error 9 | return networkError?.result?.errors?.[0]?.message; 10 | } 11 | -------------------------------------------------------------------------------- /packages/design/svgs/file.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/redux-vite/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /public/test/examples/doc_events.html: -------------------------------------------------------------------------------- 1 | 2 |
Hello World!
3 | 19 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/src/components/shared/Button/index.js: -------------------------------------------------------------------------------- 1 | /* This Source Code Form is subject to the terms of the Mozilla Public 2 | * License, v. 2.0. If a copy of the MPL was not distributed with this 3 | * file, You can obtain one at . */ 4 | 5 | // 6 | 7 | import CloseButton from "./CloseButton"; 8 | import CommandBarButton from "./CommandBarButton"; 9 | 10 | export { CloseButton, CommandBarButton }; 11 | -------------------------------------------------------------------------------- /src/ui/components/Toolbox.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | import DebuggerApp from "devtools/client/debugger/src/components/App"; 4 | 5 | export default function Toolbox() { 6 | return ( 7 |
8 |
9 |
10 | 11 |
12 |
13 |
14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/rdt-react-versions/react-15-app/src/appInjector.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom"; 3 | 4 | import App from "./App"; 5 | 6 | export const inject = (parentElementId: string) => 7 | ReactDOM.render(, document.getElementById(parentElementId)!); 8 | 9 | export const unmount = (parentElementId: string) => 10 | ReactDOM.unmountComponentAtNode(document.getElementById(parentElementId)!); 11 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/rdt-react-versions/react-16-app/src/appInjector.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom"; 3 | 4 | import App from "./App"; 5 | 6 | export const inject = (parentElementId: string) => 7 | ReactDOM.render(, document.getElementById(parentElementId)!); 8 | 9 | export const unmount = (parentElementId: string) => 10 | ReactDOM.unmountComponentAtNode(document.getElementById(parentElementId)!); 11 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/rdt-react-versions/react-17-app/src/appInjector.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom"; 3 | 4 | import App from "./App"; 5 | 6 | export const inject = (parentElementId: string) => 7 | ReactDOM.render(, document.getElementById(parentElementId)!); 8 | 9 | export const unmount = (parentElementId: string) => 10 | ReactDOM.unmountComponentAtNode(document.getElementById(parentElementId)!); 11 | -------------------------------------------------------------------------------- /packages/replay-next/components/errors/ReportProblemLink.module.css: -------------------------------------------------------------------------------- 1 | .Flex { 2 | display: inline-flex; 3 | flex-direction: row; 4 | align-items: center; 5 | gap: 0.25rem; 6 | } 7 | 8 | .Icon { 9 | width: 1.75ch; 10 | height: 1.75ch; 11 | color: var(--color-link); 12 | } 13 | 14 | .Link { 15 | text-decoration: underline; 16 | color: var(--color-link); 17 | cursor: pointer; 18 | } 19 | .Link:hover { 20 | text-decoration: none; 21 | } 22 | -------------------------------------------------------------------------------- /packages/replay-next/components/sources/SourceList.module.css: -------------------------------------------------------------------------------- 1 | .List { 2 | overscroll-behavior: none; 3 | } 4 | 5 | .List > div { 6 | /** 7 | * Each row should grow as much as needed to fit its code/content. 8 | * The parent list will measure rows after render and adjust the min-width of the list. 9 | * This prevents horizontal scrolling from jumping as new rows are rendered. 10 | */ 11 | width: var(--longest-line-width) !important; 12 | } 13 | -------------------------------------------------------------------------------- /packages/shared/client/ReplayClientContext.tsx: -------------------------------------------------------------------------------- 1 | import { createContext } from "react"; 2 | 3 | import { createReplayClientForProduction } from "shared/utils/client"; 4 | 5 | import { ReplayClientInterface } from "./types"; 6 | 7 | export type ReplayClientContextType = ReplayClientInterface; 8 | 9 | export const replayClient = createReplayClientForProduction(); 10 | export const ReplayClientContext = createContext(replayClient); 11 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/document-text.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/ui/components/Avatar.module.css: -------------------------------------------------------------------------------- 1 | .avatar { 2 | display: flex; 3 | align-items: center; 4 | } 5 | 6 | .avatar:not(.authenticated) { 7 | height: 24px; 8 | width: 24px; 9 | border-radius: 50%; 10 | box-shadow: 0 0 0 2px var(--chrome); 11 | overflow: hidden; 12 | } 13 | 14 | .avatar:not(.authenticated):not(:last-child) { 15 | margin-left: -10px; 16 | } 17 | 18 | .avatar.firstPlayer img { 19 | height: 24px; 20 | width: 24px; 21 | } 22 | -------------------------------------------------------------------------------- /src/ui/utils/thunk.ts: -------------------------------------------------------------------------------- 1 | import { ProtocolClient } from "@replayio/protocol"; 2 | 3 | import type { objectCache } from "replay-next/src/suspense/ObjectPreviews"; 4 | import { ReplayClientInterface } from "shared/client/types"; 5 | 6 | export interface ThunkExtraArgs { 7 | replayClient: ReplayClientInterface; 8 | protocolClient: ProtocolClient; 9 | objectCache: typeof objectCache; 10 | } 11 | 12 | export const extraThunkArgs = {} as ThunkExtraArgs; 13 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/cra/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | } 9 | 10 | code { 11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 12 | monospace; 13 | } 14 | -------------------------------------------------------------------------------- /packages/replay-next/components/sources/SourceLineLoadingPlaceholder.tsx: -------------------------------------------------------------------------------- 1 | import { useMemo } from "react"; 2 | 3 | import styles from "./SourceLineLoadingPlaceholder.module.css"; 4 | 5 | export default function SourceLineLoadingPlaceholder() { 6 | const width = useMemo(() => Math.round(5 + Math.random() * 30), []); 7 | 8 | return ( 9 |
10 |   11 |
12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /public/test/examples/doc_events_chromium.html: -------------------------------------------------------------------------------- 1 | 2 |
Hello World!
3 | 19 | -------------------------------------------------------------------------------- /src/devtools/client/inspector/computed/components/ComputedApp.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | import ComputedProperties from "./ComputedProperties"; 4 | import ComputedToolbar from "./ComputedToolbar"; 5 | 6 | export default function ComputedApp() { 7 | return ( 8 | 12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /.github/workflows/nightly.yaml: -------------------------------------------------------------------------------- 1 | name: Nightly 2 | on: 3 | schedule: 4 | - cron: 0 8 * * 1-5 5 | workflow_dispatch: 6 | 7 | jobs: 8 | trunk_check: 9 | name: Trunk Check Upload 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - name: Checkout 14 | uses: actions/checkout@v4 15 | 16 | - name: Trunk Check 17 | uses: trunk-io/trunk-action@v1.1.19 18 | with: 19 | trunk-token: ${{ secrets.TRUNK_TOKEN }} 20 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/mapped_minified/bundle_input.js: -------------------------------------------------------------------------------- 1 | function z(n){return n;}z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100);z(100); 2 | -------------------------------------------------------------------------------- /packages/shared/user-data/GraphQL/queries.ts: -------------------------------------------------------------------------------- 1 | import { gql } from "@apollo/client"; 2 | 3 | export const GET_USER_PREFERENCES = gql` 4 | query GetUserPreferences { 5 | viewer { 6 | preferences 7 | } 8 | } 9 | `; 10 | 11 | export const UPDATE_USER_PREFERENCES = gql` 12 | mutation UpdateUserPreferences($preferences: JSONObject!) { 13 | updateUserPreferences(input: { preferences: $preferences }) { 14 | success 15 | } 16 | } 17 | `; 18 | -------------------------------------------------------------------------------- /public/icons/video.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/plus.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/rewind-button.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/window.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/add.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/ui/components/CommandPalette/CommandPalette.module.css: -------------------------------------------------------------------------------- 1 | .commandPaletteWrapper { 2 | max-width: 400px; 3 | min-width: 280px; 4 | background-color: var(--theme-base-100); 5 | color: var(--body-color); 6 | } 7 | 8 | .commandPallete { 9 | border-bottom: 1px solid var(--theme-base-85); 10 | } 11 | 12 | .shortcut:hover { 13 | background-color: var(--theme-base-90); 14 | } 15 | 16 | .shortcutHover { 17 | background-color: var(--theme-base-90); 18 | } 19 | -------------------------------------------------------------------------------- /src/ui/hooks/comments/index.ts: -------------------------------------------------------------------------------- 1 | import * as comments from "./comments"; 2 | import useAddComment from "./useAddComment"; 3 | import useAddCommentReply from "./useAddCommentReply"; 4 | import useDeleteComment from "./useDeleteComment"; 5 | import useDeleteCommentReply from "./useDeleteCommentReply"; 6 | 7 | export const commentsHooks = { 8 | ...comments, 9 | useAddComment, 10 | useAddCommentReply, 11 | useDeleteComment, 12 | useDeleteCommentReply, 13 | }; 14 | -------------------------------------------------------------------------------- /packages/replay-next/components/sources/utils/getBadgeStyleVars.ts: -------------------------------------------------------------------------------- 1 | import { CSSProperties } from "react"; 2 | 3 | import { Badge } from "shared/client/types"; 4 | 5 | export function getBadgeStyleVars(badge: Badge | null): CSSProperties { 6 | const badgeName = badge || "default"; 7 | return { 8 | "--badge-background-color": `var(--badge-${badgeName}-color)`, 9 | "--badge-color": `var(--badge-${badgeName}-contrast-color)`, 10 | } as CSSProperties; 11 | } 12 | -------------------------------------------------------------------------------- /public/test/examples/rdt-react-versions/dist/react15/assets/index-4ab65188.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"index-4ab65188.js","mappings":"+CAKAA,EAAS,OAAQC,EAAA,IAAAC,EAAA,EAAI,EAAI,SAAS,eAAe,MAAM,CAAE","names":["ReactDOM","jsx","App"],"sources":["../../react-15-app/src/main.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport ReactDOM from \"react-dom\";\n\nimport App from \"./App\";\n\nReactDOM.render(, document.getElementById(\"root\")!);\n"]} -------------------------------------------------------------------------------- /public/test/examples/rdt-react-versions/dist/react16/assets/index-4d2a71e4.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"index-4d2a71e4.js","mappings":"+CAKAA,EAAS,OAAQC,EAAA,IAAAC,EAAA,EAAI,EAAI,SAAS,eAAe,MAAM,CAAE","names":["ReactDOM","jsx","App"],"sources":["../../react-16-app/src/main.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport ReactDOM from \"react-dom\";\n\nimport App from \"./App\";\n\nReactDOM.render(, document.getElementById(\"root\")!);\n"]} -------------------------------------------------------------------------------- /public/test/examples/rdt-react-versions/dist/react17/assets/index-36b1bcdb.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"index-36b1bcdb.js","mappings":"+CAKAA,EAAS,OAAQC,EAAA,IAAAC,EAAA,EAAI,EAAI,SAAS,eAAe,MAAM,CAAE","names":["ReactDOM","jsx","App"],"sources":["../../react-17-app/src/main.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport ReactDOM from \"react-dom\";\n\nimport App from \"./App\";\n\nReactDOM.render(, document.getElementById(\"root\")!);\n"]} -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/resume.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/src/utils/pause/frames/getFrameUrl.ts: -------------------------------------------------------------------------------- 1 | /* This Source Code Form is subject to the terms of the Mozilla Public 2 | * License, v. 2.0. If a copy of the MPL was not distributed with this 3 | * file, You can obtain one at . */ 4 | 5 | import type { PauseFrame } from "devtools/client/debugger/src/reducers/pause"; 6 | 7 | export function getFrameUrl(frame?: PauseFrame) { 8 | return frame?.source?.url ?? ""; 9 | } 10 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/arrow-white.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/devtools/client/webconsole/actions/index.ts: -------------------------------------------------------------------------------- 1 | /* This Source Code Form is subject to the terms of the Mozilla Public 2 | * License, v. 2.0. If a copy of the MPL was not distributed with this 3 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 | 5 | export * from "devtools/client/webconsole/actions/toolbox"; 6 | 7 | export interface DebuggerLocation { 8 | url?: string; 9 | sourceId?: string; 10 | line?: number; 11 | column?: number; 12 | } 13 | -------------------------------------------------------------------------------- /packages/design/Icon/index.tsx: -------------------------------------------------------------------------------- 1 | import type { IconNames } from "./types"; 2 | import iconSprite from "./sprite.svg"; 3 | 4 | export type IconProps = { name: IconNames; size?: number; className: string }; 5 | 6 | export function Icon({ name, size = 20, className }: IconProps) { 7 | return ( 8 | 9 | 10 | 11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /packages/design/svgs/external.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/redux-fundamentals/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + React + TS 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /packages/replay-next/components/lexical/plugins/auto-link/AutoLink.module.css: -------------------------------------------------------------------------------- 1 | .Link { 2 | font-weight: bold; 3 | text-decoration: underline; 4 | color: var(--color-link); 5 | } 6 | 7 | [data-lexical-editor="true"][contenteditable="false"] .Link[data-lexical-formatted-link] span { 8 | display: none; 9 | } 10 | [data-lexical-editor="true"][contenteditable="false"] .Link[data-lexical-formatted-link]::after { 11 | content: attr(data-lexical-formatted-link); 12 | } 13 | -------------------------------------------------------------------------------- /public/test/examples/doc_debugger_statements.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
Hello World!
4 | 5 | 17 | 18 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/arrow.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/rewind.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/arrow-e.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/redux-fundamentals/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react-swc' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig(({ command, mode }) => { 6 | const base = 7 | command === 'serve' ? '' : '/recording/test/examples/redux-fundamentals/dist/' 8 | return { 9 | base, 10 | plugins: [react()], 11 | build: { 12 | sourcemap: true, 13 | }, 14 | } 15 | }) 16 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/arrow-up.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/pause-circle-16x16.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/tab.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/src/utils/pause/frames/index.ts: -------------------------------------------------------------------------------- 1 | /* This Source Code Form is subject to the terms of the Mozilla Public 2 | * License, v. 2.0. If a copy of the MPL was not distributed with this 3 | * file, You can obtain one at . */ 4 | 5 | // 6 | 7 | export * from "./annotateFrames"; 8 | export * from "./collapseFrames"; 9 | export * from "./displayName"; 10 | export * from "./getFrameUrl"; 11 | export * from "./getLibraryFromUrl"; 12 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/arrow-big.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/ui/components/Timeline/EditableTimeInput.module.css: -------------------------------------------------------------------------------- 1 | .Input { 2 | border-width: 0px; 3 | padding: 0px; 4 | font-size: 1rem; 5 | line-height: 1rem; 6 | background-color: var(--focus-mode-popout-text-input-background-color); 7 | color: var(--theme-text-field-color); 8 | } 9 | .Input:focus { 10 | outline: none; 11 | box-shadow: 0 0 0 1px var(--focus-mode-popout-text-input-ring); 12 | } 13 | 14 | .Input:first-of-type { 15 | border-radius: 9px 0 0 9px; 16 | } 17 | -------------------------------------------------------------------------------- /packages/design/svgs/video.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/rdt-react-versions/react-15-app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + React + TS 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/rdt-react-versions/react-16-app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + React + TS 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/rdt-react-versions/react-17-app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + React + TS 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/redux-vite/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "redux-e2e-test-app", 3 | "private": true, 4 | "version": "0.0.0", 5 | "scripts": { 6 | "dev": "vite", 7 | "build": "vite build", 8 | "preview": "vite preview", 9 | "updateExample": "node updateExample.js" 10 | }, 11 | "devDependencies": { 12 | "@replayio/replay": "^0.15.0", 13 | "vite": "^4.3.9" 14 | }, 15 | "dependencies": { 16 | "@reduxjs/toolkit": "^1.9.5" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /public/test/examples/redux/dist/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/arrow-down.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/folder.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/arrow.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/item-arrow-dark-ltr.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/item-arrow-dark-rtl.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/item-arrow-ltr.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/item-arrow-rtl.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/tool-debugger.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /test/examples/node/async.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | function finished() { 7 | process.exit(0); 8 | } 9 | async function foo() { 10 | console.log("foo"); 11 | bar(); 12 | await baz(4); 13 | setTimeout(finished, 0); 14 | } 15 | function bar() { 16 | console.log("bar"); 17 | } 18 | async function baz(n) { 19 | console.log("baz", n); 20 | if (n) { 21 | await new Promise(r => setTimeout(r, 0)); 22 | await baz(n - 1); 23 | } 24 | return n; 25 | } 26 | foo(); 27 | -------------------------------------------------------------------------------- /packages/replay-next/src/suspense/PaintHashCache.ts: -------------------------------------------------------------------------------- 1 | import { ScreenShot } from "@replayio/protocol"; 2 | import { createExternallyManagedCache } from "suspense"; 3 | 4 | // The DOM.repaintGraphics API only returns screenshot data for a given paint hash once; see FE-2357 5 | export const paintHashCache = createExternallyManagedCache<[paintHash: string], ScreenShot>({ 6 | config: { immutable: true }, 7 | debugLabel: "paintHashCache", 8 | getKey: ([paintHash]) => paintHash, 9 | }); 10 | -------------------------------------------------------------------------------- /public/test/examples/iframe.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
IFRAME
4 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/column-marker.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/src/components/SecondaryPanes/Frames/FrameIndent.tsx: -------------------------------------------------------------------------------- 1 | /* This Source Code Form is subject to the terms of the Mozilla Public 2 | * License, v. 2.0. If a copy of the MPL was not distributed with this 3 | * file, You can obtain one at . */ 4 | 5 | // 6 | 7 | import React from "react"; 8 | 9 | export default function FrameIndent() { 10 | return     ; 11 | } 12 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/more.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/ui/components/TestSuite/views/GroupedTestCases/TestRecordingTree.module.css: -------------------------------------------------------------------------------- 1 | .Tree { 2 | display: flex; 3 | flex-direction: column; 4 | gap: 0.5rem; 5 | } 6 | .Tree[data-nested] { 7 | margin-left: 1rem; 8 | } 9 | 10 | .List { 11 | display: flex; 12 | flex-direction: column; 13 | margin-bottom: 0.5rem; 14 | } 15 | 16 | .Scope { 17 | font-size: var(--font-size-medium); 18 | color: var(--theme-base-60); 19 | font-weight: bold; 20 | text-transform: uppercase; 21 | } 22 | -------------------------------------------------------------------------------- /packages/design/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "design", 3 | "private": true, 4 | "version": "0.0.0", 5 | "sideEffects": false, 6 | "scripts": { 7 | "icons": "node scripts/icons.js --fetch" 8 | }, 9 | "dependencies": { 10 | "classnames": "*", 11 | "react": "*" 12 | }, 13 | "devDependencies": { 14 | "case-anything": "^2.1.10", 15 | "figma-tools": "^0.4.0", 16 | "nanospinner": "^1.1.0", 17 | "svgo": "^2.8.0", 18 | "svgson": "^5.2.1" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /packages/replay-next/components/lexical/plugins/mentions/utils/$createMentionsTextNode.ts: -------------------------------------------------------------------------------- 1 | import { $applyNodeReplacement } from "lexical"; 2 | 3 | import MentionsTextNode from "../MentionsTextNode"; 4 | 5 | export default function $createMentionsTextNode(id: string, name: string): MentionsTextNode { 6 | const mentionsTextNode = new MentionsTextNode(id, name); 7 | mentionsTextNode.setMode("segmented").toggleDirectionless(); 8 | 9 | return $applyNodeReplacement(mentionsTextNode); 10 | } 11 | -------------------------------------------------------------------------------- /packages/replay-next/components/sources/SourceLineLoadingPlaceholder.module.css: -------------------------------------------------------------------------------- 1 | .Shimmer { 2 | display: inline-block; 3 | height: 0.5rem; 4 | background-color: var(--chrome); 5 | border-radius: 0.25rem; 6 | 7 | animation-name: shimmer; 8 | animation-duration: 2s; 9 | animation-iteration-count: infinite; 10 | } 11 | 12 | @keyframes shimmer { 13 | 0% { 14 | opacity: 0.5; 15 | } 16 | 50% { 17 | opacity: 1; 18 | } 19 | 100% { 20 | opacity: 0.5; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /packages/replay-next/src/utils/group.ts: -------------------------------------------------------------------------------- 1 | import groupBy from "lodash/groupBy"; 2 | 3 | /** 4 | * Takes an array of [Key, Value | Value[]] entries, and groups them by key. 5 | * @return A new entry array, where values of the same key are merged into one entry. 6 | */ 7 | export function groupEntries(entries: [K, V | V[]][]): [K, V[]][] { 8 | return Object.values(groupBy(entries, x => x[0])).map(group => [ 9 | group[0][0], 10 | group.flatMap(([k, v]) => v), 11 | ]); 12 | } 13 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/src/components/SecondaryPanes/Points/LogpointsPane.module.css: -------------------------------------------------------------------------------- 1 | .LogpointsPane { 2 | color: var(--body-color); 3 | padding: 8px 0px; 4 | user-select: none; 5 | } 6 | 7 | .List { 8 | margin: 0 0.5rem; 9 | border-radius: 0.125rem; 10 | } 11 | .List:not(:last-child) { 12 | margin-bottom: 0.25rem; 13 | } 14 | 15 | .Empty { 16 | font-style: italic; 17 | text-align: center; 18 | padding: 0.5em; 19 | user-select: none; 20 | cursor: default; 21 | } 22 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/debugging-tabs.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/tool-explorer.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/vview-edit.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /packages/design/svgs/card.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/design/svgs/rewind.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/replay-next/components/lexical/plugins/code/utils/$convertCodeElement.ts: -------------------------------------------------------------------------------- 1 | import { DOMConversionOutput } from "lexical"; 2 | 3 | import $createCodeNode from "./$createCodeNode"; 4 | 5 | export default function $convertCodeElement(domNode: HTMLElement): DOMConversionOutput | null { 6 | const textContent = domNode.textContent; 7 | if (textContent !== null) { 8 | const node = $createCodeNode(); 9 | return { 10 | node, 11 | }; 12 | } 13 | 14 | return null; 15 | } 16 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/webconsole/run.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/ui/components/SecondaryToolbox/SecondaryToolbox.module.css: -------------------------------------------------------------------------------- 1 | .RoutinePanelMessage { 2 | width: 100%; 3 | display: flex; 4 | flex-direction: column; 5 | gap: 0.5rem; 6 | padding: 0.5rem; 7 | border-radius: 0.25rem; 8 | font-size: var(--font-size-regular); 9 | } 10 | 11 | .CouldNotLoadMessage { 12 | height: 100%; 13 | display: flex; 14 | justify-content: center; 15 | align-items: center; 16 | padding: 1rem; 17 | text-align: center; 18 | color: var(--color-dim); 19 | } 20 | -------------------------------------------------------------------------------- /packages/design/PrefixBadgePicker/Picker.module.css: -------------------------------------------------------------------------------- 1 | .Picker { 2 | position: relative; 3 | display: inline-grid; 4 | align-items: center; 5 | padding: 0 3px; 6 | } 7 | 8 | .PickerFill { 9 | --badge-background: var(--theme-toolbar-background); 10 | position: absolute; 11 | inset: 0; 12 | background-color: var(--badge-background); 13 | transition: background-color 0.18s ease-out; 14 | } 15 | 16 | .Picker:hover .PickerFill { 17 | background-color: var(--badge-background--active); 18 | } 19 | -------------------------------------------------------------------------------- /packages/design/svgs/legal.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/src/components/Editor/NewSourceNag.module.css: -------------------------------------------------------------------------------- 1 | .Nag { 2 | background-color: var(--nag-background-color); 3 | background: linear-gradient( 4 | 90deg, 5 | var(--nag-gradient-color-begin), 6 | var(--nag-gradient-color-end) 7 | ); 8 | color: var(--nag-color); 9 | padding: 0.25em 0.5em; 10 | gap: 0.5em; 11 | display: flex; 12 | align-items: center; 13 | 14 | font-weight: bold; 15 | font-size: var(--font-size-regular); 16 | display: none; 17 | } 18 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/badge-blue.svg: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/breadcrumbs-scrollbutton.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/ui/components/MaintenanceMode.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | import ReplayLogo from "./shared/ReplayLogo"; 4 | 5 | export default function MaintenanceModeScreen() { 6 | return ( 7 |
8 |
9 | 10 |

Replay is down for maintenance, come back later!

11 |
12 |
13 | ); 14 | } 15 | -------------------------------------------------------------------------------- /src/ui/components/TestSuite/utils/isTestSuiteReplay.ts: -------------------------------------------------------------------------------- 1 | import { Recording } from "shared/graphql/types"; 2 | import { 3 | isGroupedTestCasesV2, 4 | isGroupedTestCasesV3, 5 | } from "shared/test-suites/RecordingTestMetadata"; 6 | 7 | export function isTestSuiteReplay(recording: Recording): boolean { 8 | const testMetadata = recording?.metadata?.test; 9 | return ( 10 | testMetadata != null && 11 | (isGroupedTestCasesV2(testMetadata) || isGroupedTestCasesV3(testMetadata)) 12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /packages/design/SystemProvider/index.tsx: -------------------------------------------------------------------------------- 1 | import Head from "next/head"; 2 | import type { ReactNode } from "react"; 3 | 4 | import iconSprite from "../Icon/sprite.svg"; 5 | 6 | /** Provides design system functionality to all descendant components. */ 7 | export function SystemProvider({ children }: { children: ReactNode }) { 8 | return ( 9 | <> 10 | 11 | 12 | 13 | 14 | {children} 15 | 16 | ); 17 | } 18 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/sources/vuejs.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/play.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /packages/design/svgs/fast-forward.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/mapped_styles/webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | 3 | module.exports = { 4 | context: __dirname, 5 | entry: "./bundle_input.js", 6 | output: { 7 | filename: "mapped_styles.js", 8 | path: path.resolve(__dirname, "dist"), 9 | }, 10 | devtool: "source-map", 11 | mode: "production", 12 | module: { 13 | rules: [ 14 | { 15 | test: /\.css$/i, 16 | use: ["style-loader", "css-loader"], 17 | }, 18 | ], 19 | }, 20 | }; 21 | -------------------------------------------------------------------------------- /packages/replay-next/components/Loader.tsx: -------------------------------------------------------------------------------- 1 | import { CSSProperties, ReactNode } from "react"; 2 | 3 | import styles from "./Loader.module.css"; 4 | 5 | export default function Loader({ 6 | className = "", 7 | message = "Loading…", 8 | style, 9 | }: { 10 | className?: string; 11 | message?: ReactNode; 12 | style?: CSSProperties; 13 | }) { 14 | return ( 15 |
16 | {message} 17 |
18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /public/test/examples/rdt-react-versions/dist/react15/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + React + TS 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /public/test/examples/rdt-react-versions/dist/react16/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + React + TS 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /public/test/examples/rdt-react-versions/dist/react17/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + React + TS 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/breakpoint.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/src/utils/assert.js: -------------------------------------------------------------------------------- 1 | /* This Source Code Form is subject to the terms of the Mozilla Public 2 | * License, v. 2.0. If a copy of the MPL was not distributed with this 3 | * file, You can obtain one at . */ 4 | 5 | // 6 | import { isDevelopment } from "shared/utils/environment"; 7 | 8 | export default function assert(condition, message) { 9 | if (isDevelopment() && !condition) { 10 | throw new Error(`Assertion failure: ${message}`); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /packages/replay-next/components/elements/ElementList.module.css: -------------------------------------------------------------------------------- 1 | .ListWrapper { 2 | position: relative; 3 | } 4 | 5 | .List:focus { 6 | outline: none; 7 | } 8 | 9 | .List > div { 10 | /** 11 | * Each row should grow as much as needed to fit its code/content. 12 | * The parent list will measure rows after render and adjust the min-width of the list. 13 | * This prevents horizontal scrolling from jumping as new rows are rendered. 14 | */ 15 | width: max(100%, var(--longest-line-width)) !important; 16 | } 17 | -------------------------------------------------------------------------------- /packages/replay-next/src/hooks/usePreferredFontSize.ts: -------------------------------------------------------------------------------- 1 | import { useLayoutEffect } from "react"; 2 | 3 | export default function usePreferredFontSize(enableLargeText: boolean): void { 4 | useLayoutEffect(() => { 5 | const size = enableLargeText ? "large" : "default"; 6 | 7 | const root = document.body.parentElement!; 8 | root.classList.add(`prefers-${size}-font-size`); 9 | return () => { 10 | root.classList.remove(`prefers-${size}-font-size`); 11 | }; 12 | }, [enableLargeText]); 13 | } 14 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/markup-breakpoint.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /public/test/examples/README.md: -------------------------------------------------------------------------------- 1 | # Replay E2E Examples 2 | 3 | All of the build artifacts used by our E2E tests are committed to this folder, and will be served up by our Next dev server at `localhost:8080` when we create new "golden recordings". 4 | 5 | The majority of the examples are plain HTML files with embedded JS. For other examples, such as `cra`, `redux`, and some Webpack bundles, the actual source code lives in `packages/e2e-tests/examples` - see instructions there for rebuilding and recreating the build artifacts if necessary. -------------------------------------------------------------------------------- /src/devtools/client/themes/images/folder.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /packages/design/svgs/debug-play.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/protocol/execution-point-utils.ts: -------------------------------------------------------------------------------- 1 | import { ExecutionPoint } from "@replayio/protocol"; 2 | 3 | import { compareNumericStrings } from "protocol/utils"; 4 | 5 | export function pointEquals(p1: ExecutionPoint, p2: ExecutionPoint) { 6 | p1 == p2; 7 | } 8 | 9 | export function pointPrecedes(p1: ExecutionPoint, p2: ExecutionPoint) { 10 | return compareNumericStrings(p1, p2) < 0; 11 | } 12 | 13 | export function comparePoints(p1: ExecutionPoint, p2: ExecutionPoint) { 14 | return compareNumericStrings(p1, p2); 15 | } 16 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/security-state-secure.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/tool-comments.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/vview-delete.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/vview-lock.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/ui/components/Comments/CommentReplyButton.module.css: -------------------------------------------------------------------------------- 1 | .Row { 2 | display: flex; 3 | align-items: center; 4 | justify-content: space-between; 5 | margin: 0.25rem 0.5rem 0; 6 | } 7 | 8 | .Button { 9 | padding: 0 0.25rem; 10 | color: var(--theme-icon-dimmed-color); 11 | text-align: left; 12 | } 13 | .Button:hover { 14 | color: var(--primary-accent); 15 | } 16 | 17 | .AttachmentIcon { 18 | color: var(--theme-icon-dimmed-color); 19 | } 20 | .AttachmentIcon:hover { 21 | color: var(--primary-accent); 22 | } 23 | -------------------------------------------------------------------------------- /test/examples/node/run_worker.js: -------------------------------------------------------------------------------- 1 | const { Worker } = require("worker_threads"); 2 | 3 | let gWorker; 4 | 5 | function spawnWorker() { 6 | gWorker = new Worker(`${__dirname}/worker.js`); 7 | gWorker.on("message", onWorkerMessage); 8 | setTimeout(sendWorkerMessage, 0); 9 | } 10 | setTimeout(spawnWorker, 0); 11 | 12 | function sendWorkerMessage() { 13 | gWorker.postMessage({ kind: "ping" }); 14 | } 15 | 16 | function onWorkerMessage({ kind }) { 17 | console.log("GotWorkerMessage", kind); 18 | process.exit(); 19 | } 20 | -------------------------------------------------------------------------------- /packages/docs/README.md: -------------------------------------------------------------------------------- 1 | # Docs Site 2 | 3 | This is the docs site for Replay packages. It uses a NextJS site with Esbuild and TS Morph to compile isolated source code for a quick prototyping environment. 4 | 5 | ## Development 6 | 7 | To get started, clone the repo and run the following: 8 | 9 | ```bash 10 | yarn dev 11 | ``` 12 | 13 | This will start two servers. One is the NextJS development server and the other is a data gathering Node script that uses Esbuild and TS Morph to compile examples and collect type information. 14 | -------------------------------------------------------------------------------- /packages/e2e-tests/examples/redux-fundamentals/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | 26 | .yarn/* 27 | !.yarn/patches 28 | !.yarn/plugins 29 | !.yarn/releases 30 | !.yarn/sdks 31 | !.yarn/versions 32 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/file-small.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/ui/components/TestSuite/components/TestResultIcon.module.css: -------------------------------------------------------------------------------- 1 | .SuccessIcon { 2 | background-color: var(--testsuites-success-color); 3 | } 4 | .SuccessText { 5 | color: var(--testsuites-success-color); 6 | } 7 | 8 | .ErrorIcon { 9 | background-color: var(--testsuites-error-icon-bgcolor); 10 | } 11 | .ErrorText { 12 | color: var(--testsuites-error-color); 13 | } 14 | 15 | .SkippedIcon { 16 | background-color: var(--testsuites-skipped-color); 17 | } 18 | .SkippedText { 19 | color: var(--testsuites-skipped-color); 20 | } 21 | -------------------------------------------------------------------------------- /src/ui/components/shared/Confirm/ConfirmModal.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | import Modal from "../NewModal"; 4 | import { ConfirmDialog, ConfirmOptions } from "./ConfirmDialog"; 5 | 6 | export const ConfirmModal = ({ onDecline, ...props }: ConfirmOptions) => { 7 | return ( 8 | 13 | 14 | 15 | ); 16 | }; 17 | -------------------------------------------------------------------------------- /src/devtools/client/themes/images/tool-accessibility.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/ui/components/Events/EventsDropDownMenu.module.css: -------------------------------------------------------------------------------- 1 | .DropDownButton { 2 | background: none; 3 | border: none; 4 | outline: none; 5 | flex: 0 0 1rem; 6 | cursor: pointer; 7 | } 8 | 9 | .Icon { 10 | height: 1rem; 11 | width: 1rem; 12 | flex: 0 0 auto; 13 | } 14 | .Icon[data-selected] { 15 | color: var(--color-link); 16 | } 17 | 18 | .MenuItem { 19 | width: 100%; 20 | display: flex; 21 | align-items: center; 22 | gap: 1ch; 23 | text-transform: capitalize; 24 | } 25 | 26 | .Checkbox { 27 | gap: 1ch; 28 | } 29 | -------------------------------------------------------------------------------- /packages/design/svgs/share.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/replay-pause.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/search.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/devtools/client/shared/components/reps/images/open-inspector.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/ui/components/Events/Event.module.css: -------------------------------------------------------------------------------- 1 | .eventRow { 2 | display: block; 3 | display: flex; 4 | padding-top: 0.25rem; 5 | padding-bottom: 0.25rem; 6 | padding-right: 0.25rem; 7 | padding-left: 1rem; 8 | margin-top: 0.25rem; 9 | margin-bottom: 0.25rem; 10 | flex-direction: row; 11 | justify-content: space-between; 12 | align-items: center; 13 | width: 100%; 14 | border-radius: 9999px; 15 | cursor: pointer; 16 | } 17 | 18 | .eventRow:hover { 19 | background-color: var(--event-row-hover-background-color); 20 | } 21 | -------------------------------------------------------------------------------- /packages/design/svgs/cog.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/replay-next/components/console/ContextMenu.module.css: -------------------------------------------------------------------------------- 1 | .ColorBadge, 2 | .ColorBadgeClear, 3 | .UnicornBadge { 4 | display: inline-block; 5 | width: 0.75rem; 6 | height: 0.75rem; 7 | border-radius: 0.75rem; 8 | } 9 | .ColorBadge { 10 | background-color: var(--badge-color); 11 | } 12 | .ColorBadgeClear { 13 | background: var(--theme-base-80); 14 | } 15 | .UnicornBadge { 16 | background-image: url(../../public/unicorn.svg) !important; 17 | background-size: auto 100%; 18 | } 19 | 20 | .SmallerIcon { 21 | height: 1rem; 22 | } 23 | -------------------------------------------------------------------------------- /packages/replay-next/components/console/filters/EventCategory.module.css: -------------------------------------------------------------------------------- 1 | .Header { 2 | width: 100%; 3 | display: grid; 4 | grid-template-columns: auto min-content; 5 | gap: 0.25rem; 6 | } 7 | .Header[data-disabled] { 8 | opacity: 0.5; 9 | } 10 | 11 | .HeaderWrapper { 12 | display: flex; 13 | } 14 | 15 | .Category { 16 | overflow: hidden; 17 | text-overflow: ellipsis; 18 | white-space: nowrap; 19 | } 20 | 21 | .List { 22 | display: flex; 23 | flex-direction: column; 24 | margin-top: 0.25rem; 25 | gap: 0.25rem; 26 | } 27 | -------------------------------------------------------------------------------- /src/devtools/client/debugger/images/sources/prefix-picker.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | --------------------------------------------------------------------------------