├── .dockerignore ├── .eslintrc.json ├── .github ├── actions │ └── setup-project │ │ └── action.yml ├── dependabot.yml └── workflows │ ├── benchmarks.yml │ ├── deploy-landing-page.yml │ ├── docker-release.yml │ ├── npm-release.yml │ └── quality.yml ├── .gitignore ├── .npmignore ├── .prettierrc.json ├── LICENSE ├── README.md ├── apps ├── backend │ ├── README.md │ ├── package.json │ ├── src │ │ ├── client.ts │ │ ├── config.ts │ │ ├── debug.ts │ │ ├── index.ts │ │ └── main.ts │ └── tsconfig.json ├── collector-proxy │ ├── .gitignore │ ├── README.md │ ├── babel.config.js │ ├── jest.config.js │ ├── package.json │ ├── src │ │ ├── client.ts │ │ ├── config.ts │ │ ├── debug.ts │ │ ├── index.ts │ │ ├── main.ts │ │ ├── routes │ │ │ ├── post-schema.ts │ │ │ └── post-traces.ts │ │ ├── validate-request.ts │ │ └── workers │ │ │ ├── foreign-traces.ts │ │ │ ├── post-schema.ts │ │ │ └── post-traces.ts │ ├── tests │ │ ├── __snapshots__ │ │ │ ├── post-schema.test.ts.snap │ │ │ └── post-traces.test.ts.snap │ │ ├── client.ts │ │ ├── foreign-traces.test.ts │ │ ├── plugin-express.test.ts │ │ ├── post-schema.test.ts │ │ ├── post-traces.test.ts │ │ ├── setup.ts │ │ └── utils.ts │ ├── tsconfig.json │ └── tsconfig.test.json └── ui │ ├── README.md │ ├── assets │ ├── config-filled.ai │ ├── config-stroke.ai │ ├── expand.ai │ ├── folder-filled.ai │ ├── folder-stroke.ai │ ├── github-dark.ai │ ├── info-filled.ai │ ├── info-stroke.ai │ ├── login-filled.ai │ ├── login-stroke.ai │ ├── npm-dark.ai │ ├── refresh.ai │ ├── search-filled.ai │ └── search-stroke.ai │ ├── jest.config.ts │ ├── package.json │ ├── postcss.config.js │ ├── public │ ├── config-filled.svg │ ├── config-stroke.svg │ ├── docs-filled.svg │ ├── expand.svg │ ├── favicon.svg │ ├── folder-filled.svg │ ├── folder-stroke.svg │ ├── github-dark.svg │ ├── logo.svg │ ├── npm-dark.svg │ ├── refresh.svg │ ├── search-filled.svg │ └── search-stroke.svg │ ├── setup.ts │ ├── src │ ├── __mocks__ │ │ ├── matchMedia.ts │ │ └── zustand.ts │ ├── app.tsx │ ├── components │ │ ├── __tests__ │ │ │ ├── modal │ │ │ │ └── modal.spec.tsx │ │ │ ├── search-box.spec.tsx │ │ │ └── utils │ │ │ │ ├── linked-text.spec.tsx │ │ │ │ ├── spinner.spec.tsx │ │ │ │ └── toggle.spec.tsx │ │ ├── modal │ │ │ └── modal.tsx │ │ ├── schema │ │ │ ├── field-name.tsx │ │ │ ├── field.tsx │ │ │ ├── stat-details.tsx │ │ │ ├── stats.tsx │ │ │ ├── type.tsx │ │ │ └── viewer.tsx │ │ ├── search-box.tsx │ │ ├── sidebar │ │ │ ├── icons.tsx │ │ │ ├── utils.tsx │ │ │ ├── view.tsx │ │ │ └── views │ │ │ │ ├── backend.tsx │ │ │ │ ├── config.tsx │ │ │ │ ├── favourites.tsx │ │ │ │ ├── history.tsx │ │ │ │ └── info │ │ │ │ ├── about.tsx │ │ │ │ ├── getting-started.tsx │ │ │ │ ├── how-it-works.tsx │ │ │ │ ├── info-logo.tsx │ │ │ │ ├── made-with.tsx │ │ │ │ └── watch.tsx │ │ ├── trace │ │ │ ├── editor │ │ │ │ ├── editor.tsx │ │ │ │ ├── json │ │ │ │ │ ├── value.tsx │ │ │ │ │ └── viewer.tsx │ │ │ │ ├── query.tsx │ │ │ │ ├── query │ │ │ │ │ ├── argument.tsx │ │ │ │ │ ├── field.tsx │ │ │ │ │ ├── selection.tsx │ │ │ │ │ ├── type.tsx │ │ │ │ │ └── viewer.tsx │ │ │ │ └── variables.tsx │ │ │ ├── header.tsx │ │ │ ├── pill.tsx │ │ │ ├── search.tsx │ │ │ ├── span.tsx │ │ │ ├── trace.tsx │ │ │ ├── traces.tsx │ │ │ └── viewer.tsx │ │ └── utils │ │ │ ├── highlighted-text.tsx │ │ │ ├── linked-text.tsx │ │ │ ├── page.tsx │ │ │ ├── spinner.tsx │ │ │ └── toggle.tsx │ ├── config.ts │ ├── context │ │ ├── client.tsx │ │ ├── config.tsx │ │ ├── schemas.tsx │ │ └── sidebar.tsx │ ├── demo │ │ ├── create-post-traces.ts │ │ ├── fail-create-post-traces.ts │ │ ├── login-traces.ts │ │ ├── me-traces.ts │ │ ├── posts-traces.ts │ │ ├── schema.ts │ │ └── traces.tsx │ ├── hooks │ │ ├── __tests__ │ │ │ └── useTheme.spec.ts │ │ └── useTheme.ts │ ├── icons │ │ ├── cancel.tsx │ │ ├── delete.tsx │ │ ├── docs.tsx │ │ ├── expand.tsx │ │ ├── github.tsx │ │ ├── history.tsx │ │ ├── index.ts │ │ ├── refresh.tsx │ │ ├── search.tsx │ │ ├── settings.tsx │ │ ├── star.tsx │ │ └── types.ts │ ├── images.tsx │ ├── index.css │ ├── index.html │ ├── index.tsx │ ├── pages │ │ ├── dashboard.tsx │ │ ├── router.tsx │ │ └── schema.tsx │ ├── store │ │ ├── __tests__ │ │ │ └── useThemeStore.spec.tsx │ │ └── useThemeStore.ts │ ├── testing.ts │ └── utils │ │ ├── __tests__ │ │ ├── is-span-error.spec.ts │ │ ├── is-trace-error.spec.ts │ │ └── trace-name-includes.spec.ts │ │ ├── cn.ts │ │ ├── constants.ts │ │ ├── create-tree-data.ts │ │ ├── extract-type-name.ts │ │ ├── find-traces.ts │ │ ├── images.tsx │ │ ├── is-trace-error.ts │ │ ├── mappers.ts │ │ ├── root-span-name.ts │ │ └── sleep.ts │ ├── tailwind.config.js │ ├── tsconfig.json │ └── webpack.config.js ├── benchmarks ├── README.ecr ├── README.md ├── apollo-debugger │ ├── index.js │ └── package.json ├── apollo-otel-batch │ ├── index.js │ └── package.json ├── apollo-otel │ ├── index.js │ └── package.json ├── apollo │ ├── index.js │ └── package.json ├── benchmarks.yaml ├── helix-debugger │ ├── index.js │ └── package.json ├── helix-otel-batch │ ├── index.js │ └── package.json ├── helix-otel │ ├── index.js │ └── package.json ├── helix │ ├── index.js │ └── package.json ├── run.cr ├── shell.nix ├── yoga-debugger │ ├── index.js │ └── package.json ├── yoga-otel-batch │ ├── index.js │ └── package.json ├── yoga-otel │ ├── index.js │ └── package.json └── yoga │ ├── index.js │ └── package.json ├── docker └── Dockerfile ├── docs ├── README.md ├── assets │ └── banner.ai ├── banner.ai ├── next-env.d.ts ├── next.config.js ├── package.json ├── postcss.config.cjs ├── public │ ├── favicon.svg │ ├── img │ │ ├── banner.png │ │ ├── graphql-icon.svg │ │ ├── logo.svg │ │ ├── mit-icon.svg │ │ ├── otel-icon.svg │ │ ├── screenshot.png │ │ └── typescript-icon.svg │ └── robots.txt ├── src │ ├── components │ │ ├── icons.module.css │ │ ├── icons.tsx │ │ └── utils.tsx │ ├── pages │ │ ├── _app.tsx │ │ ├── _document.tsx │ │ ├── _meta.ts │ │ ├── contributing │ │ │ ├── _meta.ts │ │ │ ├── index.mdx │ │ │ └── release.mdx │ │ ├── docs │ │ │ ├── _meta.ts │ │ │ ├── components │ │ │ │ ├── adapters.mdx │ │ │ │ ├── backend.mdx │ │ │ │ ├── collector.mdx │ │ │ │ └── ui.mdx │ │ │ ├── docker │ │ │ │ ├── _meta.ts │ │ │ │ └── index.mdx │ │ │ ├── faq │ │ │ │ └── missing-context.mdx │ │ │ ├── how.mdx │ │ │ ├── index.mdx │ │ │ ├── integrations │ │ │ │ └── prisma.mdx │ │ │ ├── packages │ │ │ │ ├── cli.mdx │ │ │ │ ├── client.mdx │ │ │ │ ├── graphql-schema.mdx │ │ │ │ ├── trace-directive.mdx │ │ │ │ └── trace-schema.mdx │ │ │ ├── performance.mdx │ │ │ ├── plugins │ │ │ │ ├── apollo.mdx │ │ │ │ ├── express.mdx │ │ │ │ └── yoga.mdx │ │ │ └── why.mdx │ │ └── index.mdx │ └── styles │ │ └── globals.css ├── tailwind.config.ts ├── theme.config.tsx └── tsconfig.json ├── e2e ├── README.md ├── babel.config.js ├── jest.config.js ├── package.json ├── src │ ├── client.ts │ ├── debug.ts │ └── index.ts ├── tests │ ├── components │ │ ├── component.ts │ │ ├── favourites.ts │ │ ├── history.ts │ │ ├── schemas.ts │ │ ├── sidebar.ts │ │ ├── trace-viewer.ts │ │ ├── trace.ts │ │ └── traces.ts │ ├── dashboard.test.ts │ ├── favourites.test.ts │ ├── history.test.ts │ ├── issues │ │ └── 109.test.ts │ ├── pages │ │ ├── dashboard.ts │ │ └── page.ts │ ├── schemas.test.ts │ ├── sidebar.test.ts │ ├── trace-viewer.test.ts │ ├── trace.test.ts │ ├── traces.test.ts │ └── utils │ │ ├── backend.ts │ │ ├── colors.ts │ │ ├── create-test-schema.ts │ │ ├── puppeteer.ts │ │ ├── query-schema.ts │ │ ├── setup.ts │ │ └── sleep.ts ├── tsconfig.json └── tsconfig.test.json ├── package.json ├── packages ├── adapters │ ├── base │ │ ├── README.md │ │ ├── babel.config.js │ │ ├── jest.config.js │ │ ├── package.json │ │ ├── src │ │ │ ├── entities │ │ │ │ ├── Schema.ts │ │ │ │ ├── Span.ts │ │ │ │ └── Trace.ts │ │ │ └── index.ts │ │ ├── tests │ │ │ └── index.test.ts │ │ ├── tsconfig.json │ │ └── tsconfig.test.json │ ├── proxy │ │ ├── README.md │ │ ├── babel.config.js │ │ ├── jest.config.js │ │ ├── package.json │ │ ├── src │ │ │ ├── entities │ │ │ │ ├── Schema.ts │ │ │ │ ├── Span.ts │ │ │ │ └── Trace.ts │ │ │ ├── index.ts │ │ │ ├── types.ts │ │ │ └── utils.ts │ │ ├── tests │ │ │ ├── adapters.ts │ │ │ ├── backend.ts │ │ │ ├── clients.ts │ │ │ ├── entities │ │ │ │ ├── Schema │ │ │ │ │ ├── create-one.test.ts │ │ │ │ │ ├── find-first.test.ts │ │ │ │ │ ├── find-many.test.ts │ │ │ │ │ └── upsert.test.ts │ │ │ │ ├── Span │ │ │ │ │ ├── aggregate.test.ts │ │ │ │ │ ├── create-one.test.ts │ │ │ │ │ ├── delete-one.test.ts │ │ │ │ │ └── find-many.test.ts │ │ │ │ └── Trace │ │ │ │ │ ├── create-one.test.ts │ │ │ │ │ ├── find-first.test.ts │ │ │ │ │ ├── find-many.test.ts │ │ │ │ │ └── update-one.test.ts │ │ │ ├── setup.ts │ │ │ └── utils.ts │ │ ├── tsconfig.json │ │ └── tsconfig.test.json │ └── sqlite │ │ ├── README.md │ │ ├── babel.config.js │ │ ├── jest.config.js │ │ ├── package.json │ │ ├── src │ │ ├── entities │ │ │ ├── Schema.ts │ │ │ ├── Span.ts │ │ │ └── Trace.ts │ │ ├── index.ts │ │ └── prisma.ts │ │ ├── tests │ │ ├── adapter.ts │ │ ├── entities │ │ │ ├── Schema │ │ │ │ ├── create-one.test.ts │ │ │ │ ├── find-first.test.ts │ │ │ │ ├── find-many.test.ts │ │ │ │ └── upsert.test.ts │ │ │ ├── Span │ │ │ │ ├── aggregate.test.ts │ │ │ │ ├── create-one.test.ts │ │ │ │ ├── delete-one.test.ts │ │ │ │ └── find-many.test.ts │ │ │ └── Trace │ │ │ │ ├── create-one.test.ts │ │ │ │ ├── find-first.test.ts │ │ │ │ ├── find-many.test.ts │ │ │ │ └── update-one.test.ts │ │ ├── setup.ts │ │ └── utils.ts │ │ ├── tsconfig.json │ │ └── tsconfig.test.json ├── client │ ├── README.md │ ├── babel.config.js │ ├── jest.config.js │ ├── package.json │ ├── src │ │ ├── client.ts │ │ ├── debug.ts │ │ ├── index.ts │ │ ├── types.ts │ │ └── utils.ts │ ├── tests │ │ └── client.test.ts │ ├── tsconfig.json │ └── tsconfig.test.json ├── data-access │ ├── README.md │ ├── package.json │ ├── prisma │ │ ├── migrations │ │ │ ├── 20230923192543_dev │ │ │ │ └── migration.sql │ │ │ ├── 20231008134528_dev │ │ │ │ └── migration.sql │ │ │ ├── 20231008194529_dev │ │ │ │ └── migration.sql │ │ │ ├── 20231008224001_dev │ │ │ │ └── migration.sql │ │ │ ├── 20231011133824_dev │ │ │ │ └── migration.sql │ │ │ ├── 20231029205919_dev │ │ │ │ └── migration.sql │ │ │ ├── 20231029213600_ │ │ │ │ └── migration.sql │ │ │ └── migration_lock.toml │ │ └── schema.prisma │ ├── src │ │ ├── clear-db.ts │ │ └── index.ts │ └── tsconfig.json ├── graphql-debugger │ ├── README.md │ ├── package.json │ ├── src │ │ ├── debug.ts │ │ └── index.ts │ └── tsconfig.json ├── graphql-fragments │ ├── README.md │ ├── babel.config.js │ ├── package.json │ ├── src │ │ ├── SchemaFragment.ts │ │ ├── SpanFragment.ts │ │ ├── TraceFragment.ts │ │ └── index.ts │ ├── tsconfig.json │ └── tsconfig.test.json ├── graphql-schema │ ├── README.md │ ├── babel.config.js │ ├── package.json │ ├── src │ │ ├── config.ts │ │ ├── context.ts │ │ ├── index.ts │ │ ├── loaders │ │ │ └── span.ts │ │ ├── mutations │ │ │ ├── clear-db.ts │ │ │ ├── create-span.ts │ │ │ ├── create-trace.ts │ │ │ ├── delete-span.ts │ │ │ ├── index.ts │ │ │ ├── update-trace.ts │ │ │ └── upsert-schema.ts │ │ ├── objects │ │ │ ├── index.ts │ │ │ ├── schema.ts │ │ │ ├── span.ts │ │ │ └── trace.ts │ │ ├── queries │ │ │ ├── aggregate-spans.ts │ │ │ ├── find-first-schema.ts │ │ │ ├── find-first-trace.ts │ │ │ ├── index.ts │ │ │ ├── list-schemas.ts │ │ │ ├── list-spans.ts │ │ │ └── list-trace-groups.ts │ │ └── schema.ts │ └── tsconfig.json ├── opentelemetry │ ├── README.md │ ├── babel.config.js │ ├── jest.config.js │ ├── package.json │ ├── src │ │ ├── attributes-to-object.ts │ │ ├── build-span-tree.ts │ │ ├── debug.ts │ │ ├── extract-spans.ts │ │ ├── index.ts │ │ ├── info-to-attributes.ts │ │ ├── info-to-span-name.ts │ │ ├── provider.ts │ │ ├── run-in-span.ts │ │ ├── setup-otel.ts │ │ ├── tracer.ts │ │ └── unix-nano-to-bigint.ts │ ├── tests │ │ ├── attributes-to-object.test.ts │ │ ├── extract-spans.test.ts │ │ ├── info-span-name.test.ts │ │ ├── info-to-attributes.test.ts │ │ └── unix-nano-to-bigint.test.ts │ ├── tsconfig.json │ └── tsconfig.test.json ├── queue │ ├── README.md │ ├── package.json │ ├── src │ │ ├── debug.ts │ │ └── index.ts │ └── tsconfig.json ├── schemas │ ├── README.md │ ├── package.json │ ├── src │ │ ├── collector │ │ │ ├── foreign-traces.ts │ │ │ ├── index.ts │ │ │ ├── post-schema.ts │ │ │ └── post-traces.ts │ │ ├── entities │ │ │ ├── index.ts │ │ │ ├── schema.ts │ │ │ ├── span.ts │ │ │ └── trace.ts │ │ ├── graphql │ │ │ ├── index.ts │ │ │ ├── mutations │ │ │ │ ├── clear-db.ts │ │ │ │ ├── create-span.ts │ │ │ │ ├── create-trace.ts │ │ │ │ ├── delete-span.ts │ │ │ │ ├── index.ts │ │ │ │ ├── update-trace.ts │ │ │ │ └── upsert-schema.ts │ │ │ └── queries │ │ │ │ ├── aggregate-spans.ts │ │ │ │ ├── find-first-schema.ts │ │ │ │ ├── find-first-trace.ts │ │ │ │ ├── index.ts │ │ │ │ ├── list-schemas.ts │ │ │ │ ├── list-spans.ts │ │ │ │ └── list-trace-groups.ts │ │ ├── index.ts │ │ └── opentelemetry │ │ │ ├── any-value.ts │ │ │ ├── attributes.ts │ │ │ ├── event.ts │ │ │ ├── extracted-span.ts │ │ │ ├── index.ts │ │ │ ├── instrumentation-scope.ts │ │ │ ├── link.ts │ │ │ ├── resource-spans.ts │ │ │ ├── resource.ts │ │ │ ├── scope-spans.ts │ │ │ ├── span.ts │ │ │ ├── status.ts │ │ │ └── unix-nano.ts │ └── tsconfig.json ├── time │ ├── README.md │ ├── jest.config.js │ ├── package.json │ ├── src │ │ ├── index.ts │ │ ├── timestamp.test.ts │ │ ├── timestamp.ts │ │ ├── unix-nano.test.ts │ │ └── unix-nano.ts │ └── tsconfig.json ├── trace-directive │ ├── README.md │ ├── babel.config.js │ ├── jest.config.js │ ├── package.json │ ├── src │ │ ├── context.ts │ │ ├── index.ts │ │ └── trace-directive.ts │ ├── tests │ │ ├── index.test.ts │ │ ├── trace-batch.test.ts │ │ └── trace.test.ts │ ├── tsconfig.json │ └── tsconfig.test.json ├── trace-schema │ ├── README.md │ ├── babel.config.js │ ├── jest.config.js │ ├── package.json │ ├── src │ │ ├── debug.ts │ │ ├── index.ts │ │ ├── schema-exporter.ts │ │ └── trace-schema.ts │ ├── tests │ │ └── trace-schema.test.ts │ ├── tsconfig.json │ └── tsconfig.test.json ├── types │ ├── README.md │ ├── package.json │ ├── src │ │ ├── collector │ │ │ ├── foreign-traces.ts │ │ │ ├── index.ts │ │ │ ├── post-schema.ts │ │ │ └── post-traces.ts │ │ ├── entities │ │ │ ├── index.ts │ │ │ ├── schema.ts │ │ │ ├── span.ts │ │ │ └── trace.ts │ │ ├── graphql │ │ │ ├── index.ts │ │ │ ├── mutations │ │ │ │ ├── clear-db.ts │ │ │ │ ├── create-span.ts │ │ │ │ ├── create-trace.ts │ │ │ │ ├── delete-span.ts │ │ │ │ ├── index.ts │ │ │ │ ├── update-trace.ts │ │ │ │ └── upsert-schema.ts │ │ │ └── queries │ │ │ │ ├── aggregate-spans.ts │ │ │ │ ├── find-first-schema.ts │ │ │ │ ├── find-first-trace.ts │ │ │ │ ├── index.ts │ │ │ │ ├── list-schemas.ts │ │ │ │ ├── list-spans.ts │ │ │ │ └── list-trace-groups.ts │ │ ├── index.ts │ │ └── opentelemetry │ │ │ ├── any-value.ts │ │ │ ├── attribute-names.ts │ │ │ ├── attributes.ts │ │ │ ├── event.ts │ │ │ ├── extracted-span.ts │ │ │ ├── index.ts │ │ │ ├── instrumentation-scope.ts │ │ │ ├── resource-spans.ts │ │ │ ├── resource.ts │ │ │ ├── scope-spans.ts │ │ │ ├── span.ts │ │ │ ├── status.ts │ │ │ └── unix-nano.ts │ └── tsconfig.json └── utils │ ├── README.md │ ├── package.json │ ├── src │ ├── bump-versions.ts │ ├── db-span-to-network.ts │ ├── debug.ts │ ├── get-trace-start.ts │ ├── hash-schema.ts │ ├── index.ts │ ├── is-graphql-info-root.ts │ ├── is-trace-error.ts │ ├── make-valid-json.ts │ ├── print-trace-errors.ts │ ├── release.ts │ └── sum-trace-time.ts │ └── tsconfig.json ├── plugins ├── apollo │ ├── README.md │ ├── babel.config.js │ ├── jest.config.js │ ├── package.json │ ├── src │ │ └── index.ts │ ├── tests │ │ └── plugin-apollo.test.ts │ ├── tsconfig.json │ └── tsconfig.test.json ├── express │ ├── README.md │ ├── babel.config.js │ ├── jest.config.js │ ├── package.json │ ├── src │ │ ├── attributes.ts │ │ └── index.ts │ ├── tests │ │ └── plugin-express.test.ts │ ├── tsconfig.json │ └── tsconfig.test.json └── yoga │ ├── README.md │ ├── babel.config.js │ ├── jest.config.js │ ├── package.json │ ├── src │ ├── create-yoga.ts │ └── index.ts │ ├── tests │ └── plugin-graphql-yoga.test.ts │ ├── tsconfig.json │ └── tsconfig.test.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml └── turbo.json /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | build 3 | *.db -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "env": { "es2020": true, "node": true, "browser": true }, 4 | "extends": [ 5 | "eslint:recommended", 6 | "plugin:@typescript-eslint/recommended", 7 | "plugin:react-hooks/recommended", 8 | "plugin:react/recommended", 9 | "plugin:mdx/recommended" 10 | ], 11 | "settings": { 12 | "mdx/code-blocks": false, 13 | "mdx/language-mapper": {} 14 | }, 15 | "ignorePatterns": ["build", ".eslintrc.cjs", "README.md"], 16 | "rules": { 17 | "react/display-name": "off", 18 | "react/no-unescaped-entities": "off", 19 | "react/react-in-jsx-scope": "off", 20 | "@typescript-eslint/no-explicit-any": "off", 21 | "@typescript-eslint/no-var-requires": "off", 22 | "@typescript-eslint/ban-types": "off" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /.github/actions/setup-project/action.yml: -------------------------------------------------------------------------------- 1 | name: Setup Project 2 | 3 | inputs: 4 | pnpm-version: 5 | required: false 6 | default: 8.0.0 7 | node-version: 8 | required: false 9 | default: 18 10 | turbo-version: 11 | required: false 12 | default: 1.10.7 13 | 14 | runs: 15 | using: composite 16 | steps: 17 | - uses: pnpm/action-setup@v2 18 | with: 19 | version: ${{ inputs.pnpm-version }} 20 | - uses: actions/setup-node@v3 21 | with: 22 | node-version: ${{ inputs.node-version }} 23 | cache: "pnpm" 24 | - name: Install Turbo 25 | run: npm i -g turbo@${{ inputs.turbo-version }} 26 | shell: bash 27 | - name: Install dependencies 28 | run: pnpm install 29 | shell: bash 30 | - name: Build project 31 | run: pnpm build --force 32 | shell: bash 33 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "npm" # See documentation for possible values 9 | directory: "/" # Location of package manifests 10 | schedule: 11 | interval: "weekly" 12 | -------------------------------------------------------------------------------- /.github/workflows/deploy-landing-page.yml: -------------------------------------------------------------------------------- 1 | name: graphql-debugger.com 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | deploy-docs: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - name: SSH and deploy node app 14 | uses: appleboy/ssh-action@master 15 | with: 16 | timeout: 60s 17 | host: ${{ secrets.SSH_HOST }} 18 | username: ${{ secrets.SSH_USERNAME }} 19 | key: ${{ secrets.SSH_KEY }} 20 | script: | 21 | export NVM_DIR=~/.nvm 22 | source ~/.nvm/nvm.sh 23 | cd ./graphql-debugger 24 | git reset --hard 25 | git pull origin main 26 | pnpm i 27 | pnpm build 28 | cd ./docs/ 29 | pm2 restart graphql-debugger.com 30 | cd ../apps/ui 31 | NODE_ENV=production DEMO_MODE=true pnpm build 32 | pm2 restart demo 33 | -------------------------------------------------------------------------------- /.github/workflows/npm-release.yml: -------------------------------------------------------------------------------- 1 | name: NPM Release 2 | 3 | on: 4 | push: 5 | tags: 6 | - "*" 7 | 8 | jobs: 9 | npm_publish: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v3 13 | - uses: ./.github/actions/setup-project 14 | - run: cd ./packages/graphql-debugger && chmod +x ./build/index.js 15 | - run: START_PATH="." node ./packages/utils/build/bump-versions.js 16 | env: 17 | VERSION: ${{github.ref_name}} 18 | - run: pnpm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN} 19 | env: 20 | NPM_TOKEN: ${{secrets.npm_token}} 21 | - run: pnpm publish -r --filter '!@graphql-debugger/docs' --filter '!@graphql-debugger/e2e' --no-git-checks 22 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src 2 | tests 3 | tsconfig.json 4 | .turbo 5 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": ["@trivago/prettier-plugin-sort-imports"], 3 | "singleQuote": false, 4 | "importOrder": ["^@graphql-debugger/(.*)$", "", "^[./]"], 5 | "importOrderSeparation": true, 6 | "importOrderSortSpecifiers": true 7 | } 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Rocket Connect 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | GraphQL Debugger 4 | 5 |

GraphQL Debugger

6 | 7 |

GraphQL Debugger is a platform for debugging your GraphQL Server.

8 | 9 | https://www.graphql-debugger.com/ 10 | 11 | [![npm version](https://badge.fury.io/js/graphql-debugger.svg)](https://badge.fury.io/js/graphql-debugger) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) 12 | 13 | [![](./docs/public/img/screenshot.png)](https://www.graphql-debugger.com/) 14 | 15 |
16 |
17 |
18 | 19 | ## Documentation 20 | 21 | https://www.graphql-debugger.com/docs 22 | 23 | ## Contributing 24 | 25 | https://www.graphql-debugger.com/contributing 26 | 27 | ## License 28 | 29 | MIT - Rocket Connect - https://github.com/rocket-connect 30 | -------------------------------------------------------------------------------- /apps/backend/README.md: -------------------------------------------------------------------------------- 1 | # @graphql-debugger/backend 2 | 3 | - [graphql-debugger.com](http://www.graphql-debugger.com) 4 | 5 | [![npm version](https://badge.fury.io/js/@graphql-debugger%2Fbackend.svg)](https://badge.fury.io/js/@graphql-debugger%2Fbackend) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) 6 | 7 | ## About 8 | 9 | The backend serves the collector, graphql schema and the user interface. 10 | 11 | ## License 12 | 13 | MIT - Rocket Connect - https://github.com/rocket-connect 14 | -------------------------------------------------------------------------------- /apps/backend/src/client.ts: -------------------------------------------------------------------------------- 1 | import { SQLiteAdapter } from "@graphql-debugger/adapter-sqlite"; 2 | import { DebuggerClient } from "@graphql-debugger/client"; 3 | 4 | const adapter = new SQLiteAdapter(); 5 | 6 | export const client = new DebuggerClient({ 7 | adapter, 8 | }); 9 | -------------------------------------------------------------------------------- /apps/backend/src/config.ts: -------------------------------------------------------------------------------- 1 | export const BACKEND_PORT = process.env.BACKEND_PORT || "16686"; 2 | 3 | export const NODE_ENV = process.env.NODE_ENV; 4 | 5 | export const TRACE_EXPRESS = process.env.TRACE_EXPRESS; 6 | -------------------------------------------------------------------------------- /apps/backend/src/debug.ts: -------------------------------------------------------------------------------- 1 | import { Debug, type Debugger } from "@graphql-debugger/utils"; 2 | 3 | const debugNamespace = "backend"; 4 | 5 | export const debug: Debugger = Debug(debugNamespace); 6 | -------------------------------------------------------------------------------- /apps/backend/src/main.ts: -------------------------------------------------------------------------------- 1 | import { 2 | SimpleSpanProcessor, 3 | SpanExporter, 4 | } from "@graphql-debugger/opentelemetry"; 5 | 6 | import { client } from "./client"; 7 | import { BACKEND_PORT } from "./config"; 8 | import { debug } from "./debug"; 9 | import { start } from "./index"; 10 | 11 | const spanProcessorFactory = 12 | process.env.NODE_ENV === "development" 13 | ? (exporter: SpanExporter) => new SimpleSpanProcessor(exporter) 14 | : undefined; 15 | 16 | start({ port: BACKEND_PORT, client, spanProcessorFactory }) 17 | .then(() => { 18 | debug("Online"); 19 | }) 20 | .catch((error) => { 21 | debug(error); 22 | process.exit(1); 23 | }); 24 | -------------------------------------------------------------------------------- /apps/backend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/node18/tsconfig.json", 3 | "compilerOptions": { 4 | "target": "ES2020", 5 | "esModuleInterop": true, 6 | "forceConsistentCasingInFileNames": true, 7 | "strict": true, 8 | "skipLibCheck": true, 9 | "outDir": "build", 10 | "declarationMap": true, 11 | "declaration": true 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /apps/collector-proxy/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | # Keep environment variables out of version control 3 | .env 4 | -------------------------------------------------------------------------------- /apps/collector-proxy/README.md: -------------------------------------------------------------------------------- 1 | # @graphql-debugger/collector-proxy 2 | 3 | - [graphql-debugger.com](http://www.graphql-debugger.com) 4 | 5 | [![npm version](https://badge.fury.io/js/@graphql-debugger%2Fcollector-proxy.svg)](https://badge.fury.io/js/@graphql-debugger%2Fcollector-proxy) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) 6 | 7 | ## About 8 | 9 | The collector is a proxy ontop of the Open Telemetry Collector, it is used to collect traces from the GraphQL Debugger trace schema. 10 | 11 | ## Endpoints 12 | 13 | ### /v1/traces 14 | 15 | This is a proxy endpoint around the Open Telemetry Collector's `/v1/traces` endpoint. 16 | 17 | ### /v1/schema 18 | 19 | This is used by the [trace schema package](https://github.com/rocket-connect/graphql-debugger/tree/main/packages/trace-schema), it sends the GraphQL schema here. 20 | 21 | ## License 22 | 23 | MIT - Rocket Connect - https://github.com/rocket-connect 24 | -------------------------------------------------------------------------------- /apps/collector-proxy/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | ["@babel/preset-env", { targets: { node: "current" } }], 4 | "@babel/preset-typescript", 5 | ], 6 | }; 7 | -------------------------------------------------------------------------------- /apps/collector-proxy/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | modulePathIgnorePatterns: [ 3 | "/build/", 4 | "/node_modules/", 5 | "/build/", 6 | ], 7 | testTimeout: 150000, 8 | setupFilesAfterEnv: ["/tests/setup.ts"], 9 | globals: { 10 | "ts-jest": { 11 | tsconfig: "tsconfig.test.json", 12 | }, 13 | }, 14 | }; 15 | -------------------------------------------------------------------------------- /apps/collector-proxy/src/client.ts: -------------------------------------------------------------------------------- 1 | import { SQLiteAdapter } from "@graphql-debugger/adapter-sqlite"; 2 | import { DebuggerClient } from "@graphql-debugger/client"; 3 | 4 | const adapter = new SQLiteAdapter(); 5 | 6 | export const client = new DebuggerClient({ 7 | adapter, 8 | }); 9 | -------------------------------------------------------------------------------- /apps/collector-proxy/src/config.ts: -------------------------------------------------------------------------------- 1 | export const COLLECTOR_PORT = process.env.COLLECTOR_PORT || "4318"; 2 | 3 | export const NODE_ENV = process.env.NODE_ENV; 4 | -------------------------------------------------------------------------------- /apps/collector-proxy/src/debug.ts: -------------------------------------------------------------------------------- 1 | import { Debug, type Debugger } from "@graphql-debugger/utils"; 2 | 3 | const debugNamespace = "collector-proxy"; 4 | 5 | export const debug: Debugger = Debug(debugNamespace); 6 | -------------------------------------------------------------------------------- /apps/collector-proxy/src/main.ts: -------------------------------------------------------------------------------- 1 | import { client } from "./client"; 2 | import { COLLECTOR_PORT } from "./config"; 3 | import { debug } from "./debug"; 4 | import { start } from "./index"; 5 | 6 | start({ port: COLLECTOR_PORT, client }) 7 | .then(() => { 8 | debug("Online"); 9 | }) 10 | .catch((error) => { 11 | debug(error); 12 | process.exit(1); 13 | }); 14 | -------------------------------------------------------------------------------- /apps/collector-proxy/tests/__snapshots__/post-schema.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`POST /v1/schema should throw when no body is sent 1`] = ` 4 | "[ 5 | { 6 | "code": "invalid_type", 7 | "expected": "string", 8 | "received": "undefined", 9 | "path": [ 10 | "body", 11 | "schema" 12 | ], 13 | "message": "Required" 14 | }, 15 | { 16 | "code": "invalid_type", 17 | "expected": "string", 18 | "received": "undefined", 19 | "path": [ 20 | "body", 21 | "hash" 22 | ], 23 | "message": "Required" 24 | } 25 | ]" 26 | `; 27 | -------------------------------------------------------------------------------- /apps/collector-proxy/tests/client.ts: -------------------------------------------------------------------------------- 1 | import { SQLiteAdapter } from "@graphql-debugger/adapter-sqlite"; 2 | import { DebuggerClient } from "@graphql-debugger/client"; 3 | 4 | const adapter = new SQLiteAdapter(); 5 | 6 | export const client = new DebuggerClient({ 7 | adapter, 8 | }); 9 | -------------------------------------------------------------------------------- /apps/collector-proxy/tests/setup.ts: -------------------------------------------------------------------------------- 1 | import http from "http"; 2 | 3 | import { start } from "../src/index"; 4 | import { client } from "./client"; 5 | 6 | let server: http.Server; 7 | 8 | beforeAll(async () => { 9 | const collector = await start({ 10 | client, 11 | }); 12 | 13 | server = collector.server as http.Server; 14 | }); 15 | 16 | beforeEach(async () => { 17 | await client.adapter.clearDB(); 18 | }); 19 | 20 | afterAll(async () => { 21 | server?.close(); 22 | }); 23 | -------------------------------------------------------------------------------- /apps/collector-proxy/tests/utils.ts: -------------------------------------------------------------------------------- 1 | import supertest from "supertest"; 2 | 3 | import { app } from "../src/index"; 4 | 5 | export function request() { 6 | return supertest(app); 7 | } 8 | -------------------------------------------------------------------------------- /apps/collector-proxy/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/node18/tsconfig.json", 3 | "compilerOptions": { 4 | "target": "ES2020", 5 | "esModuleInterop": true, 6 | "forceConsistentCasingInFileNames": true, 7 | "strict": true, 8 | "skipLibCheck": true, 9 | "outDir": "build", 10 | "declarationMap": true, 11 | "declaration": true, 12 | "rootDir": "./src/" 13 | }, 14 | "exclude": ["tests/"], 15 | "include": ["src/**/*"] 16 | } 17 | -------------------------------------------------------------------------------- /apps/collector-proxy/tsconfig.test.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "rootDir": "tests/" 5 | }, 6 | "include": ["tests/**/*"] 7 | } 8 | -------------------------------------------------------------------------------- /apps/ui/README.md: -------------------------------------------------------------------------------- 1 | # @graphql-debugger/ui 2 | 3 | [![npm version](https://badge.fury.io/js/@graphql-debugger%2Fui.svg)](https://badge.fury.io/js/@graphql-debugger%2Fui) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) 4 | 5 | [graphql-debugger.com](http://www.graphql-debugger.com) 6 | 7 | ## About 8 | 9 | This is the user interface for the GraphQL Debugger collector. 10 | 11 | ## License 12 | 13 | MIT - Rocket Connect - https://github.com/rocket-connect 14 | -------------------------------------------------------------------------------- /apps/ui/assets/config-filled.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocket-connect/graphql-debugger/b5639a3039ccb55933dc5d4362a797628a09901e/apps/ui/assets/config-filled.ai -------------------------------------------------------------------------------- /apps/ui/assets/config-stroke.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocket-connect/graphql-debugger/b5639a3039ccb55933dc5d4362a797628a09901e/apps/ui/assets/config-stroke.ai -------------------------------------------------------------------------------- /apps/ui/assets/expand.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocket-connect/graphql-debugger/b5639a3039ccb55933dc5d4362a797628a09901e/apps/ui/assets/expand.ai -------------------------------------------------------------------------------- /apps/ui/assets/folder-filled.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocket-connect/graphql-debugger/b5639a3039ccb55933dc5d4362a797628a09901e/apps/ui/assets/folder-filled.ai -------------------------------------------------------------------------------- /apps/ui/assets/folder-stroke.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocket-connect/graphql-debugger/b5639a3039ccb55933dc5d4362a797628a09901e/apps/ui/assets/folder-stroke.ai -------------------------------------------------------------------------------- /apps/ui/assets/github-dark.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocket-connect/graphql-debugger/b5639a3039ccb55933dc5d4362a797628a09901e/apps/ui/assets/github-dark.ai -------------------------------------------------------------------------------- /apps/ui/assets/info-filled.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocket-connect/graphql-debugger/b5639a3039ccb55933dc5d4362a797628a09901e/apps/ui/assets/info-filled.ai -------------------------------------------------------------------------------- /apps/ui/assets/info-stroke.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocket-connect/graphql-debugger/b5639a3039ccb55933dc5d4362a797628a09901e/apps/ui/assets/info-stroke.ai -------------------------------------------------------------------------------- /apps/ui/assets/login-filled.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocket-connect/graphql-debugger/b5639a3039ccb55933dc5d4362a797628a09901e/apps/ui/assets/login-filled.ai -------------------------------------------------------------------------------- /apps/ui/assets/login-stroke.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocket-connect/graphql-debugger/b5639a3039ccb55933dc5d4362a797628a09901e/apps/ui/assets/login-stroke.ai -------------------------------------------------------------------------------- /apps/ui/assets/npm-dark.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocket-connect/graphql-debugger/b5639a3039ccb55933dc5d4362a797628a09901e/apps/ui/assets/npm-dark.ai -------------------------------------------------------------------------------- /apps/ui/assets/refresh.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocket-connect/graphql-debugger/b5639a3039ccb55933dc5d4362a797628a09901e/apps/ui/assets/refresh.ai -------------------------------------------------------------------------------- /apps/ui/assets/search-filled.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocket-connect/graphql-debugger/b5639a3039ccb55933dc5d4362a797628a09901e/apps/ui/assets/search-filled.ai -------------------------------------------------------------------------------- /apps/ui/assets/search-stroke.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocket-connect/graphql-debugger/b5639a3039ccb55933dc5d4362a797628a09901e/apps/ui/assets/search-stroke.ai -------------------------------------------------------------------------------- /apps/ui/jest.config.ts: -------------------------------------------------------------------------------- 1 | import { Config } from "@jest/types"; 2 | 3 | const config: Config.InitialOptions = { 4 | verbose: true, 5 | transform: { 6 | "^.+\\.tsx?$": "ts-jest", 7 | "^.+\\.svg$": "jest-transformer-svg", 8 | }, 9 | testEnvironment: "jest-environment-jsdom", 10 | setupFilesAfterEnv: ["./setup.ts"], 11 | }; 12 | 13 | export default config; 14 | -------------------------------------------------------------------------------- /apps/ui/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /apps/ui/public/docs-filled.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 11 | 12 | 14 | 15 | -------------------------------------------------------------------------------- /apps/ui/public/expand.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /apps/ui/public/folder-filled.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /apps/ui/public/folder-stroke.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /apps/ui/public/github-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /apps/ui/public/npm-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /apps/ui/public/refresh.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /apps/ui/public/search-filled.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /apps/ui/public/search-stroke.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /apps/ui/setup.ts: -------------------------------------------------------------------------------- 1 | import "@testing-library/jest-dom"; 2 | 3 | import "./src/__mocks__/matchMedia"; 4 | 5 | afterEach(() => jest.clearAllMocks()); 6 | -------------------------------------------------------------------------------- /apps/ui/src/__mocks__/matchMedia.ts: -------------------------------------------------------------------------------- 1 | Object.defineProperty(window, "matchMedia", { 2 | writable: true, 3 | value: jest.fn().mockImplementation((query) => ({ 4 | matches: false, 5 | media: query, 6 | onchange: null, 7 | addListener: jest.fn(), // Deprecated 8 | removeListener: jest.fn(), // Deprecated 9 | addEventListener: jest.fn(), 10 | removeEventListener: jest.fn(), 11 | dispatchEvent: jest.fn(), 12 | })), 13 | }); 14 | -------------------------------------------------------------------------------- /apps/ui/src/components/schema/field.tsx: -------------------------------------------------------------------------------- 1 | import { FieldDefinitionNode } from "graphql"; 2 | 3 | import { extractTypeName } from "../../utils/extract-type-name"; 4 | import { FieldName } from "./field-name"; 5 | import { Stats } from "./stats"; 6 | 7 | export interface FieldProps { 8 | field: FieldDefinitionNode; 9 | parentName: string; 10 | schemaId: string; 11 | isLastField?: boolean; 12 | } 13 | 14 | export function Field({ field, parentName, isLastField }: FieldProps) { 15 | const name = field.name.value; 16 | const type = extractTypeName(field.type); 17 | 18 | const shouldDisplayStats = ["query", "mutation"].includes(parentName); 19 | 20 | return ( 21 |
  • 22 | 23 | {shouldDisplayStats && ( 24 |
    25 | 26 |
    27 | )} 28 |
  • 29 | ); 30 | } 31 | -------------------------------------------------------------------------------- /apps/ui/src/components/schema/stat-details.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from "../../utils/cn"; 2 | 3 | export interface StatsDetailsProps { 4 | statsType: 5 | | "Resolve Count" 6 | | "Error Count" 7 | | "Average Duration" 8 | | "Last Resolved"; 9 | statsDetails?: number | string; 10 | } 11 | 12 | export function StatsDetails({ statsType, statsDetails }: StatsDetailsProps) { 13 | return ( 14 |
    15 | {statsType}: 16 | 17 | 22 | {statsDetails} {statsType === "Average Duration" && `ms`} 23 | 24 |
    25 | ); 26 | } 27 | -------------------------------------------------------------------------------- /apps/ui/src/components/search-box.tsx: -------------------------------------------------------------------------------- 1 | import { Cancel } from "../icons/cancel"; 2 | import { Search } from "../icons/search"; 3 | 4 | interface SearchBoxProps { 5 | handleSearch: (value: string) => void; 6 | searchValue: string; 7 | placeholder?: string; 8 | } 9 | 10 | export function SearchBox({ 11 | handleSearch, 12 | placeholder, 13 | searchValue, 14 | }: SearchBoxProps) { 15 | return ( 16 |
    20 | 21 | handleSearch(value)} 28 | /> 29 | 36 |
    37 | ); 38 | } 39 | -------------------------------------------------------------------------------- /apps/ui/src/components/sidebar/views/backend.tsx: -------------------------------------------------------------------------------- 1 | import { type ChangeEvent, useContext } from "react"; 2 | 3 | import { ConfigContext } from "../../../context/config"; 4 | 5 | export function Backend() { 6 | const configContext = useContext(ConfigContext); 7 | 8 | const handleChange = (event: ChangeEvent) => { 9 | configContext?.setapiURL(event.target.value); 10 | }; 11 | 12 | return ( 13 |
    14 |
    15 | 18 |

    Connect to your own backend.

    19 | 27 |
    28 |
    29 | ); 30 | } 31 | -------------------------------------------------------------------------------- /apps/ui/src/components/sidebar/views/info/info-logo.tsx: -------------------------------------------------------------------------------- 1 | import { IDS } from "../../../../testing"; 2 | import { logo } from "../../../../utils/images"; 3 | 4 | const { version } = require("../../../../../package.json"); 5 | 6 | export function InfoLogo({ id }: { id: string }) { 7 | return ( 8 |
    9 | 10 |

    GraphQL Debugger

    11 | 15 | graphql-debugger.com 16 | 17 |

    {version}

    18 |
    19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /apps/ui/src/components/sidebar/views/info/made-with.tsx: -------------------------------------------------------------------------------- 1 | export function MadeWith() { 2 | return ( 3 |
    4 |

    Made With ❤️

    5 |

    6 | GraphQL Debugger is open source and available for free. We appreciate 7 | your support and feedback. - Happy Debugging! 8 |

    9 |
    10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /apps/ui/src/components/sidebar/views/info/watch.tsx: -------------------------------------------------------------------------------- 1 | export function Watch() { 2 | return ( 3 |
    4 |
    5 |