profile
viewpoint
Simon twop Seattle http://twopennycode.com/ A former game developer, proud father, FP lover, WedDev learner/struggler.

twop/ts-union 47

ADT sum type in typescript

twop/ts-rust-bridge 12

Collection of packages to codegen types and serialization to communicate between ts and rust

twop/ts-binary-types-workers-demo 4

demo for my cascadiajs talk about binary encoding in js

twop/ts-describe-action 3

reduce redux boilerplate and leverage typescript safety

twop/worker-react-reconciler-demo 3

This is a technical demo of familiar react development workflow for UI but done in a Web Worker, which is achieved by implementing a custom react-reconciler.

twop/programming-challenges 2

collections of my solutions to typical interview challenges

twop/SlopFlow.Editor 2

Visual editor for SlopFlow

twop/web-dev-links 1

Just a place to save all useful links that I encounter while learning Web Development

twop/Blog 0

repo for my blog

Pull request review commentsourcegraph/sourcegraph

migrated to using graphQL codegen + made all fragment have unique names

 out/ src/graphql/schema.ts+src/graphql/schema_.ts+src/graphql/schema__.ts

@lguychard this is purely WIP work that I decided to document for historical reasons, today I'm going to work on reducing scope. My bad that I didn't communicate that explicitly, will convert it to draft

twop

comment created time in 11 days

issue commentsourcegraph/sourcegraph

Web: 3.19 tracking issue

Last week I worked on migrating to https://graphql-code-generator.com/. I was able to successfully generate operation types with it that we use for tests, but I haven't integrated it into our build pipeline which has watch and build modes. Generating operation types alone takes 5 seconds and significant CPU load (enough for my fans to go wild), and that makes me hesitant to use it in watch mode. I was able to make a draft implementation of watching only for files that have gql tags in them but I still think it is not good enough DevEx.

As a part of this effort I tried to migrate from gql2ts library and use graphql-code-generator to generate schema.ts (schema ts types) too but after working on it for a day I realized it probably makes more sense to do this work in a separate PR, and for graphql-operations.ts files just inline schema types as a temporary solution (otherwise there are type errors).

Next week I'm looking forward to our planned pairing(tetragramming?) session to kick off 3.19 work. Also I need to wrap up the PR and hopefully finish the work described above to fully migrate to graphql-code-generator

lguychard

comment created time in 12 days

push eventsourcegraph/sourcegraph

Simon

commit sha 24010fa3571d5a2f6f355d264643b8884450d2bc

WIP last attempt before reverting back to gql2ts

view details

push time in 12 days

create barnchtwop/ts-union

branch : match-two

created branch time in 12 days

push eventsourcegraph/sourcegraph

Simon

commit sha 5089abc005960e43fda53a773ac9cca45431aa5b

wip migrate generating schema

view details

push time in 15 days

pull request commentsourcegraph/about

WIP onboarding process

I wish I had this onboarding process! I'm jealous of our future teammates :)

lguychard

comment created time in 15 days

pull request commentsourcegraph/about

Add docs on how we style UI

Thanks for writing this! I think it gives a really nice overview.

This may not be the feedback for the documentation itself (it is great as it is) but more on a meta level:

  • as an engineer it is up to me to figure out which components do I need to use out of bootstrap and how that translates into actual react components. The doc shows the direction but not as useful as a prescription, which puts more responsibility on each engineer to "do the right thing" and "connect the dots".
  • there is no specific framework for composing smaller pieces into bigger pieces of UI. Especially when it comes to authoring react components (hint to component library).
  • Layout is left as a guidance for engineers, again, which puts more responsibility on engineers to figure out which whether Flex box or CSS grid should be used, and how to solve a specific problem.
  • I think it is worth building a shared vocabulary between designers and engineers when it comes to components and layouts, and it probably should operate on a higher level than css grid/flex box. I think It is extremely valuable for any handoff process or conversation to say a word which has a precise meaning for all participants (example: spacing-small -> 0.5rem, stack -> vertical layout etc).

If my thoughts have a ground then I worry about what we demand of engineers and designers to be productive in building new UIs.

Please treat the above not as feedback for this PR specifically, but more as my collection of thoughts on this topic (they don't need to be addressed or replied).

felixfbecker

comment created time in 15 days

Pull request review commentsourcegraph/sourcegraph

Log click events on search homepage and repogroup page

 interface Props     showCampaigns: boolean } -const SearchExampleClicked = (): void => eventLogger.log('ExampleSearchClicked')-const LanguageExampleClicked = (): void => eventLogger.log('ExampleLanguageSearchClicked')+const SearchExampleClicked = (url: string) => (): void => eventLogger.log('ExampleSearchClicked', { url })

It seems the the url itself might not as human readable and stable, maybe give them human readable name?

SearchExampleClicked("js_alert_calls")
attfarhan

comment created time in 15 days

Pull request review commentsourcegraph/sourcegraph

Log click events on search homepage and repogroup page

 export const RepogroupPage: React.FunctionComponent<RepogroupPageProps> = (props     ) } +const RepoLinkClicked = (): void => eventLogger.log('RepogroupPageRepoLinkClicked')

I wonder if we want to pass in any data with the event? Such as repo name in this case? I'm not sure if we are able to do that but it seems that slicing these events based on associated data can be useful

attfarhan

comment created time in 16 days

push eventsourcegraph/sourcegraph

AlicjaSuska

commit sha c8e4a41651cb7b17830f0d1bcc40187b0ef65f40

Add Figma URL for UserNavItem (#12290)

view details

Keegan Carruthers-Smith

commit sha f3d88f690a5767ef06d46796f8e976d951932bb0

trace: select http requests with trace=1 (#12291) Currently we parse trace=1 in our javascript layer. This adds trace selection to our endpoints that are directly requested via non-js endpoints (eg loading a page).

view details

Ryan Slade

commit sha 5cf616b29a9c53a6e6ab7784aaebe7596cc8a3a5

leader: Add a leader election package (#12289) * rcache: Add options param to TryAcquireMutex * leader: Add a leader package A small helper package that wraps our Redis based mutex to allow only a single instance of a function to run concurrently. * Update CODEOWNERS * Update internal/rcache/mutex_test.go Co-authored-by: Asdine El Hrychy <asdine.elhrychy@gmail.com> * No need for release func The outler leader loop can release when the worker function returns * Add jitter and respect ctx during sleep * Make worker fn to last parameter Makes it easier to use especially when fn is anonymous * Improve test Co-authored-by: Asdine El Hrychy <asdine.elhrychy@gmail.com>

view details

Loïc Guychard

commit sha eaa28952f62b9e7d3303b007b7f4400b9d327e53

Remove todo-security check (#12292) This check is old, very specific (anything other than `TODO(security)`, such as `todo security`, `TODO: security`, etc. will be missed), and is flaky: - https://buildkite.com/sourcegraph/sourcegraph/builds/68719#ef0d0bae-bdc7-4412-aa2a-dda5ac10aecb - https://sourcegraph.slack.com/archives/C07KZF47K/p1594989190353700?thread_ts=1594988538.353300&cid=C07KZF47K I feel like our code review process is a sufficient safeguard here.

view details

renovate[bot]

commit sha 35a4bb98ac463b91ff9934136f4aa9504d910a5b

Update dependency @types/puppeteer to v3 (#11197) Co-authored-by: Renovate Bot <bot@renovateapp.com> Co-authored-by: Felix Becker <felix.b@outlook.com>

view details

Eric Fritz

commit sha d39f0c72cc4c8379cc7b1c48619c29367729b461

codeintel: Extract generic worker process (#12262)

view details

Eric Fritz

commit sha c8c34394d09aa73ac47465d250167f386004c1a4

Update LSIF docs to link to example CI configurations (#12225)

view details

Keegan Carruthers-Smith

commit sha 5a1c63bec7bd289906cf340e3b7550800f9d452a

dev: only support watchman (#12252) Maintaining three different ways to watch files leads to unneccessary bugs. Instead lets pick just one.

view details

Chayim

commit sha e4a647a4e2c043828519cc712be00ef65e7c796e

Secure Token Schema (#12207) Creating the migrations for the token table, database schema change to accommodate key-value pairs.

view details

Felix Becker

commit sha 24ee7987c4e671d0df8ae3609652dc5b082b7cf9

Increase contrast of placeholders to meet WCAG (#12213)

view details

Felix Becker

commit sha d81fc27fa3d444becf126bf8fc4b7da60c1c7631

Add integration tests for spaces in paths (#12297) * Add integration tests for spaces in paths * Use test-* classes

view details

Eric Fritz

commit sha 80c27d5e64abb974b1ae857c9b0757c3cdfe9627

Add docs for rolling updates to migration readme. (#12298)

view details

ᴜɴᴋɴᴡᴏɴ

commit sha 5ce8ae587d734252af7d8ab439510a8fddb4f421

gqltest: add docs to run and add tests (#12285) Co-authored-by: Rijnard van Tonder <rvantonder@gmail.com>

view details

Keegan Carruthers-Smith

commit sha 3cb30b5ff3f15ba152a9153873ea4b1ad3929519

honey: sample 1 in 16 events (#12317) Band-aid solution until we can investigate further. Again hitting very high usage. Likely due to recent scaling up of the indexed search cluster. Will require more investigation, but we should probably segment user request path.

view details

ᴜɴᴋɴᴡᴏɴ

commit sha 74159cd2319a43b08e7da75591fead5ba04d8758

authz: return empty `permissionsInfo` in OSS version (#12313)

view details

Ryan Slade

commit sha 9da26cb86fbf866625cd5133c23ee21c16dd124c

repo-updater: Sleep on error during syncClone (#12299) * repo-updater: Sleep on error during syncClone Instead of immediatley looping around and potentially putting more pressure on gitserver or the repo store. * Changes from review * Move err check * Refactor to remove sleep / continue pattern

view details

github-actions[bot]

commit sha 7fec1bcc70080af496621516526cd67851f6606e

Update third-party licenses (#12116) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

view details

ᴜɴᴋɴᴡᴏɴ

commit sha 4644536a09e4864073a60a812341b6d9342c418b

Update CHANGELOG.md (#12320)

view details

Keegan Carruthers-Smith

commit sha 2b195bf4f627fea8001aba68efbbf6bc2452b62c

doc: Update and add docs for multiple index search (#12295) Lots of changes have happened due to indexing multiple branches. We update the dev architecture docs to mention options (how we configure multiple branch search) as well as shallow cloning. We mention multiple revision search syntax. We mention how to configure multi branch indexing. We mention how to search HEAD explicitly.

view details

Keegan Carruthers-Smith

commit sha 42f81405fad86921e76e9b317d38ad5358e5dd34

ci: only run go steps if only changing go (#12321) This should significantly speed up Go PR checks.

view details

push time in 16 days

pull request commentsourcegraph/sourcegraph

Badge design

Is there an easy way to see a link for Chromatic preview? Maybe there is a bot that can comment with a link?

felixfbecker

comment created time in 16 days

pull request commentsourcegraph/sourcegraph

Fix monaco in storybooks

@eseliger that is the perfect context! Tnx <3 signing off

eseliger

comment created time in 16 days

pull request commentsourcegraph/sourcegraph

Fix monaco in storybooks

@eseliger could you provide more backstory context for this PR? I would love to review but I think I would need more history explaining "why" :)

eseliger

comment created time in 16 days

Pull request review commentsourcegraph/sourcegraph

migrated to using graphQL codegen + made all fragment have unique names

     "all:stylelint": "yarn --cwd web run stylelint && yarn --cwd shared run stylelint && yarn --cwd browser run stylelint",     "all:tsgql": "yarn --cwd web run tsgql validate -p . --exitOnWarn && yarn --cwd shared run tsgql validate -p . --exitOnWarn && yarn --cwd browser run tsgql validate -p . --exitOnWarn",     "build-ts": "tsc -b .",+    "extract-graphql-operations": "graphql-codegen --config codegen.yml",

I need to trigger this on ts files that contain gql` tags in them + schema changes

twop

comment created time in 18 days

issue commentsourcegraph/sourcegraph

Web 3.18 Tracking issue

Last week

Worked on graphql code generation and tests on Monday. PR for codegen: https://github.com/sourcegraph/sourcegraph/pull/11983 After Monday I spent time investigating alternatives to the "hackyish" solution in it (https://github.com/sourcegraph/sourcegraph/issues/12177). I do like https://graphql-code-generator.com/ and have a working PR https://github.com/sourcegraph/sourcegraph/pull/12284. I still haven't figured out what is the best approach for watch mode, so this is my TODO still.

This week Finish https://github.com/sourcegraph/sourcegraph/pull/12284 asap. If I have time then I will try to replace gql2ts with https://graphql-code-generator.com/ for generation of schema typescript definitions.

lguychard

comment created time in 18 days

startedboa-dev/boa

started time in 19 days

startedjasonwilliams/boa

started time in 19 days

startedsteveruizok/perfect-arrows

started time in 19 days

pull request commentsourcegraph/sourcegraph

migrated to using graphQL codegen + made all fragment have unique names

  • sketched out usage via gulp
  • tried out watch mode (not efficient)
  • added generated files to eslintignore
twop

comment created time in 19 days

push eventsourcegraph/sourcegraph

Simon

commit sha 58ace69183c8b91bbeb352fe5884be5efd44b76d

WIP usage via gulp + ignored eslint for generated files

view details

push time in 19 days

Pull request review commentsourcegraph/sourcegraph

migrated to using graphQL codegen + made all fragment have unique names

     "all:stylelint": "yarn --cwd web run stylelint && yarn --cwd shared run stylelint && yarn --cwd browser run stylelint",     "all:tsgql": "yarn --cwd web run tsgql validate -p . --exitOnWarn && yarn --cwd shared run tsgql validate -p . --exitOnWarn && yarn --cwd browser run tsgql validate -p . --exitOnWarn",     "build-ts": "tsc -b .",+    "extract-graphql-operations": "graphql-codegen --config codegen.yml",

at least my naive implementation of watching using @graphql-codegen/cli watch mode immediately triggers codegen for every ts change image

twop

comment created time in 19 days

push eventsourcegraph/sourcegraph

Simon

commit sha 1d6452cadea5ac87579f1e1d63ca3e1c45554fa6

Update codegen.yml Co-authored-by: Felix Becker <felix.b@outlook.com>

view details

push time in 21 days

pull request commentsourcegraph/sourcegraph

migrated to using graphQL codegen + made all fragment have unique names

It would be good to then delete graphql/schema.ts as soon as possible and get rid of the other generator.

Ah, tnx for clarification. That is my next item on todolist.

twop

comment created time in 21 days

Pull request review commentsourcegraph/sourcegraph

migrated to using graphQL codegen + made all fragment have unique names

     "all:stylelint": "yarn --cwd web run stylelint && yarn --cwd shared run stylelint && yarn --cwd browser run stylelint",     "all:tsgql": "yarn --cwd web run tsgql validate -p . --exitOnWarn && yarn --cwd shared run tsgql validate -p . --exitOnWarn && yarn --cwd browser run tsgql validate -p . --exitOnWarn",     "build-ts": "tsc -b .",+    "extract-graphql-operations": "graphql-codegen --config codegen.yml",

yes

twop

comment created time in 21 days

Pull request review commentsourcegraph/sourcegraph

migrated to using graphQL codegen + made all fragment have unique names

     "all:stylelint": "yarn --cwd web run stylelint && yarn --cwd shared run stylelint && yarn --cwd browser run stylelint",     "all:tsgql": "yarn --cwd web run tsgql validate -p . --exitOnWarn && yarn --cwd shared run tsgql validate -p . --exitOnWarn && yarn --cwd browser run tsgql validate -p . --exitOnWarn",     "build-ts": "tsc -b .",+    "extract-graphql-operations": "graphql-codegen --config codegen.yml",

I'm afraid that it is going to listen for all .ts(x) file changes. But it has a watch mode built in. Partially because of that I was thinking about *.gql files. Then it is super efficient what to watch for

twop

comment created time in 21 days

pull request commentsourcegraph/sourcegraph

migrated to using graphQL codegen + made all fragment have unique names

What's the story for using these types in the application - should they all import from this big file? Or will the types be moved to folders close to their definition?

I don't have a good story yet for their usage outside of integration tests but I do want to integrate them into our product codebase.

It would be great to deduplicate between graphql/schema.ts and these types.

That is a good question, let me play with more settings. It is generated by typescript plugin, which is needed at least dor Scalars, will research settings

twop

comment created time in 21 days

Pull request review commentsourcegraph/sourcegraph

migrated to using graphQL codegen + made all fragment have unique names

-/* eslint-disable @typescript-eslint/consistent-type-definitions */+import {+    CampaignState,+    BackgroundProcessState,+    OrganizationInvitationResponseType,+    EventSource,+    RepositoryPermission,+    SymbolKind,+    DiagnosticSeverity,+    ExternalServiceKind,+    GitRefType,+    GitObjectType,+    GitRefOrder,+    LSIFUploadState,+    LSIFIndexState,+    DiffHunkLineType,+    ChangesetState,+    ChangesetReviewState,+    ChangesetCheckState,+    RepositoryOrderBy,+    UserActivePeriod,+    SearchVersion,+    SearchPatternType,+    AlertType,+    UserEvent,+} from './graphql/schema'++export type Maybe<T> = T | null+export type Exact<T extends { [key: string]: any }> = { [K in keyof T]: T[K] }+ /* This is an autogenerated file. Do not edit this file directly! */+ export interface SharedGraphQlOperations {-    ResolveRawRepoName: /* src/backend/repo.ts */ (variables: ResolveRawRepoNameVariables) => ResolveRawRepoNameResult-    Extensions: /* src/extensions/helpers.ts */ (variables: ExtensionsVariables) => ExtensionsResult-    EditSettings: /* src/settings/edit.ts */ (variables: EditSettingsVariables) => EditSettingsResult-    OverwriteSettings: /* src/settings/edit.ts */ (variables: OverwriteSettingsVariables) => OverwriteSettingsResult-    ExternalServicesForTests: /* src/testing/driver.ts */ (-        variables: ExternalServicesForTestsVariables-    ) => ExternalServicesForTestsResult-    SiteForTests: /* src/testing/driver.ts */ (variables: SiteForTestsVariables) => SiteForTestsResult-    UpdateSiteConfigurationForTests: /* src/testing/driver.ts */ (-        variables: UpdateSiteConfigurationForTestsVariables-    ) => UpdateSiteConfigurationForTestsResult-    UserSettingsForTests: /* src/testing/driver.ts */ (-        variables: UserSettingsForTestsVariables-    ) => UserSettingsForTestsResult-    OverwriteSettingsForTests: /* src/testing/driver.ts */ (-        variables: OverwriteSettingsForTestsVariables-    ) => OverwriteSettingsForTestsResult-}-export type ResolveRawRepoNameVariables = {-    repoName: string-}-export type ResolveRawRepoNameResult = {-    repository: {-        uri: string-        mirrorInfo: {-            cloned: boolean-        }-    } | null-}-export type ExtensionsVariables = {-    first: number-    prioritizeExtensionIDs: string[]-}-export type ExtensionsResult = {+    /** shared/src/backend/repo.ts */+    ResolveRawRepoName: (variables: ResolveRawRepoNameVariables) => ResolveRawRepoNameResult++    /** shared/src/extensions/helpers.ts */+    Extensions: (variables: ExtensionsVariables) => ExtensionsResult++    /** shared/src/settings/edit.ts */+    EditSettings: (variables: EditSettingsVariables) => EditSettingsResult++    /** shared/src/settings/edit.ts */+    OverwriteSettings: (variables: OverwriteSettingsVariables) => OverwriteSettingsResult+}+/** All built-in and custom scalars, mapped to their actual values */+export interface Scalars {+    ID: string+    String: string+    Boolean: boolean+    Int: number+    Float: number+    DateTime: string+    JSONCString: string+    JSONValue: any

sure

twop

comment created time in 21 days

Pull request review commentsourcegraph/sourcegraph

migrated to using graphQL codegen + made all fragment have unique names

-/* eslint-disable @typescript-eslint/consistent-type-definitions */+import {+    CampaignState,+    BackgroundProcessState,+    OrganizationInvitationResponseType,+    EventSource,+    RepositoryPermission,+    SymbolKind,+    DiagnosticSeverity,+    ExternalServiceKind,+    GitRefType,+    GitObjectType,+    GitRefOrder,+    LSIFUploadState,+    LSIFIndexState,+    DiffHunkLineType,+    ChangesetState,+    ChangesetReviewState,+    ChangesetCheckState,+    RepositoryOrderBy,+    UserActivePeriod,+    SearchVersion,+    SearchPatternType,+    AlertType,+    UserEvent,+} from '../../shared/src/graphql/schema'++export type Maybe<T> = T | null+export type Exact<T extends { [key: string]: any }> = { [K in keyof T]: T[K] }+ /* This is an autogenerated file. Do not edit this file directly! */+ export interface WebGraphQlOperations {-    CurrentAuthState: /* src/auth.ts */ (variables: CurrentAuthStateVariables) => CurrentAuthStateResult-    RepositoryID: /* src/enterprise/campaigns/detail/AddChangesetForm.tsx */ (-        variables: RepositoryIDVariables-    ) => RepositoryIDResult-    CreateChangeset: /* src/enterprise/campaigns/detail/AddChangesetForm.tsx */ (-        variables: CreateChangesetVariables-    ) => CreateChangesetResult-    AddChangeSetToCampaign: /* src/enterprise/campaigns/detail/AddChangesetForm.tsx */ (-        variables: AddChangeSetToCampaignVariables-    ) => AddChangeSetToCampaignResult-    UpdateCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (-        variables: UpdateCampaignVariables-    ) => UpdateCampaignResult-    CreateCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (-        variables: CreateCampaignVariables-    ) => CreateCampaignResult-    RetryCampaignChangesets: /* src/enterprise/campaigns/detail/backend.ts */ (-        variables: RetryCampaignChangesetsVariables-    ) => RetryCampaignChangesetsResult-    PublishCampaignChangesets: /* src/enterprise/campaigns/detail/backend.ts */ (-        variables: PublishCampaignChangesetsVariables-    ) => PublishCampaignChangesetsResult-    CloseCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (-        variables: CloseCampaignVariables-    ) => CloseCampaignResult-    DeleteCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (-        variables: DeleteCampaignVariables-    ) => DeleteCampaignResult-    CampaignByID: /* src/enterprise/campaigns/detail/backend.ts */ (-        variables: CampaignByIDVariables-    ) => CampaignByIDResult-    PatchSetByID: /* src/enterprise/campaigns/detail/backend.ts */ (-        variables: PatchSetByIDVariables-    ) => PatchSetByIDResult-    CampaignChangesets: /* src/enterprise/campaigns/detail/backend.ts */ (-        variables: CampaignChangesetsVariables-    ) => CampaignChangesetsResult-    CampaignPatches: /* src/enterprise/campaigns/detail/backend.ts */ (-        variables: CampaignPatchesVariables-    ) => CampaignPatchesResult-    PatchSetPatches: /* src/enterprise/campaigns/detail/backend.ts */ (-        variables: PatchSetPatchesVariables-    ) => PatchSetPatchesResult-    PublishChangeset: /* src/enterprise/campaigns/detail/backend.ts */ (-        variables: PublishChangesetVariables-    ) => PublishChangesetResult-    SyncChangeset: /* src/enterprise/campaigns/detail/backend.ts */ (-        variables: SyncChangesetVariables-    ) => SyncChangesetResult-    ExternalChangesetFileDiffs: /* src/enterprise/campaigns/detail/backend.ts */ (-        variables: ExternalChangesetFileDiffsVariables-    ) => ExternalChangesetFileDiffsResult-    PatchFileDiffs: /* src/enterprise/campaigns/detail/backend.ts */ (-        variables: PatchFileDiffsVariables-    ) => PatchFileDiffsResult-    Campaigns: /* src/enterprise/campaigns/global/list/backend.ts */ (variables: CampaignsVariables) => CampaignsResult-    CampaignsCount: /* src/enterprise/campaigns/global/list/backend.ts */ (-        variables: CampaignsCountVariables-    ) => CampaignsCountResult-    LsifUploads: /* src/enterprise/codeintel/backend.tsx */ (variables: LsifUploadsVariables) => LsifUploadsResult-    LsifUploadsWithRepo: /* src/enterprise/codeintel/backend.tsx */ (-        variables: LsifUploadsWithRepoVariables-    ) => LsifUploadsWithRepoResult-    LsifUpload: /* src/enterprise/codeintel/backend.tsx */ (variables: LsifUploadVariables) => LsifUploadResult-    DeleteLsifUpload: /* src/enterprise/codeintel/backend.tsx */ (-        variables: DeleteLsifUploadVariables-    ) => DeleteLsifUploadResult-    LsifIndexes: /* src/enterprise/codeintel/backend.tsx */ (variables: LsifIndexesVariables) => LsifIndexesResult-    LsifIndexesWithRepo: /* src/enterprise/codeintel/backend.tsx */ (-        variables: LsifIndexesWithRepoVariables-    ) => LsifIndexesWithRepoResult-    LsifIndex: /* src/enterprise/codeintel/backend.tsx */ (variables: LsifIndexVariables) => LsifIndexResult-    DeleteLsifIndex: /* src/enterprise/codeintel/backend.tsx */ (-        variables: DeleteLsifIndexVariables-    ) => DeleteLsifIndexResult-    ProductPlans: /* src/enterprise/dotcom/productPlans/ProductPlanFormControl.tsx */ (-        variables: ProductPlansVariables-    ) => ProductPlansResult-    ExploreExtensions: /* src/enterprise/extensions/explore/ExtensionsExploreSection.tsx */ (-        variables: ExploreExtensionsVariables-    ) => ExploreExtensionsResult-    UpdateRegistryExtension: /* src/enterprise/extensions/extension/RegistryExtensionManagePage.tsx */ (-        variables: UpdateRegistryExtensionVariables-    ) => UpdateRegistryExtensionResult-    PublishRegistryExtension: /* src/enterprise/extensions/extension/RegistryExtensionNewReleasePage.tsx */ (-        variables: PublishRegistryExtensionVariables-    ) => PublishRegistryExtensionResult-    CreateRegistryExtension: /* src/enterprise/extensions/registry/RegistryNewExtensionPage.tsx */ (-        variables: CreateRegistryExtensionVariables-    ) => CreateRegistryExtensionResult-    DeleteRegistryExtension: /* src/enterprise/extensions/registry/backend.ts */ (-        variables: DeleteRegistryExtensionVariables-    ) => DeleteRegistryExtensionResult-    ViewerRegistryPublishers: /* src/enterprise/extensions/registry/backend.ts */ (-        variables: ViewerRegistryPublishersVariables-    ) => ViewerRegistryPublishersResult-    ViewerNamespaces: /* src/enterprise/namespaces/backend.ts */ (-        variables: ViewerNamespacesVariables-    ) => ViewerNamespacesResult-    LsifUploadsForRepo: /* src/enterprise/repo/settings/backend.tsx */ (-        variables: LsifUploadsForRepoVariables-    ) => LsifUploadsForRepoResult-    LsifUploadForRepo: /* src/enterprise/repo/settings/backend.tsx */ (-        variables: LsifUploadForRepoVariables-    ) => LsifUploadForRepoResult-    DeleteLsifUploadForRepo: /* src/enterprise/repo/settings/backend.tsx */ (-        variables: DeleteLsifUploadForRepoVariables-    ) => DeleteLsifUploadForRepoResult-    LsifIndexesForRepo: /* src/enterprise/repo/settings/backend.tsx */ (-        variables: LsifIndexesForRepoVariables-    ) => LsifIndexesForRepoResult-    LsifIndexForRepo: /* src/enterprise/repo/settings/backend.tsx */ (-        variables: LsifIndexForRepoVariables-    ) => LsifIndexForRepoResult-    DeleteLsifIndexForRepo: /* src/enterprise/repo/settings/backend.tsx */ (-        variables: DeleteLsifIndexForRepoVariables-    ) => DeleteLsifIndexForRepoResult-    SearchResultsStats: /* src/enterprise/search/stats/backend.ts */ (-        variables: SearchResultsStatsVariables-    ) => SearchResultsStatsResult-    AuthProviders: /* src/enterprise/site-admin/SiteAdminAuthenticationProvidersPage.tsx */ (-        variables: AuthProvidersVariables-    ) => AuthProvidersResult-    ExternalAccounts: /* src/enterprise/site-admin/SiteAdminExternalAccountsPage.tsx */ (-        variables: ExternalAccountsVariables-    ) => ExternalAccountsResult-    SiteAdminRegistryExtensions: /* src/enterprise/site-admin/SiteAdminRegistryExtensionsPage.tsx */ (-        variables: SiteAdminRegistryExtensionsVariables-    ) => SiteAdminRegistryExtensionsResult-    SiteAdminLsifUpload: /* src/enterprise/site-admin/backend.ts */ (-        variables: SiteAdminLsifUploadVariables-    ) => SiteAdminLsifUploadResult-    SetCustomerBilling: /* src/enterprise/site-admin/dotcom/customers/SiteAdminCustomerBillingLink.tsx */ (-        variables: SetCustomerBillingVariables-    ) => SetCustomerBillingResult-    Customers: /* src/enterprise/site-admin/dotcom/customers/SiteAdminCustomersPage.tsx */ (-        variables: CustomersVariables-    ) => CustomersResult-    CreateProductSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminCreateProductSubscriptionPage.tsx */ (-        variables: CreateProductSubscriptionVariables-    ) => CreateProductSubscriptionResult-    ProductSubscriptionAccounts: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminCreateProductSubscriptionPage.tsx */ (-        variables: ProductSubscriptionAccountsVariables-    ) => ProductSubscriptionAccountsResult-    GenerateProductLicenseForSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminGenerateProductLicenseForSubscriptionForm.tsx */ (+    /** web/src/auth.ts */+    CurrentAuthState: (variables: CurrentAuthStateVariables) => CurrentAuthStateResult++    /** web/src/enterprise/campaigns/detail/AddChangesetForm.tsx */+    RepositoryID: (variables: RepositoryIDVariables) => RepositoryIDResult++    /** web/src/enterprise/campaigns/detail/AddChangesetForm.tsx */+    CreateChangeset: (variables: CreateChangesetVariables) => CreateChangesetResult++    /** web/src/enterprise/campaigns/detail/AddChangesetForm.tsx */+    AddChangeSetToCampaign: (variables: AddChangeSetToCampaignVariables) => AddChangeSetToCampaignResult++    /** web/src/enterprise/campaigns/detail/backend.ts */+    UpdateCampaign: (variables: UpdateCampaignVariables) => UpdateCampaignResult++    /** web/src/enterprise/campaigns/detail/backend.ts */+    CreateCampaign: (variables: CreateCampaignVariables) => CreateCampaignResult++    /** web/src/enterprise/campaigns/detail/backend.ts */+    RetryCampaignChangesets: (variables: RetryCampaignChangesetsVariables) => RetryCampaignChangesetsResult++    /** web/src/enterprise/campaigns/detail/backend.ts */+    PublishCampaignChangesets: (variables: PublishCampaignChangesetsVariables) => PublishCampaignChangesetsResult++    /** web/src/enterprise/campaigns/detail/backend.ts */+    CloseCampaign: (variables: CloseCampaignVariables) => CloseCampaignResult++    /** web/src/enterprise/campaigns/detail/backend.ts */+    DeleteCampaign: (variables: DeleteCampaignVariables) => DeleteCampaignResult++    /** web/src/enterprise/campaigns/detail/backend.ts */+    CampaignByID: (variables: CampaignByIDVariables) => CampaignByIDResult++    /** web/src/enterprise/campaigns/detail/backend.ts */+    PatchSetByID: (variables: PatchSetByIDVariables) => PatchSetByIDResult++    /** web/src/enterprise/campaigns/detail/backend.ts */+    CampaignChangesets: (variables: CampaignChangesetsVariables) => CampaignChangesetsResult++    /** web/src/enterprise/campaigns/detail/backend.ts */+    CampaignPatches: (variables: CampaignPatchesVariables) => CampaignPatchesResult++    /** web/src/enterprise/campaigns/detail/backend.ts */+    PatchSetPatches: (variables: PatchSetPatchesVariables) => PatchSetPatchesResult++    /** web/src/enterprise/campaigns/detail/backend.ts */+    PublishChangeset: (variables: PublishChangesetVariables) => PublishChangesetResult++    /** web/src/enterprise/campaigns/detail/backend.ts */+    SyncChangeset: (variables: SyncChangesetVariables) => SyncChangesetResult++    /** web/src/enterprise/campaigns/detail/backend.ts */+    ExternalChangesetFileDiffs: (variables: ExternalChangesetFileDiffsVariables) => ExternalChangesetFileDiffsResult++    /** web/src/enterprise/campaigns/detail/backend.ts */+    PatchFileDiffs: (variables: PatchFileDiffsVariables) => PatchFileDiffsResult++    /** web/src/enterprise/campaigns/global/list/backend.ts */+    Campaigns: (variables: CampaignsVariables) => CampaignsResult++    /** web/src/enterprise/campaigns/global/list/backend.ts */+    CampaignsCount: (variables: CampaignsCountVariables) => CampaignsCountResult++    /** web/src/enterprise/codeintel/backend.tsx */+    LsifUploads: (variables: LsifUploadsVariables) => LsifUploadsResult++    /** web/src/enterprise/codeintel/backend.tsx */+    LsifUploadsWithRepo: (variables: LsifUploadsWithRepoVariables) => LsifUploadsWithRepoResult++    /** web/src/enterprise/codeintel/backend.tsx */+    LsifUpload: (variables: LsifUploadVariables) => LsifUploadResult++    /** web/src/enterprise/codeintel/backend.tsx */+    DeleteLsifUpload: (variables: DeleteLsifUploadVariables) => DeleteLsifUploadResult++    /** web/src/enterprise/codeintel/backend.tsx */+    LsifIndexes: (variables: LsifIndexesVariables) => LsifIndexesResult++    /** web/src/enterprise/codeintel/backend.tsx */+    LsifIndexesWithRepo: (variables: LsifIndexesWithRepoVariables) => LsifIndexesWithRepoResult++    /** web/src/enterprise/codeintel/backend.tsx */+    LsifIndex: (variables: LsifIndexVariables) => LsifIndexResult++    /** web/src/enterprise/codeintel/backend.tsx */+    DeleteLsifIndex: (variables: DeleteLsifIndexVariables) => DeleteLsifIndexResult++    /** web/src/enterprise/dotcom/productPlans/ProductPlanFormControl.tsx */+    ProductPlans: (variables: ProductPlansVariables) => ProductPlansResult++    /** web/src/enterprise/extensions/explore/ExtensionsExploreSection.tsx */+    ExploreExtensions: (variables: ExploreExtensionsVariables) => ExploreExtensionsResult++    /** web/src/enterprise/extensions/extension/RegistryExtensionManagePage.tsx */+    UpdateRegistryExtension: (variables: UpdateRegistryExtensionVariables) => UpdateRegistryExtensionResult++    /** web/src/enterprise/extensions/extension/RegistryExtensionNewReleasePage.tsx */+    PublishRegistryExtension: (variables: PublishRegistryExtensionVariables) => PublishRegistryExtensionResult++    /** web/src/enterprise/extensions/registry/RegistryNewExtensionPage.tsx */+    CreateRegistryExtension: (variables: CreateRegistryExtensionVariables) => CreateRegistryExtensionResult++    /** web/src/enterprise/extensions/registry/backend.ts */+    DeleteRegistryExtension: (variables: DeleteRegistryExtensionVariables) => DeleteRegistryExtensionResult++    /** web/src/enterprise/extensions/registry/backend.ts */+    ViewerRegistryPublishers: (variables: ViewerRegistryPublishersVariables) => ViewerRegistryPublishersResult++    /** web/src/enterprise/namespaces/backend.ts */+    ViewerNamespaces: (variables: ViewerNamespacesVariables) => ViewerNamespacesResult++    /** web/src/enterprise/repo/settings/backend.tsx */+    LsifUploadsForRepo: (variables: LsifUploadsForRepoVariables) => LsifUploadsForRepoResult++    /** web/src/enterprise/repo/settings/backend.tsx */+    LsifUploadForRepo: (variables: LsifUploadForRepoVariables) => LsifUploadForRepoResult++    /** web/src/enterprise/repo/settings/backend.tsx */+    DeleteLsifUploadForRepo: (variables: DeleteLsifUploadForRepoVariables) => DeleteLsifUploadForRepoResult++    /** web/src/enterprise/repo/settings/backend.tsx */+    LsifIndexesForRepo: (variables: LsifIndexesForRepoVariables) => LsifIndexesForRepoResult++    /** web/src/enterprise/repo/settings/backend.tsx */+    LsifIndexForRepo: (variables: LsifIndexForRepoVariables) => LsifIndexForRepoResult++    /** web/src/enterprise/repo/settings/backend.tsx */+    DeleteLsifIndexForRepo: (variables: DeleteLsifIndexForRepoVariables) => DeleteLsifIndexForRepoResult++    /** web/src/enterprise/search/stats/backend.ts */+    SearchResultsStats: (variables: SearchResultsStatsVariables) => SearchResultsStatsResult++    /** web/src/enterprise/site-admin/SiteAdminAuthenticationProvidersPage.tsx */+    AuthProviders: (variables: AuthProvidersVariables) => AuthProvidersResult++    /** web/src/enterprise/site-admin/SiteAdminExternalAccountsPage.tsx */+    ExternalAccounts: (variables: ExternalAccountsVariables) => ExternalAccountsResult++    /** web/src/enterprise/site-admin/SiteAdminRegistryExtensionsPage.tsx */+    SiteAdminRegistryExtensions: (variables: SiteAdminRegistryExtensionsVariables) => SiteAdminRegistryExtensionsResult++    /** web/src/enterprise/site-admin/backend.ts */+    SiteAdminLsifUpload: (variables: SiteAdminLsifUploadVariables) => SiteAdminLsifUploadResult++    /** web/src/enterprise/site-admin/dotcom/customers/SiteAdminCustomerBillingLink.tsx */+    SetCustomerBilling: (variables: SetCustomerBillingVariables) => SetCustomerBillingResult++    /** web/src/enterprise/site-admin/dotcom/customers/SiteAdminCustomersPage.tsx */+    Customers: (variables: CustomersVariables) => CustomersResult++    /** web/src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminCreateProductSubscriptionPage.tsx */+    CreateProductSubscription: (variables: CreateProductSubscriptionVariables) => CreateProductSubscriptionResult++    /** web/src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminCreateProductSubscriptionPage.tsx */+    ProductSubscriptionAccounts: (variables: ProductSubscriptionAccountsVariables) => ProductSubscriptionAccountsResult++    /** web/src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminGenerateProductLicenseForSubscriptionForm.tsx */+    GenerateProductLicenseForSubscription: (         variables: GenerateProductLicenseForSubscriptionVariables     ) => GenerateProductLicenseForSubscriptionResult-    DotComProductLicenses: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductLicensesPage.tsx */ (-        variables: DotComProductLicensesVariables-    ) => DotComProductLicensesResult-    SetProductSubscriptionBilling: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionBillingLink.tsx */ (++    /** web/src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductLicensesPage.tsx */+    DotComProductLicenses: (variables: DotComProductLicensesVariables) => DotComProductLicensesResult++    /** web/src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionBillingLink.tsx */+    SetProductSubscriptionBilling: (         variables: SetProductSubscriptionBillingVariables     ) => SetProductSubscriptionBillingResult-    DotComProductSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionPage.tsx */ (-        variables: DotComProductSubscriptionVariables-    ) => DotComProductSubscriptionResult-    ProductLicenses: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionPage.tsx */ (-        variables: ProductLicensesVariables-    ) => ProductLicensesResult-    ArchiveProductSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionPage.tsx */ (-        variables: ArchiveProductSubscriptionVariables-    ) => ArchiveProductSubscriptionResult-    ProductSubscriptionsDotCom: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionsPage.tsx */ (-        variables: ProductSubscriptionsDotComVariables-    ) => ProductSubscriptionsDotComResult-    ProductLicenseInfo: /* src/enterprise/site-admin/productSubscription/ProductSubscriptionStatus.tsx */ (-        variables: ProductLicenseInfoVariables-    ) => ProductLicenseInfoResult-    PreviewProductSubscriptionInvoice: /* src/enterprise/user/productSubscriptions/NewProductSubscriptionPaymentSection.tsx */ (++    /** web/src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionPage.tsx */+    DotComProductSubscription: (variables: DotComProductSubscriptionVariables) => DotComProductSubscriptionResult++    /** web/src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionPage.tsx */+    ProductLicenses: (variables: ProductLicensesVariables) => ProductLicensesResult++    /** web/src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionPage.tsx */+    ArchiveProductSubscription: (variables: ArchiveProductSubscriptionVariables) => ArchiveProductSubscriptionResult++    /** web/src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionsPage.tsx */+    ProductSubscriptionsDotCom: (variables: ProductSubscriptionsDotComVariables) => ProductSubscriptionsDotComResult++    /** web/src/enterprise/site-admin/productSubscription/ProductSubscriptionStatus.tsx */+    ProductLicenseInfo: (variables: ProductLicenseInfoVariables) => ProductLicenseInfoResult++    /** web/src/enterprise/user/productSubscriptions/NewProductSubscriptionPaymentSection.tsx */+    PreviewProductSubscriptionInvoice: (         variables: PreviewProductSubscriptionInvoiceVariables     ) => PreviewProductSubscriptionInvoiceResult-    ProductSubscriptionOnEditPage: /* src/enterprise/user/productSubscriptions/UserSubscriptionsEditProductSubscriptionPage.tsx */ (++    /** web/src/enterprise/user/productSubscriptions/UserSubscriptionsEditProductSubscriptionPage.tsx */+    ProductSubscriptionOnEditPage: (         variables: ProductSubscriptionOnEditPageVariables     ) => ProductSubscriptionOnEditPageResult-    UpdatePaidProductSubscription: /* src/enterprise/user/productSubscriptions/UserSubscriptionsEditProductSubscriptionPage.tsx */ (++    /** web/src/enterprise/user/productSubscriptions/UserSubscriptionsEditProductSubscriptionPage.tsx */+    UpdatePaidProductSubscription: (         variables: UpdatePaidProductSubscriptionVariables     ) => UpdatePaidProductSubscriptionResult-    CreatePaidProductSubscription: /* src/enterprise/user/productSubscriptions/UserSubscriptionsNewProductSubscriptionPage.tsx */ (++    /** web/src/enterprise/user/productSubscriptions/UserSubscriptionsNewProductSubscriptionPage.tsx */+    CreatePaidProductSubscription: (         variables: CreatePaidProductSubscriptionVariables     ) => CreatePaidProductSubscriptionResult-    ProductSubscription: /* src/enterprise/user/productSubscriptions/UserSubscriptionsProductSubscriptionPage.tsx */ (-        variables: ProductSubscriptionVariables-    ) => ProductSubscriptionResult-    ProductSubscriptions: /* src/enterprise/user/productSubscriptions/UserSubscriptionsProductSubscriptionsPage.tsx */ (-        variables: ProductSubscriptionsVariables-    ) => ProductSubscriptionsResult-    DeleteExternalAccount: /* src/enterprise/user/settings/ExternalAccountNode.tsx */ (-        variables: DeleteExternalAccountVariables-    ) => DeleteExternalAccountResult-    UserExternalAccounts: /* src/enterprise/user/settings/UserSettingsExternalAccountsPage.tsx */ (-        variables: UserExternalAccountsVariables-    ) => UserExternalAccountsResult-    RegistryExtensions: /* src/extensions/ExtensionsList.tsx */ (-        variables: RegistryExtensionsVariables-    ) => RegistryExtensionsResult-    RegistryExtension: /* src/extensions/extension/ExtensionArea.tsx */ (-        variables: RegistryExtensionVariables-    ) => RegistryExtensionResult-    SubmitSurvey: /* src/marketing/backend.tsx */ (variables: SubmitSurveyVariables) => SubmitSurveyResult-    FetchSurveyResponses: /* src/marketing/backend.tsx */ (-        variables: FetchSurveyResponsesVariables-    ) => FetchSurveyResponsesResult-    FetchAllUsersWithSurveyResponses: /* src/marketing/backend.tsx */ (++    /** web/src/enterprise/user/productSubscriptions/UserSubscriptionsProductSubscriptionPage.tsx */+    ProductSubscription: (variables: ProductSubscriptionVariables) => ProductSubscriptionResult++    /** web/src/enterprise/user/productSubscriptions/UserSubscriptionsProductSubscriptionsPage.tsx */+    ProductSubscriptions: (variables: ProductSubscriptionsVariables) => ProductSubscriptionsResult++    /** web/src/enterprise/user/settings/ExternalAccountNode.tsx */+    DeleteExternalAccount: (variables: DeleteExternalAccountVariables) => DeleteExternalAccountResult++    /** web/src/enterprise/user/settings/UserSettingsExternalAccountsPage.tsx */+    UserExternalAccounts: (variables: UserExternalAccountsVariables) => UserExternalAccountsResult++    /** web/src/extensions/ExtensionsList.tsx */+    RegistryExtensions: (variables: RegistryExtensionsVariables) => RegistryExtensionsResult++    /** web/src/extensions/extension/ExtensionArea.tsx */+    RegistryExtension: (variables: RegistryExtensionVariables) => RegistryExtensionResult++    /** web/src/marketing/backend.tsx */+    SubmitSurvey: (variables: SubmitSurveyVariables) => SubmitSurveyResult++    /** web/src/marketing/backend.tsx */+    FetchSurveyResponses: (variables: FetchSurveyResponsesVariables) => FetchSurveyResponsesResult++    /** web/src/marketing/backend.tsx */+    FetchAllUsersWithSurveyResponses: (         variables: FetchAllUsersWithSurveyResponsesVariables     ) => FetchAllUsersWithSurveyResponsesResult-    FetchSurveyResponseAggregates: /* src/marketing/backend.tsx */ (++    /** web/src/marketing/backend.tsx */+    FetchSurveyResponseAggregates: (         variables: FetchSurveyResponseAggregatesVariables     ) => FetchSurveyResponseAggregatesResult-    RequestTrial: /* src/marketing/backend.tsx */ (variables: RequestTrialVariables) => RequestTrialResult-    StatusMessages: /* src/nav/StatusMessagesNavItem.tsx */ (variables: StatusMessagesVariables) => StatusMessagesResult-    createOrganization: /* src/org/backend.tsx */ (variables: createOrganizationVariables) => createOrganizationResult-    removeUserFromOrganization: /* src/org/backend.tsx */ (-        variables: removeUserFromOrganizationVariables-    ) => removeUserFromOrganizationResult-    UpdateOrganization: /* src/org/backend.tsx */ (variables: UpdateOrganizationVariables) => UpdateOrganizationResult-    Organization: /* src/org/area/OrgArea.tsx */ (variables: OrganizationVariables) => OrganizationResult-    RespondToOrganizationInvitation: /* src/org/area/OrgInvitationPage.tsx */ (++    /** web/src/marketing/backend.tsx */+    RequestTrial: (variables: RequestTrialVariables) => RequestTrialResult++    /** web/src/nav/StatusMessagesNavItem.tsx */+    StatusMessages: (variables: StatusMessagesVariables) => StatusMessagesResult++    /** web/src/org/area/OrgArea.tsx */+    Organization: (variables: OrganizationVariables) => OrganizationResult++    /** web/src/org/area/OrgInvitationPage.tsx */+    RespondToOrganizationInvitation: (         variables: RespondToOrganizationInvitationVariables     ) => RespondToOrganizationInvitationResult-    OrganizationMembers: /* src/org/area/OrgMembersPage.tsx */ (-        variables: OrganizationMembersVariables-    ) => OrganizationMembersResult-    InviteUserToOrganization: /* src/org/invite/InviteForm.tsx */ (-        variables: InviteUserToOrganizationVariables-    ) => InviteUserToOrganizationResult-    AddUserToOrganization: /* src/org/invite/InviteForm.tsx */ (-        variables: AddUserToOrganizationVariables-    ) => AddUserToOrganizationResult-    ViewerSettings: /* src/platform/context.ts */ (variables: ViewerSettingsVariables) => ViewerSettingsResult-    RepositoryGitRefs: /* src/repo/GitReference.tsx */ (-        variables: RepositoryGitRefsVariables-    ) => RepositoryGitRefsResult-    FetchCommits: /* src/repo/RepoRevisionSidebarCommits.tsx */ (variables: FetchCommitsVariables) => FetchCommitsResult-    RepositoriesForPopover: /* src/repo/RepositoriesPopover.tsx */ (-        variables: RepositoriesForPopoverVariables-    ) => RepositoriesForPopoverResult-    RepositoryGitCommit: /* src/repo/RevisionsPopover.tsx */ (-        variables: RepositoryGitCommitVariables-    ) => RepositoryGitCommitResult-    RepositoryRedirect: /* src/repo/backend.ts */ (variables: RepositoryRedirectVariables) => RepositoryRedirectResult-    ResolveRev: /* src/repo/backend.ts */ (variables: ResolveRevVariables) => ResolveRevResult-    HighlightedFile: /* src/repo/backend.ts */ (variables: HighlightedFileVariables) => HighlightedFileResult-    FileExternalLinks: /* src/repo/backend.ts */ (variables: FileExternalLinksVariables) => FileExternalLinksResult-    TreeEntries: /* src/repo/backend.ts */ (variables: TreeEntriesVariables) => TreeEntriesResult-    Blob: /* src/repo/blob/BlobPage.tsx */ (variables: BlobVariables) => BlobResult-    RepositoryGitBranchesOverview: /* src/repo/branches/RepositoryBranchesOverviewPage.tsx */ (++    /** web/src/org/area/OrgMembersPage.tsx */+    OrganizationMembers: (variables: OrganizationMembersVariables) => OrganizationMembersResult++    /** web/src/org/backend.tsx */+    createOrganization: (variables: createOrganizationVariables) => createOrganizationResult++    /** web/src/org/backend.tsx */+    removeUserFromOrganization: (variables: removeUserFromOrganizationVariables) => removeUserFromOrganizationResult++    /** web/src/org/backend.tsx */+    UpdateOrganization: (variables: UpdateOrganizationVariables) => UpdateOrganizationResult++    /** web/src/org/invite/InviteForm.tsx */+    InviteUserToOrganization: (variables: InviteUserToOrganizationVariables) => InviteUserToOrganizationResult++    /** web/src/org/invite/InviteForm.tsx */+    AddUserToOrganization: (variables: AddUserToOrganizationVariables) => AddUserToOrganizationResult++    /** web/src/platform/context.ts */+    ViewerSettings: (variables: ViewerSettingsVariables) => ViewerSettingsResult++    /** web/src/repo/GitReference.tsx */+    RepositoryGitRefs: (variables: RepositoryGitRefsVariables) => RepositoryGitRefsResult++    /** web/src/repo/RepoRevisionSidebarCommits.tsx */+    FetchCommits: (variables: FetchCommitsVariables) => FetchCommitsResult++    /** web/src/repo/RepositoriesPopover.tsx */+    RepositoriesForPopover: (variables: RepositoriesForPopoverVariables) => RepositoriesForPopoverResult++    /** web/src/repo/RevisionsPopover.tsx */+    RepositoryGitCommit: (variables: RepositoryGitCommitVariables) => RepositoryGitCommitResult++    /** web/src/repo/backend.ts */+    RepositoryRedirect: (variables: RepositoryRedirectVariables) => RepositoryRedirectResult++    /** web/src/repo/backend.ts */+    ResolveRev: (variables: ResolveRevVariables) => ResolveRevResult++    /** web/src/repo/backend.ts */+    HighlightedFile: (variables: HighlightedFileVariables) => HighlightedFileResult++    /** web/src/repo/backend.ts */+    FileExternalLinks: (variables: FileExternalLinksVariables) => FileExternalLinksResult++    /** web/src/repo/backend.ts */+    TreeEntries: (variables: TreeEntriesVariables) => TreeEntriesResult++    /** web/src/repo/blob/BlobPage.tsx */+    Blob: (variables: BlobVariables) => BlobResult++    /** web/src/repo/branches/RepositoryBranchesOverviewPage.tsx */+    RepositoryGitBranchesOverview: (         variables: RepositoryGitBranchesOverviewVariables     ) => RepositoryGitBranchesOverviewResult-    RepositoryCommit: /* src/repo/commit/RepositoryCommitPage.tsx */ (-        variables: RepositoryCommitVariables-    ) => RepositoryCommitResult-    RepositoryGitCommits: /* src/repo/commits/RepositoryCommitsPage.tsx */ (-        variables: RepositoryGitCommitsVariables-    ) => RepositoryGitCommitsResult-    RepositoryComparisonCommits: /* src/repo/compare/RepositoryCompareCommitsPage.tsx */ (-        variables: RepositoryComparisonCommitsVariables-    ) => RepositoryComparisonCommitsResult-    RepositoryComparisonDiff: /* src/repo/compare/RepositoryCompareDiffPage.tsx */ (-        variables: RepositoryComparisonDiffVariables-    ) => RepositoryComparisonDiffResult-    RepositoryComparison: /* src/repo/compare/RepositoryCompareOverviewPage.tsx */ (-        variables: RepositoryComparisonVariables-    ) => RepositoryComparisonResult-    ExploreRepositories: /* src/repo/explore/RepositoriesExploreSection.tsx */ (-        variables: ExploreRepositoriesVariables-    ) => ExploreRepositoriesResult-    RepositoryTextSearchIndex: /* src/repo/settings/RepoSettingsIndexPage.tsx */ (-        variables: RepositoryTextSearchIndexVariables-    ) => RepositoryTextSearchIndexResult-    Repository: /* src/repo/settings/backend.tsx */ (variables: RepositoryVariables) => RepositoryResult-    RepositoryContributors: /* src/repo/stats/RepositoryStatsContributorsPage.tsx */ (-        variables: RepositoryContributorsVariables-    ) => RepositoryContributorsResult-    TreeCommits: /* src/repo/tree/TreePage.tsx */ (variables: TreeCommitsVariables) => TreeCommitsResult-    Search: /* src/search/backend.tsx */ (variables: SearchVariables) => SearchResult-    RepoGroups: /* src/search/backend.tsx */ (variables: RepoGroupsVariables) => RepoGroupsResult-    SearchSuggestions: /* src/search/backend.tsx */ (variables: SearchSuggestionsVariables) => SearchSuggestionsResult-    ReposByQuery: /* src/search/backend.tsx */ (variables: ReposByQueryVariables) => ReposByQueryResult-    savedSearches: /* src/search/backend.tsx */ (variables: savedSearchesVariables) => savedSearchesResult-    SavedSearch: /* src/search/backend.tsx */ (variables: SavedSearchVariables) => SavedSearchResult-    CreateSavedSearch: /* src/search/backend.tsx */ (variables: CreateSavedSearchVariables) => CreateSavedSearchResult-    UpdateSavedSearch: /* src/search/backend.tsx */ (variables: UpdateSavedSearchVariables) => UpdateSavedSearchResult-    DeleteSavedSearch: /* src/search/backend.tsx */ (variables: DeleteSavedSearchVariables) => DeleteSavedSearchResult-    highlightCode: /* src/search/backend.tsx */ (variables: highlightCodeVariables) => highlightCodeResult-    ManyReposWarning: /* src/search/backend.tsx */ (variables: ManyReposWarningVariables) => ManyReposWarningResult-    SettingsCascade: /* src/settings/SettingsArea.tsx */ (variables: SettingsCascadeVariables) => SettingsCascadeResult-    DeleteAccessToken: /* src/settings/tokens/AccessTokenNode.tsx */ (-        variables: DeleteAccessTokenVariables-    ) => DeleteAccessTokenResult-    SiteFlags: /* src/site/backend.tsx */ (variables: SiteFlagsVariables) => SiteFlagsResult-    addExternalService: /* src/site-admin/SiteAdminAddExternalServicePage.tsx */ (-        variables: addExternalServiceVariables-    ) => addExternalServiceResult-    UpdateExternalService: /* src/site-admin/SiteAdminExternalServicePage.tsx */ (-        variables: UpdateExternalServiceVariables-    ) => UpdateExternalServiceResult-    ExternalService: /* src/site-admin/SiteAdminExternalServicePage.tsx */ (-        variables: ExternalServiceVariables-    ) => ExternalServiceResult-    DeleteExternalService: /* src/site-admin/SiteAdminExternalServicesPage.tsx */ (-        variables: DeleteExternalServiceVariables-    ) => DeleteExternalServiceResult-    ExternalServices: /* src/site-admin/SiteAdminExternalServicesPage.tsx */ (-        variables: ExternalServicesVariables-    ) => ExternalServicesResult-    SiteAdminAccessTokens: /* src/site-admin/SiteAdminTokensPage.tsx */ (-        variables: SiteAdminAccessTokensVariables-    ) => SiteAdminAccessTokensResult-    Users: /* src/site-admin/backend.tsx */ (variables: UsersVariables) => UsersResult-    Organizations: /* src/site-admin/backend.tsx */ (variables: OrganizationsVariables) => OrganizationsResult-    Repositories: /* src/site-admin/backend.tsx */ (variables: RepositoriesVariables) => RepositoriesResult-    UpdateMirrorRepository: /* src/site-admin/backend.tsx */ (-        variables: UpdateMirrorRepositoryVariables-    ) => UpdateMirrorRepositoryResult-    CheckMirrorRepositoryConnection: /* src/site-admin/backend.tsx */ (++    /** web/src/repo/commit/RepositoryCommitPage.tsx */+    RepositoryCommit: (variables: RepositoryCommitVariables) => RepositoryCommitResult++    /** web/src/repo/commits/RepositoryCommitsPage.tsx */+    RepositoryGitCommits: (variables: RepositoryGitCommitsVariables) => RepositoryGitCommitsResult++    /** web/src/repo/compare/RepositoryCompareCommitsPage.tsx */+    RepositoryComparisonCommits: (variables: RepositoryComparisonCommitsVariables) => RepositoryComparisonCommitsResult++    /** web/src/repo/compare/RepositoryCompareDiffPage.tsx */+    RepositoryComparisonDiff: (variables: RepositoryComparisonDiffVariables) => RepositoryComparisonDiffResult++    /** web/src/repo/compare/RepositoryCompareOverviewPage.tsx */+    RepositoryComparison: (variables: RepositoryComparisonVariables) => RepositoryComparisonResult++    /** web/src/repo/explore/RepositoriesExploreSection.tsx */+    ExploreRepositories: (variables: ExploreRepositoriesVariables) => ExploreRepositoriesResult++    /** web/src/repo/settings/RepoSettingsIndexPage.tsx */+    RepositoryTextSearchIndex: (variables: RepositoryTextSearchIndexVariables) => RepositoryTextSearchIndexResult++    /** web/src/repo/settings/backend.tsx */+    Repository: (variables: RepositoryVariables) => RepositoryResult++    /** web/src/repo/stats/RepositoryStatsContributorsPage.tsx */+    RepositoryContributors: (variables: RepositoryContributorsVariables) => RepositoryContributorsResult++    /** web/src/repo/tree/TreePage.tsx */+    TreeCommits: (variables: TreeCommitsVariables) => TreeCommitsResult++    /** web/src/search/backend.tsx */+    Search: (variables: SearchVariables) => SearchResult++    /** web/src/search/backend.tsx */+    RepoGroups: (variables: RepoGroupsVariables) => RepoGroupsResult++    /** web/src/search/backend.tsx */+    SearchSuggestions: (variables: SearchSuggestionsVariables) => SearchSuggestionsResult++    /** web/src/search/backend.tsx */+    ReposByQuery: (variables: ReposByQueryVariables) => ReposByQueryResult++    /** web/src/search/backend.tsx */+    savedSearches: (variables: savedSearchesVariables) => savedSearchesResult++    /** web/src/search/backend.tsx */+    SavedSearch: (variables: SavedSearchVariables) => SavedSearchResult++    /** web/src/search/backend.tsx */+    CreateSavedSearch: (variables: CreateSavedSearchVariables) => CreateSavedSearchResult++    /** web/src/search/backend.tsx */+    UpdateSavedSearch: (variables: UpdateSavedSearchVariables) => UpdateSavedSearchResult++    /** web/src/search/backend.tsx */+    DeleteSavedSearch: (variables: DeleteSavedSearchVariables) => DeleteSavedSearchResult++    /** web/src/search/backend.tsx */+    highlightCode: (variables: highlightCodeVariables) => highlightCodeResult++    /** web/src/search/backend.tsx */+    ManyReposWarning: (variables: ManyReposWarningVariables) => ManyReposWarningResult++    /** web/src/settings/SettingsArea.tsx */+    SettingsCascade: (variables: SettingsCascadeVariables) => SettingsCascadeResult++    /** web/src/settings/tokens/AccessTokenNode.tsx */+    DeleteAccessToken: (variables: DeleteAccessTokenVariables) => DeleteAccessTokenResult++    /** web/src/site-admin/SiteAdminAddExternalServicePage.tsx */+    addExternalService: (variables: addExternalServiceVariables) => addExternalServiceResult++    /** web/src/site-admin/SiteAdminExternalServicePage.tsx */+    UpdateExternalService: (variables: UpdateExternalServiceVariables) => UpdateExternalServiceResult++    /** web/src/site-admin/SiteAdminExternalServicePage.tsx */+    ExternalService: (variables: ExternalServiceVariables) => ExternalServiceResult++    /** web/src/site-admin/SiteAdminExternalServicesPage.tsx */+    DeleteExternalService: (variables: DeleteExternalServiceVariables) => DeleteExternalServiceResult++    /** web/src/site-admin/SiteAdminExternalServicesPage.tsx */+    ExternalServices: (variables: ExternalServicesVariables) => ExternalServicesResult++    /** web/src/site-admin/SiteAdminTokensPage.tsx */+    SiteAdminAccessTokens: (variables: SiteAdminAccessTokensVariables) => SiteAdminAccessTokensResult++    /** web/src/site-admin/backend.tsx */+    Users: (variables: UsersVariables) => UsersResult++    /** web/src/site-admin/backend.tsx */+    Organizations: (variables: OrganizationsVariables) => OrganizationsResult++    /** web/src/site-admin/backend.tsx */+    Repositories: (variables: RepositoriesVariables) => RepositoriesResult++    /** web/src/site-admin/backend.tsx */+    UpdateMirrorRepository: (variables: UpdateMirrorRepositoryVariables) => UpdateMirrorRepositoryResult++    /** web/src/site-admin/backend.tsx */+    CheckMirrorRepositoryConnection: (         variables: CheckMirrorRepositoryConnectionVariables     ) => CheckMirrorRepositoryConnectionResult-    ScheduleRepositoryPermissionsSync: /* src/site-admin/backend.tsx */ (++    /** web/src/site-admin/backend.tsx */+    ScheduleRepositoryPermissionsSync: (         variables: ScheduleRepositoryPermissionsSyncVariables     ) => ScheduleRepositoryPermissionsSyncResult-    ScheduleUserPermissionsSync: /* src/site-admin/backend.tsx */ (-        variables: ScheduleUserPermissionsSyncVariables-    ) => ScheduleUserPermissionsSyncResult-    UserUsageStatistics: /* src/site-admin/backend.tsx */ (-        variables: UserUsageStatisticsVariables-    ) => UserUsageStatisticsResult-    SiteUsageStatistics: /* src/site-admin/backend.tsx */ (-        variables: SiteUsageStatisticsVariables-    ) => SiteUsageStatisticsResult-    Site: /* src/site-admin/backend.tsx */ (variables: SiteVariables) => SiteResult-    AllConfig: /* src/site-admin/backend.tsx */ (variables: AllConfigVariables) => AllConfigResult-    UpdateSiteConfiguration: /* src/site-admin/backend.tsx */ (-        variables: UpdateSiteConfigurationVariables-    ) => UpdateSiteConfigurationResult-    ReloadSite: /* src/site-admin/backend.tsx */ (variables: ReloadSiteVariables) => ReloadSiteResult-    SetUserIsSiteAdmin: /* src/site-admin/backend.tsx */ (-        variables: SetUserIsSiteAdminVariables-    ) => SetUserIsSiteAdminResult-    RandomizeUserPassword: /* src/site-admin/backend.tsx */ (-        variables: RandomizeUserPasswordVariables-    ) => RandomizeUserPasswordResult-    DeleteUser: /* src/site-admin/backend.tsx */ (variables: DeleteUserVariables) => DeleteUserResult-    CreateUser: /* src/site-admin/backend.tsx */ (variables: CreateUserVariables) => CreateUserResult-    DeleteOrganization: /* src/site-admin/backend.tsx */ (-        variables: DeleteOrganizationVariables-    ) => DeleteOrganizationResult-    SiteUpdateCheck: /* src/site-admin/backend.tsx */ (variables: SiteUpdateCheckVariables) => SiteUpdateCheckResult-    SiteMonitoringStatistics: /* src/site-admin/backend.tsx */ (-        variables: SiteMonitoringStatisticsVariables-    ) => SiteMonitoringStatisticsResult-    Overview: /* src/site-admin/overview/SiteAdminOverviewPage.tsx */ (variables: OverviewVariables) => OverviewResult-    WAUs: /* src/site-admin/overview/SiteAdminOverviewPage.tsx */ (variables: WAUsVariables) => WAUsResult-    Symbols: /* src/symbols/backend.tsx */ (variables: SymbolsVariables) => SymbolsResult-    SiteAdminActivationStatus: /* src/tracking/withActivation.tsx */ (-        variables: SiteAdminActivationStatusVariables-    ) => SiteAdminActivationStatusResult-    ActivationStatus: /* src/tracking/withActivation.tsx */ (-        variables: ActivationStatusVariables-    ) => ActivationStatusResult-    LinksForRepositories: /* src/tracking/withActivation.tsx */ (-        variables: LinksForRepositoriesVariables-    ) => LinksForRepositoriesResult-    UserEventLogs: /* src/user/UserEventLogsPage.tsx */ (variables: UserEventLogsVariables) => UserEventLogsResult-    User: /* src/user/area/UserArea.tsx */ (variables: UserVariables) => UserResult-    updateUser: /* src/user/settings/backend.tsx */ (variables: updateUserVariables) => updateUserResult-    updatePassword: /* src/user/settings/backend.tsx */ (variables: updatePasswordVariables) => updatePasswordResult-    SetUserEmailVerified: /* src/user/settings/backend.tsx */ (-        variables: SetUserEmailVerifiedVariables-    ) => SetUserEmailVerifiedResult-    logUserEvent: /* src/user/settings/backend.tsx */ (variables: logUserEventVariables) => logUserEventResult-    logEvent: /* src/user/settings/backend.tsx */ (variables: logEventVariables) => logEventResult-    CreateAccessToken: /* src/user/settings/accessTokens/UserSettingsCreateAccessTokenPage.tsx */ (-        variables: CreateAccessTokenVariables-    ) => CreateAccessTokenResult-    AccessTokens: /* src/user/settings/accessTokens/UserSettingsTokensPage.tsx */ (-        variables: AccessTokensVariables-    ) => AccessTokensResult-    AddUserEmail: /* src/user/settings/emails/AddUserEmailForm.tsx */ (-        variables: AddUserEmailVariables-    ) => AddUserEmailResult-    RemoveUserEmail: /* src/user/settings/emails/UserSettingsEmailsPage.tsx */ (-        variables: RemoveUserEmailVariables-    ) => RemoveUserEmailResult-    UserEmails: /* src/user/settings/emails/UserSettingsEmailsPage.tsx */ (-        variables: UserEmailsVariables-    ) => UserEmailsResult-    UserForProfilePage: /* src/user/settings/profile/UserSettingsProfilePage.tsx */ (-        variables: UserForProfilePageVariables-    ) => UserForProfilePageResult-}-export type CurrentAuthStateVariables = {}-export type CurrentAuthStateResult = {-    currentUser: {++    /** web/src/site-admin/backend.tsx */+    ScheduleUserPermissionsSync: (variables: ScheduleUserPermissionsSyncVariables) => ScheduleUserPermissionsSyncResult++    /** web/src/site-admin/backend.tsx */+    UserUsageStatistics: (variables: UserUsageStatisticsVariables) => UserUsageStatisticsResult++    /** web/src/site-admin/backend.tsx */+    SiteUsageStatistics: (variables: SiteUsageStatisticsVariables) => SiteUsageStatisticsResult++    /** web/src/site-admin/backend.tsx */+    Site: (variables: SiteVariables) => SiteResult++    /** web/src/site-admin/backend.tsx */+    AllConfig: (variables: AllConfigVariables) => AllConfigResult++    /** web/src/site-admin/backend.tsx */+    UpdateSiteConfiguration: (variables: UpdateSiteConfigurationVariables) => UpdateSiteConfigurationResult++    /** web/src/site-admin/backend.tsx */+    ReloadSite: (variables: ReloadSiteVariables) => ReloadSiteResult++    /** web/src/site-admin/backend.tsx */+    SetUserIsSiteAdmin: (variables: SetUserIsSiteAdminVariables) => SetUserIsSiteAdminResult++    /** web/src/site-admin/backend.tsx */+    RandomizeUserPassword: (variables: RandomizeUserPasswordVariables) => RandomizeUserPasswordResult++    /** web/src/site-admin/backend.tsx */+    DeleteUser: (variables: DeleteUserVariables) => DeleteUserResult++    /** web/src/site-admin/backend.tsx */+    CreateUser: (variables: CreateUserVariables) => CreateUserResult++    /** web/src/site-admin/backend.tsx */+    DeleteOrganization: (variables: DeleteOrganizationVariables) => DeleteOrganizationResult++    /** web/src/site-admin/backend.tsx */+    SiteUpdateCheck: (variables: SiteUpdateCheckVariables) => SiteUpdateCheckResult++    /** web/src/site-admin/backend.tsx */+    SiteMonitoringStatistics: (variables: SiteMonitoringStatisticsVariables) => SiteMonitoringStatisticsResult++    /** web/src/site-admin/overview/SiteAdminOverviewPage.tsx */+    Overview: (variables: OverviewVariables) => OverviewResult++    /** web/src/site-admin/overview/SiteAdminOverviewPage.tsx */+    WAUs: (variables: WAUsVariables) => WAUsResult++    /** web/src/site/backend.tsx */+    SiteFlags: (variables: SiteFlagsVariables) => SiteFlagsResult++    /** web/src/symbols/backend.tsx */+    Symbols: (variables: SymbolsVariables) => SymbolsResult++    /** web/src/tracking/withActivation.tsx */+    SiteAdminActivationStatus: (variables: SiteAdminActivationStatusVariables) => SiteAdminActivationStatusResult++    /** web/src/tracking/withActivation.tsx */+    ActivationStatus: (variables: ActivationStatusVariables) => ActivationStatusResult++    /** web/src/tracking/withActivation.tsx */+    LinksForRepositories: (variables: LinksForRepositoriesVariables) => LinksForRepositoriesResult++    /** web/src/user/UserEventLogsPage.tsx */+    UserEventLogs: (variables: UserEventLogsVariables) => UserEventLogsResult++    /** web/src/user/area/UserArea.tsx */+    User: (variables: UserVariables) => UserResult++    /** web/src/user/settings/accessTokens/UserSettingsCreateAccessTokenPage.tsx */+    CreateAccessToken: (variables: CreateAccessTokenVariables) => CreateAccessTokenResult++    /** web/src/user/settings/accessTokens/UserSettingsTokensPage.tsx */+    AccessTokens: (variables: AccessTokensVariables) => AccessTokensResult++    /** web/src/user/settings/backend.tsx */+    updateUser: (variables: updateUserVariables) => updateUserResult++    /** web/src/user/settings/backend.tsx */+    updatePassword: (variables: updatePasswordVariables) => updatePasswordResult++    /** web/src/user/settings/backend.tsx */+    SetUserEmailVerified: (variables: SetUserEmailVerifiedVariables) => SetUserEmailVerifiedResult++    /** web/src/user/settings/backend.tsx */+    logUserEvent: (variables: logUserEventVariables) => logUserEventResult++    /** web/src/user/settings/backend.tsx */+    logEvent: (variables: logEventVariables) => logEventResult++    /** web/src/user/settings/emails/AddUserEmailForm.tsx */+    AddUserEmail: (variables: AddUserEmailVariables) => AddUserEmailResult++    /** web/src/user/settings/emails/UserSettingsEmailsPage.tsx */+    RemoveUserEmail: (variables: RemoveUserEmailVariables) => RemoveUserEmailResult++    /** web/src/user/settings/emails/UserSettingsEmailsPage.tsx */+    UserEmails: (variables: UserEmailsVariables) => UserEmailsResult++    /** web/src/user/settings/profile/UserSettingsProfilePage.tsx */+    UserForProfilePage: (variables: UserForProfilePageVariables) => UserForProfilePageResult+}+/** All built-in and custom scalars, mapped to their actual values */+export interface Scalars {+    ID: string+    String: string+    Boolean: boolean+    Int: number+    Float: number+    DateTime: string+    JSONCString: string+    JSONValue: any+    GitObjectID: string+}++export interface AddExternalServiceInput {+    kind: ExternalServiceKind+    displayName: Scalars['String']+    config: Scalars['String']+}++export { AlertType }++export { BackgroundProcessState }++export { CampaignState }++export { ChangesetCheckState }++export { ChangesetReviewState }++export { ChangesetState }++export interface ConfigurationEdit {+    keyPath: KeyPathSegment[]+    value?: Maybe<Scalars['JSONValue']>+    valueIsJSONCEncodedString?: Maybe<Scalars['Boolean']>+}++export interface CreateCampaignInput {+    namespace: Scalars['ID']+    name: Scalars['String']+    description?: Maybe<Scalars['String']>+    branch?: Maybe<Scalars['String']>+    patchSet?: Maybe<Scalars['ID']>+}++export interface CreateChangesetInput {+    repository: Scalars['ID']+    externalID: Scalars['String']+}++export { DiagnosticSeverity }++export { DiffHunkLineType }++export { EventSource }++export { ExternalServiceKind }++export { GitObjectType }++export { GitRefOrder }++export { GitRefType }++export interface KeyPathSegment {+    property?: Maybe<Scalars['String']>+    index?: Maybe<Scalars['Int']>+}++export { LSIFIndexState }++export { LSIFUploadState }++export interface MarkdownOptions {+    alwaysNil?: Maybe<Scalars['String']>+}++export { OrganizationInvitationResponseType }++export interface PatchInput {+    repository: Scalars['ID']+    baseRevision: Scalars['String']+    baseRef: Scalars['String']+    patch: Scalars['String']+}++export interface ProductLicenseInput {+    tags: Scalars['String'][]+    userCount: Scalars['Int']+    expiresAt: Scalars['Int']+}++export interface ProductSubscriptionInput {+    billingPlanID: Scalars['String']+    userCount: Scalars['Int']+}++export { RepositoryOrderBy }++export { RepositoryPermission }++export { SearchPatternType }++export { SearchVersion }++export interface SettingsEdit {+    keyPath: KeyPathSegment[]+    value?: Maybe<Scalars['JSONValue']>+    valueIsJSONCEncodedString?: Maybe<Scalars['Boolean']>+}++export interface SettingsMutationGroupInput {+    subject: Scalars['ID']+    lastID?: Maybe<Scalars['Int']>+}++export interface SurveySubmissionInput {+    email?: Maybe<Scalars['String']>+    score: Scalars['Int']+    reason?: Maybe<Scalars['String']>+    better?: Maybe<Scalars['String']>+}++export { SymbolKind }++export interface UpdateCampaignInput {+    id: Scalars['ID']+    name?: Maybe<Scalars['String']>+    branch?: Maybe<Scalars['String']>+    description?: Maybe<Scalars['String']>+    patchSet?: Maybe<Scalars['ID']>+}++export interface UpdateExternalServiceInput {+    id: Scalars['ID']+    displayName?: Maybe<Scalars['String']>+    config?: Maybe<Scalars['String']>+}++export { UserActivePeriod }++export { UserEvent }++export interface UserPermission {+    bindID: Scalars['String']+    permission?: Maybe<RepositoryPermission>+}++export type CurrentAuthStateVariables = Exact<{ [key: string]: never }>++export interface CurrentAuthStateResult {+    currentUser?: Maybe<{         __typename: 'User'         id: string         databaseID: number         username: string-        avatarURL: string | null+        avatarURL?: Maybe<string>         email: string-        displayName: string | null+        displayName?: Maybe<string>         siteAdmin: boolean         tags: string[]         url: string-        settingsURL: string | null+        settingsURL?: Maybe<string>+        viewerCanAdminister: boolean         organizations: {-            nodes: {-                id: string-                name: string-                displayName: string | null-                url: string-                settingsURL: string | null-            }[]-        }-        session: {-            canSignOut: boolean+            nodes: { id: string; name: string; displayName?: Maybe<string>; url: string; settingsURL?: Maybe<string> }[]         }-        viewerCanAdminister: boolean-    } | null+        session: { canSignOut: boolean }+    }> }-export type FileDiffHunkRangeFields = {++export interface FileDiffHunkRangeFields {     startLine: number     lines: number }-export type DiffStatFields = {++export interface DiffStatFields {     added: number     changed: number     deleted: number }-export type FileDiffFields = {++export interface FileDiffFields {     __typename: 'FileDiff'-    oldPath: string | null-    oldFile: {-        __typename: string-        binary: boolean-        byteSize: number-    } | null-    newFile: {-        __typename: string-        binary: boolean-        byteSize: number-    } | null-    newPath: string | null-    mostRelevantFile: {-        __typename: string-        url: string-    }+    oldPath?: Maybe<string>+    newPath?: Maybe<string>+    internalID: string+    oldFile?: Maybe<+        | { __typename: 'GitBlob'; binary: boolean; byteSize: number }+        | { __typename: 'VirtualFile'; binary: boolean; byteSize: number }+    >+    newFile?: Maybe<+        | { __typename: 'GitBlob'; binary: boolean; byteSize: number }+        | { __typename: 'VirtualFile'; binary: boolean; byteSize: number }+    >+    mostRelevantFile: { __typename: 'GitBlob'; url: string } | { __typename: 'VirtualFile'; url: string }     hunks: {-        oldRange: {-            startLine: number-            lines: number-        }         oldNoNewlineAt: boolean-        newRange: {-            startLine: number-            lines: number-        }-        section: string | null-        highlight: {-            aborted: boolean-            lines: {-                kind: 'ADDED' | 'UNCHANGED' | 'DELETED'-                html: string-            }[]-        }-    }[]-    stat: {-        added: number-        changed: number-        deleted: number-    }-    internalID: string-}-export type RepositoryIDVariables = {-    repoName: string-}-export type RepositoryIDResult = {-    repository: {-        id: string-    } | null-}-export type CreateChangesetVariables = {-    repositoryID: string-    externalID: string-}-export type CreateChangesetResult = {-    createChangesets: {-        id: string+        section?: Maybe<string>+        oldRange: { startLine: number; lines: number }+        newRange: { startLine: number; lines: number }+        highlight: { aborted: boolean; lines: { kind: DiffHunkLineType; html: string }[] }     }[]-}-export type AddChangeSetToCampaignVariables = {-    campaignID: string-    changesets: string[]-}-export type AddChangeSetToCampaignResult = {-    addChangesetsToCampaign: {-        id: string-    }-}-export type CampaignFields = {+    stat: { added: number; changed: number; deleted: number }+}++export type RepositoryIDVariables = Exact<{+    repoName: Scalars['String']+}>++export interface RepositoryIDResult {+    repository?: Maybe<{ id: string }>+}++export type CreateChangesetVariables = Exact<{+    repositoryID: Scalars['ID']+    externalID: Scalars['String']+}>++export interface CreateChangesetResult {+    createChangesets: { id: string }[]+}++export type AddChangeSetToCampaignVariables = Exact<{+    campaignID: Scalars['ID']+    changesets: Scalars['ID'][]+}>++export interface AddChangeSetToCampaignResult {+    addChangesetsToCampaign: { id: string }+}++export interface CampaignFields {     __typename: 'Campaign'     id: string     name: string-    description: string | null-    author: {-        username: string-        avatarURL: string | null-    }-    status: {-        completedCount: number-        pendingCount: number-        state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'CANCELED'-        errors: string[]-    }-    branch: string | null-    createdAt: any-    updatedAt: any-    closedAt: any | null+    description?: Maybe<string>+    branch?: Maybe<string>+    createdAt: string+    updatedAt: string+    closedAt?: Maybe<string>     viewerCanAdminister: boolean     hasUnpublishedPatches: boolean-    changesets: {-        totalCount: number-    }-    patches: {-        totalCount: number-    }+    author: { username: string; avatarURL?: Maybe<string> }+    status: { completedCount: number; pendingCount: number; state: BackgroundProcessState; errors: string[] }+    changesets: { totalCount: number }+    patches: { totalCount: number }     changesetCountsOverTime: {-        date: any+        date: string         merged: number         closed: number         openApproved: number         openChangesRequested: number         openPending: number         total: number     }[]-    diffStat: DiffStatFields1-}-export type DiffStatFields1 = {-    added: number-    changed: number-    deleted: number+    diffStat: DiffStatFields }-export type PatchSetFields = {++export interface PatchSetFields {     __typename: 'PatchSet'     id: string-    diffStat: DiffStatFields2-    patches: {+    diffStat: DiffStatFields+    patches: { totalCount: number }+}++export type UpdateCampaignVariables = Exact<{+    update: UpdateCampaignInput+}>++export interface UpdateCampaignResult {+    updateCampaign: CampaignFields+}++export type CreateCampaignVariables = Exact<{+    input: CreateCampaignInput+}>++export interface CreateCampaignResult {+    createCampaign: { id: string; url: string }+}++export type RetryCampaignChangesetsVariables = Exact<{+    campaign: Scalars['ID']+}>++export interface RetryCampaignChangesetsResult {+    retryCampaignChangesets: CampaignFields+}++export type PublishCampaignChangesetsVariables = Exact<{+    campaign: Scalars['ID']+}>++export interface PublishCampaignChangesetsResult {+    publishCampaignChangesets: CampaignFields+}++export type CloseCampaignVariables = Exact<{+    campaign: Scalars['ID']+    closeChangesets: Scalars['Boolean']+}>++export interface CloseCampaignResult {+    closeCampaign: { id: string }+}++export type DeleteCampaignVariables = Exact<{+    campaign: Scalars['ID']+    closeChangesets: Scalars['Boolean']+}>++export interface DeleteCampaignResult {+    deleteCampaign?: Maybe<{ alwaysNil?: Maybe<string> }>+}++export type CampaignByIDVariables = Exact<{+    campaign: Scalars['ID']+}>++export interface CampaignByIDResult {+    node?: Maybe<+        | ({ __typename: 'Campaign' } & CampaignFields)+        | { __typename: 'PatchSet' }+        | { __typename: 'User' }+        | { __typename: 'Org' }+        | { __typename: 'OrganizationInvitation' }+        | { __typename: 'AccessToken' }+        | { __typename: 'ExternalAccount' }+        | { __typename: 'Repository' }+        | { __typename: 'GitCommit' }+        | { __typename: 'ExternalService' }+        | { __typename: 'GitRef' }+        | { __typename: 'LSIFUpload' }+        | { __typename: 'LSIFIndex' }+        | { __typename: 'SavedSearch' }+        | { __typename: 'VersionContext' }+        | { __typename: 'RegistryExtension' }+        | { __typename: 'ProductSubscription' }+        | { __typename: 'ProductLicense' }+        | { __typename: 'ExternalChangeset' }+        | { __typename: 'ChangesetEvent' }+        | { __typename: 'Patch' }+        | { __typename: 'HiddenPatch' }+        | { __typename: 'HiddenExternalChangeset' }+    >+}++export type PatchSetByIDVariables = Exact<{+    patchSet: Scalars['ID']+}>++export interface PatchSetByIDResult {+    node?: Maybe<+        | { __typename: 'Campaign' }+        | ({ __typename: 'PatchSet' } & PatchSetFields)+        | { __typename: 'User' }+        | { __typename: 'Org' }+        | { __typename: 'OrganizationInvitation' }+        | { __typename: 'AccessToken' }+        | { __typename: 'ExternalAccount' }+        | { __typename: 'Repository' }+        | { __typename: 'GitCommit' }+        | { __typename: 'ExternalService' }+        | { __typename: 'GitRef' }+        | { __typename: 'LSIFUpload' }+        | { __typename: 'LSIFIndex' }+        | { __typename: 'SavedSearch' }+        | { __typename: 'VersionContext' }+        | { __typename: 'RegistryExtension' }+        | { __typename: 'ProductSubscription' }+        | { __typename: 'ProductLicense' }+        | { __typename: 'ExternalChangeset' }+        | { __typename: 'ChangesetEvent' }+        | { __typename: 'Patch' }+        | { __typename: 'HiddenPatch' }+        | { __typename: 'HiddenExternalChangeset' }+    >+}++export type CampaignChangesetsVariables = Exact<{+    campaign: Scalars['ID']+    first?: Maybe<Scalars['Int']>+    state?: Maybe<ChangesetState>+    reviewState?: Maybe<ChangesetReviewState>+    checkState?: Maybe<ChangesetCheckState>+}>++export interface CampaignChangesetsResult {+    node?: Maybe<+        | {+              __typename: 'Campaign'+              changesets: {+                  totalCount: number+                  nodes: (+                      | {+                            __typename: 'ExternalChangeset'+                            id: string+                            title: string+                            body: string+                            reviewState: ChangesetReviewState+                            checkState?: Maybe<ChangesetCheckState>+                            externalID: string+                            state: ChangesetState+                            createdAt: string+                            updatedAt: string+                            nextSyncAt?: Maybe<string>+                            labels: { text: string; description?: Maybe<string>; color: string }[]+                            repository: { id: string; name: string; url: string }+                            externalURL: { url: string }+                            diff?: Maybe<{ fileDiffs: { diffStat: DiffStatFields } }>+                            diffStat?: Maybe<{ added: number; changed: number; deleted: number }>+                        }+                      | {+                            __typename: 'HiddenExternalChangeset'+                            id: string+                            state: ChangesetState+                            createdAt: string+                            updatedAt: string+                            nextSyncAt?: Maybe<string>+                        }+                  )[]+              }+          }+        | { __typename: 'PatchSet' }+        | { __typename: 'User' }+        | { __typename: 'Org' }+        | { __typename: 'OrganizationInvitation' }+        | { __typename: 'AccessToken' }+        | { __typename: 'ExternalAccount' }+        | { __typename: 'Repository' }+        | { __typename: 'GitCommit' }+        | { __typename: 'ExternalService' }+        | { __typename: 'GitRef' }+        | { __typename: 'LSIFUpload' }+        | { __typename: 'LSIFIndex' }+        | { __typename: 'SavedSearch' }+        | { __typename: 'VersionContext' }+        | { __typename: 'RegistryExtension' }+        | { __typename: 'ProductSubscription' }+        | { __typename: 'ProductLicense' }+        | { __typename: 'ExternalChangeset' }+        | { __typename: 'ChangesetEvent' }+        | { __typename: 'Patch' }+        | { __typename: 'HiddenPatch' }+        | { __typename: 'HiddenExternalChangeset' }+    >+}++export type CampaignPatchesVariables = Exact<{+    campaign: Scalars['ID']+    first?: Maybe<Scalars['Int']>+}>++export interface CampaignPatchesResult {+    node?: Maybe<+        | {+              __typename: 'Campaign'+              patches: {+                  totalCount: number+                  nodes: (+                      | {+                            __typename: 'Patch'+                            id: string+                            publishable: boolean+                            publicationEnqueued: boolean+                            repository: { id: string; name: string; url: string }+                            diff: { fileDiffs: { diffStat: DiffStatFields } }+                        }+                      | { __typename: 'HiddenPatch'; id: string }+                  )[]+              }+          }+        | { __typename: 'PatchSet' }+        | { __typename: 'User' }+        | { __typename: 'Org' }+        | { __typename: 'OrganizationInvitation' }+        | { __typename: 'AccessToken' }+        | { __typename: 'ExternalAccount' }+        | { __typename: 'Repository' }+        | { __typename: 'GitCommit' }+        | { __typename: 'ExternalService' }+        | { __typename: 'GitRef' }+        | { __typename: 'LSIFUpload' }+        | { __typename: 'LSIFIndex' }+        | { __typename: 'SavedSearch' }+        | { __typename: 'VersionContext' }+        | { __typename: 'RegistryExtension' }+        | { __typename: 'ProductSubscription' }+        | { __typename: 'ProductLicense' }+        | { __typename: 'ExternalChangeset' }+        | { __typename: 'ChangesetEvent' }+        | { __typename: 'Patch' }+        | { __typename: 'HiddenPatch' }+        | { __typename: 'HiddenExternalChangeset' }+    >+}++export type PatchSetPatchesVariables = Exact<{+    patchSet: Scalars['ID']+    first?: Maybe<Scalars['Int']>+}>++export interface PatchSetPatchesResult {+    node?: Maybe<+        | { __typename: 'Campaign' }+        | {+              __typename: 'PatchSet'+              patches: {+                  totalCount: number+                  nodes: (+                      | {+                            __typename: 'Patch'+                            publishable: boolean+                            publicationEnqueued: boolean+                            id: string+                            repository: { id: string; name: string; url: string }+                            diff: { fileDiffs: { diffStat: DiffStatFields } }+                        }+                      | { __typename: 'HiddenPatch'; id: string }+                  )[]+              }+          }+        | { __typename: 'User' }+        | { __typename: 'Org' }+        | { __typename: 'OrganizationInvitation' }+        | { __typename: 'AccessToken' }+        | { __typename: 'ExternalAccount' }+        | { __typename: 'Repository' }+        | { __typename: 'GitCommit' }+        | { __typename: 'ExternalService' }+        | { __typename: 'GitRef' }+        | { __typename: 'LSIFUpload' }+        | { __typename: 'LSIFIndex' }+        | { __typename: 'SavedSearch' }+        | { __typename: 'VersionContext' }+        | { __typename: 'RegistryExtension' }+        | { __typename: 'ProductSubscription' }+        | { __typename: 'ProductLicense' }+        | { __typename: 'ExternalChangeset' }+        | { __typename: 'ChangesetEvent' }+        | { __typename: 'Patch' }+        | { __typename: 'HiddenPatch' }+        | { __typename: 'HiddenExternalChangeset' }+    >+}++export type PublishChangesetVariables = Exact<{+    patch: Scalars['ID']+}>++export interface PublishChangesetResult {+    publishChangeset: { alwaysNil?: Maybe<string> }+}++export type SyncChangesetVariables = Exact<{+    changeset: Scalars['ID']+}>++export interface SyncChangesetResult {+    syncChangeset: { alwaysNil?: Maybe<string> }+}++export type ExternalChangesetFileDiffsVariables = Exact<{+    externalChangeset: Scalars['ID']+    first?: Maybe<Scalars['Int']>+    after?: Maybe<Scalars['String']>+    isLightTheme: Scalars['Boolean']+}>++export interface ExternalChangesetFileDiffsResult {+    node?: Maybe<+        | { __typename: 'Campaign' }+        | { __typename: 'PatchSet' }+        | { __typename: 'User' }+        | { __typename: 'Org' }+        | { __typename: 'OrganizationInvitation' }+        | { __typename: 'AccessToken' }+        | { __typename: 'ExternalAccount' }+        | { __typename: 'Repository' }+        | { __typename: 'GitCommit' }+        | { __typename: 'ExternalService' }+        | { __typename: 'GitRef' }+        | { __typename: 'LSIFUpload' }+        | { __typename: 'LSIFIndex' }+        | { __typename: 'SavedSearch' }+        | { __typename: 'VersionContext' }+        | { __typename: 'RegistryExtension' }+        | { __typename: 'ProductSubscription' }+        | { __typename: 'ProductLicense' }+        | {+              __typename: 'ExternalChangeset'+              diff?: Maybe<{+                  range: {+                      base: GitRefSpecFields_GitRef_ | GitRefSpecFields_GitRevSpecExpr_ | GitRefSpecFields_GitObject_+                      head: GitRefSpecFields_GitRef_ | GitRefSpecFields_GitRevSpecExpr_ | GitRefSpecFields_GitObject_+                  }+                  fileDiffs: {+                      totalCount?: Maybe<number>+                      nodes: FileDiffFields[]+                      pageInfo: { hasNextPage: boolean; endCursor?: Maybe<string> }+                      diffStat: DiffStatFields+                  }+              }>+          }+        | { __typename: 'ChangesetEvent' }+        | { __typename: 'Patch' }+        | { __typename: 'HiddenPatch' }+        | { __typename: 'HiddenExternalChangeset' }+    >+}++interface GitRefSpecFields_GitRef_ {

good catch, I haven't noticed it. I don't know yet, will see

twop

comment created time in 21 days

push eventsourcegraph/sourcegraph

Simon

commit sha 35619527f62094703118546b1bec266e389cc5a7

Update shared/dev/extractGraphQlOperationCodegenPlugin.js Co-authored-by: Felix Becker <felix.b@outlook.com>

view details

push time in 21 days

Pull request review commentsourcegraph/sourcegraph

migrated to using graphQL codegen + made all fragment have unique names

-/* eslint-disable @typescript-eslint/consistent-type-definitions */+import {+    CampaignState,+    BackgroundProcessState,+    OrganizationInvitationResponseType,+    EventSource,+    RepositoryPermission,+    SymbolKind,+    DiagnosticSeverity,+    ExternalServiceKind,+    GitRefType,+    GitObjectType,+    GitRefOrder,+    LSIFUploadState,+    LSIFIndexState,+    DiffHunkLineType,+    ChangesetState,+    ChangesetReviewState,+    ChangesetCheckState,+    RepositoryOrderBy,+    UserActivePeriod,+    SearchVersion,+    SearchPatternType,+    AlertType,+    UserEvent,+} from './graphql/schema'++export type Maybe<T> = T | null

not as far I can tell

twop

comment created time in 21 days

push eventsourcegraph/sourcegraph

Simon

commit sha 4e3a3d30e4abdbd3bf7ef18dfccbf52ef9b554a9

minor improvements from PR comments

view details

push time in 21 days

Pull request review commentsourcegraph/sourcegraph

migrated to using graphQL codegen + made all fragment have unique names

     "all:stylelint": "yarn --cwd web run stylelint && yarn --cwd shared run stylelint && yarn --cwd browser run stylelint",     "all:tsgql": "yarn --cwd web run tsgql validate -p . --exitOnWarn && yarn --cwd shared run tsgql validate -p . --exitOnWarn && yarn --cwd browser run tsgql validate -p . --exitOnWarn",     "build-ts": "tsc -b .",+    "extract-graphql-operations": "graphql-codegen --config codegen.yml",

Programmatic usage is more flexible but way less declarative and there are more things to wire up manually (prettier, linters, building schema etc).

So if possible I would love to avoid doing so.

twop

comment created time in 21 days

Pull request review commentsourcegraph/sourcegraph

Add integration tests for spaces in paths

 describe('Repository', () => {             await driver.page.waitForSelector('.git-commit-node__message-subject')             await assertSelectorHasText('.git-commit-node__message-subject', 'update LSIF indexing CI workflow')         })++        it('works with files with spaces in the name', async () => {+            const fileName = '% token.4288249258.sql'+            const directoryName = "Geoffrey's random queries.32r242442bf"+            const filePath = path.posix.join(directoryName, fileName)++            testContext.overrideGraphQL({+                ...commonWebGraphQlResults,+                RepositoryRedirect: ({ repoName }) => createRepositoryRedirectResult(repoName),+                ResolveRev: ({ repoName }) => createResolveRevisionResult(repoName),+                FileExternalLinks: ({ filePath, repoName, revision }) =>+                    createFileExternalLinksResult(+                        `https://${repoName}/blob/${revision}/${filePath.split('/').map(encodeURIComponent).join('/')}`+                    ),+                TreeEntries: () => ({+                    repository: {+                        commit: {+                            tree: {+                                isRoot: false,+                                url: '/github.com/ggilmore/q-test/-/tree/Geoffrey%27s%20random%20queries.32r242442bf',+                                entries: [+                                    {+                                        name: fileName,+                                        path: filePath,+                                        isDirectory: false,+                                        url:+                                            '/github.com/ggilmore/q-test/-/blob/Geoffrey%27s%20random%20queries.32r242442bf/%25%20token.4288249258.sql',+                                        submodule: null,+                                        isSingleChild: false,+                                    },+                                ],+                            },+                        },+                    },+                }),+                TreeCommits: () => ({+                    node: {+                        __typename: 'Repository',+                        commit: { ancestors: { nodes: [], pageInfo: { hasNextPage: false } } },+                    },+                }),+                Blob: ({ filePath }) => createBlobContentResult(`content for: ${filePath}`),+            })++            await driver.page.goto(+                `${driver.sourcegraphBaseUrl}/github.com/ggilmore/q-test/-/tree/Geoffrey's%20random%20queries.32r242442bf`+            )+            await driver.page.waitForSelector('.test-tree-file-link')+            assert.strictEqual(+                await driver.page.evaluate(() => document.querySelector('.test-tree-file-link')?.textContent),+                fileName+            )++            await driver.page.click('.test-tree-file-link')+            await driver.page.waitForSelector('.test-repo-blob')++            assert.strictEqual(+                await driver.page.evaluate(() => document.querySelector('.breadcrumb .part-directory')?.textContent),

Maybe add a comment explaining why .breadcrumb .part-directory are safe to use in a test context?

felixfbecker

comment created time in 21 days

Pull request review commentsourcegraph/sourcegraph

migrated to using graphQL codegen + made all fragment have unique names

+// @ts-check++const { visit } = require('graphql');+const path = require('path');++const ROOT_FOLDER = path.join(__dirname, '../../')+/**+ *+ * @param {import('graphql').GraphQLSchema} schema+ * @param {import('@graphql-codegen/plugin-helpers').Types.DocumentFile[]} documents+ * @param {{interfaceNameForOperations?: string}} config+ */+const plugin = (schema, documents, config) => {+  const { interfaceNameForOperations = 'AllOperations' } = config;++  /** @type {{name: string, location?: string}[]} */+  const allOperations = [];++  for (const item of documents) {+    if (item.document) {+      visit(item.document, {+        enter: {+          OperationDefinition: node => {+            if (node.name && node.name.value) {+              allOperations.push({+                name: node.name.value,+                location: item.location && path.relative(ROOT_FOLDER, item.location),+              });+            }+          },+        },+      });+    }+  }++  const interfaceFields = allOperations.map(+    ({ name, location }) => `+/** ${location || 'location not found'}*/+${name}: (variables: ${name}Variables) => ${name}Result;+`+  );+  if (interfaceFields.length === 0) {+    console.warn('No operations found');+    // TODO maybe throw an error?

at this point we don't have a context of an operation because it is an aggregate result across all of them, but I will add the desired interface name in here

twop

comment created time in 21 days

Pull request review commentsourcegraph/sourcegraph

migrated to using graphQL codegen + made all fragment have unique names

     "all:stylelint": "yarn --cwd web run stylelint && yarn --cwd shared run stylelint && yarn --cwd browser run stylelint",     "all:tsgql": "yarn --cwd web run tsgql validate -p . --exitOnWarn && yarn --cwd shared run tsgql validate -p . --exitOnWarn && yarn --cwd browser run tsgql validate -p . --exitOnWarn",     "build-ts": "tsc -b .",+    "extract-graphql-operations": "graphql-codegen --config codegen.yml",

One challenge with that is that we want to have a compile time break when we change something inside gql tagged literal in integration tests. I feel like checking them in is a better approach

twop

comment created time in 21 days

Pull request review commentsourcegraph/sourcegraph

migrated to using graphQL codegen + made all fragment have unique names

     "all:stylelint": "yarn --cwd web run stylelint && yarn --cwd shared run stylelint && yarn --cwd browser run stylelint",     "all:tsgql": "yarn --cwd web run tsgql validate -p . --exitOnWarn && yarn --cwd shared run tsgql validate -p . --exitOnWarn && yarn --cwd browser run tsgql validate -p . --exitOnWarn",     "build-ts": "tsc -b .",+    "extract-graphql-operations": "graphql-codegen --config codegen.yml",

Nothing yet, looking for an advice how to do that.

context why I haven't yet. But I think as a part of this PR we need to hook it up at least into build

not done (not sure if it should be): didn't integrate into build and watch commands. running eslint on generated files takes ridiculous amount of time, not sure what is the best option here

twop

comment created time in 21 days

Pull request review commentsourcegraph/sourcegraph

migrated to using graphQL codegen + made all fragment have unique names

-/* eslint-disable @typescript-eslint/consistent-type-definitions */-/* This is an autogenerated file. Do not edit this file directly! */

yes, will do

twop

comment created time in 21 days

Pull request review commentsourcegraph/sourcegraph

migrated to using graphQL codegen + made all fragment have unique names

+overwrite: true+schema: './cmd/frontend/graphqlbackend/schema.graphql'+hooks:+  afterAllFileWrite:+    - eslint --fix

eslint takes insane amount of time

twop

comment created time in 22 days

PR opened sourcegraph/sourcegraph

Reviewers
migrated to using graphQL codegen + made all fragment have unique names
  • killed our custom craft based on ts-graphql-plugin with fire
  • added codegen of graphQL operations via GraphQL code generator
  • made all fragments have unique names
  • inlined "fragment" that caused issue for parsing
  • wrote custom plugin for GraphQL code generator
  • replaced old generation with it
  • fixed a type error in one of the tests

run all integration tests, everything passes and typechecks

closed: https://github.com/sourcegraph/sourcegraph/issues/12177

+5165 -5801

0 comment

18 changed files

pr created time in 22 days

create barnchsourcegraph/sourcegraph

branch : twop/better-gql-op-codegen

created branch time in 22 days

issue commentsourcegraph/sourcegraph

Replace forked ts-graphql-plugin-based type query generator

today, hopefully

felixfbecker

comment created time in 22 days

issue commentsourcegraph/sourcegraph

Replace forked ts-graphql-plugin-based type query generator

Ok I made a plugin that generates our interface thing. The best part that this is pretty much it:

import { Types, PluginFunction } from '@graphql-codegen/plugin-helpers';
import { GraphQLSchema, concatAST, visit } from 'graphql';
import { capitalCase } from 'change-case';

type Operation = {
  type: 'query' | 'mutation' | 'subscription';
  name: string;
};

export const plugin: PluginFunction<{}, string> = (
  schema: GraphQLSchema,
  documents: Types.DocumentFile[],
  config: {}
) => {
  // const identifierName = config.identifierName || 'namedOperations';
  const allAst = concatAST(documents.map(v => v.document));
  const allOperations: Operation[] = [];

  visit(allAst, {
    enter: {
      OperationDefinition: node => {
        if (node.name?.value) {
          allOperations.push({ type: node.operation, name: node.name.value });
        }
      },
    },
  });

  const interfaceFields = allOperations.map(({ type, name }) => {
    const fullname = `${capitalCase(name, { delimiter: '' })}${capitalCase(
      type
    )}`;
    return `${name}: (variables: ${fullname}Variables) => ${fullname};`;
  });

  if (interfaceFields.length === 0) {
    // eslint-disable-next-line no-console
    console.warn(
      `Plugin "named-operations-object" has an empty output, since there are no valid operations!`
    );

    return '';
  }

  return `export interface AllOperations {
${interfaceFields.join('\n')}
}`;
};

It outputs this code:

export interface AllOperations {
findUserA: (variables: FindUserAQueryVariables) => FindUserAQuery;
findUserC: (variables: FindUserCQueryVariables) => FindUserCQuery;
}

So yeah, super happy with it so far.

felixfbecker

comment created time in 23 days

issue commentsourcegraph/sourcegraph

Replace forked ts-graphql-plugin-based type query generator

copy pasting === inlining, which is our workaround today. We cannot use fragments but a normal query is OK. @eseliger is that true?

felixfbecker

comment created time in 23 days

issue commentsourcegraph/sourcegraph

Replace forked ts-graphql-plugin-based type query generator

Upd:

  1. custom gql tag works with no extra configuration (our usecase)
  2. Confirmed that string concatenation breaks the tooling
// Not using "graphql-tag"
import { gql } from './gql';

const SharedUser = `
    id
    username
`;
// const SharedUser = gql`
//   fragment SharedUser on User {
//     id
//     username
//   }
// `;

export const QueryB = gql`
  query findUserB($userId: ID!) {
      user(id: $userId){
        ${SharedUser}
      }
  }
`;

Error output

    GraphQLError: Syntax Error: Expected Name, found "}".
        at syntaxError (/Users/twop.sk/work/gql-stub/node_modules/graphql/error/syntaxError.js:15:10)
        at Parser.expectToken (/Users/twop.sk/work/gql-stub/node_modules/graphql/language/parser.js:1423:40)
        at Parser.parseName (/Users/twop.sk/work/gql-stub/node_modules/graphql/language/parser.js:92:22)
        at Parser.parseField (/Users/twop.sk/work/gql-stub/node_modules/graphql/language/parser.js:289:28)
        at Parser.parseSelection (/Users/twop.sk/work/gql-stub/node_modules/graphql/language/parser.js:278:81)
        at Parser.many (/Users/twop.sk/work/gql-stub/node_modules/graphql/language/parser.js:1537:26)
        at Parser.parseSelectionSet (/Users/twop.sk/work/gql-stub/node_modules/graphql/language/parser.js:265:24)
        at Parser.parseField (/Users/twop.sk/work/gql-stub/node_modules/graphql/language/parser.js:306:68)
        at Parser.parseSelection (/Users/twop.sk/work/gql-stub/node_modules/graphql/language/parser.js:278:81)
        at Parser.many (/Users/twop.sk/work/gql-stub/node_modules/graphql/language/parser.js:1537:26)
        at Parser.parseSelectionSet (/Users/twop.sk/work/gql-stub/node_modules/graphql/language/parser.js:265:24)
        at Parser.parseOperationDefinition (/Users/twop.sk/work/gql-stub/node_modules/graphql/language/parser.js:193:26)
        at Parser.parseDefinition (/Users/twop.sk/work/gql-stub/node_modules/graphql/language/parser.js:131:23)
        at Parser.many (/Users/twop.sk/work/gql-stub/node_modules/graphql/language/parser.js:1537:26)
        at Parser.parseDocument (/Users/twop.sk/work/gql-stub/node_modules/graphql/language/parser.js:109:25)
        at Object.parse (/Users/twop.sk/work/gql-stub/node_modules/graphql/language/parser.js:36:17)

So I think it might make sense just to copypaste the shared fragment with a comment "copied because of X", not ideal but probably not as critical.

felixfbecker

comment created time in 23 days

issue commentsourcegraph/sourcegraph

Replace forked ts-graphql-plugin-based type query generator

Good news on Fragments reuse

this code works:

import gql from 'graphql-tag';

const SharedUser = gql`
  fragment SharedUser on User {
    id
    username
  }
`;

export const QueryA = gql`
  query findUserA($userId: ID!) {
    user(id: $userId) {
      ...SharedUser
    }
    ${SharedUser}
  }
`;

const SharedUserDup = gql`
  fragment SharedUser on User {
    id
    username
  }
`;

export const QueryB = gql`
  query findUserB($userId: ID!) {
    user(id: $userId) {
      ...SharedUser
    }
    ${SharedUserDup}
  }
`;

But changing it too

const SharedUserDup = gql`
  fragment SharedUser on User {
    id
    username
    someOtherField <-----
  }
`;

will result in an error.

It seems that the tooling checks structural equality vs picking just declarations from code, which is awesome!

So as long as unique names represent different structures we are free to organize code however we want :)

felixfbecker

comment created time in 23 days

Pull request review commentsourcegraph/sourcegraph

Increase contrast of placeholders to meet WCAG

     --input-disabled-bg: #2b3750;     --input-border-color: #2b3750;     --input-color: #f2f4f8;-    --input-placeholder-color: rgba(#f2f4f8, 0.5);+    --input-placeholder-color: rgba($color-text, 0.7);

does it make sense to make 0.7 as a constant too? Or there is no expectation of reusing it?

felixfbecker

comment created time in 23 days

issue commentsourcegraph/sourcegraph

Replace forked ts-graphql-plugin-based type query generator

WIP research results

The good: GraphQL code generator can potentially do 90% of what we need today for integration tests specifically It can also replace our current codegen gql2ts because It has watch mode writing our own plugin to generate a big interface for gql operations seems doable It has graphql-tag-pluck built in

The not so good: graphql-tag-pluck has several issues with our current code base and I don’t know the scope of the problems yet. One of them: https://sourcegraph.com/github.com/sourcegraph/sourcegraph@870221e07c86de5e67d3900a804ce6547b595fd3/-/blob/web/src/search/backend.tsx#L16:7 it requires unique fragment names. I’m not sure yet if it^ implies that we cannot reuse fragments across queries.

Summary so far: It seems like the right tool for the job I will continue to invest time to make it work

felixfbecker

comment created time in 24 days

Pull request review commentsourcegraph/code-intel-extensions

Fix "Invalid array length" bug with spread of set values

 function sortByProximity(locations: sourcegraph.Location[], currentURI: URL): so function jaccardIndex<T>(a: Set<T>, b: Set<T>): number {     return (         // Get the size of the intersection-        new Set([...[...a]].filter(value => b.has(value))).size /

Now I'm really curios why it was the way it was and what made it go away? Tanspiling?

efritz

comment created time in 24 days

push eventsourcegraph/sourcegraph

Simon

commit sha 6ab5679dc34fb3beb727f57f86f20f9353076b96

minor test improvements related to PR feedback (#12174) * minor test improvements related to PR feedback * Update web/src/integration/blob-viewer.test.ts Co-authored-by: Felix Becker <felix.b@outlook.com> * Update web/src/integration/blob-viewer.test.ts Co-authored-by: Felix Becker <felix.b@outlook.com> Co-authored-by: Felix Becker <felix.b@outlook.com>

view details

push time in 24 days

delete branch sourcegraph/sourcegraph

delete branch : twop/minor-test-improvements

delete time in 24 days

PR merged sourcegraph/sourcegraph

minor test improvements related to PR feedback

Addressed feedback from @felixfbecker in https://github.com/sourcegraph/sourcegraph/pull/12135

+48 -37

2 comments

4 changed files

twop

pr closed time in 24 days

Pull request review commentsourcegraph/sourcegraph

minor test improvements related to PR feedback

 describe('Blob viewer', () => {     afterEach(() => testContext?.dispose())      describe('tests a general layout for viewing a file', () => {-        test('it populates editor content and FILES tab', async () => {-            const repositoryName = 'github.com/sourcegraph/jsonrpc2'-            const repositorySourcegraphUrl = `/${repositoryName}`-            const fileName = 'async.go'+        const repositoryName = 'github.com/sourcegraph/jsonrpc2'+        const repositorySourcegraphUrl = `/${repositoryName}`+        const fileName = 'async.go'+        const files = ['README.md', fileName] +        const prepareTwoFilesStubs = () =>

I try to avoid beforeEach as much as possible, I think creating a testContext is a good usecase for it but here I'm not sure how to organize it to be honest.

twop

comment created time in 24 days

push eventsourcegraph/sourcegraph

Simon

commit sha a9b41f2c7840bd046493c2a885b64394a8b03605

Update web/src/integration/blob-viewer.test.ts Co-authored-by: Felix Becker <felix.b@outlook.com>

view details

push time in 24 days

push eventsourcegraph/sourcegraph

Simon

commit sha d79ac427a6ad8320f7761c45745daaf5b5b9eeb8

Update web/src/integration/blob-viewer.test.ts Co-authored-by: Felix Becker <felix.b@outlook.com>

view details

push time in 24 days

PR opened sourcegraph/sourcegraph

minor test improvements related to PR feedback

Addressed feedback from @felixfbecker in https://github.com/sourcegraph/sourcegraph/pull/12135

+48 -36

0 comment

4 changed files

pr created time in 24 days

create barnchsourcegraph/sourcegraph

branch : twop/minor-test-improvements

created branch time in 24 days

Pull request review commentsourcegraph/sourcegraph

added gql response helpers for integration tests and started blob-viewer integration tests

+import assert from 'assert'+import { commonWebGraphQlResults } from './graphQlResults'+import { Driver, createDriverForTest } from '../../../shared/src/testing/driver'+import { WebIntegrationTestContext, createWebIntegrationTestContext } from './context'+import { test } from 'mocha'+import {+    makeRepositoryRedirectResult,+    makeResolveRevisionResult,+    makeFileExternalLinksResult,+    makeTreeEntriesResult,+    makeBlobContentResult,+} from './graphQlResponseHelpers'++describe('Blob viewer', () => {+    let driver: Driver+    before(async () => {+        driver = await createDriverForTest()+    })+    after(() => driver?.close())+    let testContext: WebIntegrationTestContext+    beforeEach(async function () {+        testContext = await createWebIntegrationTestContext({+            driver,+            currentTest: this.currentTest!,+            directory: __dirname,+        })+    })+    afterEach(() => testContext?.dispose())++    describe('tests a general layout for viewing a file', () => {+        test('it populates editor content and FILES tab', async () => {+            const repositoryName = 'github.com/sourcegraph/jsonrpc2'+            const repositorySourcegraphUrl = `/${repositoryName}`+            const fileName = 'async.go'++            testContext.overrideGraphQL({+                ...commonWebGraphQlResults,+                RepositoryRedirect: ({ repoName }) => makeRepositoryRedirectResult(repoName),++                ResolveRev: () => makeResolveRevisionResult(repositorySourcegraphUrl),++                FileExternalLinks: ({ filePath }) =>+                    makeFileExternalLinksResult(`https://${repositoryName}/blob/master/${filePath}`),++                TreeEntries: () => makeTreeEntriesResult(repositorySourcegraphUrl, ['README.md', fileName]),++                Blob: ({ filePath }) => makeBlobContentResult(`content for: ${filePath}`),+            })++            await driver.page.goto(`${driver.sourcegraphBaseUrl}/${repositoryName}/-/blob/${fileName}`)+            await driver.page.waitForSelector('.e2e-repo-blob')+            const blobContent = await driver.page.evaluate(() => {+                const editorArea = document.querySelector<HTMLDivElement>('.e2e-repo-blob')+                document.querySelector('a')+                return editorArea ? editorArea.textContent : null+            })++            // editor shows the return string content from Blob request+            assert.strictEqual(blobContent, `content for: ${fileName}`)++            // collect all files/links visible the the FILES tab

don't know how it applies to integration tests though, there is more ceremony involved to set up stuff. I actually even wanted to add a click in the left panel to show a different file

twop

comment created time in 24 days

Pull request review commentsourcegraph/sourcegraph

added gql response helpers for integration tests and started blob-viewer integration tests

+import assert from 'assert'+import { commonWebGraphQlResults } from './graphQlResults'+import { Driver, createDriverForTest } from '../../../shared/src/testing/driver'+import { WebIntegrationTestContext, createWebIntegrationTestContext } from './context'+import { test } from 'mocha'+import {+    makeRepositoryRedirectResult,+    makeResolveRevisionResult,+    makeFileExternalLinksResult,+    makeTreeEntriesResult,+    makeBlobContentResult,+} from './graphQlResponseHelpers'++describe('Blob viewer', () => {+    let driver: Driver+    before(async () => {+        driver = await createDriverForTest()+    })+    after(() => driver?.close())+    let testContext: WebIntegrationTestContext+    beforeEach(async function () {+        testContext = await createWebIntegrationTestContext({+            driver,+            currentTest: this.currentTest!,+            directory: __dirname,+        })+    })+    afterEach(() => testContext?.dispose())++    describe('tests a general layout for viewing a file', () => {+        test('it populates editor content and FILES tab', async () => {+            const repositoryName = 'github.com/sourcegraph/jsonrpc2'+            const repositorySourcegraphUrl = `/${repositoryName}`+            const fileName = 'async.go'++            testContext.overrideGraphQL({+                ...commonWebGraphQlResults,+                RepositoryRedirect: ({ repoName }) => makeRepositoryRedirectResult(repoName),++                ResolveRev: () => makeResolveRevisionResult(repositorySourcegraphUrl),++                FileExternalLinks: ({ filePath }) =>+                    makeFileExternalLinksResult(`https://${repositoryName}/blob/master/${filePath}`),++                TreeEntries: () => makeTreeEntriesResult(repositorySourcegraphUrl, ['README.md', fileName]),++                Blob: ({ filePath }) => makeBlobContentResult(`content for: ${filePath}`),+            })++            await driver.page.goto(`${driver.sourcegraphBaseUrl}/${repositoryName}/-/blob/${fileName}`)+            await driver.page.waitForSelector('.e2e-repo-blob')+            const blobContent = await driver.page.evaluate(() => {+                const editorArea = document.querySelector<HTMLDivElement>('.e2e-repo-blob')+                document.querySelector('a')

debug leftover

twop

comment created time in 24 days

Pull request review commentsourcegraph/sourcegraph

added gql response helpers for integration tests and started blob-viewer integration tests

+import assert from 'assert'+import { commonWebGraphQlResults } from './graphQlResults'+import { Driver, createDriverForTest } from '../../../shared/src/testing/driver'+import { WebIntegrationTestContext, createWebIntegrationTestContext } from './context'+import { test } from 'mocha'+import {+    makeRepositoryRedirectResult,+    makeResolveRevisionResult,+    makeFileExternalLinksResult,+    makeTreeEntriesResult,+    makeBlobContentResult,+} from './graphQlResponseHelpers'++describe('Blob viewer', () => {+    let driver: Driver+    before(async () => {+        driver = await createDriverForTest()+    })+    after(() => driver?.close())+    let testContext: WebIntegrationTestContext+    beforeEach(async function () {+        testContext = await createWebIntegrationTestContext({+            driver,+            currentTest: this.currentTest!,+            directory: __dirname,+        })+    })+    afterEach(() => testContext?.dispose())++    describe('tests a general layout for viewing a file', () => {+        test('it populates editor content and FILES tab', async () => {

I copied tests from search -> "test" instead of "it", thanks for the reminder

twop

comment created time in 24 days

Pull request review commentsourcegraph/sourcegraph

added gql response helpers for integration tests and started blob-viewer integration tests

+import {+    TreeEntriesResult,+    BlobResult,+    FileExternalLinksResult,+    RepositoryRedirectResult,+    ResolveRevResult,+} from '../graphql-operations'++export const makeTreeEntriesResult = (url: string, toplevelFiles: string[]): TreeEntriesResult => ({

in this case it was intentional, I tried "create" but it looked too familiar to have a visual separation, thus I felt adventurous and wanted to try a different naming. Please let me know if you think we should stick with "create", I don't have a strong preference here.

twop

comment created time in 24 days

Pull request review commentsourcegraph/sourcegraph

Add integration tests

+import assert from 'assert'+import { createDriverForTest, Driver } from '../../../shared/src/testing/driver'+import { commonWebGraphQlResults } from './graphQlResults'+import { createWebIntegrationTestContext, WebIntegrationTestContext } from './context'+import {+    makeRepositoryRedirectResult,+    makeResolveRevisionResult,+    makeFileExternalLinksResult,+    makeTreeEntriesResult,+    makeBlobContentResult,+} from './graphQlResponseHelpers'++describe('Repository', () => {+    let driver: Driver+    before(async () => {+        driver = await createDriverForTest()+    })+    after(() => driver?.close())+    let testContext: WebIntegrationTestContext+    beforeEach(async function () {+        testContext = await createWebIntegrationTestContext({+            driver,+            currentTest: this.currentTest!,+            directory: __dirname,+        })+    })+    afterEach(() => testContext?.dispose())++    async function assertSelectorHasText(selector: string, text: string) {+        assert.strictEqual(+            await driver.page.evaluate(+                selector => document.querySelector<HTMLButtonElement>(selector)?.textContent,+                selector+            ),+            text+        )+    }++    describe('index page', () => {+        it('loads when accessed with a repo url', async () => {+            const shortRepositoryName = 'sourcegraph/jsonrpc2'+            const repositoryName = `github.com/${shortRepositoryName}`+            const repositorySourcegraphUrl = `/${repositoryName}`+            const clickedFileName = 'async.go'+            const clickedCommit = ''+            const fileEntries = ['jsonrpc2.go', clickedFileName]++            testContext.overrideGraphQL({+                ...commonWebGraphQlResults,+                RepositoryRedirect: ({ repoName }) => makeRepositoryRedirectResult(repoName),+                ResolveRev: () => makeResolveRevisionResult(repositorySourcegraphUrl),+                FileExternalLinks: ({ filePath }) => makeFileExternalLinksResult(filePath),+                TreeEntries: () => makeTreeEntriesResult(repositorySourcegraphUrl, fileEntries),+                Blob: () => makeBlobContentResult('mock file blob'),+                TreeCommits: () => ({+                    node: {+                        __typename: 'Repository',+                        commit: {+                            ancestors: {+                                nodes: [+                                    {+                                        id:+                                            'R2l0Q29tbWl0OnsiciI6IlVtVndiM05wZEc5eWVUbzBNRGsxTXpnPSIsImMiOiIxNWMyMjkwZGNiMzc3MzFjYzRlZTVhMmExYzFlNWEyNWI0YzI4ZjgxIn0=',+                                        oid: '15c2290dcb37731cc4ee5a2a1c1e5a25b4c28f81',+                                        abbreviatedOID: '15c2290',+                                        message: 'update LSIF indexing CI workflow\n',+                                        subject: 'update LSIF indexing CI workflow',+                                        body: null,+                                        author: {+                                            person: {+                                                avatarURL: '',+                                                name: 'garo (they/them)',+                                                email: 'gbrik@users.noreply.github.com',+                                                displayName: 'garo (they/them)',+                                                user: null,+                                            },+                                            date: '2020-04-29T18:40:54Z',+                                        },+                                        committer: {+                                            person: {+                                                avatarURL: '',+                                                name: 'GitHub',+                                                email: 'noreply@github.com',+                                                displayName: 'GitHub',+                                                user: null,+                                            },+                                            date: '2020-04-29T18:40:54Z',+                                        },+                                        parents: [+                                            {+                                                oid: '96c4efab7ee28f3d1cf1d248a0139cea37368b18',+                                                abbreviatedOID: '96c4efa',+                                                url:+                                                    '/github.com/sourcegraph/jsonrpc2/-/commit/96c4efab7ee28f3d1cf1d248a0139cea37368b18',+                                            },+                                            {+                                                oid: '9e615b1c32cc519130575e8d10d0d0fee8a5eb6c',+                                                abbreviatedOID: '9e615b1',+                                                url:+                                                    '/github.com/sourcegraph/jsonrpc2/-/commit/9e615b1c32cc519130575e8d10d0d0fee8a5eb6c',+                                            },+                                        ],+                                        url:+                                            '/github.com/sourcegraph/jsonrpc2/-/commit/15c2290dcb37731cc4ee5a2a1c1e5a25b4c28f81',+                                        canonicalURL:+                                            '/github.com/sourcegraph/jsonrpc2/-/commit/15c2290dcb37731cc4ee5a2a1c1e5a25b4c28f81',+                                        externalURLs: [+                                            {+                                                url:+                                                    'https://github.com/sourcegraph/jsonrpc2/commit/15c2290dcb37731cc4ee5a2a1c1e5a25b4c28f81',+                                                serviceType: 'github',+                                            },+                                        ],+                                        tree: {+                                            canonicalURL:+                                                '/github.com/sourcegraph/jsonrpc2@15c2290dcb37731cc4ee5a2a1c1e5a25b4c28f81',+                                        },+                                    },+                                    {+                                        id:+                                            'R2l0Q29tbWl0OnsiciI6IlVtVndiM05wZEc5eWVUbzBNRGsxTXpnPSIsImMiOiI5ZTYxNWIxYzMyY2M1MTkxMzA1NzVlOGQxMGQwZDBmZWU4YTVlYjZjIn0=',+                                        oid: '9e615b1c32cc519130575e8d10d0d0fee8a5eb6c',+                                        abbreviatedOID: '9e615b1',+                                        message: 'LSIF Indexing Campaign',+                                        subject: 'LSIF Indexing Campaign',+                                        body: null,+                                        author: {+                                            person: {+                                                avatarURL: '',+                                                name: 'Sourcegraph Bot',+                                                email: 'campaigns@sourcegraph.com',+                                                displayName: 'Sourcegraph Bot',+                                                user: null,+                                            },+                                            date: '2020-04-29T16:57:20Z',+                                        },+                                        committer: {+                                            person: {+                                                avatarURL: '',+                                                name: 'Sourcegraph Bot',+                                                email: 'campaigns@sourcegraph.com',+                                                displayName: 'Sourcegraph Bot',+                                                user: null,+                                            },+                                            date: '2020-04-29T16:57:20Z',+                                        },+                                        parents: [+                                            {+                                                oid: '96c4efab7ee28f3d1cf1d248a0139cea37368b18',+                                                abbreviatedOID: '96c4efa',+                                                url:+                                                    '/github.com/sourcegraph/jsonrpc2/-/commit/96c4efab7ee28f3d1cf1d248a0139cea37368b18',+                                            },+                                        ],+                                        url:+                                            '/github.com/sourcegraph/jsonrpc2/-/commit/9e615b1c32cc519130575e8d10d0d0fee8a5eb6c',+                                        canonicalURL:+                                            '/github.com/sourcegraph/jsonrpc2/-/commit/9e615b1c32cc519130575e8d10d0d0fee8a5eb6c',+                                        externalURLs: [+                                            {+                                                url:+                                                    'https://github.com/sourcegraph/jsonrpc2/commit/9e615b1c32cc519130575e8d10d0d0fee8a5eb6c',+                                                serviceType: 'github',+                                            },+                                        ],+                                        tree: {+                                            canonicalURL:+                                                '/github.com/sourcegraph/jsonrpc2@9e615b1c32cc519130575e8d10d0d0fee8a5eb6c',+                                        },+                                    },+                                    {+                                        id:+                                            'R2l0Q29tbWl0OnsiciI6IlVtVndiM05wZEc5eWVUbzBNRGsxTXpnPSIsImMiOiI5NmM0ZWZhYjdlZTI4ZjNkMWNmMWQyNDhhMDEzOWNlYTM3MzY4YjE4In0=',+                                        oid: '96c4efab7ee28f3d1cf1d248a0139cea37368b18',+                                        abbreviatedOID: '96c4efa',+                                        message:+                                            'Produce LSIF data for each commit for fast/precise code nav (#35)\n\n* Produce LSIF data for each commit for fast/precise code nav\r\n\r\n* Update lsif.yml\r',+                                        subject: 'Produce LSIF data for each commit for fast/precise code nav (#35)',+                                        body:+                                            '* Produce LSIF data for each commit for fast/precise code nav\r\n\r\n* Update lsif.yml',+                                        author: {+                                            person: {+                                                avatarURL: 'https://avatars0.githubusercontent.com/u/1976?v=4',+                                                name: 'Quinn Slack',+                                                email: 'qslack@qslack.com',+                                                displayName: 'Quinn Slack',+                                                user: { id: 'VXNlcjo2', username: 'sqs', url: '/users/sqs' },+                                            },+                                            date: '2019-12-22T04:34:38Z',+                                        },+                                        committer: {+                                            person: {+                                                avatarURL: '',+                                                name: 'GitHub',+                                                email: 'noreply@github.com',+                                                displayName: 'GitHub',+                                                user: null,+                                            },+                                            date: '2019-12-22T04:34:38Z',+                                        },+                                        parents: [+                                            {+                                                oid: 'cee7209801bf50cee868f8e0696ba0b76ae21792',+                                                abbreviatedOID: 'cee7209',+                                                url:+                                                    '/github.com/sourcegraph/jsonrpc2/-/commit/cee7209801bf50cee868f8e0696ba0b76ae21792',+                                            },+                                        ],+                                        url:+                                            '/github.com/sourcegraph/jsonrpc2/-/commit/96c4efab7ee28f3d1cf1d248a0139cea37368b18',+                                        canonicalURL:+                                            '/github.com/sourcegraph/jsonrpc2/-/commit/96c4efab7ee28f3d1cf1d248a0139cea37368b18',+                                        externalURLs: [+                                            {+                                                url:+                                                    'https://github.com/sourcegraph/jsonrpc2/commit/96c4efab7ee28f3d1cf1d248a0139cea37368b18',+                                                serviceType: 'github',+                                            },+                                        ],+                                        tree: {+                                            canonicalURL:+                                                '/github.com/sourcegraph/jsonrpc2@96c4efab7ee28f3d1cf1d248a0139cea37368b18',+                                        },+                                    },+                                ],+                                pageInfo: { hasNextPage: true },+                            },+                        },+                    },+                }),+                RepositoryCommit: () => ({+                    node: {+                        commit: {+                            __typename: 'GitCommit',+                            id:+                                'R2l0Q29tbWl0OnsiciI6IlVtVndiM05wZEc5eWVUbzBNRGsxTXpnPSIsImMiOiIxNWMyMjkwZGNiMzc3MzFjYzRlZTVhMmExYzFlNWEyNWI0YzI4ZjgxIn0=',+                            oid: '15c2290dcb37731cc4ee5a2a1c1e5a25b4c28f81',+                            abbreviatedOID: '15c2290',+                            message: 'update LSIF indexing CI workflow\n',+                            subject: 'update LSIF indexing CI workflow',+                            body: null,+                            author: {+                                person: {+                                    avatarURL: '',+                                    name: 'garo (they/them)',+                                    email: 'gbrik@users.noreply.github.com',+                                    displayName: 'garo (they/them)',+                                    user: null,+                                },+                                date: '2020-04-29T18:40:54Z',+                            },+                            committer: {+                                person: {+                                    avatarURL: '',+                                    name: 'GitHub',+                                    email: 'noreply@github.com',+                                    displayName: 'GitHub',+                                    user: null,+                                },+                                date: '2020-04-29T18:40:54Z',+                            },+                            parents: [+                                {+                                    oid: '96c4efab7ee28f3d1cf1d248a0139cea37368b18',+                                    abbreviatedOID: '96c4efa',+                                    url:+                                        '/github.com/sourcegraph/jsonrpc2/-/commit/96c4efab7ee28f3d1cf1d248a0139cea37368b18',+                                },+                                {+                                    oid: '9e615b1c32cc519130575e8d10d0d0fee8a5eb6c',+                                    abbreviatedOID: '9e615b1',+                                    url:+                                        '/github.com/sourcegraph/jsonrpc2/-/commit/9e615b1c32cc519130575e8d10d0d0fee8a5eb6c',+                                },+                            ],+                            url: '/github.com/sourcegraph/jsonrpc2/-/commit/15c2290dcb37731cc4ee5a2a1c1e5a25b4c28f81',+                            canonicalURL:+                                '/github.com/sourcegraph/jsonrpc2/-/commit/15c2290dcb37731cc4ee5a2a1c1e5a25b4c28f81',+                            externalURLs: [+                                {+                                    url:+                                        'https://github.com/sourcegraph/jsonrpc2/commit/15c2290dcb37731cc4ee5a2a1c1e5a25b4c28f81',+                                    serviceType: 'github',+                                },+                            ],+                            tree: {+                                canonicalURL:+                                    '/github.com/sourcegraph/jsonrpc2@15c2290dcb37731cc4ee5a2a1c1e5a25b4c28f81',+                            },+                        },+                    },+                }),+                RepositoryComparisonDiff: () => ({+                    node: {+                        comparison: {+                            fileDiffs: {+                                nodes: [+                                    {+                                        __typename: 'FileDiff',+                                        oldPath: '.github/workflows/lsif.yml',+                                        oldFile: { __typename: 'GitBlob', binary: false, byteSize: 381 },+                                        newFile: { __typename: 'GitBlob', binary: false, byteSize: 304 },+                                        newPath: '.github/workflows/lsif.yml',+                                        mostRelevantFile: {+                                            __typename: 'GitBlob',+                                            url:+                                                '/github.com/sourcegraph/jsonrpc2@15c2290dcb37731cc4ee5a2a1c1e5a25b4c28f81/-/blob/.github/workflows/lsif.yml',+                                        },+                                        hunks: [+                                            {+                                                oldRange: { startLine: 2, lines: 15 },+                                                oldNoNewlineAt: false,+                                                newRange: { startLine: 2, lines: 12 },+                                                section: 'name: LSIF',+                                                highlight: {+                                                    aborted: false,+                                                    lines: [+                                                        {+                                                            kind: 'DELETED',+                                                            html:+                                                                '<div><span style="color:#657b83;">  </span><span style="color:#268bd2;">build</span><span style="color:#657b83;">:\n</span></div>',+                                                        },+                                                        {+                                                            kind: 'ADDED',+                                                            html:+                                                                '<div><span style="color:#657b83;">  </span><span style="color:#268bd2;">lsif-go</span><span style="color:#657b83;">:\n</span></div>',+                                                        },+                                                    ],+                                                },+                                            },+                                        ],+                                        stat: { added: 1, changed: 3, deleted: 4 },+                                        internalID: '084bcb27838a8adbbbe10f664420f2d2',+                                    },+                                ],+                                totalCount: 1,+                                pageInfo: { endCursor: null, hasNextPage: false },+                                diffStat: { added: 1, changed: 3, deleted: 4 },+                            },+                        },+                    },+                }),+            })++            await driver.page.goto(driver.sourcegraphBaseUrl + '/github.com/sourcegraph/jsonrpc2')+            await driver.page.waitForSelector('h2.tree-page__title')++            // Assert that the directory listing displays properly+            await driver.page.waitForSelector('.e2e-tree-entries')++            const numberOfFileEntries = await driver.page.evaluate(+                () => document.querySelectorAll<HTMLButtonElement>('.e2e-tree-entry-file')?.length+            )++            assert.strictEqual(numberOfFileEntries, fileEntries.length, 'Number of files in directory listing')++            await testContext.waitForGraphQLRequest(async () => {+                await driver.findElementWithText(clickedFileName, { selector: '.e2e-tree-entry-file', action: 'click' })+            }, 'Blob')++            await driver.page.waitForSelector('.e2e-repo-blob')+            await driver.assertWindowLocation(`/github.com/sourcegraph/jsonrpc2/-/blob/${clickedFileName}`)

you already have a repo name so it might be worth it to use that explicitly

marekweb

comment created time in 25 days

Pull request review commentsourcegraph/sourcegraph

Add integration tests

+import { createDriverForTest, Driver } from '../../../shared/src/testing/driver'+import { commonWebGraphQlResults } from './graphQlResults'+import { createWebIntegrationTestContext, WebIntegrationTestContext } from './context'++describe('User profile page', () => {+    let driver: Driver+    before(async () => {+        driver = await createDriverForTest()+    })+    after(() => driver?.close())+    let testContext: WebIntegrationTestContext+    beforeEach(async function () {+        testContext = await createWebIntegrationTestContext({+            driver,+            currentTest: this.currentTest!,+            directory: __dirname,+        })+    })+    afterEach(() => testContext?.dispose())++    it('updates display name', async () => {+        testContext.overrideGraphQL({+            ...commonWebGraphQlResults,+            User: () => ({+                user: {+                    __typename: 'User',+                    id: 'VXNlcjoxODkyNw==',+                    username: 'test',+                    displayName: 'Test',+                    url: '/users/test',+                    settingsURL: '/users/test/settings',+                    avatarURL: '',+                    viewerCanAdminister: true,+                    siteAdmin: true,+                    builtinAuth: true,+                    createdAt: '2020-04-10T21:11:42Z',+                    emails: [{ email: 'test@example.com', verified: true }],+                    organizations: { nodes: [] },+                    permissionsInfo: null,+                },+            }),+            UserForProfilePage: () => ({+                node: {+                    id: 'VXNlcjoxODkyNw==',+                    username: 'test',+                    displayName: 'Test',+                    avatarURL: '',+                    viewerCanChangeUsername: true,+                },+            }),+            updateUser: () => ({ updateUser: { alwaysNil: null } }),+        })+        await driver.page.goto(driver.sourcegraphBaseUrl + '/users/test/settings/profile')+        await driver.page.waitForSelector('.user-settings-profile-page')+        await driver.replaceText({+            selector: '.e2e-user-settings-profile-page__display-name',+            newText: 'Test2',+            selectMethod: 'selectall',+        })++        await testContext.waitForGraphQLRequest(async () => {

shouldn't this be an assert afterwards to verify input?

marekweb

comment created time in 25 days

push eventsourcegraph/sourcegraph

Simon

commit sha 5bff6676c09f6f37f434b55e0455686d4d6fab69

added gql response helpers for integration tests and started blob-viewer integration tests (#12135) * added gql response helpers for integration tests and started blob-viewer tests * removed "only" from test

view details

push time in 25 days

delete branch sourcegraph/sourcegraph

delete branch : twop/blob-viewer-integration-tests

delete time in 25 days

PR merged sourcegraph/sourcegraph

added gql response helpers for integration tests and started blob-viewer integration tests

done

  • helpers to attempt to make stubbing graphQL responses easier
  • Test that verifies general layout for viewing a blob
+164 -0

3 comments

2 changed files

twop

pr closed time in 25 days

pull request commentsourcegraph/sourcegraph

added gql response helpers for integration tests and started blob-viewer integration tests

It was probably due to "test.only" that I left

twop

comment created time in 25 days

push eventsourcegraph/sourcegraph

Simon

commit sha 234eef3eece8be1e2f461a01134c30390c659207

removed "only" from test

view details

push time in 25 days

pull request commentsourcegraph/sourcegraph

added gql response helpers for integration tests and started blob-viewer integration tests

I wonder how adding a test code only can decrease coverage?

twop

comment created time in 25 days

PR opened sourcegraph/sourcegraph

added gql response helpers for integration tests and started blob-viewer integration tests

done

  • helpers to attempt to make stubbing graphQL responses easier
  • Test that verifies general layout for viewing a blob
+164 -0

0 comment

2 changed files

pr created time in 25 days

create barnchsourcegraph/sourcegraph

branch : twop/blob-viewer-integration-tests

created branch time in 25 days

issue commentsourcegraph/sourcegraph

Web 3.18 Tracking issue

Last week Worked primarily on codegenaration for typesafe stubbing of graphQL queries for integration tests. Landed on Friday https://github.com/sourcegraph/sourcegraph/pull/11983. As a part of it I made all queries have unique names.

I'm not super happy with the custom code I wrote based on https://github.com/Quramy/ts-graphql-plugin. We need to either upstream changes fully or maintain a proper fork of it. I think I would love us to move to https://graphql-code-generator.com/ sometime soon, but that may require some workflow changes.

On Friday I haven't had time to investigate graphql-code-generator because I was dealing with issues after rebase and tried to help @marekweb to ramp up on our progress with integration tests.

Plus, some code reviews.

Next week Monday is going to be dedicating writing more tests before the fork, and I want to spend some time researching graphQl tools to reduce technical debt I introduced with codegen. The rest of the week is TBD.

lguychard

comment created time in a month

startedOrasund/elm-ui-widgets

started time in a month

push eventtwop/ts-rust-bridge

Simon

commit sha cebc04308eede58e5a8b1d8188891666f4d75144

added support for nullable

view details

push time in a month

push eventtwop/ts-rust-bridge

Simon

commit sha 3d51a74d3f9282c4fdd6a791992fddc3c6730ab0

added support for nullable

view details

Simon

commit sha 64c64cb1d707065f2680c2bac17cf714b16c770b

added tests for nullable ser/de

view details

Simon

commit sha 1e8fa45af9a3cfaa329e9f1434fb9761b64425f9

package version

view details

push time in a month

push eventsourcegraph/sourcegraph

Simon

commit sha 4623f8c9a52da3e4d393666f6f725a9bf224f1fa

typesafe stubbing of graphQL requests for integration tests (#11983) * WIP first iteration of type generation of all queries * WIP: fixed nested list in the parser + gave operations unique names * WIP: partially migrated search tests to have typesafe responses, operations in shared is the last standing issue * refactored tests to use typechecked graphql stubbing * fixed eslint issues * runt prettier on generated sources * changed override to be a function + PR comments Co-authored-by: Marek <marekz@gmail.com> * rebased * make process fail if we have an error during extraction * added site admin activation status

view details

push time in a month

delete branch sourcegraph/sourcegraph

delete branch : twop/gql-operations-extraction

delete time in a month

PR merged sourcegraph/sourcegraph

Reviewers
typesafe stubbing of graphQL requests for integration tests

done:

  • wrote a script that extracts all gql operations into a separate typescript file that has an interface that describes all operations as functions with input and output
  • made all graphlql operations having unique names
  • add npm script to generate these interfaces for web and shared (one per tsconfig.json). For now it needs to be run manually.
  • fixed an error that was in ts-graphql-plugin related to nested list syntax [[Int!]!]
  • made overrideGraphQL calls and waitForGraphQLRequest fully typesafe and now it supports autocomplete
  • refactored our existing tests accordingly

image image image

+6323 -312

2 comments

24 changed files

twop

pr closed time in a month

push eventsourcegraph/sourcegraph

Simon

commit sha 1269900abc4c28b6a552194f7d5b1e8dc8e5176d

added site admin activation status

view details

push time in a month

push eventsourcegraph/sourcegraph

Simon

commit sha e3328b1559d1e4b6d6522e658c72710657b91afd

make process fail if we have an error during extraction

view details

push time in a month

push eventsourcegraph/sourcegraph

Stephen Gutekanst

commit sha 72c9642a54231f2a50b49af6e2199471cc58c635

web: use cache buster for logo (#12042) * web: use cache buster for logo The old one will be cached for quite some time so using a cache buster is needed. * Update snapshots Co-authored-by: Felix Becker <felix.b@outlook.com>

view details

Robert Lin

commit sha 5989c18ada3f528f9057442c3461bdfbd87542ca

monitoring: fix alert banner wording, link to grafana (#12045)

view details

Ryan Slade

commit sha c1ae2d6a5093759ef37b76374374b1c6bd6a96b8

campaigns: Pass in existing context (#12044)

view details

Ryan Slade

commit sha f4d83172f3748745542ebbf5c4a670e7ba101042

Rename configuredRepo2 to configuredRepo (#12048) It looks like this was left over from an old change and is quite confusing.

view details

ᴜɴᴋɴᴡᴏɴ

commit sha 941cd706408ac16dc4b782f3d48987ca1d6eaaa1

gqltest: add search integration tests (#11888)

view details

Erik Seliger

commit sha 22797a7ac07b376a45ff6d5883a2ed0e05ca7eed

Add storybooks for file diffs and improve ugly states (#12036)

view details

renovate[bot]

commit sha 9f9e837ef3f00974763a8af0dc31bf905c9a895c

Update dependency @sourcegraph/eslint-config to ^0.19.12 (#12051) Co-authored-by: Renovate Bot <bot@renovateapp.com> Co-authored-by: Felix Becker <felix.b@outlook.com>

view details

renovate[bot]

commit sha 914cf6d970e286a8632eb6bd5b8a3d8169cd6037

Update dependency @sourcegraph/eslint-config to ^0.19.15 (#12053) Co-authored-by: Renovate Bot <bot@renovateapp.com>

view details

Beyang Liu

commit sha 0d7e15c698d4cf6b6fb0df4f963996fadfbab33a

remove deprecated /repos/list endpoint (replaced by /repos/index) (#12041)

view details

Eric Fritz

commit sha b769ef6faeda831f06c3d8f56882a48ef76a15f6

codeintel: Reduce correlation memory usage by 50% (#11977)

view details

Pooja Jain

commit sha 25459ec7aff5e2111b8bb7f5139a52e05c41b55a

Remove fancy quotes on homepage (#12061) * Remove fancy quotes on homepage * Replace with normal quotes instead Co-authored-by: Pooja Jsin <poojajain@poojas-mbp.attlocal.net>

view details

Farhan Attamimi

commit sha 5d86b8b46cefcbe78f24ff9f0aec3546cdd1ac02

repogroup pages: read from settings (#11923)

view details

Rob Rhyne

commit sha 41db04954c28180792defbc5cf0496c24e08ef37

Repo group dark mode (#12078)

view details

Rijnard van Tonder

commit sha bb1daacb6d09a77a9337040361baba439d661072

search: remove dead function RepoSearch (#12081)

view details

Asdine El Hrychy

commit sha cab1a64cfdbe0c930cccdc9fd550e60913972b60

cloud: use the cloned column to filter by clone status (#11932)

view details

renovate[bot]

commit sha 7b5cbd9dfcaa5e279ff8f6294d58e1f0dbecfa4b

Update dependency highlight.js to ^10.1.1 (#11858) Co-authored-by: Renovate Bot <bot@renovateapp.com> Co-authored-by: Erik Seliger <erikseliger@me.com>

view details

Asdine El Hrychy

commit sha c9224061da6a614e0e15d04c5aa057dccda45dd1

Delete cloning tab from the site-admin repositories page (#12043)

view details

Eric Fritz

commit sha b459aa491f1fadfa53b07667cfcaf99cc15fe0ee

codeintel: Add enabled flag to lsif_indexable_repositories (#12062)

view details

Ryan Slade

commit sha d3dbb2811f1832206be7c7c0c9848c0012a6d369

repo-updater: Consistent use of MustRegister (#12094) * repo-updater: Consistent use of MustRegister Make it a method of each metric type. Also moved "handler" closer to where it's used. * No need to run server in goroutine

view details

Christina Forney

commit sha 750c90ffcf65fe1bf80555ccefe8987f1c94f8b5

Fixes #12057 search example page copy edits (#12084)

view details

push time in a month

push eventsourcegraph/sourcegraph

Simon

commit sha 6fc2cef809f1f3600e3eb5a99c7ef9b4b9c433a9

changed override to be a function + PR comments Co-authored-by: Marek <marekz@gmail.com>

view details

push time in a month

Pull request review commentsourcegraph/sourcegraph

typesafe stubbing of graphQL requests for integration tests

+/* eslint-disable quotes */+/* eslint-disable @typescript-eslint/consistent-type-definitions */+/* This is an autogenerated file. Do not edit this file directly! */+export interface WebGQLOperations {+    CurrentAuthState: /* src/auth.ts */ (input: CurrentAuthStateInput) => CurrentAuthStateOutput+    RepositoryID: /* src/enterprise/campaigns/detail/AddChangesetForm.tsx */ (+        input: RepositoryIDInput+    ) => RepositoryIDOutput+    CreateChangeset: /* src/enterprise/campaigns/detail/AddChangesetForm.tsx */ (+        input: CreateChangesetInput+    ) => CreateChangesetOutput+    AddChangeSetToCampaign: /* src/enterprise/campaigns/detail/AddChangesetForm.tsx */ (+        input: AddChangeSetToCampaignInput+    ) => AddChangeSetToCampaignOutput+    UpdateCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: UpdateCampaignInput+    ) => UpdateCampaignOutput+    CreateCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: CreateCampaignInput+    ) => CreateCampaignOutput+    RetryCampaignChangesets: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: RetryCampaignChangesetsInput+    ) => RetryCampaignChangesetsOutput+    PublishCampaignChangesets: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: PublishCampaignChangesetsInput+    ) => PublishCampaignChangesetsOutput+    CloseCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (input: CloseCampaignInput) => CloseCampaignOutput+    DeleteCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: DeleteCampaignInput+    ) => DeleteCampaignOutput+    CampaignByID: /* src/enterprise/campaigns/detail/backend.ts */ (input: CampaignByIDInput) => CampaignByIDOutput+    PatchSetByID: /* src/enterprise/campaigns/detail/backend.ts */ (input: PatchSetByIDInput) => PatchSetByIDOutput+    CampaignChangesets: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: CampaignChangesetsInput+    ) => CampaignChangesetsOutput+    CampaignPatches: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: CampaignPatchesInput+    ) => CampaignPatchesOutput+    PatchSetPatches: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: PatchSetPatchesInput+    ) => PatchSetPatchesOutput+    PublishChangeset: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: PublishChangesetInput+    ) => PublishChangesetOutput+    SyncChangeset: /* src/enterprise/campaigns/detail/backend.ts */ (input: SyncChangesetInput) => SyncChangesetOutput+    ExternalChangesetFileDiffs: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: ExternalChangesetFileDiffsInput+    ) => ExternalChangesetFileDiffsOutput+    PatchFileDiffs: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: PatchFileDiffsInput+    ) => PatchFileDiffsOutput+    Campaigns: /* src/enterprise/campaigns/global/list/backend.ts */ (input: CampaignsInput) => CampaignsOutput+    CampaignsCount: /* src/enterprise/campaigns/global/list/backend.ts */ (+        input: CampaignsCountInput+    ) => CampaignsCountOutput+    LsifUploads: /* src/enterprise/codeintel/backend.tsx */ (input: LsifUploadsInput) => LsifUploadsOutput+    LsifUploadsWithRepo: /* src/enterprise/codeintel/backend.tsx */ (+        input: LsifUploadsWithRepoInput+    ) => LsifUploadsWithRepoOutput+    LsifUpload: /* src/enterprise/codeintel/backend.tsx */ (input: LsifUploadInput) => LsifUploadOutput+    DeleteLsifUpload: /* src/enterprise/codeintel/backend.tsx */ (+        input: DeleteLsifUploadInput+    ) => DeleteLsifUploadOutput+    LsifIndexes: /* src/enterprise/codeintel/backend.tsx */ (input: LsifIndexesInput) => LsifIndexesOutput+    LsifIndexesWithRepo: /* src/enterprise/codeintel/backend.tsx */ (+        input: LsifIndexesWithRepoInput+    ) => LsifIndexesWithRepoOutput+    LsifIndex: /* src/enterprise/codeintel/backend.tsx */ (input: LsifIndexInput) => LsifIndexOutput+    DeleteLsifIndex: /* src/enterprise/codeintel/backend.tsx */ (input: DeleteLsifIndexInput) => DeleteLsifIndexOutput+    ProductPlans: /* src/enterprise/dotcom/productPlans/ProductPlanFormControl.tsx */ (+        input: ProductPlansInput+    ) => ProductPlansOutput+    ExploreExtensions: /* src/enterprise/extensions/explore/ExtensionsExploreSection.tsx */ (+        input: ExploreExtensionsInput+    ) => ExploreExtensionsOutput+    UpdateRegistryExtension: /* src/enterprise/extensions/extension/RegistryExtensionManagePage.tsx */ (+        input: UpdateRegistryExtensionInput+    ) => UpdateRegistryExtensionOutput+    PublishRegistryExtension: /* src/enterprise/extensions/extension/RegistryExtensionNewReleasePage.tsx */ (+        input: PublishRegistryExtensionInput+    ) => PublishRegistryExtensionOutput+    CreateRegistryExtension: /* src/enterprise/extensions/registry/RegistryNewExtensionPage.tsx */ (+        input: CreateRegistryExtensionInput+    ) => CreateRegistryExtensionOutput+    DeleteRegistryExtension: /* src/enterprise/extensions/registry/backend.ts */ (+        input: DeleteRegistryExtensionInput+    ) => DeleteRegistryExtensionOutput+    ViewerRegistryPublishers: /* src/enterprise/extensions/registry/backend.ts */ (+        input: ViewerRegistryPublishersInput+    ) => ViewerRegistryPublishersOutput+    ViewerNamespaces: /* src/enterprise/namespaces/backend.ts */ (+        input: ViewerNamespacesInput+    ) => ViewerNamespacesOutput+    LsifUploadsForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: LsifUploadsForRepoInput+    ) => LsifUploadsForRepoOutput+    LsifUploadForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: LsifUploadForRepoInput+    ) => LsifUploadForRepoOutput+    DeleteLsifUploadForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: DeleteLsifUploadForRepoInput+    ) => DeleteLsifUploadForRepoOutput+    LsifIndexesForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: LsifIndexesForRepoInput+    ) => LsifIndexesForRepoOutput+    LsifIndexForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: LsifIndexForRepoInput+    ) => LsifIndexForRepoOutput+    DeleteLsifIndexForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: DeleteLsifIndexForRepoInput+    ) => DeleteLsifIndexForRepoOutput+    SearchResultsStats: /* src/enterprise/search/stats/backend.ts */ (+        input: SearchResultsStatsInput+    ) => SearchResultsStatsOutput+    AuthProviders: /* src/enterprise/site-admin/SiteAdminAuthenticationProvidersPage.tsx */ (+        input: AuthProvidersInput+    ) => AuthProvidersOutput+    ExternalAccounts: /* src/enterprise/site-admin/SiteAdminExternalAccountsPage.tsx */ (+        input: ExternalAccountsInput+    ) => ExternalAccountsOutput+    SiteAdminRegistryExtensions: /* src/enterprise/site-admin/SiteAdminRegistryExtensionsPage.tsx */ (+        input: SiteAdminRegistryExtensionsInput+    ) => SiteAdminRegistryExtensionsOutput+    SiteAdminLsifUpload: /* src/enterprise/site-admin/backend.ts */ (+        input: SiteAdminLsifUploadInput+    ) => SiteAdminLsifUploadOutput+    SetCustomerBilling: /* src/enterprise/site-admin/dotcom/customers/SiteAdminCustomerBillingLink.tsx */ (+        input: SetCustomerBillingInput+    ) => SetCustomerBillingOutput+    Customers: /* src/enterprise/site-admin/dotcom/customers/SiteAdminCustomersPage.tsx */ (+        input: CustomersInput+    ) => CustomersOutput+    CreateProductSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminCreateProductSubscriptionPage.tsx */ (+        input: CreateProductSubscriptionInput+    ) => CreateProductSubscriptionOutput+    ProductSubscriptionAccounts: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminCreateProductSubscriptionPage.tsx */ (+        input: ProductSubscriptionAccountsInput+    ) => ProductSubscriptionAccountsOutput+    GenerateProductLicenseForSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminGenerateProductLicenseForSubscriptionForm.tsx */ (+        input: GenerateProductLicenseForSubscriptionInput+    ) => GenerateProductLicenseForSubscriptionOutput+    DotComProductLicenses: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductLicensesPage.tsx */ (+        input: DotComProductLicensesInput+    ) => DotComProductLicensesOutput+    SetProductSubscriptionBilling: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionBillingLink.tsx */ (+        input: SetProductSubscriptionBillingInput+    ) => SetProductSubscriptionBillingOutput+    DotComProductSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionPage.tsx */ (+        input: DotComProductSubscriptionInput+    ) => DotComProductSubscriptionOutput+    ProductLicenses: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionPage.tsx */ (+        input: ProductLicensesInput+    ) => ProductLicensesOutput+    ArchiveProductSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionPage.tsx */ (+        input: ArchiveProductSubscriptionInput+    ) => ArchiveProductSubscriptionOutput+    ProductSubscriptionsDotCom: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionsPage.tsx */ (+        input: ProductSubscriptionsDotComInput+    ) => ProductSubscriptionsDotComOutput+    ProductLicenseInfo: /* src/enterprise/site-admin/productSubscription/ProductSubscriptionStatus.tsx */ (+        input: ProductLicenseInfoInput+    ) => ProductLicenseInfoOutput+    PreviewProductSubscriptionInvoice: /* src/enterprise/user/productSubscriptions/NewProductSubscriptionPaymentSection.tsx */ (+        input: PreviewProductSubscriptionInvoiceInput+    ) => PreviewProductSubscriptionInvoiceOutput+    ProductSubscriptionOnEditPage: /* src/enterprise/user/productSubscriptions/UserSubscriptionsEditProductSubscriptionPage.tsx */ (+        input: ProductSubscriptionOnEditPageInput+    ) => ProductSubscriptionOnEditPageOutput+    UpdatePaidProductSubscription: /* src/enterprise/user/productSubscriptions/UserSubscriptionsEditProductSubscriptionPage.tsx */ (+        input: UpdatePaidProductSubscriptionInput+    ) => UpdatePaidProductSubscriptionOutput+    CreatePaidProductSubscription: /* src/enterprise/user/productSubscriptions/UserSubscriptionsNewProductSubscriptionPage.tsx */ (+        input: CreatePaidProductSubscriptionInput+    ) => CreatePaidProductSubscriptionOutput+    ProductSubscription: /* src/enterprise/user/productSubscriptions/UserSubscriptionsProductSubscriptionPage.tsx */ (+        input: ProductSubscriptionInput+    ) => ProductSubscriptionOutput+    ProductSubscriptions: /* src/enterprise/user/productSubscriptions/UserSubscriptionsProductSubscriptionsPage.tsx */ (+        input: ProductSubscriptionsInput+    ) => ProductSubscriptionsOutput+    DeleteExternalAccount: /* src/enterprise/user/settings/ExternalAccountNode.tsx */ (+        input: DeleteExternalAccountInput+    ) => DeleteExternalAccountOutput+    UserExternalAccounts: /* src/enterprise/user/settings/UserSettingsExternalAccountsPage.tsx */ (+        input: UserExternalAccountsInput+    ) => UserExternalAccountsOutput+    RegistryExtensions: /* src/extensions/ExtensionsList.tsx */ (+        input: RegistryExtensionsInput+    ) => RegistryExtensionsOutput+    RegistryExtension: /* src/extensions/extension/ExtensionArea.tsx */ (+        input: RegistryExtensionInput+    ) => RegistryExtensionOutput+    SubmitSurvey: /* src/marketing/backend.tsx */ (input: SubmitSurveyInput) => SubmitSurveyOutput+    FetchSurveyResponses: /* src/marketing/backend.tsx */ (+        input: FetchSurveyResponsesInput+    ) => FetchSurveyResponsesOutput+    FetchAllUsersWithSurveyResponses: /* src/marketing/backend.tsx */ (+        input: FetchAllUsersWithSurveyResponsesInput+    ) => FetchAllUsersWithSurveyResponsesOutput+    FetchSurveyResponseAggregates: /* src/marketing/backend.tsx */ (+        input: FetchSurveyResponseAggregatesInput+    ) => FetchSurveyResponseAggregatesOutput+    RequestTrial: /* src/marketing/backend.tsx */ (input: RequestTrialInput) => RequestTrialOutput+    StatusMessages: /* src/nav/StatusMessagesNavItem.tsx */ (input: StatusMessagesInput) => StatusMessagesOutput+    createOrganization: /* src/org/backend.tsx */ (input: createOrganizationInput) => createOrganizationOutput+    removeUserFromOrganization: /* src/org/backend.tsx */ (+        input: removeUserFromOrganizationInput+    ) => removeUserFromOrganizationOutput+    UpdateOrganization: /* src/org/backend.tsx */ (input: UpdateOrganizationInput) => UpdateOrganizationOutput+    Organization: /* src/org/area/OrgArea.tsx */ (input: OrganizationInput) => OrganizationOutput+    RespondToOrganizationInvitation: /* src/org/area/OrgInvitationPage.tsx */ (+        input: RespondToOrganizationInvitationInput+    ) => RespondToOrganizationInvitationOutput+    OrganizationMembers: /* src/org/area/OrgMembersPage.tsx */ (+        input: OrganizationMembersInput+    ) => OrganizationMembersOutput+    InviteUserToOrganization: /* src/org/invite/InviteForm.tsx */ (+        input: InviteUserToOrganizationInput+    ) => InviteUserToOrganizationOutput+    AddUserToOrganization: /* src/org/invite/InviteForm.tsx */ (+        input: AddUserToOrganizationInput+    ) => AddUserToOrganizationOutput+    ViewerSettings: /* src/platform/context.ts */ (input: ViewerSettingsInput) => ViewerSettingsOutput+    RepositoryGitRefs: /* src/repo/GitReference.tsx */ (input: RepositoryGitRefsInput) => RepositoryGitRefsOutput+    FetchCommits: /* src/repo/RepoRevisionSidebarCommits.tsx */ (input: FetchCommitsInput) => FetchCommitsOutput+    RepositoriesForPopover: /* src/repo/RepositoriesPopover.tsx */ (+        input: RepositoriesForPopoverInput+    ) => RepositoriesForPopoverOutput+    RepositoryGitCommit: /* src/repo/RevisionsPopover.tsx */ (+        input: RepositoryGitCommitInput+    ) => RepositoryGitCommitOutput+    RepositoryRedirect: /* src/repo/backend.ts */ (input: RepositoryRedirectInput) => RepositoryRedirectOutput+    ResolveRev: /* src/repo/backend.ts */ (input: ResolveRevInput) => ResolveRevOutput+    HighlightedFile: /* src/repo/backend.ts */ (input: HighlightedFileInput) => HighlightedFileOutput+    FileExternalLinks: /* src/repo/backend.ts */ (input: FileExternalLinksInput) => FileExternalLinksOutput+    TreeEntries: /* src/repo/backend.ts */ (input: TreeEntriesInput) => TreeEntriesOutput+    Blob: /* src/repo/blob/BlobPage.tsx */ (input: BlobInput) => BlobOutput+    RepositoryGitBranchesOverview: /* src/repo/branches/RepositoryBranchesOverviewPage.tsx */ (+        input: RepositoryGitBranchesOverviewInput+    ) => RepositoryGitBranchesOverviewOutput+    RepositoryCommit: /* src/repo/commit/RepositoryCommitPage.tsx */ (+        input: RepositoryCommitInput+    ) => RepositoryCommitOutput+    RepositoryGitCommits: /* src/repo/commits/RepositoryCommitsPage.tsx */ (+        input: RepositoryGitCommitsInput+    ) => RepositoryGitCommitsOutput+    RepositoryComparisonCommits: /* src/repo/compare/RepositoryCompareCommitsPage.tsx */ (+        input: RepositoryComparisonCommitsInput+    ) => RepositoryComparisonCommitsOutput+    RepositoryComparisonDiff: /* src/repo/compare/RepositoryCompareDiffPage.tsx */ (+        input: RepositoryComparisonDiffInput+    ) => RepositoryComparisonDiffOutput+    RepositoryComparison: /* src/repo/compare/RepositoryCompareOverviewPage.tsx */ (+        input: RepositoryComparisonInput+    ) => RepositoryComparisonOutput+    ExploreRepositories: /* src/repo/explore/RepositoriesExploreSection.tsx */ (+        input: ExploreRepositoriesInput+    ) => ExploreRepositoriesOutput+    RepositoryTextSearchIndex: /* src/repo/settings/RepoSettingsIndexPage.tsx */ (+        input: RepositoryTextSearchIndexInput+    ) => RepositoryTextSearchIndexOutput+    Repository: /* src/repo/settings/backend.tsx */ (input: RepositoryInput) => RepositoryOutput+    RepositoryContributors: /* src/repo/stats/RepositoryStatsContributorsPage.tsx */ (+        input: RepositoryContributorsInput+    ) => RepositoryContributorsOutput+    TreeCommits: /* src/repo/tree/TreePage.tsx */ (input: TreeCommitsInput) => TreeCommitsOutput+    Search: /* src/search/backend.tsx */ (input: SearchInput) => SearchOutput+    RepoGroups: /* src/search/backend.tsx */ (input: RepoGroupsInput) => RepoGroupsOutput+    SearchSuggestions: /* src/search/backend.tsx */ (input: SearchSuggestionsInput) => SearchSuggestionsOutput+    ReposByQuery: /* src/search/backend.tsx */ (input: ReposByQueryInput) => ReposByQueryOutput+    savedSearches: /* src/search/backend.tsx */ (input: savedSearchesInput) => savedSearchesOutput+    SavedSearch: /* src/search/backend.tsx */ (input: SavedSearchInput) => SavedSearchOutput+    CreateSavedSearch: /* src/search/backend.tsx */ (input: CreateSavedSearchInput) => CreateSavedSearchOutput+    UpdateSavedSearch: /* src/search/backend.tsx */ (input: UpdateSavedSearchInput) => UpdateSavedSearchOutput+    DeleteSavedSearch: /* src/search/backend.tsx */ (input: DeleteSavedSearchInput) => DeleteSavedSearchOutput+    highlightCode: /* src/search/backend.tsx */ (input: highlightCodeInput) => highlightCodeOutput+    ManyReposWarning: /* src/search/backend.tsx */ (input: ManyReposWarningInput) => ManyReposWarningOutput+    SettingsCascade: /* src/settings/SettingsArea.tsx */ (input: SettingsCascadeInput) => SettingsCascadeOutput+    DeleteAccessToken: /* src/settings/tokens/AccessTokenNode.tsx */ (+        input: DeleteAccessTokenInput+    ) => DeleteAccessTokenOutput+    SiteFlags: /* src/site/backend.tsx */ (input: SiteFlagsInput) => SiteFlagsOutput+    addExternalService: /* src/site-admin/SiteAdminAddExternalServicePage.tsx */ (+        input: addExternalServiceInput+    ) => addExternalServiceOutput+    UpdateExternalService: /* src/site-admin/SiteAdminExternalServicePage.tsx */ (+        input: UpdateExternalServiceInput+    ) => UpdateExternalServiceOutput+    ExternalService: /* src/site-admin/SiteAdminExternalServicePage.tsx */ (+        input: ExternalServiceInput+    ) => ExternalServiceOutput+    DeleteExternalService: /* src/site-admin/SiteAdminExternalServicesPage.tsx */ (+        input: DeleteExternalServiceInput+    ) => DeleteExternalServiceOutput+    ExternalServices: /* src/site-admin/SiteAdminExternalServicesPage.tsx */ (+        input: ExternalServicesInput+    ) => ExternalServicesOutput+    SiteAdminAccessTokens: /* src/site-admin/SiteAdminTokensPage.tsx */ (+        input: SiteAdminAccessTokensInput+    ) => SiteAdminAccessTokensOutput+    Users: /* src/site-admin/backend.tsx */ (input: UsersInput) => UsersOutput+    Organizations: /* src/site-admin/backend.tsx */ (input: OrganizationsInput) => OrganizationsOutput+    Repositories: /* src/site-admin/backend.tsx */ (input: RepositoriesInput) => RepositoriesOutput+    UpdateMirrorRepository: /* src/site-admin/backend.tsx */ (+        input: UpdateMirrorRepositoryInput+    ) => UpdateMirrorRepositoryOutput+    CheckMirrorRepositoryConnection: /* src/site-admin/backend.tsx */ (+        input: CheckMirrorRepositoryConnectionInput+    ) => CheckMirrorRepositoryConnectionOutput+    ScheduleRepositoryPermissionsSync: /* src/site-admin/backend.tsx */ (+        input: ScheduleRepositoryPermissionsSyncInput+    ) => ScheduleRepositoryPermissionsSyncOutput+    ScheduleUserPermissionsSync: /* src/site-admin/backend.tsx */ (+        input: ScheduleUserPermissionsSyncInput+    ) => ScheduleUserPermissionsSyncOutput+    UserUsageStatistics: /* src/site-admin/backend.tsx */ (input: UserUsageStatisticsInput) => UserUsageStatisticsOutput+    SiteUsageStatistics: /* src/site-admin/backend.tsx */ (input: SiteUsageStatisticsInput) => SiteUsageStatisticsOutput+    Site: /* src/site-admin/backend.tsx */ (input: SiteInput) => SiteOutput+    AllConfig: /* src/site-admin/backend.tsx */ (input: AllConfigInput) => AllConfigOutput+    UpdateSiteConfiguration: /* src/site-admin/backend.tsx */ (+        input: UpdateSiteConfigurationInput+    ) => UpdateSiteConfigurationOutput+    ReloadSite: /* src/site-admin/backend.tsx */ (input: ReloadSiteInput) => ReloadSiteOutput+    SetUserIsSiteAdmin: /* src/site-admin/backend.tsx */ (input: SetUserIsSiteAdminInput) => SetUserIsSiteAdminOutput+    RandomizeUserPassword: /* src/site-admin/backend.tsx */ (+        input: RandomizeUserPasswordInput+    ) => RandomizeUserPasswordOutput+    DeleteUser: /* src/site-admin/backend.tsx */ (input: DeleteUserInput) => DeleteUserOutput+    CreateUser: /* src/site-admin/backend.tsx */ (input: CreateUserInput) => CreateUserOutput+    DeleteOrganization: /* src/site-admin/backend.tsx */ (input: DeleteOrganizationInput) => DeleteOrganizationOutput+    SiteUpdateCheck: /* src/site-admin/backend.tsx */ (input: SiteUpdateCheckInput) => SiteUpdateCheckOutput+    SiteMonitoringStatistics: /* src/site-admin/backend.tsx */ (+        input: SiteMonitoringStatisticsInput+    ) => SiteMonitoringStatisticsOutput+    Overview: /* src/site-admin/overview/SiteAdminOverviewPage.tsx */ (input: OverviewInput) => OverviewOutput+    WAUs: /* src/site-admin/overview/SiteAdminOverviewPage.tsx */ (input: WAUsInput) => WAUsOutput+    Symbols: /* src/symbols/backend.tsx */ (input: SymbolsInput) => SymbolsOutput+    SiteAdminActivationStatus: /* src/tracking/withActivation.tsx */ (+        input: SiteAdminActivationStatusInput+    ) => SiteAdminActivationStatusOutput+    ActivationStatus: /* src/tracking/withActivation.tsx */ (input: ActivationStatusInput) => ActivationStatusOutput+    LinksForRepositories: /* src/tracking/withActivation.tsx */ (+        input: LinksForRepositoriesInput+    ) => LinksForRepositoriesOutput+    UserEventLogs: /* src/user/UserEventLogsPage.tsx */ (input: UserEventLogsInput) => UserEventLogsOutput+    User: /* src/user/area/UserArea.tsx */ (input: UserInput) => UserOutput+    updateUser: /* src/user/settings/backend.tsx */ (input: updateUserInput) => updateUserOutput+    updatePassword: /* src/user/settings/backend.tsx */ (input: updatePasswordInput) => updatePasswordOutput+    SetUserEmailVerified: /* src/user/settings/backend.tsx */ (+        input: SetUserEmailVerifiedInput+    ) => SetUserEmailVerifiedOutput+    logUserEvent: /* src/user/settings/backend.tsx */ (input: logUserEventInput) => logUserEventOutput+    logEvent: /* src/user/settings/backend.tsx */ (input: logEventInput) => logEventOutput+    CreateAccessToken: /* src/user/settings/accessTokens/UserSettingsCreateAccessTokenPage.tsx */ (+        input: CreateAccessTokenInput+    ) => CreateAccessTokenOutput+    AccessTokens: /* src/user/settings/accessTokens/UserSettingsTokensPage.tsx */ (+        input: AccessTokensInput+    ) => AccessTokensOutput+    AddUserEmail: /* src/user/settings/emails/AddUserEmailForm.tsx */ (input: AddUserEmailInput) => AddUserEmailOutput+    RemoveUserEmail: /* src/user/settings/emails/UserSettingsEmailsPage.tsx */ (+        input: RemoveUserEmailInput+    ) => RemoveUserEmailOutput+    UserEmails: /* src/user/settings/emails/UserSettingsEmailsPage.tsx */ (input: UserEmailsInput) => UserEmailsOutput+    UserForProfilePage: /* src/user/settings/profile/UserSettingsProfilePage.tsx */ (+        input: UserForProfilePageInput+    ) => UserForProfilePageOutput+}+export type CurrentAuthStateInput = {}+export type CurrentAuthStateOutput = {+    currentUser: {+        __typename: 'User'+        id: string+        databaseID: number+        username: string+        avatarURL: string | null+        email: string+        displayName: string | null+        siteAdmin: boolean+        tags: string[]+        url: string+        settingsURL: string | null+        organizations: {+            nodes: {+                id: string+                name: string+                displayName: string | null+                url: string+                settingsURL: string | null+            }[]+        }+        session: {+            canSignOut: boolean+        }+        viewerCanAdminister: boolean+    } | null+}+export type FileDiffHunkRangeFields = {+    startLine: number+    lines: number+}+export type DiffStatFields = {+    added: number+    changed: number+    deleted: number+}+export type FileDiffFields = {+    __typename: 'FileDiff'+    oldPath: string | null+    oldFile: {+        __typename: string+        binary: boolean+        byteSize: number+    } | null+    newFile: {+        __typename: string+        binary: boolean+        byteSize: number+    } | null+    newPath: string | null+    mostRelevantFile: {+        __typename: string+        url: string+    }+    hunks: {+        oldRange: {+            startLine: number+            lines: number+        }+        oldNoNewlineAt: boolean+        newRange: {+            startLine: number+            lines: number+        }+        section: string | null+        highlight: {+            aborted: boolean+            lines: {+                kind: 'ADDED' | 'UNCHANGED' | 'DELETED'+                html: string+            }[]+        }+    }[]+    stat: {+        added: number+        changed: number+        deleted: number+    }+    internalID: string+}+export type RepositoryIDInput = {+    repoName: string+}+export type RepositoryIDOutput = {+    repository: {+        id: string+    } | null+}+export type CreateChangesetInput = {+    repositoryID: string+    externalID: string+}+export type CreateChangesetOutput = {+    createChangesets: {+        id: string+    }[]+}+export type AddChangeSetToCampaignInput = {+    campaignID: string+    changesets: string[]+}+export type AddChangeSetToCampaignOutput = {+    addChangesetsToCampaign: {+        id: string+    }+}+export type CampaignFields = {+    __typename: 'Campaign'+    id: string+    name: string+    description: string | null+    author: {+        username: string+        avatarURL: string | null+    }+    status: {+        completedCount: number+        pendingCount: number+        state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'CANCELED'+        errors: string[]+    }+    branch: string | null+    createdAt: any+    updatedAt: any+    closedAt: any | null+    viewerCanAdminister: boolean+    hasUnpublishedPatches: boolean+    changesets: {+        totalCount: number+    }+    patches: {+        totalCount: number+    }+    changesetCountsOverTime: {+        date: any+        merged: number+        closed: number+        openApproved: number+        openChangesRequested: number+        openPending: number+        total: number+    }[]+    diffStat: DiffStatFields1+}+export type DiffStatFields1 = {+    added: number+    changed: number+    deleted: number+}+export type PatchSetFields = {+    __typename: 'PatchSet'+    id: string+    diffStat: DiffStatFields2+    patches: {+        totalCount: number+    }+}+export type DiffStatFields2 = {+    added: number+    changed: number+    deleted: number+}+export type UpdateCampaignInput = {+    update: {+        id: string+        name: string | null+        branch: string | null+        description: string | null+        patchSet: string | null+    }+}+export type UpdateCampaignOutput = {+    updateCampaign: CampaignFields1+}+export type CampaignFields1 = {+    __typename: 'Campaign'+    id: string+    name: string+    description: string | null+    author: {+        username: string+        avatarURL: string | null+    }+    status: {+        completedCount: number+        pendingCount: number+        state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'CANCELED'+        errors: string[]+    }+    branch: string | null+    createdAt: any+    updatedAt: any+    closedAt: any | null+    viewerCanAdminister: boolean+    hasUnpublishedPatches: boolean+    changesets: {+        totalCount: number+    }+    patches: {+        totalCount: number+    }+    changesetCountsOverTime: {+        date: any+        merged: number+        closed: number+        openApproved: number+        openChangesRequested: number+        openPending: number+        total: number+    }[]+    diffStat: DiffStatFields3+}+export type DiffStatFields3 = {+    added: number+    changed: number+    deleted: number+}+export type CreateCampaignInput = {+    input: {+        namespace: string+        name: string+        description: string | null+        branch: string | null+        patchSet: string | null+    }+}+export type CreateCampaignOutput = {+    createCampaign: {+        id: string+        url: string+    }+}+export type RetryCampaignChangesetsInput = {+    campaign: string+}+export type RetryCampaignChangesetsOutput = {+    retryCampaignChangesets: CampaignFields2+}+export type CampaignFields2 = {+    __typename: 'Campaign'+    id: string+    name: string+    description: string | null+    author: {+        username: string+        avatarURL: string | null+    }+    status: {+        completedCount: number+        pendingCount: number+        state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'CANCELED'+        errors: string[]+    }+    branch: string | null+    createdAt: any+    updatedAt: any+    closedAt: any | null+    viewerCanAdminister: boolean+    hasUnpublishedPatches: boolean+    changesets: {+        totalCount: number+    }+    patches: {+        totalCount: number+    }+    changesetCountsOverTime: {+        date: any+        merged: number+        closed: number+        openApproved: number+        openChangesRequested: number+        openPending: number+        total: number+    }[]+    diffStat: DiffStatFields4+}+export type DiffStatFields4 = {+    added: number+    changed: number+    deleted: number+}+export type PublishCampaignChangesetsInput = {+    campaign: string+}+export type PublishCampaignChangesetsOutput = {+    publishCampaignChangesets: CampaignFields3+}+export type CampaignFields3 = {+    __typename: 'Campaign'+    id: string+    name: string+    description: string | null+    author: {+        username: string+        avatarURL: string | null+    }+    status: {+        completedCount: number+        pendingCount: number+        state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'CANCELED'+        errors: string[]+    }+    branch: string | null+    createdAt: any+    updatedAt: any+    closedAt: any | null+    viewerCanAdminister: boolean+    hasUnpublishedPatches: boolean+    changesets: {+        totalCount: number+    }+    patches: {+        totalCount: number+    }+    changesetCountsOverTime: {+        date: any+        merged: number+        closed: number+        openApproved: number+        openChangesRequested: number+        openPending: number+        total: number+    }[]+    diffStat: DiffStatFields5+}+export type DiffStatFields5 = {+    added: number+    changed: number+    deleted: number+}+export type CloseCampaignInput = {+    campaign: string+    closeChangesets: boolean+}+export type CloseCampaignOutput = {+    closeCampaign: {+        id: string+    }+}+export type DeleteCampaignInput = {+    campaign: string+    closeChangesets: boolean+}+export type DeleteCampaignOutput = {+    deleteCampaign: {+        alwaysNil: string | null+    } | null+}+export type CampaignByIDInput = {+    campaign: string+}+export type CampaignByIDOutput = {+    node:+        | ({+              __typename: string+          } & CampaignFields4)+        | null+}+export type CampaignFields4 = {+    __typename: 'Campaign'+    id: string+    name: string+    description: string | null+    author: {+        username: string+        avatarURL: string | null+    }+    status: {+        completedCount: number+        pendingCount: number+        state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'CANCELED'+        errors: string[]+    }+    branch: string | null+    createdAt: any+    updatedAt: any+    closedAt: any | null+    viewerCanAdminister: boolean+    hasUnpublishedPatches: boolean+    changesets: {+        totalCount: number+    }+    patches: {+        totalCount: number+    }+    changesetCountsOverTime: {+        date: any+        merged: number+        closed: number+        openApproved: number+        openChangesRequested: number+        openPending: number+        total: number+    }[]+    diffStat: DiffStatFields6+}+export type DiffStatFields6 = {+    added: number+    changed: number+    deleted: number+}+export type PatchSetByIDInput = {+    patchSet: string+}+export type PatchSetByIDOutput = {+    node:+        | ({+              __typename: string+          } & PatchSetFields1)+        | null+}+export type PatchSetFields1 = {+    __typename: 'PatchSet'+    id: string+    diffStat: DiffStatFields7+    patches: {+        totalCount: number+    }+}+export type DiffStatFields7 = {+    added: number+    changed: number+    deleted: number+}+export type CampaignChangesetsInput = {+    campaign: string+    first: number | null+    state: ('OPEN' | 'CLOSED' | 'MERGED' | 'DELETED') | null+    reviewState: ('APPROVED' | 'CHANGES_REQUESTED' | 'PENDING' | 'COMMENTED' | 'DISMISSED') | null+    checkState: ('PENDING' | 'PASSED' | 'FAILED') | null+}+export type CampaignChangesetsOutput = {+    node:+        | ({+              __typename: string+          } & {+              changesets: {+                  totalCount: number+                  nodes: ({+                      __typename: string+                      state: 'OPEN' | 'CLOSED' | 'MERGED' | 'DELETED'+                      createdAt: any+                      updatedAt: any+                      nextSyncAt: any | null+                  } & {+                      id: string+                  } & {+                      id: string+                      title: string+                      body: string+                      reviewState: 'APPROVED' | 'CHANGES_REQUESTED' | 'PENDING' | 'COMMENTED' | 'DISMISSED'+                      checkState: ('PENDING' | 'PASSED' | 'FAILED') | null+                      labels: {+                          text: string+                          description: string | null+                          color: string+                      }[]+                      repository: {+                          id: string+                          name: string+                          url: string+                      }+                      externalURL: {+                          url: string+                      }+                      externalID: string+                      diff: {+                          fileDiffs: {+                              diffStat: DiffStatFields8+                          }+                      } | null+                      diffStat: {+                          added: number+                          changed: number+                          deleted: number+                      } | null+                  })[]+              }+          })+        | null+}+export type DiffStatFields8 = {+    added: number+    changed: number+    deleted: number+}+export type CampaignPatchesInput = {+    campaign: string+    first: number | null+}+export type CampaignPatchesOutput = {+    node:+        | ({+              __typename: string+          } & {+              patches: {+                  totalCount: number+                  nodes: ({+                      __typename: string+                  } & {+                      id: string+                  } & {+                      id: string+                      repository: {+                          id: string+                          name: string+                          url: string+                      }+                      publishable: boolean+                      publicationEnqueued: boolean+                      diff: {+                          fileDiffs: {+                              diffStat: DiffStatFields9+                          }+                      }+                  })[]+              }+          })+        | null+}+export type DiffStatFields9 = {+    added: number+    changed: number+    deleted: number+}+export type PatchSetPatchesInput = {+    patchSet: string+    first: number | null+}+export type PatchSetPatchesOutput = {+    node:+        | ({+              __typename: string+          } & {+              patches: {+                  totalCount: number+                  nodes: ({+                      __typename: string+                      id: string+                  } & {+                      repository: {+                          id: string+                          name: string+                          url: string+                      }+                      publishable: boolean+                      publicationEnqueued: boolean+                      diff: {+                          fileDiffs: {+                              diffStat: DiffStatFields10+                          }+                      }+                  })[]+              }+          })+        | null+}+export type DiffStatFields10 = {+    added: number+    changed: number+    deleted: number+}

I think I would prefer not to spend time on this effort in this iteration, because it doesn't provide a big ROI. In my head it is related to the question how we are working with graphql in general, so I want to take a little bit of time to think about it.

twop

comment created time in a month

Pull request review commentsourcegraph/sourcegraph

typesafe stubbing of graphQL requests for integration tests

+/* eslint-disable quotes */+/* eslint-disable @typescript-eslint/consistent-type-definitions */+/* This is an autogenerated file. Do not edit this file directly! */+export interface WebGQLOperations {+    CurrentAuthState: /* src/auth.ts */ (input: CurrentAuthStateInput) => CurrentAuthStateOutput+    RepositoryID: /* src/enterprise/campaigns/detail/AddChangesetForm.tsx */ (+        input: RepositoryIDInput+    ) => RepositoryIDOutput+    CreateChangeset: /* src/enterprise/campaigns/detail/AddChangesetForm.tsx */ (+        input: CreateChangesetInput+    ) => CreateChangesetOutput+    AddChangeSetToCampaign: /* src/enterprise/campaigns/detail/AddChangesetForm.tsx */ (+        input: AddChangeSetToCampaignInput+    ) => AddChangeSetToCampaignOutput+    UpdateCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: UpdateCampaignInput+    ) => UpdateCampaignOutput+    CreateCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: CreateCampaignInput+    ) => CreateCampaignOutput+    RetryCampaignChangesets: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: RetryCampaignChangesetsInput+    ) => RetryCampaignChangesetsOutput+    PublishCampaignChangesets: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: PublishCampaignChangesetsInput+    ) => PublishCampaignChangesetsOutput+    CloseCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (input: CloseCampaignInput) => CloseCampaignOutput+    DeleteCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: DeleteCampaignInput+    ) => DeleteCampaignOutput+    CampaignByID: /* src/enterprise/campaigns/detail/backend.ts */ (input: CampaignByIDInput) => CampaignByIDOutput+    PatchSetByID: /* src/enterprise/campaigns/detail/backend.ts */ (input: PatchSetByIDInput) => PatchSetByIDOutput+    CampaignChangesets: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: CampaignChangesetsInput+    ) => CampaignChangesetsOutput+    CampaignPatches: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: CampaignPatchesInput+    ) => CampaignPatchesOutput+    PatchSetPatches: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: PatchSetPatchesInput+    ) => PatchSetPatchesOutput+    PublishChangeset: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: PublishChangesetInput+    ) => PublishChangesetOutput+    SyncChangeset: /* src/enterprise/campaigns/detail/backend.ts */ (input: SyncChangesetInput) => SyncChangesetOutput+    ExternalChangesetFileDiffs: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: ExternalChangesetFileDiffsInput+    ) => ExternalChangesetFileDiffsOutput+    PatchFileDiffs: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: PatchFileDiffsInput+    ) => PatchFileDiffsOutput+    Campaigns: /* src/enterprise/campaigns/global/list/backend.ts */ (input: CampaignsInput) => CampaignsOutput+    CampaignsCount: /* src/enterprise/campaigns/global/list/backend.ts */ (+        input: CampaignsCountInput+    ) => CampaignsCountOutput+    LsifUploads: /* src/enterprise/codeintel/backend.tsx */ (input: LsifUploadsInput) => LsifUploadsOutput+    LsifUploadsWithRepo: /* src/enterprise/codeintel/backend.tsx */ (+        input: LsifUploadsWithRepoInput+    ) => LsifUploadsWithRepoOutput+    LsifUpload: /* src/enterprise/codeintel/backend.tsx */ (input: LsifUploadInput) => LsifUploadOutput+    DeleteLsifUpload: /* src/enterprise/codeintel/backend.tsx */ (+        input: DeleteLsifUploadInput+    ) => DeleteLsifUploadOutput+    LsifIndexes: /* src/enterprise/codeintel/backend.tsx */ (input: LsifIndexesInput) => LsifIndexesOutput+    LsifIndexesWithRepo: /* src/enterprise/codeintel/backend.tsx */ (+        input: LsifIndexesWithRepoInput+    ) => LsifIndexesWithRepoOutput+    LsifIndex: /* src/enterprise/codeintel/backend.tsx */ (input: LsifIndexInput) => LsifIndexOutput+    DeleteLsifIndex: /* src/enterprise/codeintel/backend.tsx */ (input: DeleteLsifIndexInput) => DeleteLsifIndexOutput+    ProductPlans: /* src/enterprise/dotcom/productPlans/ProductPlanFormControl.tsx */ (+        input: ProductPlansInput+    ) => ProductPlansOutput+    ExploreExtensions: /* src/enterprise/extensions/explore/ExtensionsExploreSection.tsx */ (+        input: ExploreExtensionsInput+    ) => ExploreExtensionsOutput+    UpdateRegistryExtension: /* src/enterprise/extensions/extension/RegistryExtensionManagePage.tsx */ (+        input: UpdateRegistryExtensionInput+    ) => UpdateRegistryExtensionOutput+    PublishRegistryExtension: /* src/enterprise/extensions/extension/RegistryExtensionNewReleasePage.tsx */ (+        input: PublishRegistryExtensionInput+    ) => PublishRegistryExtensionOutput+    CreateRegistryExtension: /* src/enterprise/extensions/registry/RegistryNewExtensionPage.tsx */ (+        input: CreateRegistryExtensionInput+    ) => CreateRegistryExtensionOutput+    DeleteRegistryExtension: /* src/enterprise/extensions/registry/backend.ts */ (+        input: DeleteRegistryExtensionInput+    ) => DeleteRegistryExtensionOutput+    ViewerRegistryPublishers: /* src/enterprise/extensions/registry/backend.ts */ (+        input: ViewerRegistryPublishersInput+    ) => ViewerRegistryPublishersOutput+    ViewerNamespaces: /* src/enterprise/namespaces/backend.ts */ (+        input: ViewerNamespacesInput+    ) => ViewerNamespacesOutput+    LsifUploadsForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: LsifUploadsForRepoInput+    ) => LsifUploadsForRepoOutput+    LsifUploadForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: LsifUploadForRepoInput+    ) => LsifUploadForRepoOutput+    DeleteLsifUploadForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: DeleteLsifUploadForRepoInput+    ) => DeleteLsifUploadForRepoOutput+    LsifIndexesForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: LsifIndexesForRepoInput+    ) => LsifIndexesForRepoOutput+    LsifIndexForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: LsifIndexForRepoInput+    ) => LsifIndexForRepoOutput+    DeleteLsifIndexForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: DeleteLsifIndexForRepoInput+    ) => DeleteLsifIndexForRepoOutput+    SearchResultsStats: /* src/enterprise/search/stats/backend.ts */ (+        input: SearchResultsStatsInput+    ) => SearchResultsStatsOutput+    AuthProviders: /* src/enterprise/site-admin/SiteAdminAuthenticationProvidersPage.tsx */ (+        input: AuthProvidersInput+    ) => AuthProvidersOutput+    ExternalAccounts: /* src/enterprise/site-admin/SiteAdminExternalAccountsPage.tsx */ (+        input: ExternalAccountsInput+    ) => ExternalAccountsOutput+    SiteAdminRegistryExtensions: /* src/enterprise/site-admin/SiteAdminRegistryExtensionsPage.tsx */ (+        input: SiteAdminRegistryExtensionsInput+    ) => SiteAdminRegistryExtensionsOutput+    SiteAdminLsifUpload: /* src/enterprise/site-admin/backend.ts */ (+        input: SiteAdminLsifUploadInput+    ) => SiteAdminLsifUploadOutput+    SetCustomerBilling: /* src/enterprise/site-admin/dotcom/customers/SiteAdminCustomerBillingLink.tsx */ (+        input: SetCustomerBillingInput+    ) => SetCustomerBillingOutput+    Customers: /* src/enterprise/site-admin/dotcom/customers/SiteAdminCustomersPage.tsx */ (+        input: CustomersInput+    ) => CustomersOutput+    CreateProductSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminCreateProductSubscriptionPage.tsx */ (+        input: CreateProductSubscriptionInput+    ) => CreateProductSubscriptionOutput+    ProductSubscriptionAccounts: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminCreateProductSubscriptionPage.tsx */ (+        input: ProductSubscriptionAccountsInput+    ) => ProductSubscriptionAccountsOutput+    GenerateProductLicenseForSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminGenerateProductLicenseForSubscriptionForm.tsx */ (+        input: GenerateProductLicenseForSubscriptionInput+    ) => GenerateProductLicenseForSubscriptionOutput+    DotComProductLicenses: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductLicensesPage.tsx */ (+        input: DotComProductLicensesInput+    ) => DotComProductLicensesOutput+    SetProductSubscriptionBilling: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionBillingLink.tsx */ (+        input: SetProductSubscriptionBillingInput+    ) => SetProductSubscriptionBillingOutput+    DotComProductSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionPage.tsx */ (+        input: DotComProductSubscriptionInput+    ) => DotComProductSubscriptionOutput+    ProductLicenses: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionPage.tsx */ (+        input: ProductLicensesInput+    ) => ProductLicensesOutput+    ArchiveProductSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionPage.tsx */ (+        input: ArchiveProductSubscriptionInput+    ) => ArchiveProductSubscriptionOutput+    ProductSubscriptionsDotCom: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionsPage.tsx */ (+        input: ProductSubscriptionsDotComInput+    ) => ProductSubscriptionsDotComOutput+    ProductLicenseInfo: /* src/enterprise/site-admin/productSubscription/ProductSubscriptionStatus.tsx */ (+        input: ProductLicenseInfoInput+    ) => ProductLicenseInfoOutput+    PreviewProductSubscriptionInvoice: /* src/enterprise/user/productSubscriptions/NewProductSubscriptionPaymentSection.tsx */ (+        input: PreviewProductSubscriptionInvoiceInput+    ) => PreviewProductSubscriptionInvoiceOutput+    ProductSubscriptionOnEditPage: /* src/enterprise/user/productSubscriptions/UserSubscriptionsEditProductSubscriptionPage.tsx */ (+        input: ProductSubscriptionOnEditPageInput+    ) => ProductSubscriptionOnEditPageOutput+    UpdatePaidProductSubscription: /* src/enterprise/user/productSubscriptions/UserSubscriptionsEditProductSubscriptionPage.tsx */ (+        input: UpdatePaidProductSubscriptionInput+    ) => UpdatePaidProductSubscriptionOutput+    CreatePaidProductSubscription: /* src/enterprise/user/productSubscriptions/UserSubscriptionsNewProductSubscriptionPage.tsx */ (+        input: CreatePaidProductSubscriptionInput+    ) => CreatePaidProductSubscriptionOutput+    ProductSubscription: /* src/enterprise/user/productSubscriptions/UserSubscriptionsProductSubscriptionPage.tsx */ (+        input: ProductSubscriptionInput+    ) => ProductSubscriptionOutput+    ProductSubscriptions: /* src/enterprise/user/productSubscriptions/UserSubscriptionsProductSubscriptionsPage.tsx */ (+        input: ProductSubscriptionsInput+    ) => ProductSubscriptionsOutput+    DeleteExternalAccount: /* src/enterprise/user/settings/ExternalAccountNode.tsx */ (+        input: DeleteExternalAccountInput+    ) => DeleteExternalAccountOutput+    UserExternalAccounts: /* src/enterprise/user/settings/UserSettingsExternalAccountsPage.tsx */ (+        input: UserExternalAccountsInput+    ) => UserExternalAccountsOutput+    RegistryExtensions: /* src/extensions/ExtensionsList.tsx */ (+        input: RegistryExtensionsInput+    ) => RegistryExtensionsOutput+    RegistryExtension: /* src/extensions/extension/ExtensionArea.tsx */ (+        input: RegistryExtensionInput+    ) => RegistryExtensionOutput+    SubmitSurvey: /* src/marketing/backend.tsx */ (input: SubmitSurveyInput) => SubmitSurveyOutput+    FetchSurveyResponses: /* src/marketing/backend.tsx */ (+        input: FetchSurveyResponsesInput+    ) => FetchSurveyResponsesOutput+    FetchAllUsersWithSurveyResponses: /* src/marketing/backend.tsx */ (+        input: FetchAllUsersWithSurveyResponsesInput+    ) => FetchAllUsersWithSurveyResponsesOutput+    FetchSurveyResponseAggregates: /* src/marketing/backend.tsx */ (+        input: FetchSurveyResponseAggregatesInput+    ) => FetchSurveyResponseAggregatesOutput+    RequestTrial: /* src/marketing/backend.tsx */ (input: RequestTrialInput) => RequestTrialOutput+    StatusMessages: /* src/nav/StatusMessagesNavItem.tsx */ (input: StatusMessagesInput) => StatusMessagesOutput+    createOrganization: /* src/org/backend.tsx */ (input: createOrganizationInput) => createOrganizationOutput+    removeUserFromOrganization: /* src/org/backend.tsx */ (+        input: removeUserFromOrganizationInput+    ) => removeUserFromOrganizationOutput+    UpdateOrganization: /* src/org/backend.tsx */ (input: UpdateOrganizationInput) => UpdateOrganizationOutput+    Organization: /* src/org/area/OrgArea.tsx */ (input: OrganizationInput) => OrganizationOutput+    RespondToOrganizationInvitation: /* src/org/area/OrgInvitationPage.tsx */ (+        input: RespondToOrganizationInvitationInput+    ) => RespondToOrganizationInvitationOutput+    OrganizationMembers: /* src/org/area/OrgMembersPage.tsx */ (+        input: OrganizationMembersInput+    ) => OrganizationMembersOutput+    InviteUserToOrganization: /* src/org/invite/InviteForm.tsx */ (+        input: InviteUserToOrganizationInput+    ) => InviteUserToOrganizationOutput+    AddUserToOrganization: /* src/org/invite/InviteForm.tsx */ (+        input: AddUserToOrganizationInput+    ) => AddUserToOrganizationOutput+    ViewerSettings: /* src/platform/context.ts */ (input: ViewerSettingsInput) => ViewerSettingsOutput+    RepositoryGitRefs: /* src/repo/GitReference.tsx */ (input: RepositoryGitRefsInput) => RepositoryGitRefsOutput+    FetchCommits: /* src/repo/RepoRevisionSidebarCommits.tsx */ (input: FetchCommitsInput) => FetchCommitsOutput+    RepositoriesForPopover: /* src/repo/RepositoriesPopover.tsx */ (+        input: RepositoriesForPopoverInput+    ) => RepositoriesForPopoverOutput+    RepositoryGitCommit: /* src/repo/RevisionsPopover.tsx */ (+        input: RepositoryGitCommitInput+    ) => RepositoryGitCommitOutput+    RepositoryRedirect: /* src/repo/backend.ts */ (input: RepositoryRedirectInput) => RepositoryRedirectOutput+    ResolveRev: /* src/repo/backend.ts */ (input: ResolveRevInput) => ResolveRevOutput+    HighlightedFile: /* src/repo/backend.ts */ (input: HighlightedFileInput) => HighlightedFileOutput+    FileExternalLinks: /* src/repo/backend.ts */ (input: FileExternalLinksInput) => FileExternalLinksOutput+    TreeEntries: /* src/repo/backend.ts */ (input: TreeEntriesInput) => TreeEntriesOutput+    Blob: /* src/repo/blob/BlobPage.tsx */ (input: BlobInput) => BlobOutput+    RepositoryGitBranchesOverview: /* src/repo/branches/RepositoryBranchesOverviewPage.tsx */ (+        input: RepositoryGitBranchesOverviewInput+    ) => RepositoryGitBranchesOverviewOutput+    RepositoryCommit: /* src/repo/commit/RepositoryCommitPage.tsx */ (+        input: RepositoryCommitInput+    ) => RepositoryCommitOutput+    RepositoryGitCommits: /* src/repo/commits/RepositoryCommitsPage.tsx */ (+        input: RepositoryGitCommitsInput+    ) => RepositoryGitCommitsOutput+    RepositoryComparisonCommits: /* src/repo/compare/RepositoryCompareCommitsPage.tsx */ (+        input: RepositoryComparisonCommitsInput+    ) => RepositoryComparisonCommitsOutput+    RepositoryComparisonDiff: /* src/repo/compare/RepositoryCompareDiffPage.tsx */ (+        input: RepositoryComparisonDiffInput+    ) => RepositoryComparisonDiffOutput+    RepositoryComparison: /* src/repo/compare/RepositoryCompareOverviewPage.tsx */ (+        input: RepositoryComparisonInput+    ) => RepositoryComparisonOutput+    ExploreRepositories: /* src/repo/explore/RepositoriesExploreSection.tsx */ (+        input: ExploreRepositoriesInput+    ) => ExploreRepositoriesOutput+    RepositoryTextSearchIndex: /* src/repo/settings/RepoSettingsIndexPage.tsx */ (+        input: RepositoryTextSearchIndexInput+    ) => RepositoryTextSearchIndexOutput+    Repository: /* src/repo/settings/backend.tsx */ (input: RepositoryInput) => RepositoryOutput+    RepositoryContributors: /* src/repo/stats/RepositoryStatsContributorsPage.tsx */ (+        input: RepositoryContributorsInput+    ) => RepositoryContributorsOutput+    TreeCommits: /* src/repo/tree/TreePage.tsx */ (input: TreeCommitsInput) => TreeCommitsOutput+    Search: /* src/search/backend.tsx */ (input: SearchInput) => SearchOutput+    RepoGroups: /* src/search/backend.tsx */ (input: RepoGroupsInput) => RepoGroupsOutput+    SearchSuggestions: /* src/search/backend.tsx */ (input: SearchSuggestionsInput) => SearchSuggestionsOutput+    ReposByQuery: /* src/search/backend.tsx */ (input: ReposByQueryInput) => ReposByQueryOutput+    savedSearches: /* src/search/backend.tsx */ (input: savedSearchesInput) => savedSearchesOutput+    SavedSearch: /* src/search/backend.tsx */ (input: SavedSearchInput) => SavedSearchOutput+    CreateSavedSearch: /* src/search/backend.tsx */ (input: CreateSavedSearchInput) => CreateSavedSearchOutput+    UpdateSavedSearch: /* src/search/backend.tsx */ (input: UpdateSavedSearchInput) => UpdateSavedSearchOutput+    DeleteSavedSearch: /* src/search/backend.tsx */ (input: DeleteSavedSearchInput) => DeleteSavedSearchOutput+    highlightCode: /* src/search/backend.tsx */ (input: highlightCodeInput) => highlightCodeOutput+    ManyReposWarning: /* src/search/backend.tsx */ (input: ManyReposWarningInput) => ManyReposWarningOutput+    SettingsCascade: /* src/settings/SettingsArea.tsx */ (input: SettingsCascadeInput) => SettingsCascadeOutput+    DeleteAccessToken: /* src/settings/tokens/AccessTokenNode.tsx */ (+        input: DeleteAccessTokenInput+    ) => DeleteAccessTokenOutput+    SiteFlags: /* src/site/backend.tsx */ (input: SiteFlagsInput) => SiteFlagsOutput+    addExternalService: /* src/site-admin/SiteAdminAddExternalServicePage.tsx */ (+        input: addExternalServiceInput+    ) => addExternalServiceOutput+    UpdateExternalService: /* src/site-admin/SiteAdminExternalServicePage.tsx */ (+        input: UpdateExternalServiceInput+    ) => UpdateExternalServiceOutput+    ExternalService: /* src/site-admin/SiteAdminExternalServicePage.tsx */ (+        input: ExternalServiceInput+    ) => ExternalServiceOutput+    DeleteExternalService: /* src/site-admin/SiteAdminExternalServicesPage.tsx */ (+        input: DeleteExternalServiceInput+    ) => DeleteExternalServiceOutput+    ExternalServices: /* src/site-admin/SiteAdminExternalServicesPage.tsx */ (+        input: ExternalServicesInput+    ) => ExternalServicesOutput+    SiteAdminAccessTokens: /* src/site-admin/SiteAdminTokensPage.tsx */ (+        input: SiteAdminAccessTokensInput+    ) => SiteAdminAccessTokensOutput+    Users: /* src/site-admin/backend.tsx */ (input: UsersInput) => UsersOutput+    Organizations: /* src/site-admin/backend.tsx */ (input: OrganizationsInput) => OrganizationsOutput+    Repositories: /* src/site-admin/backend.tsx */ (input: RepositoriesInput) => RepositoriesOutput+    UpdateMirrorRepository: /* src/site-admin/backend.tsx */ (+        input: UpdateMirrorRepositoryInput+    ) => UpdateMirrorRepositoryOutput+    CheckMirrorRepositoryConnection: /* src/site-admin/backend.tsx */ (+        input: CheckMirrorRepositoryConnectionInput+    ) => CheckMirrorRepositoryConnectionOutput+    ScheduleRepositoryPermissionsSync: /* src/site-admin/backend.tsx */ (+        input: ScheduleRepositoryPermissionsSyncInput+    ) => ScheduleRepositoryPermissionsSyncOutput+    ScheduleUserPermissionsSync: /* src/site-admin/backend.tsx */ (+        input: ScheduleUserPermissionsSyncInput+    ) => ScheduleUserPermissionsSyncOutput+    UserUsageStatistics: /* src/site-admin/backend.tsx */ (input: UserUsageStatisticsInput) => UserUsageStatisticsOutput+    SiteUsageStatistics: /* src/site-admin/backend.tsx */ (input: SiteUsageStatisticsInput) => SiteUsageStatisticsOutput+    Site: /* src/site-admin/backend.tsx */ (input: SiteInput) => SiteOutput+    AllConfig: /* src/site-admin/backend.tsx */ (input: AllConfigInput) => AllConfigOutput+    UpdateSiteConfiguration: /* src/site-admin/backend.tsx */ (+        input: UpdateSiteConfigurationInput+    ) => UpdateSiteConfigurationOutput+    ReloadSite: /* src/site-admin/backend.tsx */ (input: ReloadSiteInput) => ReloadSiteOutput+    SetUserIsSiteAdmin: /* src/site-admin/backend.tsx */ (input: SetUserIsSiteAdminInput) => SetUserIsSiteAdminOutput+    RandomizeUserPassword: /* src/site-admin/backend.tsx */ (+        input: RandomizeUserPasswordInput+    ) => RandomizeUserPasswordOutput+    DeleteUser: /* src/site-admin/backend.tsx */ (input: DeleteUserInput) => DeleteUserOutput+    CreateUser: /* src/site-admin/backend.tsx */ (input: CreateUserInput) => CreateUserOutput+    DeleteOrganization: /* src/site-admin/backend.tsx */ (input: DeleteOrganizationInput) => DeleteOrganizationOutput+    SiteUpdateCheck: /* src/site-admin/backend.tsx */ (input: SiteUpdateCheckInput) => SiteUpdateCheckOutput+    SiteMonitoringStatistics: /* src/site-admin/backend.tsx */ (+        input: SiteMonitoringStatisticsInput+    ) => SiteMonitoringStatisticsOutput+    Overview: /* src/site-admin/overview/SiteAdminOverviewPage.tsx */ (input: OverviewInput) => OverviewOutput+    WAUs: /* src/site-admin/overview/SiteAdminOverviewPage.tsx */ (input: WAUsInput) => WAUsOutput+    Symbols: /* src/symbols/backend.tsx */ (input: SymbolsInput) => SymbolsOutput+    SiteAdminActivationStatus: /* src/tracking/withActivation.tsx */ (+        input: SiteAdminActivationStatusInput+    ) => SiteAdminActivationStatusOutput+    ActivationStatus: /* src/tracking/withActivation.tsx */ (input: ActivationStatusInput) => ActivationStatusOutput+    LinksForRepositories: /* src/tracking/withActivation.tsx */ (+        input: LinksForRepositoriesInput+    ) => LinksForRepositoriesOutput+    UserEventLogs: /* src/user/UserEventLogsPage.tsx */ (input: UserEventLogsInput) => UserEventLogsOutput+    User: /* src/user/area/UserArea.tsx */ (input: UserInput) => UserOutput+    updateUser: /* src/user/settings/backend.tsx */ (input: updateUserInput) => updateUserOutput+    updatePassword: /* src/user/settings/backend.tsx */ (input: updatePasswordInput) => updatePasswordOutput+    SetUserEmailVerified: /* src/user/settings/backend.tsx */ (+        input: SetUserEmailVerifiedInput+    ) => SetUserEmailVerifiedOutput+    logUserEvent: /* src/user/settings/backend.tsx */ (input: logUserEventInput) => logUserEventOutput+    logEvent: /* src/user/settings/backend.tsx */ (input: logEventInput) => logEventOutput+    CreateAccessToken: /* src/user/settings/accessTokens/UserSettingsCreateAccessTokenPage.tsx */ (+        input: CreateAccessTokenInput+    ) => CreateAccessTokenOutput+    AccessTokens: /* src/user/settings/accessTokens/UserSettingsTokensPage.tsx */ (+        input: AccessTokensInput+    ) => AccessTokensOutput+    AddUserEmail: /* src/user/settings/emails/AddUserEmailForm.tsx */ (input: AddUserEmailInput) => AddUserEmailOutput+    RemoveUserEmail: /* src/user/settings/emails/UserSettingsEmailsPage.tsx */ (+        input: RemoveUserEmailInput+    ) => RemoveUserEmailOutput+    UserEmails: /* src/user/settings/emails/UserSettingsEmailsPage.tsx */ (input: UserEmailsInput) => UserEmailsOutput+    UserForProfilePage: /* src/user/settings/profile/UserSettingsProfilePage.tsx */ (+        input: UserForProfilePageInput+    ) => UserForProfilePageOutput+}+export type CurrentAuthStateInput = {}+export type CurrentAuthStateOutput = {+    currentUser: {+        __typename: 'User'+        id: string+        databaseID: number+        username: string+        avatarURL: string | null+        email: string+        displayName: string | null+        siteAdmin: boolean+        tags: string[]+        url: string+        settingsURL: string | null+        organizations: {+            nodes: {+                id: string+                name: string+                displayName: string | null+                url: string+                settingsURL: string | null+            }[]+        }+        session: {+            canSignOut: boolean+        }+        viewerCanAdminister: boolean+    } | null+}+export type FileDiffHunkRangeFields = {+    startLine: number+    lines: number+}+export type DiffStatFields = {+    added: number+    changed: number+    deleted: number+}+export type FileDiffFields = {+    __typename: 'FileDiff'+    oldPath: string | null+    oldFile: {+        __typename: string+        binary: boolean+        byteSize: number+    } | null+    newFile: {+        __typename: string+        binary: boolean+        byteSize: number+    } | null+    newPath: string | null+    mostRelevantFile: {+        __typename: string+        url: string+    }+    hunks: {+        oldRange: {+            startLine: number+            lines: number+        }+        oldNoNewlineAt: boolean+        newRange: {+            startLine: number+            lines: number+        }+        section: string | null+        highlight: {+            aborted: boolean+            lines: {+                kind: 'ADDED' | 'UNCHANGED' | 'DELETED'+                html: string+            }[]+        }+    }[]+    stat: {+        added: number+        changed: number+        deleted: number+    }+    internalID: string+}+export type RepositoryIDInput = {+    repoName: string+}+export type RepositoryIDOutput = {+    repository: {+        id: string+    } | null+}+export type CreateChangesetInput = {+    repositoryID: string+    externalID: string+}+export type CreateChangesetOutput = {+    createChangesets: {+        id: string+    }[]+}+export type AddChangeSetToCampaignInput = {+    campaignID: string+    changesets: string[]+}+export type AddChangeSetToCampaignOutput = {+    addChangesetsToCampaign: {+        id: string+    }+}+export type CampaignFields = {+    __typename: 'Campaign'+    id: string+    name: string+    description: string | null+    author: {+        username: string+        avatarURL: string | null+    }+    status: {+        completedCount: number+        pendingCount: number+        state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'CANCELED'+        errors: string[]+    }+    branch: string | null+    createdAt: any+    updatedAt: any+    closedAt: any | null+    viewerCanAdminister: boolean+    hasUnpublishedPatches: boolean+    changesets: {+        totalCount: number+    }+    patches: {+        totalCount: number+    }+    changesetCountsOverTime: {+        date: any+        merged: number+        closed: number+        openApproved: number+        openChangesRequested: number+        openPending: number+        total: number+    }[]+    diffStat: DiffStatFields1+}+export type DiffStatFields1 = {+    added: number+    changed: number+    deleted: number+}+export type PatchSetFields = {+    __typename: 'PatchSet'+    id: string+    diffStat: DiffStatFields2+    patches: {+        totalCount: number+    }+}+export type DiffStatFields2 = {+    added: number+    changed: number+    deleted: number+}+export type UpdateCampaignInput = {+    update: {+        id: string+        name: string | null+        branch: string | null+        description: string | null+        patchSet: string | null+    }+}+export type UpdateCampaignOutput = {+    updateCampaign: CampaignFields1+}+export type CampaignFields1 = {+    __typename: 'Campaign'+    id: string+    name: string+    description: string | null+    author: {+        username: string+        avatarURL: string | null+    }+    status: {+        completedCount: number+        pendingCount: number+        state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'CANCELED'+        errors: string[]+    }+    branch: string | null+    createdAt: any+    updatedAt: any+    closedAt: any | null+    viewerCanAdminister: boolean+    hasUnpublishedPatches: boolean+    changesets: {+        totalCount: number+    }+    patches: {+        totalCount: number+    }+    changesetCountsOverTime: {+        date: any+        merged: number+        closed: number+        openApproved: number+        openChangesRequested: number+        openPending: number+        total: number+    }[]+    diffStat: DiffStatFields3+}+export type DiffStatFields3 = {+    added: number+    changed: number+    deleted: number+}+export type CreateCampaignInput = {+    input: {+        namespace: string+        name: string+        description: string | null+        branch: string | null+        patchSet: string | null+    }+}+export type CreateCampaignOutput = {+    createCampaign: {+        id: string+        url: string+    }+}+export type RetryCampaignChangesetsInput = {+    campaign: string+}+export type RetryCampaignChangesetsOutput = {+    retryCampaignChangesets: CampaignFields2+}+export type CampaignFields2 = {+    __typename: 'Campaign'+    id: string+    name: string+    description: string | null+    author: {+        username: string+        avatarURL: string | null+    }+    status: {+        completedCount: number+        pendingCount: number+        state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'CANCELED'+        errors: string[]+    }+    branch: string | null+    createdAt: any+    updatedAt: any+    closedAt: any | null+    viewerCanAdminister: boolean+    hasUnpublishedPatches: boolean+    changesets: {+        totalCount: number+    }+    patches: {+        totalCount: number+    }+    changesetCountsOverTime: {+        date: any+        merged: number+        closed: number+        openApproved: number+        openChangesRequested: number+        openPending: number+        total: number+    }[]+    diffStat: DiffStatFields4+}+export type DiffStatFields4 = {+    added: number+    changed: number+    deleted: number+}+export type PublishCampaignChangesetsInput = {+    campaign: string+}+export type PublishCampaignChangesetsOutput = {+    publishCampaignChangesets: CampaignFields3+}+export type CampaignFields3 = {+    __typename: 'Campaign'+    id: string+    name: string+    description: string | null+    author: {+        username: string+        avatarURL: string | null+    }+    status: {+        completedCount: number+        pendingCount: number+        state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'CANCELED'+        errors: string[]+    }+    branch: string | null+    createdAt: any+    updatedAt: any+    closedAt: any | null+    viewerCanAdminister: boolean+    hasUnpublishedPatches: boolean+    changesets: {+        totalCount: number+    }+    patches: {+        totalCount: number+    }+    changesetCountsOverTime: {+        date: any+        merged: number+        closed: number+        openApproved: number+        openChangesRequested: number+        openPending: number+        total: number+    }[]+    diffStat: DiffStatFields5+}+export type DiffStatFields5 = {+    added: number+    changed: number+    deleted: number+}+export type CloseCampaignInput = {+    campaign: string+    closeChangesets: boolean+}+export type CloseCampaignOutput = {+    closeCampaign: {+        id: string+    }+}+export type DeleteCampaignInput = {+    campaign: string+    closeChangesets: boolean+}+export type DeleteCampaignOutput = {+    deleteCampaign: {+        alwaysNil: string | null+    } | null+}+export type CampaignByIDInput = {+    campaign: string+}+export type CampaignByIDOutput = {+    node:+        | ({+              __typename: string+          } & CampaignFields4)+        | null+}+export type CampaignFields4 = {+    __typename: 'Campaign'+    id: string+    name: string+    description: string | null+    author: {+        username: string+        avatarURL: string | null+    }+    status: {+        completedCount: number+        pendingCount: number+        state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'CANCELED'+        errors: string[]+    }+    branch: string | null+    createdAt: any+    updatedAt: any+    closedAt: any | null+    viewerCanAdminister: boolean+    hasUnpublishedPatches: boolean+    changesets: {+        totalCount: number+    }+    patches: {+        totalCount: number+    }+    changesetCountsOverTime: {+        date: any+        merged: number+        closed: number+        openApproved: number+        openChangesRequested: number+        openPending: number+        total: number+    }[]+    diffStat: DiffStatFields6+}+export type DiffStatFields6 = {+    added: number+    changed: number+    deleted: number+}+export type PatchSetByIDInput = {+    patchSet: string+}+export type PatchSetByIDOutput = {+    node:+        | ({+              __typename: string+          } & PatchSetFields1)+        | null+}+export type PatchSetFields1 = {+    __typename: 'PatchSet'+    id: string+    diffStat: DiffStatFields7+    patches: {+        totalCount: number+    }+}+export type DiffStatFields7 = {+    added: number+    changed: number+    deleted: number+}+export type CampaignChangesetsInput = {+    campaign: string+    first: number | null+    state: ('OPEN' | 'CLOSED' | 'MERGED' | 'DELETED') | null+    reviewState: ('APPROVED' | 'CHANGES_REQUESTED' | 'PENDING' | 'COMMENTED' | 'DISMISSED') | null+    checkState: ('PENDING' | 'PASSED' | 'FAILED') | null+}+export type CampaignChangesetsOutput = {+    node:+        | ({+              __typename: string+          } & {+              changesets: {+                  totalCount: number+                  nodes: ({+                      __typename: string+                      state: 'OPEN' | 'CLOSED' | 'MERGED' | 'DELETED'+                      createdAt: any+                      updatedAt: any+                      nextSyncAt: any | null+                  } & {+                      id: string+                  } & {+                      id: string+                      title: string+                      body: string+                      reviewState: 'APPROVED' | 'CHANGES_REQUESTED' | 'PENDING' | 'COMMENTED' | 'DISMISSED'+                      checkState: ('PENDING' | 'PASSED' | 'FAILED') | null+                      labels: {+                          text: string+                          description: string | null+                          color: string+                      }[]+                      repository: {+                          id: string+                          name: string+                          url: string+                      }+                      externalURL: {+                          url: string+                      }+                      externalID: string+                      diff: {+                          fileDiffs: {+                              diffStat: DiffStatFields8+                          }+                      } | null+                      diffStat: {+                          added: number+                          changed: number+                          deleted: number+                      } | null+                  })[]+              }+          })+        | null+}+export type DiffStatFields8 = {+    added: number+    changed: number+    deleted: number+}+export type CampaignPatchesInput = {+    campaign: string+    first: number | null+}+export type CampaignPatchesOutput = {+    node:+        | ({+              __typename: string+          } & {+              patches: {+                  totalCount: number+                  nodes: ({+                      __typename: string+                  } & {+                      id: string+                  } & {+                      id: string+                      repository: {+                          id: string+                          name: string+                          url: string+                      }+                      publishable: boolean+                      publicationEnqueued: boolean+                      diff: {+                          fileDiffs: {+                              diffStat: DiffStatFields9+                          }+                      }+                  })[]+              }+          })+        | null+}+export type DiffStatFields9 = {+    added: number+    changed: number+    deleted: number+}+export type PatchSetPatchesInput = {+    patchSet: string+    first: number | null+}+export type PatchSetPatchesOutput = {+    node:+        | ({+              __typename: string+          } & {+              patches: {+                  totalCount: number+                  nodes: ({+                      __typename: string+                      id: string+                  } & {+                      repository: {+                          id: string+                          name: string+                          url: string+                      }+                      publishable: boolean+                      publicationEnqueued: boolean+                      diff: {+                          fileDiffs: {+                              diffStat: DiffStatFields10+                          }+                      }+                  })[]+              }+          })+        | null+}+export type DiffStatFields10 = {+    added: number+    changed: number+    deleted: number+}

Yes, but it is not a part of the spec. Some tools like Relay compiler enforce uniqueness. In our codebase we have at least several different fragments under the same name. So I don't know how to handle this properly, If we enforce all fragment names to be unique that will make things easier for sure.

twop

comment created time in a month

Pull request review commentsourcegraph/sourcegraph

typesafe stubbing of graphQL requests for integration tests

+/* eslint-disable quotes */+/* eslint-disable @typescript-eslint/consistent-type-definitions */+/* This is an autogenerated file. Do not edit this file directly! */+export interface SharedGQLOperations {+    ResolveRawRepoName: /* src/backend/repo.ts */ (input: ResolveRawRepoNameInput) => ResolveRawRepoNameOutput+    Extensions: /* src/extensions/helpers.ts */ (input: ExtensionsInput) => ExtensionsOutput+    EditSettings: /* src/settings/edit.ts */ (input: EditSettingsInput) => EditSettingsOutput+    OverwriteSettings: /* src/settings/edit.ts */ (input: OverwriteSettingsInput) => OverwriteSettingsOutput+    ExternalServicesForTests: /* src/testing/driver.ts */ (+        input: ExternalServicesForTestsInput+    ) => ExternalServicesForTestsOutput+    SiteForTests: /* src/testing/driver.ts */ (input: SiteForTestsInput) => SiteForTestsOutput+    UpdateSiteConfigurationForTests: /* src/testing/driver.ts */ (+        input: UpdateSiteConfigurationForTestsInput+    ) => UpdateSiteConfigurationForTestsOutput+    UserSettingsForTests: /* src/testing/driver.ts */ (input: UserSettingsForTestsInput) => UserSettingsForTestsOutput+    OverwriteSettingsForTests: /* src/testing/driver.ts */ (+        input: OverwriteSettingsForTestsInput+    ) => OverwriteSettingsForTestsOutput+}+export type ResolveRawRepoNameInput = {+    repoName: string+}+export type ResolveRawRepoNameOutput = {

Totally, will do

twop

comment created time in a month

Pull request review commentsourcegraph/sourcegraph

typesafe stubbing of graphQL requests for integration tests

 type IntegrationTestInitGeneration = () => Promise<{     subscriptions?: Subscription }> -export type GraphQLOverrides = Record<string, SuccessGraphQLResult<IQuery | IMutation> | ErrorGraphQLResult>+type PotentialOverrides<T> = Partial<+    { [K in keyof T]: T[K] extends (input: any) => infer Output ? Output | ErrorGraphQLResult : never }

oh ReturnType default is any, not never. I think I like never more

twop

comment created time in a month

Pull request review commentsourcegraph/sourcegraph

typesafe stubbing of graphQL requests for integration tests

 type IntegrationTestInitGeneration = () => Promise<{     subscriptions?: Subscription }> -export type GraphQLOverrides = Record<string, SuccessGraphQLResult<IQuery | IMutation> | ErrorGraphQLResult>+type PotentialOverrides<T> = Partial<+    { [K in keyof T]: T[K] extends (input: any) => infer Output ? Output | ErrorGraphQLResult : never }

If you mean that it can be replaced with ReturnType totally. Internally it is implemented in the same way

type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;

Is there way to extract an inner type without conditionals?

twop

comment created time in a month

Pull request review commentsourcegraph/sourcegraph

typesafe stubbing of graphQL requests for integration tests

+/* eslint-disable quotes */+/* eslint-disable @typescript-eslint/consistent-type-definitions */+/* This is an autogenerated file. Do not edit this file directly! */+export interface WebGQLOperations {+    CurrentAuthState: /* src/auth.ts */ (input: CurrentAuthStateInput) => CurrentAuthStateOutput+    RepositoryID: /* src/enterprise/campaigns/detail/AddChangesetForm.tsx */ (+        input: RepositoryIDInput+    ) => RepositoryIDOutput+    CreateChangeset: /* src/enterprise/campaigns/detail/AddChangesetForm.tsx */ (+        input: CreateChangesetInput+    ) => CreateChangesetOutput+    AddChangeSetToCampaign: /* src/enterprise/campaigns/detail/AddChangesetForm.tsx */ (+        input: AddChangeSetToCampaignInput+    ) => AddChangeSetToCampaignOutput+    UpdateCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: UpdateCampaignInput+    ) => UpdateCampaignOutput+    CreateCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: CreateCampaignInput+    ) => CreateCampaignOutput+    RetryCampaignChangesets: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: RetryCampaignChangesetsInput+    ) => RetryCampaignChangesetsOutput+    PublishCampaignChangesets: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: PublishCampaignChangesetsInput+    ) => PublishCampaignChangesetsOutput+    CloseCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (input: CloseCampaignInput) => CloseCampaignOutput+    DeleteCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: DeleteCampaignInput+    ) => DeleteCampaignOutput+    CampaignByID: /* src/enterprise/campaigns/detail/backend.ts */ (input: CampaignByIDInput) => CampaignByIDOutput+    PatchSetByID: /* src/enterprise/campaigns/detail/backend.ts */ (input: PatchSetByIDInput) => PatchSetByIDOutput+    CampaignChangesets: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: CampaignChangesetsInput+    ) => CampaignChangesetsOutput+    CampaignPatches: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: CampaignPatchesInput+    ) => CampaignPatchesOutput+    PatchSetPatches: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: PatchSetPatchesInput+    ) => PatchSetPatchesOutput+    PublishChangeset: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: PublishChangesetInput+    ) => PublishChangesetOutput+    SyncChangeset: /* src/enterprise/campaigns/detail/backend.ts */ (input: SyncChangesetInput) => SyncChangesetOutput+    ExternalChangesetFileDiffs: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: ExternalChangesetFileDiffsInput+    ) => ExternalChangesetFileDiffsOutput+    PatchFileDiffs: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: PatchFileDiffsInput+    ) => PatchFileDiffsOutput+    Campaigns: /* src/enterprise/campaigns/global/list/backend.ts */ (input: CampaignsInput) => CampaignsOutput+    CampaignsCount: /* src/enterprise/campaigns/global/list/backend.ts */ (+        input: CampaignsCountInput+    ) => CampaignsCountOutput+    LsifUploads: /* src/enterprise/codeintel/backend.tsx */ (input: LsifUploadsInput) => LsifUploadsOutput+    LsifUploadsWithRepo: /* src/enterprise/codeintel/backend.tsx */ (+        input: LsifUploadsWithRepoInput+    ) => LsifUploadsWithRepoOutput+    LsifUpload: /* src/enterprise/codeintel/backend.tsx */ (input: LsifUploadInput) => LsifUploadOutput+    DeleteLsifUpload: /* src/enterprise/codeintel/backend.tsx */ (+        input: DeleteLsifUploadInput+    ) => DeleteLsifUploadOutput+    LsifIndexes: /* src/enterprise/codeintel/backend.tsx */ (input: LsifIndexesInput) => LsifIndexesOutput+    LsifIndexesWithRepo: /* src/enterprise/codeintel/backend.tsx */ (+        input: LsifIndexesWithRepoInput+    ) => LsifIndexesWithRepoOutput+    LsifIndex: /* src/enterprise/codeintel/backend.tsx */ (input: LsifIndexInput) => LsifIndexOutput+    DeleteLsifIndex: /* src/enterprise/codeintel/backend.tsx */ (input: DeleteLsifIndexInput) => DeleteLsifIndexOutput+    ProductPlans: /* src/enterprise/dotcom/productPlans/ProductPlanFormControl.tsx */ (+        input: ProductPlansInput+    ) => ProductPlansOutput+    ExploreExtensions: /* src/enterprise/extensions/explore/ExtensionsExploreSection.tsx */ (+        input: ExploreExtensionsInput+    ) => ExploreExtensionsOutput+    UpdateRegistryExtension: /* src/enterprise/extensions/extension/RegistryExtensionManagePage.tsx */ (+        input: UpdateRegistryExtensionInput+    ) => UpdateRegistryExtensionOutput+    PublishRegistryExtension: /* src/enterprise/extensions/extension/RegistryExtensionNewReleasePage.tsx */ (+        input: PublishRegistryExtensionInput+    ) => PublishRegistryExtensionOutput+    CreateRegistryExtension: /* src/enterprise/extensions/registry/RegistryNewExtensionPage.tsx */ (+        input: CreateRegistryExtensionInput+    ) => CreateRegistryExtensionOutput+    DeleteRegistryExtension: /* src/enterprise/extensions/registry/backend.ts */ (+        input: DeleteRegistryExtensionInput+    ) => DeleteRegistryExtensionOutput+    ViewerRegistryPublishers: /* src/enterprise/extensions/registry/backend.ts */ (+        input: ViewerRegistryPublishersInput+    ) => ViewerRegistryPublishersOutput+    ViewerNamespaces: /* src/enterprise/namespaces/backend.ts */ (+        input: ViewerNamespacesInput+    ) => ViewerNamespacesOutput+    LsifUploadsForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: LsifUploadsForRepoInput+    ) => LsifUploadsForRepoOutput+    LsifUploadForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: LsifUploadForRepoInput+    ) => LsifUploadForRepoOutput+    DeleteLsifUploadForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: DeleteLsifUploadForRepoInput+    ) => DeleteLsifUploadForRepoOutput+    LsifIndexesForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: LsifIndexesForRepoInput+    ) => LsifIndexesForRepoOutput+    LsifIndexForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: LsifIndexForRepoInput+    ) => LsifIndexForRepoOutput+    DeleteLsifIndexForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: DeleteLsifIndexForRepoInput+    ) => DeleteLsifIndexForRepoOutput+    SearchResultsStats: /* src/enterprise/search/stats/backend.ts */ (+        input: SearchResultsStatsInput+    ) => SearchResultsStatsOutput+    AuthProviders: /* src/enterprise/site-admin/SiteAdminAuthenticationProvidersPage.tsx */ (+        input: AuthProvidersInput+    ) => AuthProvidersOutput+    ExternalAccounts: /* src/enterprise/site-admin/SiteAdminExternalAccountsPage.tsx */ (+        input: ExternalAccountsInput+    ) => ExternalAccountsOutput+    SiteAdminRegistryExtensions: /* src/enterprise/site-admin/SiteAdminRegistryExtensionsPage.tsx */ (+        input: SiteAdminRegistryExtensionsInput+    ) => SiteAdminRegistryExtensionsOutput+    SiteAdminLsifUpload: /* src/enterprise/site-admin/backend.ts */ (+        input: SiteAdminLsifUploadInput+    ) => SiteAdminLsifUploadOutput+    SetCustomerBilling: /* src/enterprise/site-admin/dotcom/customers/SiteAdminCustomerBillingLink.tsx */ (+        input: SetCustomerBillingInput+    ) => SetCustomerBillingOutput+    Customers: /* src/enterprise/site-admin/dotcom/customers/SiteAdminCustomersPage.tsx */ (+        input: CustomersInput+    ) => CustomersOutput+    CreateProductSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminCreateProductSubscriptionPage.tsx */ (+        input: CreateProductSubscriptionInput+    ) => CreateProductSubscriptionOutput+    ProductSubscriptionAccounts: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminCreateProductSubscriptionPage.tsx */ (+        input: ProductSubscriptionAccountsInput+    ) => ProductSubscriptionAccountsOutput+    GenerateProductLicenseForSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminGenerateProductLicenseForSubscriptionForm.tsx */ (+        input: GenerateProductLicenseForSubscriptionInput+    ) => GenerateProductLicenseForSubscriptionOutput+    DotComProductLicenses: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductLicensesPage.tsx */ (+        input: DotComProductLicensesInput+    ) => DotComProductLicensesOutput+    SetProductSubscriptionBilling: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionBillingLink.tsx */ (+        input: SetProductSubscriptionBillingInput+    ) => SetProductSubscriptionBillingOutput+    DotComProductSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionPage.tsx */ (+        input: DotComProductSubscriptionInput+    ) => DotComProductSubscriptionOutput+    ProductLicenses: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionPage.tsx */ (+        input: ProductLicensesInput+    ) => ProductLicensesOutput+    ArchiveProductSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionPage.tsx */ (+        input: ArchiveProductSubscriptionInput+    ) => ArchiveProductSubscriptionOutput+    ProductSubscriptionsDotCom: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionsPage.tsx */ (+        input: ProductSubscriptionsDotComInput+    ) => ProductSubscriptionsDotComOutput+    ProductLicenseInfo: /* src/enterprise/site-admin/productSubscription/ProductSubscriptionStatus.tsx */ (+        input: ProductLicenseInfoInput+    ) => ProductLicenseInfoOutput+    PreviewProductSubscriptionInvoice: /* src/enterprise/user/productSubscriptions/NewProductSubscriptionPaymentSection.tsx */ (+        input: PreviewProductSubscriptionInvoiceInput+    ) => PreviewProductSubscriptionInvoiceOutput+    ProductSubscriptionOnEditPage: /* src/enterprise/user/productSubscriptions/UserSubscriptionsEditProductSubscriptionPage.tsx */ (+        input: ProductSubscriptionOnEditPageInput+    ) => ProductSubscriptionOnEditPageOutput+    UpdatePaidProductSubscription: /* src/enterprise/user/productSubscriptions/UserSubscriptionsEditProductSubscriptionPage.tsx */ (+        input: UpdatePaidProductSubscriptionInput+    ) => UpdatePaidProductSubscriptionOutput+    CreatePaidProductSubscription: /* src/enterprise/user/productSubscriptions/UserSubscriptionsNewProductSubscriptionPage.tsx */ (+        input: CreatePaidProductSubscriptionInput+    ) => CreatePaidProductSubscriptionOutput+    ProductSubscription: /* src/enterprise/user/productSubscriptions/UserSubscriptionsProductSubscriptionPage.tsx */ (+        input: ProductSubscriptionInput+    ) => ProductSubscriptionOutput+    ProductSubscriptions: /* src/enterprise/user/productSubscriptions/UserSubscriptionsProductSubscriptionsPage.tsx */ (+        input: ProductSubscriptionsInput+    ) => ProductSubscriptionsOutput+    DeleteExternalAccount: /* src/enterprise/user/settings/ExternalAccountNode.tsx */ (+        input: DeleteExternalAccountInput+    ) => DeleteExternalAccountOutput+    UserExternalAccounts: /* src/enterprise/user/settings/UserSettingsExternalAccountsPage.tsx */ (+        input: UserExternalAccountsInput+    ) => UserExternalAccountsOutput+    RegistryExtensions: /* src/extensions/ExtensionsList.tsx */ (+        input: RegistryExtensionsInput+    ) => RegistryExtensionsOutput+    RegistryExtension: /* src/extensions/extension/ExtensionArea.tsx */ (+        input: RegistryExtensionInput+    ) => RegistryExtensionOutput+    SubmitSurvey: /* src/marketing/backend.tsx */ (input: SubmitSurveyInput) => SubmitSurveyOutput+    FetchSurveyResponses: /* src/marketing/backend.tsx */ (+        input: FetchSurveyResponsesInput+    ) => FetchSurveyResponsesOutput+    FetchAllUsersWithSurveyResponses: /* src/marketing/backend.tsx */ (+        input: FetchAllUsersWithSurveyResponsesInput+    ) => FetchAllUsersWithSurveyResponsesOutput+    FetchSurveyResponseAggregates: /* src/marketing/backend.tsx */ (+        input: FetchSurveyResponseAggregatesInput+    ) => FetchSurveyResponseAggregatesOutput+    RequestTrial: /* src/marketing/backend.tsx */ (input: RequestTrialInput) => RequestTrialOutput+    StatusMessages: /* src/nav/StatusMessagesNavItem.tsx */ (input: StatusMessagesInput) => StatusMessagesOutput+    createOrganization: /* src/org/backend.tsx */ (input: createOrganizationInput) => createOrganizationOutput+    removeUserFromOrganization: /* src/org/backend.tsx */ (+        input: removeUserFromOrganizationInput+    ) => removeUserFromOrganizationOutput+    UpdateOrganization: /* src/org/backend.tsx */ (input: UpdateOrganizationInput) => UpdateOrganizationOutput+    Organization: /* src/org/area/OrgArea.tsx */ (input: OrganizationInput) => OrganizationOutput+    RespondToOrganizationInvitation: /* src/org/area/OrgInvitationPage.tsx */ (+        input: RespondToOrganizationInvitationInput+    ) => RespondToOrganizationInvitationOutput+    OrganizationMembers: /* src/org/area/OrgMembersPage.tsx */ (+        input: OrganizationMembersInput+    ) => OrganizationMembersOutput+    InviteUserToOrganization: /* src/org/invite/InviteForm.tsx */ (+        input: InviteUserToOrganizationInput+    ) => InviteUserToOrganizationOutput+    AddUserToOrganization: /* src/org/invite/InviteForm.tsx */ (+        input: AddUserToOrganizationInput+    ) => AddUserToOrganizationOutput+    ViewerSettings: /* src/platform/context.ts */ (input: ViewerSettingsInput) => ViewerSettingsOutput+    RepositoryGitRefs: /* src/repo/GitReference.tsx */ (input: RepositoryGitRefsInput) => RepositoryGitRefsOutput+    FetchCommits: /* src/repo/RepoRevisionSidebarCommits.tsx */ (input: FetchCommitsInput) => FetchCommitsOutput+    RepositoriesForPopover: /* src/repo/RepositoriesPopover.tsx */ (+        input: RepositoriesForPopoverInput+    ) => RepositoriesForPopoverOutput+    RepositoryGitCommit: /* src/repo/RevisionsPopover.tsx */ (+        input: RepositoryGitCommitInput+    ) => RepositoryGitCommitOutput+    RepositoryRedirect: /* src/repo/backend.ts */ (input: RepositoryRedirectInput) => RepositoryRedirectOutput+    ResolveRev: /* src/repo/backend.ts */ (input: ResolveRevInput) => ResolveRevOutput+    HighlightedFile: /* src/repo/backend.ts */ (input: HighlightedFileInput) => HighlightedFileOutput+    FileExternalLinks: /* src/repo/backend.ts */ (input: FileExternalLinksInput) => FileExternalLinksOutput+    TreeEntries: /* src/repo/backend.ts */ (input: TreeEntriesInput) => TreeEntriesOutput+    Blob: /* src/repo/blob/BlobPage.tsx */ (input: BlobInput) => BlobOutput+    RepositoryGitBranchesOverview: /* src/repo/branches/RepositoryBranchesOverviewPage.tsx */ (+        input: RepositoryGitBranchesOverviewInput+    ) => RepositoryGitBranchesOverviewOutput+    RepositoryCommit: /* src/repo/commit/RepositoryCommitPage.tsx */ (+        input: RepositoryCommitInput+    ) => RepositoryCommitOutput+    RepositoryGitCommits: /* src/repo/commits/RepositoryCommitsPage.tsx */ (+        input: RepositoryGitCommitsInput+    ) => RepositoryGitCommitsOutput+    RepositoryComparisonCommits: /* src/repo/compare/RepositoryCompareCommitsPage.tsx */ (+        input: RepositoryComparisonCommitsInput+    ) => RepositoryComparisonCommitsOutput+    RepositoryComparisonDiff: /* src/repo/compare/RepositoryCompareDiffPage.tsx */ (+        input: RepositoryComparisonDiffInput+    ) => RepositoryComparisonDiffOutput+    RepositoryComparison: /* src/repo/compare/RepositoryCompareOverviewPage.tsx */ (+        input: RepositoryComparisonInput+    ) => RepositoryComparisonOutput+    ExploreRepositories: /* src/repo/explore/RepositoriesExploreSection.tsx */ (+        input: ExploreRepositoriesInput+    ) => ExploreRepositoriesOutput+    RepositoryTextSearchIndex: /* src/repo/settings/RepoSettingsIndexPage.tsx */ (+        input: RepositoryTextSearchIndexInput+    ) => RepositoryTextSearchIndexOutput+    Repository: /* src/repo/settings/backend.tsx */ (input: RepositoryInput) => RepositoryOutput+    RepositoryContributors: /* src/repo/stats/RepositoryStatsContributorsPage.tsx */ (+        input: RepositoryContributorsInput+    ) => RepositoryContributorsOutput+    TreeCommits: /* src/repo/tree/TreePage.tsx */ (input: TreeCommitsInput) => TreeCommitsOutput+    Search: /* src/search/backend.tsx */ (input: SearchInput) => SearchOutput+    RepoGroups: /* src/search/backend.tsx */ (input: RepoGroupsInput) => RepoGroupsOutput+    SearchSuggestions: /* src/search/backend.tsx */ (input: SearchSuggestionsInput) => SearchSuggestionsOutput+    ReposByQuery: /* src/search/backend.tsx */ (input: ReposByQueryInput) => ReposByQueryOutput+    savedSearches: /* src/search/backend.tsx */ (input: savedSearchesInput) => savedSearchesOutput+    SavedSearch: /* src/search/backend.tsx */ (input: SavedSearchInput) => SavedSearchOutput+    CreateSavedSearch: /* src/search/backend.tsx */ (input: CreateSavedSearchInput) => CreateSavedSearchOutput+    UpdateSavedSearch: /* src/search/backend.tsx */ (input: UpdateSavedSearchInput) => UpdateSavedSearchOutput+    DeleteSavedSearch: /* src/search/backend.tsx */ (input: DeleteSavedSearchInput) => DeleteSavedSearchOutput+    highlightCode: /* src/search/backend.tsx */ (input: highlightCodeInput) => highlightCodeOutput+    ManyReposWarning: /* src/search/backend.tsx */ (input: ManyReposWarningInput) => ManyReposWarningOutput+    SettingsCascade: /* src/settings/SettingsArea.tsx */ (input: SettingsCascadeInput) => SettingsCascadeOutput+    DeleteAccessToken: /* src/settings/tokens/AccessTokenNode.tsx */ (+        input: DeleteAccessTokenInput+    ) => DeleteAccessTokenOutput+    SiteFlags: /* src/site/backend.tsx */ (input: SiteFlagsInput) => SiteFlagsOutput+    addExternalService: /* src/site-admin/SiteAdminAddExternalServicePage.tsx */ (+        input: addExternalServiceInput+    ) => addExternalServiceOutput+    UpdateExternalService: /* src/site-admin/SiteAdminExternalServicePage.tsx */ (+        input: UpdateExternalServiceInput+    ) => UpdateExternalServiceOutput+    ExternalService: /* src/site-admin/SiteAdminExternalServicePage.tsx */ (+        input: ExternalServiceInput+    ) => ExternalServiceOutput+    DeleteExternalService: /* src/site-admin/SiteAdminExternalServicesPage.tsx */ (+        input: DeleteExternalServiceInput+    ) => DeleteExternalServiceOutput+    ExternalServices: /* src/site-admin/SiteAdminExternalServicesPage.tsx */ (+        input: ExternalServicesInput+    ) => ExternalServicesOutput+    SiteAdminAccessTokens: /* src/site-admin/SiteAdminTokensPage.tsx */ (+        input: SiteAdminAccessTokensInput+    ) => SiteAdminAccessTokensOutput+    Users: /* src/site-admin/backend.tsx */ (input: UsersInput) => UsersOutput+    Organizations: /* src/site-admin/backend.tsx */ (input: OrganizationsInput) => OrganizationsOutput+    Repositories: /* src/site-admin/backend.tsx */ (input: RepositoriesInput) => RepositoriesOutput+    UpdateMirrorRepository: /* src/site-admin/backend.tsx */ (+        input: UpdateMirrorRepositoryInput+    ) => UpdateMirrorRepositoryOutput+    CheckMirrorRepositoryConnection: /* src/site-admin/backend.tsx */ (+        input: CheckMirrorRepositoryConnectionInput+    ) => CheckMirrorRepositoryConnectionOutput+    ScheduleRepositoryPermissionsSync: /* src/site-admin/backend.tsx */ (+        input: ScheduleRepositoryPermissionsSyncInput+    ) => ScheduleRepositoryPermissionsSyncOutput+    ScheduleUserPermissionsSync: /* src/site-admin/backend.tsx */ (+        input: ScheduleUserPermissionsSyncInput+    ) => ScheduleUserPermissionsSyncOutput+    UserUsageStatistics: /* src/site-admin/backend.tsx */ (input: UserUsageStatisticsInput) => UserUsageStatisticsOutput+    SiteUsageStatistics: /* src/site-admin/backend.tsx */ (input: SiteUsageStatisticsInput) => SiteUsageStatisticsOutput+    Site: /* src/site-admin/backend.tsx */ (input: SiteInput) => SiteOutput+    AllConfig: /* src/site-admin/backend.tsx */ (input: AllConfigInput) => AllConfigOutput+    UpdateSiteConfiguration: /* src/site-admin/backend.tsx */ (+        input: UpdateSiteConfigurationInput+    ) => UpdateSiteConfigurationOutput+    ReloadSite: /* src/site-admin/backend.tsx */ (input: ReloadSiteInput) => ReloadSiteOutput+    SetUserIsSiteAdmin: /* src/site-admin/backend.tsx */ (input: SetUserIsSiteAdminInput) => SetUserIsSiteAdminOutput+    RandomizeUserPassword: /* src/site-admin/backend.tsx */ (+        input: RandomizeUserPasswordInput+    ) => RandomizeUserPasswordOutput+    DeleteUser: /* src/site-admin/backend.tsx */ (input: DeleteUserInput) => DeleteUserOutput+    CreateUser: /* src/site-admin/backend.tsx */ (input: CreateUserInput) => CreateUserOutput+    DeleteOrganization: /* src/site-admin/backend.tsx */ (input: DeleteOrganizationInput) => DeleteOrganizationOutput+    SiteUpdateCheck: /* src/site-admin/backend.tsx */ (input: SiteUpdateCheckInput) => SiteUpdateCheckOutput+    SiteMonitoringStatistics: /* src/site-admin/backend.tsx */ (+        input: SiteMonitoringStatisticsInput+    ) => SiteMonitoringStatisticsOutput+    Overview: /* src/site-admin/overview/SiteAdminOverviewPage.tsx */ (input: OverviewInput) => OverviewOutput+    WAUs: /* src/site-admin/overview/SiteAdminOverviewPage.tsx */ (input: WAUsInput) => WAUsOutput+    Symbols: /* src/symbols/backend.tsx */ (input: SymbolsInput) => SymbolsOutput+    SiteAdminActivationStatus: /* src/tracking/withActivation.tsx */ (+        input: SiteAdminActivationStatusInput+    ) => SiteAdminActivationStatusOutput+    ActivationStatus: /* src/tracking/withActivation.tsx */ (input: ActivationStatusInput) => ActivationStatusOutput+    LinksForRepositories: /* src/tracking/withActivation.tsx */ (+        input: LinksForRepositoriesInput+    ) => LinksForRepositoriesOutput+    UserEventLogs: /* src/user/UserEventLogsPage.tsx */ (input: UserEventLogsInput) => UserEventLogsOutput+    User: /* src/user/area/UserArea.tsx */ (input: UserInput) => UserOutput+    updateUser: /* src/user/settings/backend.tsx */ (input: updateUserInput) => updateUserOutput+    updatePassword: /* src/user/settings/backend.tsx */ (input: updatePasswordInput) => updatePasswordOutput+    SetUserEmailVerified: /* src/user/settings/backend.tsx */ (+        input: SetUserEmailVerifiedInput+    ) => SetUserEmailVerifiedOutput+    logUserEvent: /* src/user/settings/backend.tsx */ (input: logUserEventInput) => logUserEventOutput+    logEvent: /* src/user/settings/backend.tsx */ (input: logEventInput) => logEventOutput+    CreateAccessToken: /* src/user/settings/accessTokens/UserSettingsCreateAccessTokenPage.tsx */ (+        input: CreateAccessTokenInput+    ) => CreateAccessTokenOutput+    AccessTokens: /* src/user/settings/accessTokens/UserSettingsTokensPage.tsx */ (+        input: AccessTokensInput+    ) => AccessTokensOutput+    AddUserEmail: /* src/user/settings/emails/AddUserEmailForm.tsx */ (input: AddUserEmailInput) => AddUserEmailOutput+    RemoveUserEmail: /* src/user/settings/emails/UserSettingsEmailsPage.tsx */ (+        input: RemoveUserEmailInput+    ) => RemoveUserEmailOutput+    UserEmails: /* src/user/settings/emails/UserSettingsEmailsPage.tsx */ (input: UserEmailsInput) => UserEmailsOutput+    UserForProfilePage: /* src/user/settings/profile/UserSettingsProfilePage.tsx */ (+        input: UserForProfilePageInput+    ) => UserForProfilePageOutput+}+export type CurrentAuthStateInput = {}+export type CurrentAuthStateOutput = {+    currentUser: {+        __typename: 'User'+        id: string+        databaseID: number+        username: string+        avatarURL: string | null+        email: string+        displayName: string | null+        siteAdmin: boolean+        tags: string[]+        url: string+        settingsURL: string | null+        organizations: {+            nodes: {+                id: string+                name: string+                displayName: string | null+                url: string+                settingsURL: string | null+            }[]+        }+        session: {+            canSignOut: boolean+        }+        viewerCanAdminister: boolean+    } | null+}+export type FileDiffHunkRangeFields = {+    startLine: number+    lines: number+}+export type DiffStatFields = {+    added: number+    changed: number+    deleted: number+}+export type FileDiffFields = {+    __typename: 'FileDiff'+    oldPath: string | null+    oldFile: {+        __typename: string+        binary: boolean+        byteSize: number+    } | null+    newFile: {+        __typename: string+        binary: boolean+        byteSize: number+    } | null+    newPath: string | null+    mostRelevantFile: {+        __typename: string+        url: string+    }+    hunks: {+        oldRange: {+            startLine: number+            lines: number+        }+        oldNoNewlineAt: boolean+        newRange: {+            startLine: number+            lines: number+        }+        section: string | null+        highlight: {+            aborted: boolean+            lines: {+                kind: 'ADDED' | 'UNCHANGED' | 'DELETED'+                html: string+            }[]+        }+    }[]+    stat: {+        added: number+        changed: number+        deleted: number+    }+    internalID: string+}+export type RepositoryIDInput = {+    repoName: string+}+export type RepositoryIDOutput = {+    repository: {+        id: string+    } | null+}+export type CreateChangesetInput = {+    repositoryID: string+    externalID: string+}+export type CreateChangesetOutput = {+    createChangesets: {+        id: string+    }[]+}+export type AddChangeSetToCampaignInput = {+    campaignID: string+    changesets: string[]+}+export type AddChangeSetToCampaignOutput = {+    addChangesetsToCampaign: {+        id: string+    }+}+export type CampaignFields = {+    __typename: 'Campaign'+    id: string+    name: string+    description: string | null+    author: {+        username: string+        avatarURL: string | null+    }+    status: {+        completedCount: number+        pendingCount: number+        state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'CANCELED'+        errors: string[]+    }+    branch: string | null+    createdAt: any+    updatedAt: any+    closedAt: any | null+    viewerCanAdminister: boolean+    hasUnpublishedPatches: boolean+    changesets: {+        totalCount: number+    }+    patches: {+        totalCount: number+    }+    changesetCountsOverTime: {+        date: any

oh, I haven't seen that. This does mean that we have the same issue in the plugin, thus custom scalars are not typechecked?

twop

comment created time in a month

Pull request review commentsourcegraph/sourcegraph

typesafe stubbing of graphQL requests for integration tests

+/* eslint-disable quotes */+/* eslint-disable @typescript-eslint/consistent-type-definitions */+/* This is an autogenerated file. Do not edit this file directly! */+export interface WebGQLOperations {+    CurrentAuthState: /* src/auth.ts */ (input: CurrentAuthStateInput) => CurrentAuthStateOutput+    RepositoryID: /* src/enterprise/campaigns/detail/AddChangesetForm.tsx */ (+        input: RepositoryIDInput+    ) => RepositoryIDOutput+    CreateChangeset: /* src/enterprise/campaigns/detail/AddChangesetForm.tsx */ (+        input: CreateChangesetInput+    ) => CreateChangesetOutput+    AddChangeSetToCampaign: /* src/enterprise/campaigns/detail/AddChangesetForm.tsx */ (+        input: AddChangeSetToCampaignInput+    ) => AddChangeSetToCampaignOutput+    UpdateCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: UpdateCampaignInput+    ) => UpdateCampaignOutput+    CreateCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: CreateCampaignInput+    ) => CreateCampaignOutput+    RetryCampaignChangesets: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: RetryCampaignChangesetsInput+    ) => RetryCampaignChangesetsOutput+    PublishCampaignChangesets: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: PublishCampaignChangesetsInput+    ) => PublishCampaignChangesetsOutput+    CloseCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (input: CloseCampaignInput) => CloseCampaignOutput+    DeleteCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: DeleteCampaignInput+    ) => DeleteCampaignOutput+    CampaignByID: /* src/enterprise/campaigns/detail/backend.ts */ (input: CampaignByIDInput) => CampaignByIDOutput+    PatchSetByID: /* src/enterprise/campaigns/detail/backend.ts */ (input: PatchSetByIDInput) => PatchSetByIDOutput+    CampaignChangesets: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: CampaignChangesetsInput+    ) => CampaignChangesetsOutput+    CampaignPatches: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: CampaignPatchesInput+    ) => CampaignPatchesOutput+    PatchSetPatches: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: PatchSetPatchesInput+    ) => PatchSetPatchesOutput+    PublishChangeset: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: PublishChangesetInput+    ) => PublishChangesetOutput+    SyncChangeset: /* src/enterprise/campaigns/detail/backend.ts */ (input: SyncChangesetInput) => SyncChangesetOutput+    ExternalChangesetFileDiffs: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: ExternalChangesetFileDiffsInput+    ) => ExternalChangesetFileDiffsOutput+    PatchFileDiffs: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: PatchFileDiffsInput+    ) => PatchFileDiffsOutput+    Campaigns: /* src/enterprise/campaigns/global/list/backend.ts */ (input: CampaignsInput) => CampaignsOutput+    CampaignsCount: /* src/enterprise/campaigns/global/list/backend.ts */ (+        input: CampaignsCountInput+    ) => CampaignsCountOutput+    LsifUploads: /* src/enterprise/codeintel/backend.tsx */ (input: LsifUploadsInput) => LsifUploadsOutput+    LsifUploadsWithRepo: /* src/enterprise/codeintel/backend.tsx */ (+        input: LsifUploadsWithRepoInput+    ) => LsifUploadsWithRepoOutput+    LsifUpload: /* src/enterprise/codeintel/backend.tsx */ (input: LsifUploadInput) => LsifUploadOutput+    DeleteLsifUpload: /* src/enterprise/codeintel/backend.tsx */ (+        input: DeleteLsifUploadInput+    ) => DeleteLsifUploadOutput+    LsifIndexes: /* src/enterprise/codeintel/backend.tsx */ (input: LsifIndexesInput) => LsifIndexesOutput+    LsifIndexesWithRepo: /* src/enterprise/codeintel/backend.tsx */ (+        input: LsifIndexesWithRepoInput+    ) => LsifIndexesWithRepoOutput+    LsifIndex: /* src/enterprise/codeintel/backend.tsx */ (input: LsifIndexInput) => LsifIndexOutput+    DeleteLsifIndex: /* src/enterprise/codeintel/backend.tsx */ (input: DeleteLsifIndexInput) => DeleteLsifIndexOutput+    ProductPlans: /* src/enterprise/dotcom/productPlans/ProductPlanFormControl.tsx */ (+        input: ProductPlansInput+    ) => ProductPlansOutput+    ExploreExtensions: /* src/enterprise/extensions/explore/ExtensionsExploreSection.tsx */ (+        input: ExploreExtensionsInput+    ) => ExploreExtensionsOutput+    UpdateRegistryExtension: /* src/enterprise/extensions/extension/RegistryExtensionManagePage.tsx */ (+        input: UpdateRegistryExtensionInput+    ) => UpdateRegistryExtensionOutput+    PublishRegistryExtension: /* src/enterprise/extensions/extension/RegistryExtensionNewReleasePage.tsx */ (+        input: PublishRegistryExtensionInput+    ) => PublishRegistryExtensionOutput+    CreateRegistryExtension: /* src/enterprise/extensions/registry/RegistryNewExtensionPage.tsx */ (+        input: CreateRegistryExtensionInput+    ) => CreateRegistryExtensionOutput+    DeleteRegistryExtension: /* src/enterprise/extensions/registry/backend.ts */ (+        input: DeleteRegistryExtensionInput+    ) => DeleteRegistryExtensionOutput+    ViewerRegistryPublishers: /* src/enterprise/extensions/registry/backend.ts */ (+        input: ViewerRegistryPublishersInput+    ) => ViewerRegistryPublishersOutput+    ViewerNamespaces: /* src/enterprise/namespaces/backend.ts */ (+        input: ViewerNamespacesInput+    ) => ViewerNamespacesOutput+    LsifUploadsForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: LsifUploadsForRepoInput+    ) => LsifUploadsForRepoOutput+    LsifUploadForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: LsifUploadForRepoInput+    ) => LsifUploadForRepoOutput+    DeleteLsifUploadForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: DeleteLsifUploadForRepoInput+    ) => DeleteLsifUploadForRepoOutput+    LsifIndexesForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: LsifIndexesForRepoInput+    ) => LsifIndexesForRepoOutput+    LsifIndexForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: LsifIndexForRepoInput+    ) => LsifIndexForRepoOutput+    DeleteLsifIndexForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: DeleteLsifIndexForRepoInput+    ) => DeleteLsifIndexForRepoOutput+    SearchResultsStats: /* src/enterprise/search/stats/backend.ts */ (+        input: SearchResultsStatsInput+    ) => SearchResultsStatsOutput+    AuthProviders: /* src/enterprise/site-admin/SiteAdminAuthenticationProvidersPage.tsx */ (+        input: AuthProvidersInput+    ) => AuthProvidersOutput+    ExternalAccounts: /* src/enterprise/site-admin/SiteAdminExternalAccountsPage.tsx */ (+        input: ExternalAccountsInput+    ) => ExternalAccountsOutput+    SiteAdminRegistryExtensions: /* src/enterprise/site-admin/SiteAdminRegistryExtensionsPage.tsx */ (+        input: SiteAdminRegistryExtensionsInput+    ) => SiteAdminRegistryExtensionsOutput+    SiteAdminLsifUpload: /* src/enterprise/site-admin/backend.ts */ (+        input: SiteAdminLsifUploadInput+    ) => SiteAdminLsifUploadOutput+    SetCustomerBilling: /* src/enterprise/site-admin/dotcom/customers/SiteAdminCustomerBillingLink.tsx */ (+        input: SetCustomerBillingInput+    ) => SetCustomerBillingOutput+    Customers: /* src/enterprise/site-admin/dotcom/customers/SiteAdminCustomersPage.tsx */ (+        input: CustomersInput+    ) => CustomersOutput+    CreateProductSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminCreateProductSubscriptionPage.tsx */ (+        input: CreateProductSubscriptionInput+    ) => CreateProductSubscriptionOutput+    ProductSubscriptionAccounts: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminCreateProductSubscriptionPage.tsx */ (+        input: ProductSubscriptionAccountsInput+    ) => ProductSubscriptionAccountsOutput+    GenerateProductLicenseForSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminGenerateProductLicenseForSubscriptionForm.tsx */ (+        input: GenerateProductLicenseForSubscriptionInput+    ) => GenerateProductLicenseForSubscriptionOutput+    DotComProductLicenses: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductLicensesPage.tsx */ (+        input: DotComProductLicensesInput+    ) => DotComProductLicensesOutput+    SetProductSubscriptionBilling: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionBillingLink.tsx */ (+        input: SetProductSubscriptionBillingInput+    ) => SetProductSubscriptionBillingOutput+    DotComProductSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionPage.tsx */ (+        input: DotComProductSubscriptionInput+    ) => DotComProductSubscriptionOutput+    ProductLicenses: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionPage.tsx */ (+        input: ProductLicensesInput+    ) => ProductLicensesOutput+    ArchiveProductSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionPage.tsx */ (+        input: ArchiveProductSubscriptionInput+    ) => ArchiveProductSubscriptionOutput+    ProductSubscriptionsDotCom: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionsPage.tsx */ (+        input: ProductSubscriptionsDotComInput+    ) => ProductSubscriptionsDotComOutput+    ProductLicenseInfo: /* src/enterprise/site-admin/productSubscription/ProductSubscriptionStatus.tsx */ (+        input: ProductLicenseInfoInput+    ) => ProductLicenseInfoOutput+    PreviewProductSubscriptionInvoice: /* src/enterprise/user/productSubscriptions/NewProductSubscriptionPaymentSection.tsx */ (+        input: PreviewProductSubscriptionInvoiceInput+    ) => PreviewProductSubscriptionInvoiceOutput+    ProductSubscriptionOnEditPage: /* src/enterprise/user/productSubscriptions/UserSubscriptionsEditProductSubscriptionPage.tsx */ (+        input: ProductSubscriptionOnEditPageInput+    ) => ProductSubscriptionOnEditPageOutput+    UpdatePaidProductSubscription: /* src/enterprise/user/productSubscriptions/UserSubscriptionsEditProductSubscriptionPage.tsx */ (+        input: UpdatePaidProductSubscriptionInput+    ) => UpdatePaidProductSubscriptionOutput+    CreatePaidProductSubscription: /* src/enterprise/user/productSubscriptions/UserSubscriptionsNewProductSubscriptionPage.tsx */ (+        input: CreatePaidProductSubscriptionInput+    ) => CreatePaidProductSubscriptionOutput+    ProductSubscription: /* src/enterprise/user/productSubscriptions/UserSubscriptionsProductSubscriptionPage.tsx */ (+        input: ProductSubscriptionInput+    ) => ProductSubscriptionOutput+    ProductSubscriptions: /* src/enterprise/user/productSubscriptions/UserSubscriptionsProductSubscriptionsPage.tsx */ (+        input: ProductSubscriptionsInput+    ) => ProductSubscriptionsOutput+    DeleteExternalAccount: /* src/enterprise/user/settings/ExternalAccountNode.tsx */ (+        input: DeleteExternalAccountInput+    ) => DeleteExternalAccountOutput+    UserExternalAccounts: /* src/enterprise/user/settings/UserSettingsExternalAccountsPage.tsx */ (+        input: UserExternalAccountsInput+    ) => UserExternalAccountsOutput+    RegistryExtensions: /* src/extensions/ExtensionsList.tsx */ (+        input: RegistryExtensionsInput+    ) => RegistryExtensionsOutput+    RegistryExtension: /* src/extensions/extension/ExtensionArea.tsx */ (+        input: RegistryExtensionInput+    ) => RegistryExtensionOutput+    SubmitSurvey: /* src/marketing/backend.tsx */ (input: SubmitSurveyInput) => SubmitSurveyOutput+    FetchSurveyResponses: /* src/marketing/backend.tsx */ (+        input: FetchSurveyResponsesInput+    ) => FetchSurveyResponsesOutput+    FetchAllUsersWithSurveyResponses: /* src/marketing/backend.tsx */ (+        input: FetchAllUsersWithSurveyResponsesInput+    ) => FetchAllUsersWithSurveyResponsesOutput+    FetchSurveyResponseAggregates: /* src/marketing/backend.tsx */ (+        input: FetchSurveyResponseAggregatesInput+    ) => FetchSurveyResponseAggregatesOutput+    RequestTrial: /* src/marketing/backend.tsx */ (input: RequestTrialInput) => RequestTrialOutput+    StatusMessages: /* src/nav/StatusMessagesNavItem.tsx */ (input: StatusMessagesInput) => StatusMessagesOutput+    createOrganization: /* src/org/backend.tsx */ (input: createOrganizationInput) => createOrganizationOutput+    removeUserFromOrganization: /* src/org/backend.tsx */ (+        input: removeUserFromOrganizationInput+    ) => removeUserFromOrganizationOutput+    UpdateOrganization: /* src/org/backend.tsx */ (input: UpdateOrganizationInput) => UpdateOrganizationOutput+    Organization: /* src/org/area/OrgArea.tsx */ (input: OrganizationInput) => OrganizationOutput+    RespondToOrganizationInvitation: /* src/org/area/OrgInvitationPage.tsx */ (+        input: RespondToOrganizationInvitationInput+    ) => RespondToOrganizationInvitationOutput+    OrganizationMembers: /* src/org/area/OrgMembersPage.tsx */ (+        input: OrganizationMembersInput+    ) => OrganizationMembersOutput+    InviteUserToOrganization: /* src/org/invite/InviteForm.tsx */ (+        input: InviteUserToOrganizationInput+    ) => InviteUserToOrganizationOutput+    AddUserToOrganization: /* src/org/invite/InviteForm.tsx */ (+        input: AddUserToOrganizationInput+    ) => AddUserToOrganizationOutput+    ViewerSettings: /* src/platform/context.ts */ (input: ViewerSettingsInput) => ViewerSettingsOutput+    RepositoryGitRefs: /* src/repo/GitReference.tsx */ (input: RepositoryGitRefsInput) => RepositoryGitRefsOutput+    FetchCommits: /* src/repo/RepoRevisionSidebarCommits.tsx */ (input: FetchCommitsInput) => FetchCommitsOutput+    RepositoriesForPopover: /* src/repo/RepositoriesPopover.tsx */ (+        input: RepositoriesForPopoverInput+    ) => RepositoriesForPopoverOutput+    RepositoryGitCommit: /* src/repo/RevisionsPopover.tsx */ (+        input: RepositoryGitCommitInput+    ) => RepositoryGitCommitOutput+    RepositoryRedirect: /* src/repo/backend.ts */ (input: RepositoryRedirectInput) => RepositoryRedirectOutput+    ResolveRev: /* src/repo/backend.ts */ (input: ResolveRevInput) => ResolveRevOutput+    HighlightedFile: /* src/repo/backend.ts */ (input: HighlightedFileInput) => HighlightedFileOutput+    FileExternalLinks: /* src/repo/backend.ts */ (input: FileExternalLinksInput) => FileExternalLinksOutput+    TreeEntries: /* src/repo/backend.ts */ (input: TreeEntriesInput) => TreeEntriesOutput+    Blob: /* src/repo/blob/BlobPage.tsx */ (input: BlobInput) => BlobOutput+    RepositoryGitBranchesOverview: /* src/repo/branches/RepositoryBranchesOverviewPage.tsx */ (+        input: RepositoryGitBranchesOverviewInput+    ) => RepositoryGitBranchesOverviewOutput+    RepositoryCommit: /* src/repo/commit/RepositoryCommitPage.tsx */ (+        input: RepositoryCommitInput+    ) => RepositoryCommitOutput+    RepositoryGitCommits: /* src/repo/commits/RepositoryCommitsPage.tsx */ (+        input: RepositoryGitCommitsInput+    ) => RepositoryGitCommitsOutput+    RepositoryComparisonCommits: /* src/repo/compare/RepositoryCompareCommitsPage.tsx */ (+        input: RepositoryComparisonCommitsInput+    ) => RepositoryComparisonCommitsOutput+    RepositoryComparisonDiff: /* src/repo/compare/RepositoryCompareDiffPage.tsx */ (+        input: RepositoryComparisonDiffInput+    ) => RepositoryComparisonDiffOutput+    RepositoryComparison: /* src/repo/compare/RepositoryCompareOverviewPage.tsx */ (+        input: RepositoryComparisonInput+    ) => RepositoryComparisonOutput+    ExploreRepositories: /* src/repo/explore/RepositoriesExploreSection.tsx */ (+        input: ExploreRepositoriesInput+    ) => ExploreRepositoriesOutput+    RepositoryTextSearchIndex: /* src/repo/settings/RepoSettingsIndexPage.tsx */ (+        input: RepositoryTextSearchIndexInput+    ) => RepositoryTextSearchIndexOutput+    Repository: /* src/repo/settings/backend.tsx */ (input: RepositoryInput) => RepositoryOutput+    RepositoryContributors: /* src/repo/stats/RepositoryStatsContributorsPage.tsx */ (+        input: RepositoryContributorsInput+    ) => RepositoryContributorsOutput+    TreeCommits: /* src/repo/tree/TreePage.tsx */ (input: TreeCommitsInput) => TreeCommitsOutput+    Search: /* src/search/backend.tsx */ (input: SearchInput) => SearchOutput+    RepoGroups: /* src/search/backend.tsx */ (input: RepoGroupsInput) => RepoGroupsOutput+    SearchSuggestions: /* src/search/backend.tsx */ (input: SearchSuggestionsInput) => SearchSuggestionsOutput+    ReposByQuery: /* src/search/backend.tsx */ (input: ReposByQueryInput) => ReposByQueryOutput+    savedSearches: /* src/search/backend.tsx */ (input: savedSearchesInput) => savedSearchesOutput+    SavedSearch: /* src/search/backend.tsx */ (input: SavedSearchInput) => SavedSearchOutput+    CreateSavedSearch: /* src/search/backend.tsx */ (input: CreateSavedSearchInput) => CreateSavedSearchOutput+    UpdateSavedSearch: /* src/search/backend.tsx */ (input: UpdateSavedSearchInput) => UpdateSavedSearchOutput+    DeleteSavedSearch: /* src/search/backend.tsx */ (input: DeleteSavedSearchInput) => DeleteSavedSearchOutput+    highlightCode: /* src/search/backend.tsx */ (input: highlightCodeInput) => highlightCodeOutput+    ManyReposWarning: /* src/search/backend.tsx */ (input: ManyReposWarningInput) => ManyReposWarningOutput+    SettingsCascade: /* src/settings/SettingsArea.tsx */ (input: SettingsCascadeInput) => SettingsCascadeOutput+    DeleteAccessToken: /* src/settings/tokens/AccessTokenNode.tsx */ (+        input: DeleteAccessTokenInput+    ) => DeleteAccessTokenOutput+    SiteFlags: /* src/site/backend.tsx */ (input: SiteFlagsInput) => SiteFlagsOutput+    addExternalService: /* src/site-admin/SiteAdminAddExternalServicePage.tsx */ (+        input: addExternalServiceInput+    ) => addExternalServiceOutput+    UpdateExternalService: /* src/site-admin/SiteAdminExternalServicePage.tsx */ (+        input: UpdateExternalServiceInput+    ) => UpdateExternalServiceOutput+    ExternalService: /* src/site-admin/SiteAdminExternalServicePage.tsx */ (+        input: ExternalServiceInput+    ) => ExternalServiceOutput+    DeleteExternalService: /* src/site-admin/SiteAdminExternalServicesPage.tsx */ (+        input: DeleteExternalServiceInput+    ) => DeleteExternalServiceOutput+    ExternalServices: /* src/site-admin/SiteAdminExternalServicesPage.tsx */ (+        input: ExternalServicesInput+    ) => ExternalServicesOutput+    SiteAdminAccessTokens: /* src/site-admin/SiteAdminTokensPage.tsx */ (+        input: SiteAdminAccessTokensInput+    ) => SiteAdminAccessTokensOutput+    Users: /* src/site-admin/backend.tsx */ (input: UsersInput) => UsersOutput+    Organizations: /* src/site-admin/backend.tsx */ (input: OrganizationsInput) => OrganizationsOutput+    Repositories: /* src/site-admin/backend.tsx */ (input: RepositoriesInput) => RepositoriesOutput+    UpdateMirrorRepository: /* src/site-admin/backend.tsx */ (+        input: UpdateMirrorRepositoryInput+    ) => UpdateMirrorRepositoryOutput+    CheckMirrorRepositoryConnection: /* src/site-admin/backend.tsx */ (+        input: CheckMirrorRepositoryConnectionInput+    ) => CheckMirrorRepositoryConnectionOutput+    ScheduleRepositoryPermissionsSync: /* src/site-admin/backend.tsx */ (+        input: ScheduleRepositoryPermissionsSyncInput+    ) => ScheduleRepositoryPermissionsSyncOutput+    ScheduleUserPermissionsSync: /* src/site-admin/backend.tsx */ (+        input: ScheduleUserPermissionsSyncInput+    ) => ScheduleUserPermissionsSyncOutput+    UserUsageStatistics: /* src/site-admin/backend.tsx */ (input: UserUsageStatisticsInput) => UserUsageStatisticsOutput+    SiteUsageStatistics: /* src/site-admin/backend.tsx */ (input: SiteUsageStatisticsInput) => SiteUsageStatisticsOutput+    Site: /* src/site-admin/backend.tsx */ (input: SiteInput) => SiteOutput+    AllConfig: /* src/site-admin/backend.tsx */ (input: AllConfigInput) => AllConfigOutput+    UpdateSiteConfiguration: /* src/site-admin/backend.tsx */ (+        input: UpdateSiteConfigurationInput+    ) => UpdateSiteConfigurationOutput+    ReloadSite: /* src/site-admin/backend.tsx */ (input: ReloadSiteInput) => ReloadSiteOutput+    SetUserIsSiteAdmin: /* src/site-admin/backend.tsx */ (input: SetUserIsSiteAdminInput) => SetUserIsSiteAdminOutput+    RandomizeUserPassword: /* src/site-admin/backend.tsx */ (+        input: RandomizeUserPasswordInput+    ) => RandomizeUserPasswordOutput+    DeleteUser: /* src/site-admin/backend.tsx */ (input: DeleteUserInput) => DeleteUserOutput+    CreateUser: /* src/site-admin/backend.tsx */ (input: CreateUserInput) => CreateUserOutput+    DeleteOrganization: /* src/site-admin/backend.tsx */ (input: DeleteOrganizationInput) => DeleteOrganizationOutput+    SiteUpdateCheck: /* src/site-admin/backend.tsx */ (input: SiteUpdateCheckInput) => SiteUpdateCheckOutput+    SiteMonitoringStatistics: /* src/site-admin/backend.tsx */ (+        input: SiteMonitoringStatisticsInput+    ) => SiteMonitoringStatisticsOutput+    Overview: /* src/site-admin/overview/SiteAdminOverviewPage.tsx */ (input: OverviewInput) => OverviewOutput+    WAUs: /* src/site-admin/overview/SiteAdminOverviewPage.tsx */ (input: WAUsInput) => WAUsOutput+    Symbols: /* src/symbols/backend.tsx */ (input: SymbolsInput) => SymbolsOutput+    SiteAdminActivationStatus: /* src/tracking/withActivation.tsx */ (+        input: SiteAdminActivationStatusInput+    ) => SiteAdminActivationStatusOutput+    ActivationStatus: /* src/tracking/withActivation.tsx */ (input: ActivationStatusInput) => ActivationStatusOutput+    LinksForRepositories: /* src/tracking/withActivation.tsx */ (+        input: LinksForRepositoriesInput+    ) => LinksForRepositoriesOutput+    UserEventLogs: /* src/user/UserEventLogsPage.tsx */ (input: UserEventLogsInput) => UserEventLogsOutput+    User: /* src/user/area/UserArea.tsx */ (input: UserInput) => UserOutput+    updateUser: /* src/user/settings/backend.tsx */ (input: updateUserInput) => updateUserOutput+    updatePassword: /* src/user/settings/backend.tsx */ (input: updatePasswordInput) => updatePasswordOutput+    SetUserEmailVerified: /* src/user/settings/backend.tsx */ (+        input: SetUserEmailVerifiedInput+    ) => SetUserEmailVerifiedOutput+    logUserEvent: /* src/user/settings/backend.tsx */ (input: logUserEventInput) => logUserEventOutput+    logEvent: /* src/user/settings/backend.tsx */ (input: logEventInput) => logEventOutput+    CreateAccessToken: /* src/user/settings/accessTokens/UserSettingsCreateAccessTokenPage.tsx */ (+        input: CreateAccessTokenInput+    ) => CreateAccessTokenOutput+    AccessTokens: /* src/user/settings/accessTokens/UserSettingsTokensPage.tsx */ (+        input: AccessTokensInput+    ) => AccessTokensOutput+    AddUserEmail: /* src/user/settings/emails/AddUserEmailForm.tsx */ (input: AddUserEmailInput) => AddUserEmailOutput+    RemoveUserEmail: /* src/user/settings/emails/UserSettingsEmailsPage.tsx */ (+        input: RemoveUserEmailInput+    ) => RemoveUserEmailOutput+    UserEmails: /* src/user/settings/emails/UserSettingsEmailsPage.tsx */ (input: UserEmailsInput) => UserEmailsOutput+    UserForProfilePage: /* src/user/settings/profile/UserSettingsProfilePage.tsx */ (+        input: UserForProfilePageInput+    ) => UserForProfilePageOutput+}+export type CurrentAuthStateInput = {}+export type CurrentAuthStateOutput = {+    currentUser: {+        __typename: 'User'+        id: string+        databaseID: number+        username: string+        avatarURL: string | null+        email: string+        displayName: string | null+        siteAdmin: boolean+        tags: string[]+        url: string+        settingsURL: string | null+        organizations: {+            nodes: {+                id: string+                name: string+                displayName: string | null+                url: string+                settingsURL: string | null+            }[]+        }+        session: {+            canSignOut: boolean+        }+        viewerCanAdminister: boolean+    } | null+}+export type FileDiffHunkRangeFields = {+    startLine: number+    lines: number+}+export type DiffStatFields = {+    added: number+    changed: number+    deleted: number+}+export type FileDiffFields = {+    __typename: 'FileDiff'+    oldPath: string | null+    oldFile: {+        __typename: string+        binary: boolean+        byteSize: number+    } | null+    newFile: {+        __typename: string+        binary: boolean+        byteSize: number+    } | null+    newPath: string | null+    mostRelevantFile: {+        __typename: string+        url: string+    }+    hunks: {+        oldRange: {+            startLine: number+            lines: number+        }+        oldNoNewlineAt: boolean+        newRange: {+            startLine: number+            lines: number+        }+        section: string | null+        highlight: {+            aborted: boolean+            lines: {+                kind: 'ADDED' | 'UNCHANGED' | 'DELETED'+                html: string+            }[]+        }+    }[]+    stat: {+        added: number+        changed: number+        deleted: number+    }+    internalID: string+}+export type RepositoryIDInput = {+    repoName: string+}+export type RepositoryIDOutput = {+    repository: {+        id: string+    } | null+}+export type CreateChangesetInput = {+    repositoryID: string+    externalID: string+}+export type CreateChangesetOutput = {+    createChangesets: {+        id: string+    }[]+}+export type AddChangeSetToCampaignInput = {+    campaignID: string+    changesets: string[]+}+export type AddChangeSetToCampaignOutput = {+    addChangesetsToCampaign: {+        id: string+    }+}+export type CampaignFields = {+    __typename: 'Campaign'+    id: string+    name: string+    description: string | null+    author: {+        username: string+        avatarURL: string | null+    }+    status: {+        completedCount: number+        pendingCount: number+        state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'CANCELED'+        errors: string[]+    }+    branch: string | null+    createdAt: any+    updatedAt: any+    closedAt: any | null+    viewerCanAdminister: boolean+    hasUnpublishedPatches: boolean+    changesets: {+        totalCount: number+    }+    patches: {+        totalCount: number+    }+    changesetCountsOverTime: {+        date: any+        merged: number+        closed: number+        openApproved: number+        openChangesRequested: number+        openPending: number+        total: number+    }[]+    diffStat: DiffStatFields1+}+export type DiffStatFields1 = {+    added: number+    changed: number+    deleted: number+}+export type PatchSetFields = {+    __typename: 'PatchSet'+    id: string+    diffStat: DiffStatFields2+    patches: {+        totalCount: number+    }+}+export type DiffStatFields2 = {+    added: number+    changed: number+    deleted: number+}+export type UpdateCampaignInput = {+    update: {+        id: string+        name: string | null+        branch: string | null+        description: string | null+        patchSet: string | null+    }+}+export type UpdateCampaignOutput = {+    updateCampaign: CampaignFields1+}+export type CampaignFields1 = {+    __typename: 'Campaign'+    id: string+    name: string+    description: string | null+    author: {+        username: string+        avatarURL: string | null+    }+    status: {+        completedCount: number+        pendingCount: number+        state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'CANCELED'+        errors: string[]+    }+    branch: string | null+    createdAt: any+    updatedAt: any+    closedAt: any | null+    viewerCanAdminister: boolean+    hasUnpublishedPatches: boolean+    changesets: {+        totalCount: number+    }+    patches: {+        totalCount: number+    }+    changesetCountsOverTime: {+        date: any+        merged: number+        closed: number+        openApproved: number+        openChangesRequested: number+        openPending: number+        total: number+    }[]+    diffStat: DiffStatFields3+}+export type DiffStatFields3 = {+    added: number+    changed: number+    deleted: number+}+export type CreateCampaignInput = {+    input: {+        namespace: string+        name: string+        description: string | null+        branch: string | null+        patchSet: string | null+    }+}+export type CreateCampaignOutput = {+    createCampaign: {+        id: string+        url: string+    }+}+export type RetryCampaignChangesetsInput = {+    campaign: string+}+export type RetryCampaignChangesetsOutput = {+    retryCampaignChangesets: CampaignFields2+}+export type CampaignFields2 = {+    __typename: 'Campaign'+    id: string+    name: string+    description: string | null+    author: {+        username: string+        avatarURL: string | null+    }+    status: {+        completedCount: number+        pendingCount: number+        state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'CANCELED'+        errors: string[]+    }+    branch: string | null+    createdAt: any+    updatedAt: any+    closedAt: any | null+    viewerCanAdminister: boolean+    hasUnpublishedPatches: boolean+    changesets: {+        totalCount: number+    }+    patches: {+        totalCount: number+    }+    changesetCountsOverTime: {+        date: any+        merged: number+        closed: number+        openApproved: number+        openChangesRequested: number+        openPending: number+        total: number+    }[]+    diffStat: DiffStatFields4+}+export type DiffStatFields4 = {+    added: number+    changed: number+    deleted: number+}+export type PublishCampaignChangesetsInput = {+    campaign: string+}+export type PublishCampaignChangesetsOutput = {+    publishCampaignChangesets: CampaignFields3+}+export type CampaignFields3 = {+    __typename: 'Campaign'+    id: string+    name: string+    description: string | null+    author: {+        username: string+        avatarURL: string | null+    }+    status: {+        completedCount: number+        pendingCount: number+        state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'CANCELED'+        errors: string[]+    }+    branch: string | null+    createdAt: any+    updatedAt: any+    closedAt: any | null+    viewerCanAdminister: boolean+    hasUnpublishedPatches: boolean+    changesets: {+        totalCount: number+    }+    patches: {+        totalCount: number+    }+    changesetCountsOverTime: {+        date: any+        merged: number+        closed: number+        openApproved: number+        openChangesRequested: number+        openPending: number+        total: number+    }[]+    diffStat: DiffStatFields5+}+export type DiffStatFields5 = {+    added: number+    changed: number+    deleted: number+}+export type CloseCampaignInput = {+    campaign: string+    closeChangesets: boolean+}+export type CloseCampaignOutput = {+    closeCampaign: {+        id: string+    }+}+export type DeleteCampaignInput = {+    campaign: string+    closeChangesets: boolean+}+export type DeleteCampaignOutput = {+    deleteCampaign: {+        alwaysNil: string | null+    } | null+}+export type CampaignByIDInput = {+    campaign: string+}+export type CampaignByIDOutput = {+    node:+        | ({+              __typename: string+          } & CampaignFields4)+        | null+}+export type CampaignFields4 = {+    __typename: 'Campaign'+    id: string+    name: string+    description: string | null+    author: {+        username: string+        avatarURL: string | null+    }+    status: {+        completedCount: number+        pendingCount: number+        state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'CANCELED'+        errors: string[]+    }+    branch: string | null+    createdAt: any+    updatedAt: any+    closedAt: any | null+    viewerCanAdminister: boolean+    hasUnpublishedPatches: boolean+    changesets: {+        totalCount: number+    }+    patches: {+        totalCount: number+    }+    changesetCountsOverTime: {+        date: any+        merged: number+        closed: number+        openApproved: number+        openChangesRequested: number+        openPending: number+        total: number+    }[]+    diffStat: DiffStatFields6+}+export type DiffStatFields6 = {+    added: number+    changed: number+    deleted: number+}+export type PatchSetByIDInput = {+    patchSet: string+}+export type PatchSetByIDOutput = {+    node:+        | ({+              __typename: string+          } & PatchSetFields1)+        | null+}+export type PatchSetFields1 = {+    __typename: 'PatchSet'+    id: string+    diffStat: DiffStatFields7+    patches: {+        totalCount: number+    }+}+export type DiffStatFields7 = {+    added: number+    changed: number+    deleted: number+}+export type CampaignChangesetsInput = {+    campaign: string+    first: number | null+    state: ('OPEN' | 'CLOSED' | 'MERGED' | 'DELETED') | null+    reviewState: ('APPROVED' | 'CHANGES_REQUESTED' | 'PENDING' | 'COMMENTED' | 'DISMISSED') | null+    checkState: ('PENDING' | 'PASSED' | 'FAILED') | null+}+export type CampaignChangesetsOutput = {+    node:+        | ({+              __typename: string+          } & {+              changesets: {+                  totalCount: number+                  nodes: ({+                      __typename: string+                      state: 'OPEN' | 'CLOSED' | 'MERGED' | 'DELETED'+                      createdAt: any+                      updatedAt: any+                      nextSyncAt: any | null+                  } & {+                      id: string+                  } & {+                      id: string+                      title: string+                      body: string+                      reviewState: 'APPROVED' | 'CHANGES_REQUESTED' | 'PENDING' | 'COMMENTED' | 'DISMISSED'+                      checkState: ('PENDING' | 'PASSED' | 'FAILED') | null+                      labels: {+                          text: string+                          description: string | null+                          color: string+                      }[]+                      repository: {+                          id: string+                          name: string+                          url: string+                      }+                      externalURL: {+                          url: string+                      }+                      externalID: string+                      diff: {+                          fileDiffs: {+                              diffStat: DiffStatFields8+                          }+                      } | null+                      diffStat: {+                          added: number+                          changed: number+                          deleted: number+                      } | null+                  })[]+              }+          })+        | null+}+export type DiffStatFields8 = {+    added: number+    changed: number+    deleted: number+}+export type CampaignPatchesInput = {+    campaign: string+    first: number | null+}+export type CampaignPatchesOutput = {+    node:+        | ({+              __typename: string+          } & {+              patches: {+                  totalCount: number+                  nodes: ({+                      __typename: string+                  } & {+                      id: string+                  } & {+                      id: string+                      repository: {+                          id: string+                          name: string+                          url: string+                      }+                      publishable: boolean+                      publicationEnqueued: boolean+                      diff: {+                          fileDiffs: {+                              diffStat: DiffStatFields9+                          }+                      }+                  })[]+              }+          })+        | null+}+export type DiffStatFields9 = {+    added: number+    changed: number+    deleted: number+}+export type PatchSetPatchesInput = {+    patchSet: string+    first: number | null+}+export type PatchSetPatchesOutput = {+    node:+        | ({+              __typename: string+          } & {+              patches: {+                  totalCount: number+                  nodes: ({+                      __typename: string+                      id: string+                  } & {+                      repository: {+                          id: string+                          name: string+                          url: string+                      }+                      publishable: boolean+                      publicationEnqueued: boolean+                      diff: {+                          fileDiffs: {+                              diffStat: DiffStatFields10+                          }+                      }+                  })[]+              }+          })+        | null+}+export type DiffStatFields10 = {+    added: number+    changed: number+    deleted: number+}

For sure, Ideally I want to prefix them with the operation name like MyMutation_DiffStatFields but that will require a significant effort, thus number suffixed. I think I saw DiffStatFields12 :)

twop

comment created time in a month

Pull request review commentsourcegraph/sourcegraph

typesafe stubbing of graphQL requests for integration tests

+/* eslint-disable unicorn/consistent-function-scoping */+/* eslint-disable no-sync */+import * as prettier from 'prettier'+import { Extractor } from 'ts-graphql-plugin/lib/analyzer/extractor'+import { ScriptHost } from 'ts-graphql-plugin/lib/analyzer/analyzer-factory'+import { createScriptSourceHelper } from 'ts-graphql-plugin/lib/ts-ast-util/script-source-helper'+import * as path from 'path'+import * as fs from 'fs'+import { buildSchema, GraphQLSchema } from 'graphql'+import * as ts from 'typescript'+import { TsGraphQLPluginConfigOptions } from 'ts-graphql-plugin/lib/types'+import { extractTypes, createTsTypeDeclaration } from './gql2ts-transformer'+import { memoize } from 'lodash'++// NOTE borderline reasonable to define an interface here instead of duplicating+const WEB_TSPROJECT_PATH = path.join(__dirname, '../../web')+const WEB_OUTPUT_DIR = path.join(__dirname, '../../web/src')+const WEB_INTERFACE_NAME = 'WebGQLOperations'++const SHARED_TSPROJECT_PATH = path.join(__dirname, '../')+const SHARED_OUTPUT_DIR = path.join(__dirname, '../src/')+const SHARED_INTERFACE_NAME = 'SharedGQLOperations'++const readSchema = (schemaPath: string): GraphQLSchema => {+    const isExists = fs.existsSync(schemaPath)+    if (!isExists) {+        throw new Error('schema file was not found here:' + schemaPath)+    }++    const sdl = fs.readFileSync(schemaPath, 'utf-8')+    const schema = buildSchema(sdl)+    return schema+}++export async function formatSourceFile(fileContent: string, fileLocation: string): Promise<string> {+    const config = await prettier.resolveConfig(fileLocation)+    if (!config) {+        throw new Error(`Prettier config not found for file ${fileLocation}`)+    }+    return prettier.format(fileContent, { ...config, parser: 'typescript' })+}++const extractGQL = async (tsProjectPath: string, outputDirectory: string, interfaceName: string): Promise<void> => {+    const { pluginConfig, tsconfig, prjRootPath } = readTsconfig(tsProjectPath)+    if (typeof pluginConfig.schema !== 'string') {+        throw new TypeError('for now schema field needs to be a string path')+    }++    const schema = readSchema(path.join(prjRootPath, pluginConfig.schema))+    const currentDirectory = process.cwd()+    const scriptHost = new ScriptHost(currentDirectory, tsconfig.options)+    for (const fileName of tsconfig.fileNames) {+        scriptHost.readFile(fileName)+    }++    const langService = ts.createLanguageService(scriptHost)+    const scriptSourceHelper = createScriptSourceHelper({+        languageService: langService,+        languageServiceHost: scriptHost,+    })++    const extractor = new Extractor({+        removeDuplicatedFragments: true,+        scriptSourceHelper,+        debug: message => console.log('##gql: ' + message),+    })++    const extractedResults = extractor.extract(scriptHost.getScriptFileNames(), pluginConfig.tag)++    let typeDeclarations: ts.Statement[] = []+    const members: ts.PropertySignature[] = []++    const operationInputName = (name: string): string => name + 'Input'+    const operationOutputName = (name: string): string => name + 'Output'++    const fragmentNames = new Set<string>()++    for (const result of extractedResults) {+        if (!result.documentNode) {+            continue+        }++        const { type } = extractor.getDominantDefiniton(result)+        if (type === 'complex') {+            throw new Error('not complex types')+        }++        // TODO this is a hack to generate unique names for fragments+        // note within a single document it should be memoized+        const uniqueFragmentName = memoize((name: string): string => {+            if (!fragmentNames.has(name)) {+                fragmentNames.add(name)+                return name+            }+            let index = 1+            while (true) {+                const potentialName = name + index.toString()+                if (fragmentNames.has(potentialName)) {+                    index += 1+                    continue+                }++                fragmentNames.add(potentialName)+                return potentialName+            }+        })++        const types = extractTypes(result.documentNode, result.fileName, schema, uniqueFragmentName)+        for (const type of types) {+            if (type.tag === 'fragment') {+                typeDeclarations.push(createTsTypeDeclaration(type.name, type.output))+            }+            if (type.tag === 'operation') {+                const inputTypeName = operationInputName(type.name)+                typeDeclarations.push(createTsTypeDeclaration(inputTypeName, type.input))+                const outputTypeName = operationOutputName(type.name)+                typeDeclarations.push(createTsTypeDeclaration(outputTypeName, type.output))++                // generates something like updateBla: (input: BlaInput) => BlaOutput+                members.push(+                    ts.createPropertySignature(+                        undefined,+                        type.name + `/* ${path.relative(prjRootPath, result.fileName)} */`,+                        undefined,+                        ts.createFunctionTypeNode(+                            undefined,+                            [+                                ts.createParameter(+                                    undefined,+                                    undefined,+                                    undefined,+                                    'input',+                                    undefined,+                                    ts.createTypeReferenceNode(inputTypeName, undefined)+                                ),+                            ],+                            ts.createTypeReferenceNode(outputTypeName, undefined)+                        ),+                        undefined+                    )+                )+            }+        }+    }++    typeDeclarations = [+        ts.createInterfaceDeclaration(+            undefined,+            ts.createModifiersFromModifierFlags(ts.ModifierFlags.Export),+            interfaceName,+            undefined,+            undefined,+            members+        ),+        ...typeDeclarations,+    ]++    // TODO as an option+    const outputFileName = 'gql-operations.ts'++    const sourceFile = ts.createSourceFile(outputFileName, '', ts.ScriptTarget.Latest, false, ts.ScriptKind.TS)+    const resultFile = ts.updateSourceFileNode(sourceFile, typeDeclarations)++    const comments = [+        'eslint-disable quotes',+        'eslint-disable @typescript-eslint/consistent-type-definitions',+        'This is an autogenerated file. Do not edit this file directly!',+    ]+    for (const comment of comments) {+        ts.addSyntheticLeadingComment(+            resultFile.statements[0],+            ts.SyntaxKind.MultiLineCommentTrivia,+            ` ${comment} `,+            true+        )+    }++    const outputFilePath = path.join(outputDirectory, outputFileName)+    const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed, removeComments: false })+    const prettySource = await formatSourceFile(printer.printFile(resultFile), outputFilePath)++    ts.sys.writeFile(outputFilePath, prettySource)+}++interface Config {+    tsconfig: ts.ParsedCommandLine+    pluginConfig: TsGraphQLPluginConfigOptions+    prjRootPath: string+}++// copy pasted+function readTsconfig(project: string): Config {+    const currentDirectory = ts.sys.getCurrentDirectory()+    const ppath = path.isAbsolute(project) ? path.resolve(currentDirectory, project) : project+    let configPath: string | undefined+    if (ts.sys.fileExists(ppath)) {+        configPath = ppath+    } else if (ts.sys.directoryExists(ppath) && ts.sys.fileExists(path.join(ppath, 'tsconfig.json'))) {+        configPath = path.join(ppath, 'tsconfig.json')+    }+    if (!configPath) {+        throw new Error(`tsconfig file not found: ${project}`)+    }+    const tsconfig = ts.getParsedCommandLineOfConfigFile(configPath, {}, ts.sys as any)+    if (!tsconfig) {+        throw new Error(`Failed to parse: ${configPath}`)+    }+    const prjRootPath = path.dirname(configPath)+    const plugins = tsconfig.options.plugins+    if (!plugins || !Array.isArray(plugins)) {+        throw new Error(+            `tsconfig.json should have ts-graphql-plugin setting. Add the following:+  "compilerOptions": {+    "plugins": [+      {+        "name": "ts-graphql-plugin",+        "schema": "shema.graphql",   /* Path to your GraphQL schema */+        "tag": "gql"                 /* Template tag function name */+      }+    ]+  }`+        )+    }+    // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment+    // eslint-disable-next-line id-length+    const found = (plugins as any[]).find((p: any) => p.name === 'ts-graphql-plugin')+    if (!found) {+        throw new Error(+            `tsconfig.json should have ts-graphql-plugin setting. Add the following:+  "compilerOptions": {+    "plugins": [+      {+        "name": "ts-graphql-plugin",+        "schema": "shema.graphql",   /* Path to your GraphQL schema */+        "tag": "gql"                 /* Template tag function name */+      }+    ]+  }`+        )+    }+    const pluginConfig = found as TsGraphQLPluginConfigOptions+    return {+        tsconfig,+        pluginConfig,+        prjRootPath,+    }+}++Promise.all([+    // web+    extractGQL(WEB_TSPROJECT_PATH, WEB_OUTPUT_DIR, WEB_INTERFACE_NAME),+    // shared+    extractGQL(SHARED_TSPROJECT_PATH, SHARED_OUTPUT_DIR, SHARED_INTERFACE_NAME),+]).catch(error => {+    throw error+})

btw what would be the proper way of reporting errors?

twop

comment created time in a month

Pull request review commentsourcegraph/sourcegraph

typesafe stubbing of graphQL requests for integration tests

+/* eslint-disable unicorn/consistent-function-scoping */+/* eslint-disable no-sync */+import * as prettier from 'prettier'+import { Extractor } from 'ts-graphql-plugin/lib/analyzer/extractor'+import { ScriptHost } from 'ts-graphql-plugin/lib/analyzer/analyzer-factory'+import { createScriptSourceHelper } from 'ts-graphql-plugin/lib/ts-ast-util/script-source-helper'+import * as path from 'path'+import * as fs from 'fs'+import { buildSchema, GraphQLSchema } from 'graphql'+import * as ts from 'typescript'+import { TsGraphQLPluginConfigOptions } from 'ts-graphql-plugin/lib/types'+import { extractTypes, createTsTypeDeclaration } from './gql2ts-transformer'+import { memoize } from 'lodash'++// NOTE borderline reasonable to define an interface here instead of duplicating+const WEB_TSPROJECT_PATH = path.join(__dirname, '../../web')+const WEB_OUTPUT_DIR = path.join(__dirname, '../../web/src')+const WEB_INTERFACE_NAME = 'WebGQLOperations'++const SHARED_TSPROJECT_PATH = path.join(__dirname, '../')+const SHARED_OUTPUT_DIR = path.join(__dirname, '../src/')+const SHARED_INTERFACE_NAME = 'SharedGQLOperations'++const readSchema = (schemaPath: string): GraphQLSchema => {+    const isExists = fs.existsSync(schemaPath)+    if (!isExists) {+        throw new Error('schema file was not found here:' + schemaPath)+    }++    const sdl = fs.readFileSync(schemaPath, 'utf-8')+    const schema = buildSchema(sdl)+    return schema+}++export async function formatSourceFile(fileContent: string, fileLocation: string): Promise<string> {+    const config = await prettier.resolveConfig(fileLocation)+    if (!config) {+        throw new Error(`Prettier config not found for file ${fileLocation}`)+    }+    return prettier.format(fileContent, { ...config, parser: 'typescript' })+}++const extractGQL = async (tsProjectPath: string, outputDirectory: string, interfaceName: string): Promise<void> => {+    const { pluginConfig, tsconfig, prjRootPath } = readTsconfig(tsProjectPath)+    if (typeof pluginConfig.schema !== 'string') {+        throw new TypeError('for now schema field needs to be a string path')+    }++    const schema = readSchema(path.join(prjRootPath, pluginConfig.schema))+    const currentDirectory = process.cwd()+    const scriptHost = new ScriptHost(currentDirectory, tsconfig.options)+    for (const fileName of tsconfig.fileNames) {+        scriptHost.readFile(fileName)+    }++    const langService = ts.createLanguageService(scriptHost)+    const scriptSourceHelper = createScriptSourceHelper({+        languageService: langService,+        languageServiceHost: scriptHost,+    })++    const extractor = new Extractor({+        removeDuplicatedFragments: true,+        scriptSourceHelper,+        debug: message => console.log('##gql: ' + message),+    })++    const extractedResults = extractor.extract(scriptHost.getScriptFileNames(), pluginConfig.tag)++    let typeDeclarations: ts.Statement[] = []+    const members: ts.PropertySignature[] = []++    const operationInputName = (name: string): string => name + 'Input'+    const operationOutputName = (name: string): string => name + 'Output'++    const fragmentNames = new Set<string>()++    for (const result of extractedResults) {+        if (!result.documentNode) {+            continue+        }++        const { type } = extractor.getDominantDefiniton(result)+        if (type === 'complex') {+            throw new Error('not complex types')+        }++        // TODO this is a hack to generate unique names for fragments+        // note within a single document it should be memoized+        const uniqueFragmentName = memoize((name: string): string => {+            if (!fragmentNames.has(name)) {+                fragmentNames.add(name)+                return name+            }+            let index = 1+            while (true) {+                const potentialName = name + index.toString()+                if (fragmentNames.has(potentialName)) {+                    index += 1+                    continue+                }++                fragmentNames.add(potentialName)+                return potentialName+            }+        })++        const types = extractTypes(result.documentNode, result.fileName, schema, uniqueFragmentName)+        for (const type of types) {+            if (type.tag === 'fragment') {+                typeDeclarations.push(createTsTypeDeclaration(type.name, type.output))+            }+            if (type.tag === 'operation') {+                const inputTypeName = operationInputName(type.name)+                typeDeclarations.push(createTsTypeDeclaration(inputTypeName, type.input))+                const outputTypeName = operationOutputName(type.name)+                typeDeclarations.push(createTsTypeDeclaration(outputTypeName, type.output))++                // generates something like updateBla: (input: BlaInput) => BlaOutput+                members.push(+                    ts.createPropertySignature(+                        undefined,+                        type.name + `/* ${path.relative(prjRootPath, result.fileName)} */`,+                        undefined,+                        ts.createFunctionTypeNode(+                            undefined,+                            [+                                ts.createParameter(+                                    undefined,+                                    undefined,+                                    undefined,+                                    'input',+                                    undefined,+                                    ts.createTypeReferenceNode(inputTypeName, undefined)+                                ),+                            ],+                            ts.createTypeReferenceNode(outputTypeName, undefined)+                        ),+                        undefined+                    )+                )+            }+        }+    }++    typeDeclarations = [+        ts.createInterfaceDeclaration(+            undefined,+            ts.createModifiersFromModifierFlags(ts.ModifierFlags.Export),+            interfaceName,+            undefined,+            undefined,+            members+        ),+        ...typeDeclarations,+    ]++    // TODO as an option+    const outputFileName = 'gql-operations.ts'++    const sourceFile = ts.createSourceFile(outputFileName, '', ts.ScriptTarget.Latest, false, ts.ScriptKind.TS)+    const resultFile = ts.updateSourceFileNode(sourceFile, typeDeclarations)++    const comments = [+        'eslint-disable quotes',

yeah, I wanted to not format with prettier because it breaks lines with long comments but the build failed in CI :) So now I do use prettier but forgot to remove this comment

twop

comment created time in a month

Pull request review commentsourcegraph/sourcegraph

typesafe stubbing of graphQL requests for integration tests

+/* eslint-disable quotes */+/* eslint-disable @typescript-eslint/consistent-type-definitions */+/* This is an autogenerated file. Do not edit this file directly! */+export interface SharedGQLOperations {+    ResolveRawRepoName: /* src/backend/repo.ts */ (input: ResolveRawRepoNameInput) => ResolveRawRepoNameOutput

I haven't found a way to do that quickly :( I added comments just for myself to find duplicates quickly and then I liked them so much that I decided to leave them. Will spend some time researching how to do that

twop

comment created time in a month

Pull request review commentsourcegraph/sourcegraph

typesafe stubbing of graphQL requests for integration tests

+/* eslint-disable quotes */+/* eslint-disable @typescript-eslint/consistent-type-definitions */+/* This is an autogenerated file. Do not edit this file directly! */+export interface WebGQLOperations {+    CurrentAuthState: /* src/auth.ts */ (input: CurrentAuthStateInput) => CurrentAuthStateOutput+    RepositoryID: /* src/enterprise/campaigns/detail/AddChangesetForm.tsx */ (+        input: RepositoryIDInput+    ) => RepositoryIDOutput+    CreateChangeset: /* src/enterprise/campaigns/detail/AddChangesetForm.tsx */ (+        input: CreateChangesetInput+    ) => CreateChangesetOutput+    AddChangeSetToCampaign: /* src/enterprise/campaigns/detail/AddChangesetForm.tsx */ (+        input: AddChangeSetToCampaignInput+    ) => AddChangeSetToCampaignOutput+    UpdateCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: UpdateCampaignInput+    ) => UpdateCampaignOutput+    CreateCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: CreateCampaignInput+    ) => CreateCampaignOutput+    RetryCampaignChangesets: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: RetryCampaignChangesetsInput+    ) => RetryCampaignChangesetsOutput+    PublishCampaignChangesets: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: PublishCampaignChangesetsInput+    ) => PublishCampaignChangesetsOutput+    CloseCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (input: CloseCampaignInput) => CloseCampaignOutput+    DeleteCampaign: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: DeleteCampaignInput+    ) => DeleteCampaignOutput+    CampaignByID: /* src/enterprise/campaigns/detail/backend.ts */ (input: CampaignByIDInput) => CampaignByIDOutput+    PatchSetByID: /* src/enterprise/campaigns/detail/backend.ts */ (input: PatchSetByIDInput) => PatchSetByIDOutput+    CampaignChangesets: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: CampaignChangesetsInput+    ) => CampaignChangesetsOutput+    CampaignPatches: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: CampaignPatchesInput+    ) => CampaignPatchesOutput+    PatchSetPatches: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: PatchSetPatchesInput+    ) => PatchSetPatchesOutput+    PublishChangeset: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: PublishChangesetInput+    ) => PublishChangesetOutput+    SyncChangeset: /* src/enterprise/campaigns/detail/backend.ts */ (input: SyncChangesetInput) => SyncChangesetOutput+    ExternalChangesetFileDiffs: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: ExternalChangesetFileDiffsInput+    ) => ExternalChangesetFileDiffsOutput+    PatchFileDiffs: /* src/enterprise/campaigns/detail/backend.ts */ (+        input: PatchFileDiffsInput+    ) => PatchFileDiffsOutput+    Campaigns: /* src/enterprise/campaigns/global/list/backend.ts */ (input: CampaignsInput) => CampaignsOutput+    CampaignsCount: /* src/enterprise/campaigns/global/list/backend.ts */ (+        input: CampaignsCountInput+    ) => CampaignsCountOutput+    LsifUploads: /* src/enterprise/codeintel/backend.tsx */ (input: LsifUploadsInput) => LsifUploadsOutput+    LsifUploadsWithRepo: /* src/enterprise/codeintel/backend.tsx */ (+        input: LsifUploadsWithRepoInput+    ) => LsifUploadsWithRepoOutput+    LsifUpload: /* src/enterprise/codeintel/backend.tsx */ (input: LsifUploadInput) => LsifUploadOutput+    DeleteLsifUpload: /* src/enterprise/codeintel/backend.tsx */ (+        input: DeleteLsifUploadInput+    ) => DeleteLsifUploadOutput+    LsifIndexes: /* src/enterprise/codeintel/backend.tsx */ (input: LsifIndexesInput) => LsifIndexesOutput+    LsifIndexesWithRepo: /* src/enterprise/codeintel/backend.tsx */ (+        input: LsifIndexesWithRepoInput+    ) => LsifIndexesWithRepoOutput+    LsifIndex: /* src/enterprise/codeintel/backend.tsx */ (input: LsifIndexInput) => LsifIndexOutput+    DeleteLsifIndex: /* src/enterprise/codeintel/backend.tsx */ (input: DeleteLsifIndexInput) => DeleteLsifIndexOutput+    ProductPlans: /* src/enterprise/dotcom/productPlans/ProductPlanFormControl.tsx */ (+        input: ProductPlansInput+    ) => ProductPlansOutput+    ExploreExtensions: /* src/enterprise/extensions/explore/ExtensionsExploreSection.tsx */ (+        input: ExploreExtensionsInput+    ) => ExploreExtensionsOutput+    UpdateRegistryExtension: /* src/enterprise/extensions/extension/RegistryExtensionManagePage.tsx */ (+        input: UpdateRegistryExtensionInput+    ) => UpdateRegistryExtensionOutput+    PublishRegistryExtension: /* src/enterprise/extensions/extension/RegistryExtensionNewReleasePage.tsx */ (+        input: PublishRegistryExtensionInput+    ) => PublishRegistryExtensionOutput+    CreateRegistryExtension: /* src/enterprise/extensions/registry/RegistryNewExtensionPage.tsx */ (+        input: CreateRegistryExtensionInput+    ) => CreateRegistryExtensionOutput+    DeleteRegistryExtension: /* src/enterprise/extensions/registry/backend.ts */ (+        input: DeleteRegistryExtensionInput+    ) => DeleteRegistryExtensionOutput+    ViewerRegistryPublishers: /* src/enterprise/extensions/registry/backend.ts */ (+        input: ViewerRegistryPublishersInput+    ) => ViewerRegistryPublishersOutput+    ViewerNamespaces: /* src/enterprise/namespaces/backend.ts */ (+        input: ViewerNamespacesInput+    ) => ViewerNamespacesOutput+    LsifUploadsForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: LsifUploadsForRepoInput+    ) => LsifUploadsForRepoOutput+    LsifUploadForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: LsifUploadForRepoInput+    ) => LsifUploadForRepoOutput+    DeleteLsifUploadForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: DeleteLsifUploadForRepoInput+    ) => DeleteLsifUploadForRepoOutput+    LsifIndexesForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: LsifIndexesForRepoInput+    ) => LsifIndexesForRepoOutput+    LsifIndexForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: LsifIndexForRepoInput+    ) => LsifIndexForRepoOutput+    DeleteLsifIndexForRepo: /* src/enterprise/repo/settings/backend.tsx */ (+        input: DeleteLsifIndexForRepoInput+    ) => DeleteLsifIndexForRepoOutput+    SearchResultsStats: /* src/enterprise/search/stats/backend.ts */ (+        input: SearchResultsStatsInput+    ) => SearchResultsStatsOutput+    AuthProviders: /* src/enterprise/site-admin/SiteAdminAuthenticationProvidersPage.tsx */ (+        input: AuthProvidersInput+    ) => AuthProvidersOutput+    ExternalAccounts: /* src/enterprise/site-admin/SiteAdminExternalAccountsPage.tsx */ (+        input: ExternalAccountsInput+    ) => ExternalAccountsOutput+    SiteAdminRegistryExtensions: /* src/enterprise/site-admin/SiteAdminRegistryExtensionsPage.tsx */ (+        input: SiteAdminRegistryExtensionsInput+    ) => SiteAdminRegistryExtensionsOutput+    SiteAdminLsifUpload: /* src/enterprise/site-admin/backend.ts */ (+        input: SiteAdminLsifUploadInput+    ) => SiteAdminLsifUploadOutput+    SetCustomerBilling: /* src/enterprise/site-admin/dotcom/customers/SiteAdminCustomerBillingLink.tsx */ (+        input: SetCustomerBillingInput+    ) => SetCustomerBillingOutput+    Customers: /* src/enterprise/site-admin/dotcom/customers/SiteAdminCustomersPage.tsx */ (+        input: CustomersInput+    ) => CustomersOutput+    CreateProductSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminCreateProductSubscriptionPage.tsx */ (+        input: CreateProductSubscriptionInput+    ) => CreateProductSubscriptionOutput+    ProductSubscriptionAccounts: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminCreateProductSubscriptionPage.tsx */ (+        input: ProductSubscriptionAccountsInput+    ) => ProductSubscriptionAccountsOutput+    GenerateProductLicenseForSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminGenerateProductLicenseForSubscriptionForm.tsx */ (+        input: GenerateProductLicenseForSubscriptionInput+    ) => GenerateProductLicenseForSubscriptionOutput+    DotComProductLicenses: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductLicensesPage.tsx */ (+        input: DotComProductLicensesInput+    ) => DotComProductLicensesOutput+    SetProductSubscriptionBilling: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionBillingLink.tsx */ (+        input: SetProductSubscriptionBillingInput+    ) => SetProductSubscriptionBillingOutput+    DotComProductSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionPage.tsx */ (+        input: DotComProductSubscriptionInput+    ) => DotComProductSubscriptionOutput+    ProductLicenses: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionPage.tsx */ (+        input: ProductLicensesInput+    ) => ProductLicensesOutput+    ArchiveProductSubscription: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionPage.tsx */ (+        input: ArchiveProductSubscriptionInput+    ) => ArchiveProductSubscriptionOutput+    ProductSubscriptionsDotCom: /* src/enterprise/site-admin/dotcom/productSubscriptions/SiteAdminProductSubscriptionsPage.tsx */ (+        input: ProductSubscriptionsDotComInput+    ) => ProductSubscriptionsDotComOutput+    ProductLicenseInfo: /* src/enterprise/site-admin/productSubscription/ProductSubscriptionStatus.tsx */ (+        input: ProductLicenseInfoInput+    ) => ProductLicenseInfoOutput+    PreviewProductSubscriptionInvoice: /* src/enterprise/user/productSubscriptions/NewProductSubscriptionPaymentSection.tsx */ (+        input: PreviewProductSubscriptionInvoiceInput+    ) => PreviewProductSubscriptionInvoiceOutput+    ProductSubscriptionOnEditPage: /* src/enterprise/user/productSubscriptions/UserSubscriptionsEditProductSubscriptionPage.tsx */ (+        input: ProductSubscriptionOnEditPageInput+    ) => ProductSubscriptionOnEditPageOutput+    UpdatePaidProductSubscription: /* src/enterprise/user/productSubscriptions/UserSubscriptionsEditProductSubscriptionPage.tsx */ (+        input: UpdatePaidProductSubscriptionInput+    ) => UpdatePaidProductSubscriptionOutput+    CreatePaidProductSubscription: /* src/enterprise/user/productSubscriptions/UserSubscriptionsNewProductSubscriptionPage.tsx */ (+        input: CreatePaidProductSubscriptionInput+    ) => CreatePaidProductSubscriptionOutput+    ProductSubscription: /* src/enterprise/user/productSubscriptions/UserSubscriptionsProductSubscriptionPage.tsx */ (+        input: ProductSubscriptionInput+    ) => ProductSubscriptionOutput+    ProductSubscriptions: /* src/enterprise/user/productSubscriptions/UserSubscriptionsProductSubscriptionsPage.tsx */ (+        input: ProductSubscriptionsInput+    ) => ProductSubscriptionsOutput+    DeleteExternalAccount: /* src/enterprise/user/settings/ExternalAccountNode.tsx */ (+        input: DeleteExternalAccountInput+    ) => DeleteExternalAccountOutput+    UserExternalAccounts: /* src/enterprise/user/settings/UserSettingsExternalAccountsPage.tsx */ (+        input: UserExternalAccountsInput+    ) => UserExternalAccountsOutput+    RegistryExtensions: /* src/extensions/ExtensionsList.tsx */ (+        input: RegistryExtensionsInput+    ) => RegistryExtensionsOutput+    RegistryExtension: /* src/extensions/extension/ExtensionArea.tsx */ (+        input: RegistryExtensionInput+    ) => RegistryExtensionOutput+    SubmitSurvey: /* src/marketing/backend.tsx */ (input: SubmitSurveyInput) => SubmitSurveyOutput+    FetchSurveyResponses: /* src/marketing/backend.tsx */ (+        input: FetchSurveyResponsesInput+    ) => FetchSurveyResponsesOutput+    FetchAllUsersWithSurveyResponses: /* src/marketing/backend.tsx */ (+        input: FetchAllUsersWithSurveyResponsesInput+    ) => FetchAllUsersWithSurveyResponsesOutput+    FetchSurveyResponseAggregates: /* src/marketing/backend.tsx */ (+        input: FetchSurveyResponseAggregatesInput+    ) => FetchSurveyResponseAggregatesOutput+    RequestTrial: /* src/marketing/backend.tsx */ (input: RequestTrialInput) => RequestTrialOutput+    StatusMessages: /* src/nav/StatusMessagesNavItem.tsx */ (input: StatusMessagesInput) => StatusMessagesOutput+    createOrganization: /* src/org/backend.tsx */ (input: createOrganizationInput) => createOrganizationOutput+    removeUserFromOrganization: /* src/org/backend.tsx */ (+        input: removeUserFromOrganizationInput+    ) => removeUserFromOrganizationOutput+    UpdateOrganization: /* src/org/backend.tsx */ (input: UpdateOrganizationInput) => UpdateOrganizationOutput+    Organization: /* src/org/area/OrgArea.tsx */ (input: OrganizationInput) => OrganizationOutput+    RespondToOrganizationInvitation: /* src/org/area/OrgInvitationPage.tsx */ (+        input: RespondToOrganizationInvitationInput+    ) => RespondToOrganizationInvitationOutput+    OrganizationMembers: /* src/org/area/OrgMembersPage.tsx */ (+        input: OrganizationMembersInput+    ) => OrganizationMembersOutput+    InviteUserToOrganization: /* src/org/invite/InviteForm.tsx */ (+        input: InviteUserToOrganizationInput+    ) => InviteUserToOrganizationOutput+    AddUserToOrganization: /* src/org/invite/InviteForm.tsx */ (+        input: AddUserToOrganizationInput+    ) => AddUserToOrganizationOutput+    ViewerSettings: /* src/platform/context.ts */ (input: ViewerSettingsInput) => ViewerSettingsOutput+    RepositoryGitRefs: /* src/repo/GitReference.tsx */ (input: RepositoryGitRefsInput) => RepositoryGitRefsOutput+    FetchCommits: /* src/repo/RepoRevisionSidebarCommits.tsx */ (input: FetchCommitsInput) => FetchCommitsOutput+    RepositoriesForPopover: /* src/repo/RepositoriesPopover.tsx */ (+        input: RepositoriesForPopoverInput+    ) => RepositoriesForPopoverOutput+    RepositoryGitCommit: /* src/repo/RevisionsPopover.tsx */ (+        input: RepositoryGitCommitInput+    ) => RepositoryGitCommitOutput+    RepositoryRedirect: /* src/repo/backend.ts */ (input: RepositoryRedirectInput) => RepositoryRedirectOutput+    ResolveRev: /* src/repo/backend.ts */ (input: ResolveRevInput) => ResolveRevOutput+    HighlightedFile: /* src/repo/backend.ts */ (input: HighlightedFileInput) => HighlightedFileOutput+    FileExternalLinks: /* src/repo/backend.ts */ (input: FileExternalLinksInput) => FileExternalLinksOutput+    TreeEntries: /* src/repo/backend.ts */ (input: TreeEntriesInput) => TreeEntriesOutput+    Blob: /* src/repo/blob/BlobPage.tsx */ (input: BlobInput) => BlobOutput+    RepositoryGitBranchesOverview: /* src/repo/branches/RepositoryBranchesOverviewPage.tsx */ (+        input: RepositoryGitBranchesOverviewInput+    ) => RepositoryGitBranchesOverviewOutput+    RepositoryCommit: /* src/repo/commit/RepositoryCommitPage.tsx */ (+        input: RepositoryCommitInput+    ) => RepositoryCommitOutput+    RepositoryGitCommits: /* src/repo/commits/RepositoryCommitsPage.tsx */ (+        input: RepositoryGitCommitsInput+    ) => RepositoryGitCommitsOutput+    RepositoryComparisonCommits: /* src/repo/compare/RepositoryCompareCommitsPage.tsx */ (+        input: RepositoryComparisonCommitsInput+    ) => RepositoryComparisonCommitsOutput+    RepositoryComparisonDiff: /* src/repo/compare/RepositoryCompareDiffPage.tsx */ (+        input: RepositoryComparisonDiffInput+    ) => RepositoryComparisonDiffOutput+    RepositoryComparison: /* src/repo/compare/RepositoryCompareOverviewPage.tsx */ (+        input: RepositoryComparisonInput+    ) => RepositoryComparisonOutput+    ExploreRepositories: /* src/repo/explore/RepositoriesExploreSection.tsx */ (+        input: ExploreRepositoriesInput+    ) => ExploreRepositoriesOutput+    RepositoryTextSearchIndex: /* src/repo/settings/RepoSettingsIndexPage.tsx */ (+        input: RepositoryTextSearchIndexInput+    ) => RepositoryTextSearchIndexOutput+    Repository: /* src/repo/settings/backend.tsx */ (input: RepositoryInput) => RepositoryOutput+    RepositoryContributors: /* src/repo/stats/RepositoryStatsContributorsPage.tsx */ (+        input: RepositoryContributorsInput+    ) => RepositoryContributorsOutput+    TreeCommits: /* src/repo/tree/TreePage.tsx */ (input: TreeCommitsInput) => TreeCommitsOutput+    Search: /* src/search/backend.tsx */ (input: SearchInput) => SearchOutput+    RepoGroups: /* src/search/backend.tsx */ (input: RepoGroupsInput) => RepoGroupsOutput+    SearchSuggestions: /* src/search/backend.tsx */ (input: SearchSuggestionsInput) => SearchSuggestionsOutput+    ReposByQuery: /* src/search/backend.tsx */ (input: ReposByQueryInput) => ReposByQueryOutput+    savedSearches: /* src/search/backend.tsx */ (input: savedSearchesInput) => savedSearchesOutput+    SavedSearch: /* src/search/backend.tsx */ (input: SavedSearchInput) => SavedSearchOutput+    CreateSavedSearch: /* src/search/backend.tsx */ (input: CreateSavedSearchInput) => CreateSavedSearchOutput+    UpdateSavedSearch: /* src/search/backend.tsx */ (input: UpdateSavedSearchInput) => UpdateSavedSearchOutput+    DeleteSavedSearch: /* src/search/backend.tsx */ (input: DeleteSavedSearchInput) => DeleteSavedSearchOutput+    highlightCode: /* src/search/backend.tsx */ (input: highlightCodeInput) => highlightCodeOutput+    ManyReposWarning: /* src/search/backend.tsx */ (input: ManyReposWarningInput) => ManyReposWarningOutput+    SettingsCascade: /* src/settings/SettingsArea.tsx */ (input: SettingsCascadeInput) => SettingsCascadeOutput+    DeleteAccessToken: /* src/settings/tokens/AccessTokenNode.tsx */ (+        input: DeleteAccessTokenInput+    ) => DeleteAccessTokenOutput+    SiteFlags: /* src/site/backend.tsx */ (input: SiteFlagsInput) => SiteFlagsOutput+    addExternalService: /* src/site-admin/SiteAdminAddExternalServicePage.tsx */ (+        input: addExternalServiceInput+    ) => addExternalServiceOutput+    UpdateExternalService: /* src/site-admin/SiteAdminExternalServicePage.tsx */ (+        input: UpdateExternalServiceInput+    ) => UpdateExternalServiceOutput+    ExternalService: /* src/site-admin/SiteAdminExternalServicePage.tsx */ (+        input: ExternalServiceInput+    ) => ExternalServiceOutput+    DeleteExternalService: /* src/site-admin/SiteAdminExternalServicesPage.tsx */ (+        input: DeleteExternalServiceInput+    ) => DeleteExternalServiceOutput+    ExternalServices: /* src/site-admin/SiteAdminExternalServicesPage.tsx */ (+        input: ExternalServicesInput+    ) => ExternalServicesOutput+    SiteAdminAccessTokens: /* src/site-admin/SiteAdminTokensPage.tsx */ (+        input: SiteAdminAccessTokensInput+    ) => SiteAdminAccessTokensOutput+    Users: /* src/site-admin/backend.tsx */ (input: UsersInput) => UsersOutput+    Organizations: /* src/site-admin/backend.tsx */ (input: OrganizationsInput) => OrganizationsOutput+    Repositories: /* src/site-admin/backend.tsx */ (input: RepositoriesInput) => RepositoriesOutput+    UpdateMirrorRepository: /* src/site-admin/backend.tsx */ (+        input: UpdateMirrorRepositoryInput+    ) => UpdateMirrorRepositoryOutput+    CheckMirrorRepositoryConnection: /* src/site-admin/backend.tsx */ (+        input: CheckMirrorRepositoryConnectionInput+    ) => CheckMirrorRepositoryConnectionOutput+    ScheduleRepositoryPermissionsSync: /* src/site-admin/backend.tsx */ (+        input: ScheduleRepositoryPermissionsSyncInput+    ) => ScheduleRepositoryPermissionsSyncOutput+    ScheduleUserPermissionsSync: /* src/site-admin/backend.tsx */ (+        input: ScheduleUserPermissionsSyncInput+    ) => ScheduleUserPermissionsSyncOutput+    UserUsageStatistics: /* src/site-admin/backend.tsx */ (input: UserUsageStatisticsInput) => UserUsageStatisticsOutput+    SiteUsageStatistics: /* src/site-admin/backend.tsx */ (input: SiteUsageStatisticsInput) => SiteUsageStatisticsOutput+    Site: /* src/site-admin/backend.tsx */ (input: SiteInput) => SiteOutput+    AllConfig: /* src/site-admin/backend.tsx */ (input: AllConfigInput) => AllConfigOutput+    UpdateSiteConfiguration: /* src/site-admin/backend.tsx */ (+        input: UpdateSiteConfigurationInput+    ) => UpdateSiteConfigurationOutput+    ReloadSite: /* src/site-admin/backend.tsx */ (input: ReloadSiteInput) => ReloadSiteOutput+    SetUserIsSiteAdmin: /* src/site-admin/backend.tsx */ (input: SetUserIsSiteAdminInput) => SetUserIsSiteAdminOutput+    RandomizeUserPassword: /* src/site-admin/backend.tsx */ (+        input: RandomizeUserPasswordInput+    ) => RandomizeUserPasswordOutput+    DeleteUser: /* src/site-admin/backend.tsx */ (input: DeleteUserInput) => DeleteUserOutput+    CreateUser: /* src/site-admin/backend.tsx */ (input: CreateUserInput) => CreateUserOutput+    DeleteOrganization: /* src/site-admin/backend.tsx */ (input: DeleteOrganizationInput) => DeleteOrganizationOutput+    SiteUpdateCheck: /* src/site-admin/backend.tsx */ (input: SiteUpdateCheckInput) => SiteUpdateCheckOutput+    SiteMonitoringStatistics: /* src/site-admin/backend.tsx */ (+        input: SiteMonitoringStatisticsInput+    ) => SiteMonitoringStatisticsOutput+    Overview: /* src/site-admin/overview/SiteAdminOverviewPage.tsx */ (input: OverviewInput) => OverviewOutput+    WAUs: /* src/site-admin/overview/SiteAdminOverviewPage.tsx */ (input: WAUsInput) => WAUsOutput+    Symbols: /* src/symbols/backend.tsx */ (input: SymbolsInput) => SymbolsOutput+    SiteAdminActivationStatus: /* src/tracking/withActivation.tsx */ (+        input: SiteAdminActivationStatusInput+    ) => SiteAdminActivationStatusOutput+    ActivationStatus: /* src/tracking/withActivation.tsx */ (input: ActivationStatusInput) => ActivationStatusOutput+    LinksForRepositories: /* src/tracking/withActivation.tsx */ (+        input: LinksForRepositoriesInput+    ) => LinksForRepositoriesOutput+    UserEventLogs: /* src/user/UserEventLogsPage.tsx */ (input: UserEventLogsInput) => UserEventLogsOutput+    User: /* src/user/area/UserArea.tsx */ (input: UserInput) => UserOutput+    updateUser: /* src/user/settings/backend.tsx */ (input: updateUserInput) => updateUserOutput+    updatePassword: /* src/user/settings/backend.tsx */ (input: updatePasswordInput) => updatePasswordOutput+    SetUserEmailVerified: /* src/user/settings/backend.tsx */ (+        input: SetUserEmailVerifiedInput+    ) => SetUserEmailVerifiedOutput+    logUserEvent: /* src/user/settings/backend.tsx */ (input: logUserEventInput) => logUserEventOutput+    logEvent: /* src/user/settings/backend.tsx */ (input: logEventInput) => logEventOutput+    CreateAccessToken: /* src/user/settings/accessTokens/UserSettingsCreateAccessTokenPage.tsx */ (+        input: CreateAccessTokenInput+    ) => CreateAccessTokenOutput+    AccessTokens: /* src/user/settings/accessTokens/UserSettingsTokensPage.tsx */ (+        input: AccessTokensInput+    ) => AccessTokensOutput+    AddUserEmail: /* src/user/settings/emails/AddUserEmailForm.tsx */ (input: AddUserEmailInput) => AddUserEmailOutput+    RemoveUserEmail: /* src/user/settings/emails/UserSettingsEmailsPage.tsx */ (+        input: RemoveUserEmailInput+    ) => RemoveUserEmailOutput+    UserEmails: /* src/user/settings/emails/UserSettingsEmailsPage.tsx */ (input: UserEmailsInput) => UserEmailsOutput+    UserForProfilePage: /* src/user/settings/profile/UserSettingsProfilePage.tsx */ (+        input: UserForProfilePageInput+    ) => UserForProfilePageOutput+}+export type CurrentAuthStateInput = {}+export type CurrentAuthStateOutput = {+    currentUser: {+        __typename: 'User'+        id: string+        databaseID: number+        username: string+        avatarURL: string | null+        email: string+        displayName: string | null+        siteAdmin: boolean+        tags: string[]+        url: string+        settingsURL: string | null+        organizations: {+            nodes: {+                id: string+                name: string+                displayName: string | null+                url: string+                settingsURL: string | null+            }[]+        }+        session: {+            canSignOut: boolean+        }+        viewerCanAdminister: boolean+    } | null+}+export type FileDiffHunkRangeFields = {+    startLine: number+    lines: number+}+export type DiffStatFields = {+    added: number+    changed: number+    deleted: number+}+export type FileDiffFields = {+    __typename: 'FileDiff'+    oldPath: string | null+    oldFile: {+        __typename: string+        binary: boolean+        byteSize: number+    } | null+    newFile: {+        __typename: string+        binary: boolean+        byteSize: number+    } | null+    newPath: string | null+    mostRelevantFile: {+        __typename: string+        url: string+    }+    hunks: {+        oldRange: {+            startLine: number+            lines: number+        }+        oldNoNewlineAt: boolean+        newRange: {+            startLine: number+            lines: number+        }+        section: string | null+        highlight: {+            aborted: boolean+            lines: {+                kind: 'ADDED' | 'UNCHANGED' | 'DELETED'+                html: string+            }[]+        }+    }[]+    stat: {+        added: number+        changed: number+        deleted: number+    }+    internalID: string+}+export type RepositoryIDInput = {+    repoName: string+}+export type RepositoryIDOutput = {+    repository: {+        id: string+    } | null+}+export type CreateChangesetInput = {+    repositoryID: string+    externalID: string+}+export type CreateChangesetOutput = {+    createChangesets: {+        id: string+    }[]+}+export type AddChangeSetToCampaignInput = {+    campaignID: string+    changesets: string[]+}+export type AddChangeSetToCampaignOutput = {+    addChangesetsToCampaign: {+        id: string+    }+}+export type CampaignFields = {+    __typename: 'Campaign'+    id: string+    name: string+    description: string | null+    author: {+        username: string+        avatarURL: string | null+    }+    status: {+        completedCount: number+        pendingCount: number+        state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'CANCELED'+        errors: string[]+    }+    branch: string | null+    createdAt: any+    updatedAt: any+    closedAt: any | null+    viewerCanAdminister: boolean+    hasUnpublishedPatches: boolean+    changesets: {+        totalCount: number+    }+    patches: {+        totalCount: number+    }+    changesetCountsOverTime: {+        date: any+        merged: number+        closed: number+        openApproved: number+        openChangesRequested: number+        openPending: number+        total: number+    }[]+    diffStat: DiffStatFields1+}+export type DiffStatFields1 = {+    added: number+    changed: number+    deleted: number+}+export type PatchSetFields = {+    __typename: 'PatchSet'+    id: string+    diffStat: DiffStatFields2+    patches: {+        totalCount: number+    }+}+export type DiffStatFields2 = {+    added: number+    changed: number+    deleted: number+}+export type UpdateCampaignInput = {+    update: {+        id: string+        name: string | null+        branch: string | null+        description: string | null+        patchSet: string | null+    }+}+export type UpdateCampaignOutput = {+    updateCampaign: CampaignFields1+}+export type CampaignFields1 = {+    __typename: 'Campaign'+    id: string+    name: string+    description: string | null+    author: {+        username: string+        avatarURL: string | null+    }+    status: {+        completedCount: number+        pendingCount: number+        state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'CANCELED'+        errors: string[]+    }+    branch: string | null+    createdAt: any+    updatedAt: any+    closedAt: any | null+    viewerCanAdminister: boolean+    hasUnpublishedPatches: boolean+    changesets: {+        totalCount: number+    }+    patches: {+        totalCount: number+    }+    changesetCountsOverTime: {+        date: any+        merged: number+        closed: number+        openApproved: number+        openChangesRequested: number+        openPending: number+        total: number+    }[]+    diffStat: DiffStatFields3+}+export type DiffStatFields3 = {+    added: number+    changed: number+    deleted: number+}+export type CreateCampaignInput = {+    input: {+        namespace: string+        name: string+        description: string | null+        branch: string | null+        patchSet: string | null+    }+}+export type CreateCampaignOutput = {+    createCampaign: {+        id: string+        url: string+    }+}+export type RetryCampaignChangesetsInput = {+    campaign: string+}+export type RetryCampaignChangesetsOutput = {+    retryCampaignChangesets: CampaignFields2+}+export type CampaignFields2 = {+    __typename: 'Campaign'+    id: string+    name: string+    description: string | null+    author: {+        username: string+        avatarURL: string | null+    }+    status: {+        completedCount: number+        pendingCount: number+        state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'CANCELED'+        errors: string[]+    }+    branch: string | null+    createdAt: any+    updatedAt: any+    closedAt: any | null+    viewerCanAdminister: boolean+    hasUnpublishedPatches: boolean+    changesets: {+        totalCount: number+    }+    patches: {+        totalCount: number+    }+    changesetCountsOverTime: {+        date: any+        merged: number+        closed: number+        openApproved: number+        openChangesRequested: number+        openPending: number+        total: number+    }[]+    diffStat: DiffStatFields4+}+export type DiffStatFields4 = {+    added: number+    changed: number+    deleted: number+}+export type PublishCampaignChangesetsInput = {+    campaign: string+}+export type PublishCampaignChangesetsOutput = {+    publishCampaignChangesets: CampaignFields3+}+export type CampaignFields3 = {+    __typename: 'Campaign'+    id: string+    name: string+    description: string | null+    author: {+        username: string+        avatarURL: string | null+    }+    status: {+        completedCount: number+        pendingCount: number+        state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'CANCELED'+        errors: string[]+    }+    branch: string | null+    createdAt: any+    updatedAt: any+    closedAt: any | null+    viewerCanAdminister: boolean+    hasUnpublishedPatches: boolean+    changesets: {+        totalCount: number+    }+    patches: {+        totalCount: number+    }+    changesetCountsOverTime: {+        date: any+        merged: number+        closed: number+        openApproved: number+        openChangesRequested: number+        openPending: number+        total: number+    }[]+    diffStat: DiffStatFields5+}+export type DiffStatFields5 = {+    added: number+    changed: number+    deleted: number+}+export type CloseCampaignInput = {+    campaign: string+    closeChangesets: boolean+}+export type CloseCampaignOutput = {+    closeCampaign: {+        id: string+    }+}+export type DeleteCampaignInput = {+    campaign: string+    closeChangesets: boolean+}+export type DeleteCampaignOutput = {+    deleteCampaign: {+        alwaysNil: string | null+    } | null+}+export type CampaignByIDInput = {+    campaign: string+}+export type CampaignByIDOutput = {+    node:+        | ({+              __typename: string+          } & CampaignFields4)+        | null+}+export type CampaignFields4 = {+    __typename: 'Campaign'+    id: string+    name: string+    description: string | null+    author: {+        username: string+        avatarURL: string | null+    }+    status: {+        completedCount: number+        pendingCount: number+        state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'CANCELED'+        errors: string[]+    }+    branch: string | null+    createdAt: any+    updatedAt: any+    closedAt: any | null+    viewerCanAdminister: boolean+    hasUnpublishedPatches: boolean+    changesets: {+        totalCount: number+    }+    patches: {+        totalCount: number+    }+    changesetCountsOverTime: {+        date: any+        merged: number+        closed: number+        openApproved: number+        openChangesRequested: number+        openPending: number+        total: number+    }[]+    diffStat: DiffStatFields6+}+export type DiffStatFields6 = {+    added: number+    changed: number+    deleted: number+}+export type PatchSetByIDInput = {+    patchSet: string+}+export type PatchSetByIDOutput = {+    node:+        | ({+              __typename: string+          } & PatchSetFields1)+        | null+}+export type PatchSetFields1 = {+    __typename: 'PatchSet'+    id: string+    diffStat: DiffStatFields7+    patches: {+        totalCount: number+    }+}+export type DiffStatFields7 = {+    added: number+    changed: number+    deleted: number+}+export type CampaignChangesetsInput = {+    campaign: string+    first: number | null+    state: ('OPEN' | 'CLOSED' | 'MERGED' | 'DELETED') | null+    reviewState: ('APPROVED' | 'CHANGES_REQUESTED' | 'PENDING' | 'COMMENTED' | 'DISMISSED') | null+    checkState: ('PENDING' | 'PASSED' | 'FAILED') | null+}+export type CampaignChangesetsOutput = {+    node:+        | ({+              __typename: string+          } & {+              changesets: {+                  totalCount: number+                  nodes: ({+                      __typename: string+                      state: 'OPEN' | 'CLOSED' | 'MERGED' | 'DELETED'+                      createdAt: any+                      updatedAt: any+                      nextSyncAt: any | null+                  } & {+                      id: string+                  } & {+                      id: string+                      title: string+                      body: string+                      reviewState: 'APPROVED' | 'CHANGES_REQUESTED' | 'PENDING' | 'COMMENTED' | 'DISMISSED'+                      checkState: ('PENDING' | 'PASSED' | 'FAILED') | null+                      labels: {+                          text: string+                          description: string | null+                          color: string+                      }[]+                      repository: {+                          id: string+                          name: string+                          url: string+                      }+                      externalURL: {+                          url: string+                      }+                      externalID: string+                      diff: {+                          fileDiffs: {+                              diffStat: DiffStatFields8+                          }+                      } | null+                      diffStat: {+                          added: number+                          changed: number+                          deleted: number+                      } | null+                  })[]+              }+          })+        | null+}+export type DiffStatFields8 = {+    added: number+    changed: number+    deleted: number+}+export type CampaignPatchesInput = {+    campaign: string+    first: number | null+}+export type CampaignPatchesOutput = {+    node:+        | ({+              __typename: string+          } & {+              patches: {+                  totalCount: number+                  nodes: ({+                      __typename: string+                  } & {+                      id: string+                  } & {+                      id: string+                      repository: {+                          id: string+                          name: string+                          url: string+                      }+                      publishable: boolean+                      publicationEnqueued: boolean+                      diff: {+                          fileDiffs: {+                              diffStat: DiffStatFields9+                          }+                      }+                  })[]+              }+          })+        | null+}+export type DiffStatFields9 = {+    added: number+    changed: number+    deleted: number+}+export type PatchSetPatchesInput = {+    patchSet: string+    first: number | null+}+export type PatchSetPatchesOutput = {+    node:+        | ({+              __typename: string+          } & {+              patches: {+                  totalCount: number+                  nodes: ({+                      __typename: string+                      id: string+                  } & {+                      repository: {+                          id: string+                          name: string+                          url: string+                      }+                      publishable: boolean+                      publicationEnqueued: boolean+                      diff: {+                          fileDiffs: {+                              diffStat: DiffStatFields10+                          }+                      }+                  })[]+              }+          })+        | null+}+export type DiffStatFields10 = {+    added: number+    changed: number+    deleted: number+}+export type PublishChangesetInput = {+    patch: string+}+export type PublishChangesetOutput = {+    publishChangeset: {+        alwaysNil: string | null+    }+}+export type SyncChangesetInput = {+    changeset: string+}+export type SyncChangesetOutput = {+    syncChangeset: {+        alwaysNil: string | null+    }+}+export type ExternalChangesetFileDiffsInput = {+    externalChangeset: string+    first: number | null+    after: string | null+    isLightTheme: boolean+}+export type ExternalChangesetFileDiffsOutput = {+    node:+        | ({+              __typename: string+          } & {+              diff: {+                  range: {+                      base: GitRefSpecFields+                      head: GitRefSpecFields+                  }+                  fileDiffs: {+                      nodes: FileDiffFields1[]+                      totalCount: number | null+                      pageInfo: {+                          hasNextPage: boolean+                          endCursor: string | null+                      }+                      diffStat: DiffStatFields11+                  }+              } | null+          })+        | null+}+export type GitRefSpecFields = {+    __typename: 'GitRef' | 'GitRevSpecExpr' | 'GitObject'+} & (+    | {+          oid: any+      }+    | {+          target: {+              oid: any+          }+      }+    | {+          object: {+              oid: any+          } | null+      }+)+export type FileDiffFields1 = {+    __typename: 'FileDiff'+    oldPath: string | null+    oldFile: {+        __typename: string+        binary: boolean+        byteSize: number+    } | null+    newFile: {+        __typename: string+        binary: boolean+        byteSize: number+    } | null+    newPath: string | null+    mostRelevantFile: {+        __typename: string+        url: string+    }+    hunks: {+        oldRange: {+            startLine: number+            lines: number+        }+        oldNoNewlineAt: boolean+        newRange: {+            startLine: number+            lines: number+        }+        section: string | null+        highlight: {+            aborted: boolean+            lines: {+                kind: 'ADDED' | 'UNCHANGED' | 'DELETED'+                html: string+            }[]+        }+    }[]+    stat: {+        added: number+        changed: number+        deleted: number+    }+    internalID: string+}+export type DiffStatFields11 = {+    added: number+    changed: number+    deleted: number+}+export type PatchFileDiffsInput = {+    patch: string+    first: number | null+    after: string | null+    isLightTheme: boolean+}+export type PatchFileDiffsOutput = {+    node:+        | ({+              __typename: string+          } & {+              diff: {+                  fileDiffs: {+                      nodes: FileDiffFields2[]+                      totalCount: number | null+                      pageInfo: {+                          hasNextPage: boolean+                          endCursor: string | null+                      }+                      diffStat: DiffStatFields12+                  }+              }+          })+        | null+}+export type FileDiffFields2 = {+    __typename: 'FileDiff'+    oldPath: string | null+    oldFile: {+        __typename: string+        binary: boolean+        byteSize: number+    } | null+    newFile: {+        __typename: string+        binary: boolean+        byteSize: number+    } | null+    newPath: string | null+    mostRelevantFile: {+        __typename: string+        url: string+    }+    hunks: {+        oldRange: {+            startLine: number+            lines: number+        }+        oldNoNewlineAt: boolean+        newRange: {+            startLine: number+            lines: number+        }+        section: string | null+        highlight: {+            aborted: boolean+            lines: {+                kind: 'ADDED' | 'UNCHANGED' | 'DELETED'+                html: string+            }[]+        }+    }[]+    stat: {+        added: number+        changed: number+        deleted: number+    }+    internalID: string+}+export type DiffStatFields12 = {+    added: number+    changed: number+    deleted: number+}+export type CampaignsInput = {+    first: number | null+    state: ('OPEN' | 'CLOSED') | null+    hasPatchSet: boolean | null+    viewerCanAdminister: boolean | null+}+export type CampaignsOutput = {+    campaigns: {+        nodes: {+            id: string+            name: string+            description: string | null+            url: string+            createdAt: any+            closedAt: any | null+            changesets: {+                totalCount: number+                nodes: {+                    state: 'OPEN' | 'CLOSED' | 'MERGED' | 'DELETED'+                }[]+            }+            patches: {+                totalCount: number+            }+        }[]+        totalCount: number+    }+}+export type CampaignsCountInput = {}+export type CampaignsCountOutput = {+    campaigns: {+        totalCount: number+    }+}+export type LsifUploadsInput = {+    state: ('PROCESSING' | 'ERRORED' | 'COMPLETED' | 'QUEUED' | 'UPLOADING') | null+    isLatestForRepo: boolean | null+    first: number | null+    after: string | null+    query: string | null+}+export type LsifUploadsOutput = {+    lsifUploads: {+        nodes: {+            id: string+            state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'QUEUED' | 'UPLOADING'+            projectRoot: {+                url: string+                path: string+                repository: {+                    url: string+                    name: string+                }+                commit: {+                    url: string+                    oid: any+                    abbreviatedOID: string+                }+            } | null+            inputCommit: string+            inputRoot: string+            inputIndexer: string+            uploadedAt: any+            startedAt: any | null+            finishedAt: any | null+            placeInQueue: number | null+        }[]+        totalCount: number | null+        pageInfo: {+            endCursor: string | null+            hasNextPage: boolean+        }+    }+}+export type LsifUploadsWithRepoInput = {+    repository: string+    state: ('PROCESSING' | 'ERRORED' | 'COMPLETED' | 'QUEUED' | 'UPLOADING') | null+    isLatestForRepo: boolean | null+    first: number | null+    after: string | null+    query: string | null+}+export type LsifUploadsWithRepoOutput = {+    node:+        | ({+              __typename: string+          } & {+              lsifUploads: {+                  nodes: {+                      id: string+                      state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'QUEUED' | 'UPLOADING'+                      projectRoot: {+                          url: string+                          path: string+                          repository: {+                              url: string+                              name: string+                          }+                          commit: {+                              url: string+                              oid: any+                              abbreviatedOID: string+                          }+                      } | null+                      inputCommit: string+                      inputRoot: string+                      inputIndexer: string+                      uploadedAt: any+                      startedAt: any | null+                      finishedAt: any | null+                      placeInQueue: number | null+                  }[]+                  totalCount: number | null+                  pageInfo: {+                      endCursor: string | null+                      hasNextPage: boolean+                  }+              }+          })+        | null+}+export type LsifUploadInput = {+    id: string+}+export type LsifUploadOutput = {+    node:+        | ({+              __typename: string+          } & {+              id: string+              projectRoot: {+                  url: string+                  path: string+                  repository: {+                      url: string+                      name: string+                  }+                  commit: {+                      url: string+                      oid: any+                      abbreviatedOID: string+                  }+              } | null+              inputCommit: string+              inputRoot: string+              inputIndexer: string+              state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'QUEUED' | 'UPLOADING'+              failure: string | null+              uploadedAt: any+              startedAt: any | null+              finishedAt: any | null+              isLatestForRepo: boolean+              placeInQueue: number | null+          })+        | null+}+export type DeleteLsifUploadInput = {+    id: string+}+export type DeleteLsifUploadOutput = {+    deleteLSIFUpload: {+        alwaysNil: string | null+    } | null+}+export type LsifIndexesInput = {+    state: ('PROCESSING' | 'ERRORED' | 'COMPLETED' | 'QUEUED') | null+    first: number | null+    after: string | null+    query: string | null+}+export type LsifIndexesOutput = {+    lsifIndexes: {+        nodes: {+            id: string+            state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'QUEUED'+            projectRoot: {+                url: string+                path: string+                repository: {+                    url: string+                    name: string+                }+                commit: {+                    url: string+                    oid: any+                    abbreviatedOID: string+                }+            } | null+            inputCommit: string+            queuedAt: any+            startedAt: any | null+            finishedAt: any | null+            placeInQueue: number | null+        }[]+        totalCount: number | null+        pageInfo: {+            endCursor: string | null+            hasNextPage: boolean+        }+    }+}+export type LsifIndexesWithRepoInput = {+    repository: string+    state: ('PROCESSING' | 'ERRORED' | 'COMPLETED' | 'QUEUED') | null+    first: number | null+    after: string | null+    query: string | null+}+export type LsifIndexesWithRepoOutput = {+    node:+        | ({+              __typename: string+          } & {+              lsifIndexes: {+                  nodes: {+                      id: string+                      state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'QUEUED'+                      projectRoot: {+                          url: string+                          path: string+                          repository: {+                              url: string+                              name: string+                          }+                          commit: {+                              url: string+                              oid: any+                              abbreviatedOID: string+                          }+                      } | null+                      inputCommit: string+                      queuedAt: any+                      startedAt: any | null+                      finishedAt: any | null+                      placeInQueue: number | null+                  }[]+                  totalCount: number | null+                  pageInfo: {+                      endCursor: string | null+                      hasNextPage: boolean+                  }+              }+          })+        | null+}+export type LsifIndexInput = {+    id: string+}+export type LsifIndexOutput = {+    node:+        | ({+              __typename: string+          } & {+              id: string+              projectRoot: {+                  url: string+                  path: string+                  repository: {+                      url: string+                      name: string+                  }+                  commit: {+                      url: string+                      oid: any+                      abbreviatedOID: string+                  }+              } | null+              inputCommit: string+              state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'QUEUED'+              failure: string | null+              queuedAt: any+              startedAt: any | null+              finishedAt: any | null+              placeInQueue: number | null+          })+        | null+}+export type DeleteLsifIndexInput = {+    id: string+}+export type DeleteLsifIndexOutput = {+    deleteLSIFIndex: {+        alwaysNil: string | null+    } | null+}+export type ProductPlansInput = {}+export type ProductPlansOutput = {+    dotcom: {+        productPlans: {+            productPlanID: string+            billingPlanID: string+            name: string+            pricePerUserPerYear: number+            minQuantity: number | null+            maxQuantity: number | null+            tiersMode: string+            planTiers: {+                unitAmount: number+                upTo: number+                flatAmount: number+            }[]+        }[]+    }+}+export type ProductSubscriptionFields = {+    id: string+    name: string+    account: {+        id: string+        username: string+        displayName: string | null+        emails: {+            email: string+            verified: boolean+        }[]+    } | null+    invoiceItem: {+        plan: {+            nameWithBrand: string+        }+        userCount: number+        expiresAt: any+    } | null+    activeLicense: {+        licenseKey: string+        info: {+            productNameWithBrand: string+            tags: string[]+            userCount: number+            expiresAt: any+        } | null+    } | null+    createdAt: any+    isArchived: boolean+    url: string+}+export type ExploreExtensionsInput = {+    first: number | null+    prioritizeExtensionIDs: string[] | null+}+export type ExploreExtensionsOutput = {+    extensionRegistry: {+        extensions: {+            nodes: {+                id: string+                extensionIDWithoutRegistry: string+                url: string+                manifest: {+                    description: string | null+                } | null+            }[]+        }+    }+}+export type UpdateRegistryExtensionInput = {+    extension: string+    name: string | null+}+export type UpdateRegistryExtensionOutput = {+    extensionRegistry: {+        updateExtension: {+            extension: {+                url: string+            }+        }+    }+}+export type PublishRegistryExtensionInput = {+    extensionID: string+    manifest: string+    bundle: string+}+export type PublishRegistryExtensionOutput = {+    extensionRegistry: {+        publishExtension: {+            extension: {+                url: string+            }+        }+    }+}+export type CreateRegistryExtensionInput = {+    publisher: string+    name: string+}+export type CreateRegistryExtensionOutput = {+    extensionRegistry: {+        createExtension: {+            extension: {+                id: string+                extensionID: string+                url: string+            }+        }+    }+}+export type DeleteRegistryExtensionInput = {+    extension: string+}+export type DeleteRegistryExtensionOutput = {+    extensionRegistry: {+        deleteExtension: {+            alwaysNil: string | null+        }+    }+}+export type ViewerRegistryPublishersInput = {}+export type ViewerRegistryPublishersOutput = {+    extensionRegistry: {+        viewerPublishers: ({+            __typename: 'User' | 'Org'+        } & (+            | {+                  id: string+                  username: string+              }+            | {+                  id: string+                  name: string+              }+        ))[]+        localExtensionIDPrefix: string | null+    }+}+export type ViewerNamespacesInput = {}+export type ViewerNamespacesOutput = {+    currentUser: {+        __typename: 'User'+        id: string+        namespaceName: string+        url: string+        organizations: {+            nodes: {+                __typename: 'Org'+                id: string+                namespaceName: string+                url: string+            }[]+        }+    } | null+}+export type LsifUploadsForRepoInput = {+    repository: string+    state: ('PROCESSING' | 'ERRORED' | 'COMPLETED' | 'QUEUED' | 'UPLOADING') | null+    isLatestForRepo: boolean | null+    first: number | null+    after: string | null+    query: string | null+}+export type LsifUploadsForRepoOutput = {+    node:+        | ({+              __typename: string+          } & {+              lsifUploads: {+                  nodes: {+                      id: string+                      state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'QUEUED' | 'UPLOADING'+                      projectRoot: {+                          commit: {+                              abbreviatedOID: string+                              url: string+                          }+                          path: string+                          url: string+                      } | null+                      inputCommit: string+                      inputRoot: string+                      inputIndexer: string+                      uploadedAt: any+                      startedAt: any | null+                      finishedAt: any | null+                      placeInQueue: number | null+                  }[]+                  totalCount: number | null+                  pageInfo: {+                      endCursor: string | null+                      hasNextPage: boolean+                  }+              }+          })+        | null+}+export type LsifUploadForRepoInput = {+    id: string+}+export type LsifUploadForRepoOutput = {+    node:+        | ({+              __typename: string+          } & {+              id: string+              projectRoot: {+                  commit: {+                      oid: any+                      abbreviatedOID: string+                      url: string+                      repository: {+                          name: string+                          url: string+                      }+                  }+                  path: string+                  url: string+              } | null+              inputCommit: string+              inputRoot: string+              inputIndexer: string+              state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'QUEUED' | 'UPLOADING'+              failure: string | null+              uploadedAt: any+              startedAt: any | null+              finishedAt: any | null+              isLatestForRepo: boolean+              placeInQueue: number | null+          })+        | null+}+export type DeleteLsifUploadForRepoInput = {+    id: string+}+export type DeleteLsifUploadForRepoOutput = {+    deleteLSIFUpload: {+        alwaysNil: string | null+    } | null+}+export type LsifIndexesForRepoInput = {+    repository: string+    state: ('PROCESSING' | 'ERRORED' | 'COMPLETED' | 'QUEUED') | null+    first: number | null+    after: string | null+    query: string | null+}+export type LsifIndexesForRepoOutput = {+    node:+        | ({+              __typename: string+          } & {+              lsifIndexes: {+                  nodes: {+                      id: string+                      state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'QUEUED'+                      projectRoot: {+                          commit: {+                              abbreviatedOID: string+                              url: string+                          }+                          path: string+                          url: string+                      } | null+                      inputCommit: string+                      queuedAt: any+                      startedAt: any | null+                      finishedAt: any | null+                      placeInQueue: number | null+                  }[]+                  totalCount: number | null+                  pageInfo: {+                      endCursor: string | null+                      hasNextPage: boolean+                  }+              }+          })+        | null+}+export type LsifIndexForRepoInput = {+    id: string+}+export type LsifIndexForRepoOutput = {+    node:+        | ({+              __typename: string+          } & {+              id: string+              projectRoot: {+                  commit: {+                      oid: any+                      abbreviatedOID: string+                      url: string+                      repository: {+                          name: string+                          url: string+                      }+                  }+                  path: string+                  url: string+              } | null+              inputCommit: string+              state: 'PROCESSING' | 'ERRORED' | 'COMPLETED' | 'QUEUED'+              failure: string | null+              queuedAt: any+              startedAt: any | null+              finishedAt: any | null+              placeInQueue: number | null+          })+        | null+}+export type DeleteLsifIndexForRepoInput = {+    id: string+}+export type DeleteLsifIndexForRepoOutput = {+    deleteLSIFIndex: {+        alwaysNil: string | null+    } | null+}+export type SearchResultsStatsInput = {+    query: string+}+export type SearchResultsStatsOutput = {+    search: {+        results: {+            limitHit: boolean+        }+        stats: {+            languages: {+                name: string+                totalLines: number+            }[]+        }+    } | null+}+export type AuthProviderFields = {+    serviceType: string+    serviceID: string+    clientID: string+    displayName: string+    isBuiltin: boolean+    authenticationURL: string | null+}+export type AuthProvidersInput = {}+export type AuthProvidersOutput = {+    site: {+        authProviders: {+            nodes: AuthProviderFields1[]+            totalCount: number+            pageInfo: {+                hasNextPage: boolean+            }+        }+    }+}+export type AuthProviderFields1 = {+    serviceType: string+    serviceID: string+    clientID: string+    displayName: string+    isBuiltin: boolean+    authenticationURL: string | null+}+export type ExternalAccountsInput = {+    first: number | null+    user: string | null+    serviceType: string | null+    serviceID: string | null+    clientID: string | null+}+export type ExternalAccountsOutput = {+    site: {+        externalAccounts: {+            nodes: ExternalAccountFields[]+            totalCount: number+            pageInfo: {+                hasNextPage: boolean+            }+        }+    }+}+export type ExternalAccountFields = {+    id: string+    user: {+        id: string+        username: string+    }+    serviceType: string+    serviceID: string+    clientID: string+    accountID: string+    createdAt: any+    updatedAt: any+    refreshURL: string | null+    accountData: any | null+}+export type SiteAdminRegistryExtensionsInput = {+    first: number | null+    publisher: string | null+    query: string | null+    local: boolean | null+    remote: boolean | null+}+export type SiteAdminRegistryExtensionsOutput = {+    extensionRegistry: {+        extensions: {+            nodes: RegistryExtensionFields[]+            totalCount: number+            pageInfo: {+                hasNextPage: boolean+            }+            error: string | null+        }+    }+}+export type RegistryExtensionFields = {+    id: string+    publisher:+        | ({+              __typename: 'User' | 'Org'+          } & (+              | {+                    id: string+                    username: string+                    displayName: string | null+                    url: string+                }+              | {+                    id: string+                    name: string+                    displayName: string | null+                    url: string+                }

Good point, I will try this workaround.

twop

comment created time in a month

Pull request review commentsourcegraph/sourcegraph

typesafe stubbing of graphQL requests for integration tests

 type IntegrationTestInitGeneration = () => Promise<{     subscriptions?: Subscription }> -export type GraphQLOverrides = Record<string, SuccessGraphQLResult<IQuery | IMutation> | ErrorGraphQLResult>+type PotentialOverrides<T> = Partial<+    { [K in keyof T]: T[K] extends (input: any) => infer Output ? Output | ErrorGraphQLResult : never }

they are filled by this code, so at least right now all of them are function signatures

                  ts.createPropertySignature(
                        undefined,
                        type.name + `/* ${path.relative(prjRootPath, result.fileName)} */`,
                        undefined,
                        ts.createFunctionTypeNode(
                            undefined,
                            [
                                ts.createParameter(
                                    undefined,
                                    undefined,
                                    undefined,
                                    'input',
                                    undefined,
                                    ts.createTypeReferenceNode(inputTypeName, undefined)
                                ),
                            ],
                            ts.createTypeReferenceNode(outputTypeName, undefined)
                        ),
                        undefined
                    )
twop

comment created time in a month

Pull request review commentsourcegraph/sourcegraph

typesafe stubbing of graphQL requests for integration tests

 export function describeIntegration(description: string, testSuite: IntegrationT                         errors.error(error)                         throw error                     }-                    const result = graphQlOverrides[queryName]-                    response.json(result)+                    const result = (graphQlOverrides as any)[queryName]

nice! let me try.

twop

comment created time in a month

Pull request review commentsourcegraph/sourcegraph

typesafe stubbing of graphQL requests for integration tests

 interface TestContext {      * @param queryName The name of the query to wait for.      * @returns The GraphQL variables of the query.      */-    waitForGraphQLRequest: (triggerRequest: () => Promise<void> | void, queryName: string) => Promise<unknown>+    waitForGraphQLRequest: <Operation extends keyof AllGQLOperations & string>(+        triggerRequest: () => Promise<void> | void,+        queryName: Operation+    ) => Promise<AllGQLOperations[Operation] extends (input: infer InputVariables) => any ? InputVariables : never>

I honestly find mine version more intuitive, I think that the need of [0] adds some overhead

twop

comment created time in a month

Pull request review commentsourcegraph/sourcegraph

typesafe stubbing of graphQL requests for integration tests

 type IntegrationTestSuite = (helpers: {     describe: IntegrationTestDescriber }) => void +const isErrorResult = <T extends object>(result: ErrorGraphQLResult | T): result is ErrorGraphQLResult =>

I like the idea. I felt that having to provide data all the time was awkward but omitting it is not symmetrical with errors. I was thinking that maybe error case needs an explicit helper function

{
  User:makeGqlError('some error')
}

Can you paste a snippet how you envision it?

twop

comment created time in a month

push eventsourcegraph/sourcegraph

Simon

commit sha 7cef648f918691b4bee2525ee774c2c6b6bb69fa

runt prettier on generated sources

view details

push time in a month

pull request commentsourcegraph/sourcegraph

Repo group dark mode

also, thanks for working on this! <3

rrhyne

comment created time in a month

push eventsourcegraph/sourcegraph

Simon

commit sha 2e3b8b9698a2d9720058086d6e788b6a5ab70cb9

fixed eslint issues

view details

push time in a month

push eventsourcegraph/sourcegraph

Simon

commit sha 33c190ee0bc48882fec8d813fe1cf73222115cee

refactored tests to use typechecked graphql stubbing

view details

push time in a month

more