diff --git a/codegen/end_to_end_test/lib/graphql/__generated__/schema.schema.gql.dart b/codegen/end_to_end_test/lib/graphql/__generated__/schema.schema.gql.dart index 79cdcfc6..2112325b 100644 --- a/codegen/end_to_end_test/lib/graphql/__generated__/schema.schema.gql.dart +++ b/codegen/end_to_end_test/lib/graphql/__generated__/schema.schema.gql.dart @@ -85,3 +85,8 @@ abstract class GISODate implements Built { _i2.DefaultScalarSerializer( (Object serialized) => GISODate((serialized as String?))); } + +const possibleTypesMap = { + 'Character': {'Human', 'Droid'}, + 'SearchResult': {'Human', 'Droid', 'Starship'} +}; diff --git a/codegen/gql_build/lib/gql_build.dart b/codegen/gql_build/lib/gql_build.dart index dd46c5da..2bc65930 100644 --- a/codegen/gql_build/lib/gql_build.dart +++ b/codegen/gql_build/lib/gql_build.dart @@ -54,6 +54,7 @@ Builder schemaBuilder( SchemaBuilder( typeOverrideMap(options.config["type_overrides"]), enumFallbackConfig(options.config), + generatePossibleTypesConfig(options.config), ); /// Builds an aggregate Serlializers object for [built_value]s diff --git a/codegen/gql_build/lib/src/schema_builder.dart b/codegen/gql_build/lib/src/schema_builder.dart index 523f9a4d..b7054dd5 100644 --- a/codegen/gql_build/lib/src/schema_builder.dart +++ b/codegen/gql_build/lib/src/schema_builder.dart @@ -12,10 +12,12 @@ import "./utils/writer.dart"; class SchemaBuilder implements Builder { final Map typeOverrides; final EnumFallbackConfig enumFallbackConfig; + final bool generatePossibleTypesMap; SchemaBuilder( this.typeOverrides, this.enumFallbackConfig, + this.generatePossibleTypesMap, ); @override @@ -37,6 +39,7 @@ class SchemaBuilder implements Builder { basename(generatedPartUrl), typeOverrides, enumFallbackConfig, + generatePossibleTypesMap: generatePossibleTypesMap, ); return writeDocument( diff --git a/codegen/gql_build/lib/src/utils/config.dart b/codegen/gql_build/lib/src/utils/config.dart index 7b8ca57a..54c14d9d 100644 --- a/codegen/gql_build/lib/src/utils/config.dart +++ b/codegen/gql_build/lib/src/utils/config.dart @@ -41,6 +41,9 @@ EnumFallbackConfig enumFallbackConfig(Map config) => fallbackValueMap: enumFallbackMap(config["enum_fallbacks"]), ); +bool generatePossibleTypesConfig(Map config) => + config["generate_possible_types_map"] as bool? ?? true; + Map enumFallbackMap(final dynamic enumFallbacks) { if (enumFallbacks is YamlMap) { return Map.fromEntries( diff --git a/codegen/gql_code_builder/lib/possible_types.dart b/codegen/gql_code_builder/lib/possible_types.dart new file mode 100644 index 00000000..ca5e14c6 --- /dev/null +++ b/codegen/gql_code_builder/lib/possible_types.dart @@ -0,0 +1 @@ +export "src/utils/possible_types.dart"; diff --git a/codegen/gql_code_builder/lib/schema.dart b/codegen/gql_code_builder/lib/schema.dart index 5c3d6764..6d305fd1 100644 --- a/codegen/gql_code_builder/lib/schema.dart +++ b/codegen/gql_code_builder/lib/schema.dart @@ -1,26 +1,50 @@ import "package:code_builder/code_builder.dart"; +import "package:gql/ast.dart"; import "package:gql_code_builder/source.dart"; import "package:gql_code_builder/src/schema.dart"; +import "package:gql_code_builder/src/utils/possible_types.dart"; Library buildSchemaLibrary( - SourceNode schemaSource, - String partUrl, - Map typeOverrides, - EnumFallbackConfig enumFallbackConfig) { + SourceNode schemaSource, + String partUrl, + Map typeOverrides, + EnumFallbackConfig enumFallbackConfig, { + bool generatePossibleTypesMap = false, +}) { final lib = buildSchema( schemaSource, typeOverrides, enumFallbackConfig, ) as Library; + final Code? possibleTypes; + if (generatePossibleTypesMap && lib.body.isNotEmpty) { + possibleTypes = buildPossibleTypes(schemaSource.document); + } else { + possibleTypes = null; + } return lib.rebuild( - (b) => b - ..directives.add( + (b) { + b.directives.add( Directive.part(partUrl), - ), + ); + if (possibleTypes != null) { + b.body.add(possibleTypes); + } + return b; + }, ); } +Code buildPossibleTypes(DocumentNode document) { + // generate the map of possible types + final possibleTypesMap = document.possibleTypesMap(); + // wrap the map in a literal for codegen + final possibleTypesLiteral = literalMap(possibleTypesMap); + // assign the literal to a const variable named "possibleTypes" + return possibleTypesLiteral.assignConst("possibleTypesMap").statement; +} + class EnumFallbackConfig { final bool generateFallbackValuesGlobally; final String? globalEnumFallbackName; diff --git a/codegen/gql_code_builder/lib/src/utils/possible_types.dart b/codegen/gql_code_builder/lib/src/utils/possible_types.dart new file mode 100644 index 00000000..03c138bb --- /dev/null +++ b/codegen/gql_code_builder/lib/src/utils/possible_types.dart @@ -0,0 +1,96 @@ +import "package:gql/ast.dart"; + +/// implementation based on graphql_codegen: +/// https://github.com/heftapp/graphql_codegen/blob/main/packages/graphql_codegen/lib/src/context.dart#L770 +extension PossibleTypes on DocumentNode { + Map> possibleTypesMap() { + // TODO handle interfaces that extend other interfaces? + // https://github.com/graphql/graphql-spec/pull/373 + final possibleTypes = >{}; + + for (final definition in definitions) { + if (definition is UnionTypeDefinitionNode) { + final types = possibleTypes[definition.name.value] ?? {}; + for (final tpe in definition.types) { + types.add(tpe.name.value); + } + possibleTypes[definition.name.value] = types; + } else if (definition is ObjectTypeDefinitionNode) { + for (final tpe in definition.interfaces) { + final types = possibleTypes[tpe.name.value] ?? {}; + types.add(definition.name.value); + possibleTypes[tpe.name.value] = types; + } + } + } + return possibleTypes.map((key, value) => MapEntry>( + key, + value + .expand(_lookupConcreteTypes) + .map((e) => e.name.value) + .toSet())); + } + + Iterable _lookupConcreteTypes(String name) { + final typeDefinition = _lookupType(name); + if (typeDefinition is ObjectTypeDefinitionNode) { + return [typeDefinition]; + } + if (typeDefinition is UnionTypeDefinitionNode) { + return typeDefinition.types + .expand((e) => _lookupConcreteTypes(e.name.value)); + } + + if (typeDefinition is InterfaceTypeDefinitionNode) { + return definitions.whereType().where( + (element) => element.interfaces + .where((element) => element.name.value == name) + .isNotEmpty, + ); + } + + return []; + } + + TType? _lookupType(String name) { + final defs = _memoizedTypeDefinitionsOf(this); + + final def = defs[name]; + if (def == null) { + return null; + } + if (def is! TType) { + return null; + } + return def; + } +} + +final _memoizedTypeDefinitionsOf = _memo1(_typeDefinitionsOf); + +Map _typeDefinitionsOf(DocumentNode schema) => + Map.fromEntries( + schema.definitions + .whereType() + .map((e) => MapEntry(e.name.value, e)), + ); + +/// Checks 1 argument for equality with [==] operator and returns the cached +/// result if it was not changed. +R Function(A) _memo1(R Function(A) func) { + late A prevArg; + late R prevResult; + bool isInitial = true; + + return (A arg) { + if (!isInitial && arg == prevArg) { + return prevResult; + } else { + prevArg = arg; + prevResult = func(arg); + isInitial = false; + + return prevResult; + } + }; +} diff --git a/codegen/gql_code_builder/pubspec.yaml b/codegen/gql_code_builder/pubspec.yaml index 0c74ad34..8ab5b26a 100644 --- a/codegen/gql_code_builder/pubspec.yaml +++ b/codegen/gql_code_builder/pubspec.yaml @@ -10,7 +10,7 @@ dependencies: built_value: ^8.0.6 code_builder: ^4.0.0 collection: ^1.15.0 - gql: ^0.13.0 + gql: ^0.14.0 gql_exec: ^0.4.0 path: ^1.8.0 dev_dependencies: diff --git a/examples/gql_example_build/lib/__generated__/schema.schema.gql.dart b/examples/gql_example_build/lib/__generated__/schema.schema.gql.dart index 3b22b846..d2e8c52c 100644 --- a/examples/gql_example_build/lib/__generated__/schema.schema.gql.dart +++ b/examples/gql_example_build/lib/__generated__/schema.schema.gql.dart @@ -66,3 +66,7 @@ abstract class GInput implements Built { static GInput? fromJson(Map json) => _i2.serializers.deserializeWith(GInput.serializer, json); } + +const possibleTypesMap = { + 'Shape': {'Square', 'Rectangle'} +}; diff --git a/examples/gql_example_cli_github/lib/__generated__/schema.schema.gql.dart b/examples/gql_example_cli_github/lib/__generated__/schema.schema.gql.dart index c4ad60ea..90471d01 100644 --- a/examples/gql_example_cli_github/lib/__generated__/schema.schema.gql.dart +++ b/examples/gql_example_cli_github/lib/__generated__/schema.schema.gql.dart @@ -5806,3 +5806,727 @@ abstract class GX509Certificate _i2.DefaultScalarSerializer( (Object serialized) => GX509Certificate((serialized as String?))); } + +const possibleTypesMap = { + 'Node': { + 'AddedToProjectEvent', + 'App', + 'AssignedEvent', + 'BaseRefChangedEvent', + 'BaseRefForcePushedEvent', + 'Blob', + 'Bot', + 'BranchProtectionRule', + 'ClosedEvent', + 'CodeOfConduct', + 'CommentDeletedEvent', + 'Commit', + 'CommitComment', + 'CommitCommentThread', + 'ConnectedEvent', + 'ConvertedNoteToIssueEvent', + 'CrossReferencedEvent', + 'DemilestonedEvent', + 'DeployKey', + 'DeployedEvent', + 'Deployment', + 'DeploymentEnvironmentChangedEvent', + 'DeploymentStatus', + 'DisconnectedEvent', + 'Enterprise', + 'EnterpriseAdministratorInvitation', + 'EnterpriseIdentityProvider', + 'EnterpriseRepositoryInfo', + 'EnterpriseServerInstallation', + 'EnterpriseServerUserAccount', + 'EnterpriseServerUserAccountEmail', + 'EnterpriseServerUserAccountsUpload', + 'EnterpriseUserAccount', + 'ExternalIdentity', + 'Gist', + 'GistComment', + 'HeadRefDeletedEvent', + 'HeadRefForcePushedEvent', + 'HeadRefRestoredEvent', + 'Issue', + 'IssueComment', + 'Label', + 'LabeledEvent', + 'Language', + 'License', + 'LockedEvent', + 'Mannequin', + 'MarkedAsDuplicateEvent', + 'MarketplaceCategory', + 'MarketplaceListing', + 'MembersCanDeleteReposClearAuditEntry', + 'MembersCanDeleteReposDisableAuditEntry', + 'MembersCanDeleteReposEnableAuditEntry', + 'MentionedEvent', + 'MergedEvent', + 'Milestone', + 'MilestonedEvent', + 'MovedColumnsInProjectEvent', + 'OauthApplicationCreateAuditEntry', + 'OrgAddBillingManagerAuditEntry', + 'OrgAddMemberAuditEntry', + 'OrgBlockUserAuditEntry', + 'OrgConfigDisableCollaboratorsOnlyAuditEntry', + 'OrgConfigEnableCollaboratorsOnlyAuditEntry', + 'OrgCreateAuditEntry', + 'OrgDisableOauthAppRestrictionsAuditEntry', + 'OrgDisableSamlAuditEntry', + 'OrgDisableTwoFactorRequirementAuditEntry', + 'OrgEnableOauthAppRestrictionsAuditEntry', + 'OrgEnableSamlAuditEntry', + 'OrgEnableTwoFactorRequirementAuditEntry', + 'OrgInviteMemberAuditEntry', + 'OrgInviteToBusinessAuditEntry', + 'OrgOauthAppAccessApprovedAuditEntry', + 'OrgOauthAppAccessDeniedAuditEntry', + 'OrgOauthAppAccessRequestedAuditEntry', + 'OrgRemoveBillingManagerAuditEntry', + 'OrgRemoveMemberAuditEntry', + 'OrgRemoveOutsideCollaboratorAuditEntry', + 'OrgRestoreMemberAuditEntry', + 'OrgUnblockUserAuditEntry', + 'OrgUpdateDefaultRepositoryPermissionAuditEntry', + 'OrgUpdateMemberAuditEntry', + 'OrgUpdateMemberRepositoryCreationPermissionAuditEntry', + 'OrgUpdateMemberRepositoryInvitationPermissionAuditEntry', + 'Organization', + 'OrganizationIdentityProvider', + 'OrganizationInvitation', + 'PinnedEvent', + 'PrivateRepositoryForkingDisableAuditEntry', + 'PrivateRepositoryForkingEnableAuditEntry', + 'Project', + 'ProjectCard', + 'ProjectColumn', + 'PublicKey', + 'PullRequest', + 'PullRequestCommit', + 'PullRequestCommitCommentThread', + 'PullRequestReview', + 'PullRequestReviewComment', + 'PullRequestReviewThread', + 'PushAllowance', + 'Reaction', + 'ReadyForReviewEvent', + 'Ref', + 'ReferencedEvent', + 'RegistryPackage', + 'RegistryPackageDependency', + 'RegistryPackageFile', + 'RegistryPackageTag', + 'RegistryPackageVersion', + 'Release', + 'ReleaseAsset', + 'RemovedFromProjectEvent', + 'RenamedTitleEvent', + 'ReopenedEvent', + 'RepoAccessAuditEntry', + 'RepoAddMemberAuditEntry', + 'RepoAddTopicAuditEntry', + 'RepoArchivedAuditEntry', + 'RepoChangeMergeSettingAuditEntry', + 'RepoConfigDisableAnonymousGitAccessAuditEntry', + 'RepoConfigDisableCollaboratorsOnlyAuditEntry', + 'RepoConfigDisableContributorsOnlyAuditEntry', + 'RepoConfigDisableSockpuppetDisallowedAuditEntry', + 'RepoConfigEnableAnonymousGitAccessAuditEntry', + 'RepoConfigEnableCollaboratorsOnlyAuditEntry', + 'RepoConfigEnableContributorsOnlyAuditEntry', + 'RepoConfigEnableSockpuppetDisallowedAuditEntry', + 'RepoConfigLockAnonymousGitAccessAuditEntry', + 'RepoConfigUnlockAnonymousGitAccessAuditEntry', + 'RepoCreateAuditEntry', + 'RepoDestroyAuditEntry', + 'RepoRemoveMemberAuditEntry', + 'RepoRemoveTopicAuditEntry', + 'Repository', + 'RepositoryInvitation', + 'RepositoryTopic', + 'RepositoryVisibilityChangeDisableAuditEntry', + 'RepositoryVisibilityChangeEnableAuditEntry', + 'RepositoryVulnerabilityAlert', + 'ReviewDismissalAllowance', + 'ReviewDismissedEvent', + 'ReviewRequest', + 'ReviewRequestRemovedEvent', + 'ReviewRequestedEvent', + 'SavedReply', + 'SecurityAdvisory', + 'SponsorsListing', + 'SponsorsTier', + 'Sponsorship', + 'Status', + 'StatusContext', + 'SubscribedEvent', + 'Tag', + 'Team', + 'TeamAddMemberAuditEntry', + 'TeamAddRepositoryAuditEntry', + 'TeamChangeParentTeamAuditEntry', + 'TeamDiscussion', + 'TeamDiscussionComment', + 'TeamRemoveMemberAuditEntry', + 'TeamRemoveRepositoryAuditEntry', + 'Topic', + 'TransferredEvent', + 'Tree', + 'UnassignedEvent', + 'UnlabeledEvent', + 'UnlockedEvent', + 'UnmarkedAsDuplicateEvent', + 'UnpinnedEvent', + 'UnsubscribedEvent', + 'User', + 'UserBlockedEvent', + 'UserContentEdit', + 'UserStatus' + }, + 'Assignee': {'Bot', 'Mannequin', 'Organization', 'User'}, + 'AuditEntryActor': {'Bot', 'Organization', 'User'}, + 'GitObject': {'Blob', 'Commit', 'Tag', 'Tree'}, + 'Actor': { + 'Bot', + 'EnterpriseUserAccount', + 'Mannequin', + 'Organization', + 'User' + }, + 'UniformResourceLocatable': { + 'Bot', + 'ClosedEvent', + 'Commit', + 'CrossReferencedEvent', + 'Gist', + 'Issue', + 'Mannequin', + 'MergedEvent', + 'Milestone', + 'Organization', + 'PullRequest', + 'PullRequestCommit', + 'ReadyForReviewEvent', + 'Release', + 'Repository', + 'RepositoryTopic', + 'ReviewDismissedEvent', + 'TeamDiscussion', + 'TeamDiscussionComment', + 'User' + }, + 'Closer': {'Commit', 'PullRequest'}, + 'Subscribable': { + 'Commit', + 'Issue', + 'PullRequest', + 'Repository', + 'Team', + 'TeamDiscussion' + }, + 'Comment': { + 'CommitComment', + 'GistComment', + 'Issue', + 'IssueComment', + 'PullRequest', + 'PullRequestReview', + 'PullRequestReviewComment', + 'TeamDiscussion', + 'TeamDiscussionComment' + }, + 'Deletable': { + 'CommitComment', + 'GistComment', + 'IssueComment', + 'PullRequestReview', + 'PullRequestReviewComment', + 'TeamDiscussion', + 'TeamDiscussionComment' + }, + 'Reactable': { + 'CommitComment', + 'Issue', + 'IssueComment', + 'PullRequest', + 'PullRequestReview', + 'PullRequestReviewComment', + 'TeamDiscussion', + 'TeamDiscussionComment' + }, + 'RepositoryNode': { + 'CommitComment', + 'CommitCommentThread', + 'Issue', + 'IssueComment', + 'PullRequest', + 'PullRequestCommitCommentThread', + 'PullRequestReview', + 'PullRequestReviewComment', + 'RepositoryVulnerabilityAlert' + }, + 'Updatable': { + 'CommitComment', + 'GistComment', + 'Issue', + 'IssueComment', + 'Project', + 'PullRequest', + 'PullRequestReview', + 'PullRequestReviewComment', + 'TeamDiscussion', + 'TeamDiscussionComment' + }, + 'UpdatableComment': { + 'CommitComment', + 'GistComment', + 'Issue', + 'IssueComment', + 'PullRequest', + 'PullRequestReview', + 'PullRequestReviewComment', + 'TeamDiscussion', + 'TeamDiscussionComment' + }, + 'Contribution': { + 'CreatedCommitContribution', + 'CreatedIssueContribution', + 'CreatedPullRequestContribution', + 'CreatedPullRequestReviewContribution', + 'CreatedRepositoryContribution', + 'JoinedGitHubContribution', + 'RestrictedContribution' + }, + 'CreatedIssueOrRestrictedContribution': { + 'CreatedIssueContribution', + 'RestrictedContribution' + }, + 'CreatedPullRequestOrRestrictedContribution': { + 'CreatedPullRequestContribution', + 'RestrictedContribution' + }, + 'CreatedRepositoryOrRestrictedContribution': { + 'CreatedRepositoryContribution', + 'RestrictedContribution' + }, + 'EnterpriseMember': {'EnterpriseUserAccount', 'User'}, + 'HovercardContext': { + 'GenericHovercardContext', + 'OrganizationTeamsHovercardContext', + 'OrganizationsHovercardContext', + 'ReviewStatusHovercardContext', + 'ViewerHovercardContext' + }, + 'Starrable': {'Gist', 'Repository', 'Topic'}, + 'GitSignature': {'GpgSignature', 'SmimeSignature', 'UnknownSignature'}, + 'Assignable': {'Issue', 'PullRequest'}, + 'Closable': {'Issue', 'Milestone', 'Project', 'PullRequest'}, + 'Labelable': {'Issue', 'PullRequest'}, + 'Lockable': {'Issue', 'PullRequest'}, + 'IssueOrPullRequest': {'Issue', 'PullRequest'}, + 'IssueTimelineItem': { + 'AssignedEvent', + 'ClosedEvent', + 'Commit', + 'CrossReferencedEvent', + 'DemilestonedEvent', + 'IssueComment', + 'LabeledEvent', + 'LockedEvent', + 'MilestonedEvent', + 'ReferencedEvent', + 'RenamedTitleEvent', + 'ReopenedEvent', + 'SubscribedEvent', + 'TransferredEvent', + 'UnassignedEvent', + 'UnlabeledEvent', + 'UnlockedEvent', + 'UnsubscribedEvent', + 'UserBlockedEvent' + }, + 'IssueTimelineItems': { + 'AddedToProjectEvent', + 'AssignedEvent', + 'ClosedEvent', + 'CommentDeletedEvent', + 'ConnectedEvent', + 'ConvertedNoteToIssueEvent', + 'CrossReferencedEvent', + 'DemilestonedEvent', + 'DisconnectedEvent', + 'IssueComment', + 'LabeledEvent', + 'LockedEvent', + 'MarkedAsDuplicateEvent', + 'MentionedEvent', + 'MilestonedEvent', + 'MovedColumnsInProjectEvent', + 'PinnedEvent', + 'ReferencedEvent', + 'RemovedFromProjectEvent', + 'RenamedTitleEvent', + 'ReopenedEvent', + 'SubscribedEvent', + 'TransferredEvent', + 'UnassignedEvent', + 'UnlabeledEvent', + 'UnlockedEvent', + 'UnmarkedAsDuplicateEvent', + 'UnpinnedEvent', + 'UnsubscribedEvent', + 'UserBlockedEvent' + }, + 'AuditEntry': { + 'MembersCanDeleteReposClearAuditEntry', + 'MembersCanDeleteReposDisableAuditEntry', + 'MembersCanDeleteReposEnableAuditEntry', + 'OauthApplicationCreateAuditEntry', + 'OrgAddBillingManagerAuditEntry', + 'OrgAddMemberAuditEntry', + 'OrgBlockUserAuditEntry', + 'OrgConfigDisableCollaboratorsOnlyAuditEntry', + 'OrgConfigEnableCollaboratorsOnlyAuditEntry', + 'OrgCreateAuditEntry', + 'OrgDisableOauthAppRestrictionsAuditEntry', + 'OrgDisableSamlAuditEntry', + 'OrgDisableTwoFactorRequirementAuditEntry', + 'OrgEnableOauthAppRestrictionsAuditEntry', + 'OrgEnableSamlAuditEntry', + 'OrgEnableTwoFactorRequirementAuditEntry', + 'OrgInviteMemberAuditEntry', + 'OrgInviteToBusinessAuditEntry', + 'OrgOauthAppAccessApprovedAuditEntry', + 'OrgOauthAppAccessDeniedAuditEntry', + 'OrgOauthAppAccessRequestedAuditEntry', + 'OrgRemoveBillingManagerAuditEntry', + 'OrgRemoveMemberAuditEntry', + 'OrgRemoveOutsideCollaboratorAuditEntry', + 'OrgRestoreMemberAuditEntry', + 'OrgUnblockUserAuditEntry', + 'OrgUpdateDefaultRepositoryPermissionAuditEntry', + 'OrgUpdateMemberAuditEntry', + 'OrgUpdateMemberRepositoryCreationPermissionAuditEntry', + 'OrgUpdateMemberRepositoryInvitationPermissionAuditEntry', + 'PrivateRepositoryForkingDisableAuditEntry', + 'PrivateRepositoryForkingEnableAuditEntry', + 'RepoAccessAuditEntry', + 'RepoAddMemberAuditEntry', + 'RepoAddTopicAuditEntry', + 'RepoArchivedAuditEntry', + 'RepoChangeMergeSettingAuditEntry', + 'RepoConfigDisableAnonymousGitAccessAuditEntry', + 'RepoConfigDisableCollaboratorsOnlyAuditEntry', + 'RepoConfigDisableContributorsOnlyAuditEntry', + 'RepoConfigDisableSockpuppetDisallowedAuditEntry', + 'RepoConfigEnableAnonymousGitAccessAuditEntry', + 'RepoConfigEnableCollaboratorsOnlyAuditEntry', + 'RepoConfigEnableContributorsOnlyAuditEntry', + 'RepoConfigEnableSockpuppetDisallowedAuditEntry', + 'RepoConfigLockAnonymousGitAccessAuditEntry', + 'RepoConfigUnlockAnonymousGitAccessAuditEntry', + 'RepoCreateAuditEntry', + 'RepoDestroyAuditEntry', + 'RepoRemoveMemberAuditEntry', + 'RepoRemoveTopicAuditEntry', + 'RepositoryVisibilityChangeDisableAuditEntry', + 'RepositoryVisibilityChangeEnableAuditEntry', + 'TeamAddMemberAuditEntry', + 'TeamAddRepositoryAuditEntry', + 'TeamChangeParentTeamAuditEntry', + 'TeamRemoveMemberAuditEntry', + 'TeamRemoveRepositoryAuditEntry' + }, + 'EnterpriseAuditEntryData': { + 'MembersCanDeleteReposClearAuditEntry', + 'MembersCanDeleteReposDisableAuditEntry', + 'MembersCanDeleteReposEnableAuditEntry', + 'OrgInviteToBusinessAuditEntry', + 'PrivateRepositoryForkingDisableAuditEntry', + 'PrivateRepositoryForkingEnableAuditEntry', + 'RepositoryVisibilityChangeDisableAuditEntry', + 'RepositoryVisibilityChangeEnableAuditEntry' + }, + 'OrganizationAuditEntryData': { + 'MembersCanDeleteReposClearAuditEntry', + 'MembersCanDeleteReposDisableAuditEntry', + 'MembersCanDeleteReposEnableAuditEntry', + 'OauthApplicationCreateAuditEntry', + 'OrgAddBillingManagerAuditEntry', + 'OrgAddMemberAuditEntry', + 'OrgBlockUserAuditEntry', + 'OrgConfigDisableCollaboratorsOnlyAuditEntry', + 'OrgConfigEnableCollaboratorsOnlyAuditEntry', + 'OrgCreateAuditEntry', + 'OrgDisableOauthAppRestrictionsAuditEntry', + 'OrgDisableSamlAuditEntry', + 'OrgDisableTwoFactorRequirementAuditEntry', + 'OrgEnableOauthAppRestrictionsAuditEntry', + 'OrgEnableSamlAuditEntry', + 'OrgEnableTwoFactorRequirementAuditEntry', + 'OrgInviteMemberAuditEntry', + 'OrgInviteToBusinessAuditEntry', + 'OrgOauthAppAccessApprovedAuditEntry', + 'OrgOauthAppAccessDeniedAuditEntry', + 'OrgOauthAppAccessRequestedAuditEntry', + 'OrgRemoveBillingManagerAuditEntry', + 'OrgRemoveMemberAuditEntry', + 'OrgRemoveOutsideCollaboratorAuditEntry', + 'OrgRestoreMemberAuditEntry', + 'OrgRestoreMemberMembershipOrganizationAuditEntryData', + 'OrgUnblockUserAuditEntry', + 'OrgUpdateDefaultRepositoryPermissionAuditEntry', + 'OrgUpdateMemberAuditEntry', + 'OrgUpdateMemberRepositoryCreationPermissionAuditEntry', + 'OrgUpdateMemberRepositoryInvitationPermissionAuditEntry', + 'PrivateRepositoryForkingDisableAuditEntry', + 'PrivateRepositoryForkingEnableAuditEntry', + 'RepoAccessAuditEntry', + 'RepoAddMemberAuditEntry', + 'RepoAddTopicAuditEntry', + 'RepoArchivedAuditEntry', + 'RepoChangeMergeSettingAuditEntry', + 'RepoConfigDisableAnonymousGitAccessAuditEntry', + 'RepoConfigDisableCollaboratorsOnlyAuditEntry', + 'RepoConfigDisableContributorsOnlyAuditEntry', + 'RepoConfigDisableSockpuppetDisallowedAuditEntry', + 'RepoConfigEnableAnonymousGitAccessAuditEntry', + 'RepoConfigEnableCollaboratorsOnlyAuditEntry', + 'RepoConfigEnableContributorsOnlyAuditEntry', + 'RepoConfigEnableSockpuppetDisallowedAuditEntry', + 'RepoConfigLockAnonymousGitAccessAuditEntry', + 'RepoConfigUnlockAnonymousGitAccessAuditEntry', + 'RepoCreateAuditEntry', + 'RepoDestroyAuditEntry', + 'RepoRemoveMemberAuditEntry', + 'RepoRemoveTopicAuditEntry', + 'RepositoryVisibilityChangeDisableAuditEntry', + 'RepositoryVisibilityChangeEnableAuditEntry', + 'TeamAddMemberAuditEntry', + 'TeamAddRepositoryAuditEntry', + 'TeamChangeParentTeamAuditEntry', + 'TeamRemoveMemberAuditEntry', + 'TeamRemoveRepositoryAuditEntry' + }, + 'MilestoneItem': {'Issue', 'PullRequest'}, + 'OauthApplicationAuditEntryData': { + 'OauthApplicationCreateAuditEntry', + 'OrgOauthAppAccessApprovedAuditEntry', + 'OrgOauthAppAccessDeniedAuditEntry', + 'OrgOauthAppAccessRequestedAuditEntry' + }, + 'OrgRestoreMemberAuditEntryMembership': { + 'OrgRestoreMemberMembershipOrganizationAuditEntryData', + 'OrgRestoreMemberMembershipRepositoryAuditEntryData', + 'OrgRestoreMemberMembershipTeamAuditEntryData' + }, + 'RepositoryAuditEntryData': { + 'OrgRestoreMemberMembershipRepositoryAuditEntryData', + 'PrivateRepositoryForkingDisableAuditEntry', + 'PrivateRepositoryForkingEnableAuditEntry', + 'RepoAccessAuditEntry', + 'RepoAddMemberAuditEntry', + 'RepoAddTopicAuditEntry', + 'RepoArchivedAuditEntry', + 'RepoChangeMergeSettingAuditEntry', + 'RepoConfigDisableAnonymousGitAccessAuditEntry', + 'RepoConfigDisableCollaboratorsOnlyAuditEntry', + 'RepoConfigDisableContributorsOnlyAuditEntry', + 'RepoConfigDisableSockpuppetDisallowedAuditEntry', + 'RepoConfigEnableAnonymousGitAccessAuditEntry', + 'RepoConfigEnableCollaboratorsOnlyAuditEntry', + 'RepoConfigEnableContributorsOnlyAuditEntry', + 'RepoConfigEnableSockpuppetDisallowedAuditEntry', + 'RepoConfigLockAnonymousGitAccessAuditEntry', + 'RepoConfigUnlockAnonymousGitAccessAuditEntry', + 'RepoCreateAuditEntry', + 'RepoDestroyAuditEntry', + 'RepoRemoveMemberAuditEntry', + 'RepoRemoveTopicAuditEntry', + 'TeamAddRepositoryAuditEntry', + 'TeamRemoveRepositoryAuditEntry' + }, + 'TeamAuditEntryData': { + 'OrgRestoreMemberMembershipTeamAuditEntryData', + 'TeamAddMemberAuditEntry', + 'TeamAddRepositoryAuditEntry', + 'TeamChangeParentTeamAuditEntry', + 'TeamRemoveMemberAuditEntry', + 'TeamRemoveRepositoryAuditEntry' + }, + 'MemberStatusable': {'Organization', 'Team'}, + 'ProfileOwner': {'Organization', 'User'}, + 'ProjectOwner': {'Organization', 'Repository', 'User'}, + 'RegistryPackageOwner': {'Organization', 'Repository', 'User'}, + 'RegistryPackageSearch': {'Organization', 'Repository', 'User'}, + 'RepositoryOwner': {'Organization', 'User'}, + 'Sponsorable': {'Organization', 'User'}, + 'OrganizationAuditEntry': { + 'MembersCanDeleteReposClearAuditEntry', + 'MembersCanDeleteReposDisableAuditEntry', + 'MembersCanDeleteReposEnableAuditEntry', + 'OauthApplicationCreateAuditEntry', + 'OrgAddBillingManagerAuditEntry', + 'OrgAddMemberAuditEntry', + 'OrgBlockUserAuditEntry', + 'OrgConfigDisableCollaboratorsOnlyAuditEntry', + 'OrgConfigEnableCollaboratorsOnlyAuditEntry', + 'OrgCreateAuditEntry', + 'OrgDisableOauthAppRestrictionsAuditEntry', + 'OrgDisableSamlAuditEntry', + 'OrgDisableTwoFactorRequirementAuditEntry', + 'OrgEnableOauthAppRestrictionsAuditEntry', + 'OrgEnableSamlAuditEntry', + 'OrgEnableTwoFactorRequirementAuditEntry', + 'OrgInviteMemberAuditEntry', + 'OrgInviteToBusinessAuditEntry', + 'OrgOauthAppAccessApprovedAuditEntry', + 'OrgOauthAppAccessDeniedAuditEntry', + 'OrgOauthAppAccessRequestedAuditEntry', + 'OrgRemoveBillingManagerAuditEntry', + 'OrgRemoveMemberAuditEntry', + 'OrgRemoveOutsideCollaboratorAuditEntry', + 'OrgRestoreMemberAuditEntry', + 'OrgUnblockUserAuditEntry', + 'OrgUpdateDefaultRepositoryPermissionAuditEntry', + 'OrgUpdateMemberAuditEntry', + 'OrgUpdateMemberRepositoryCreationPermissionAuditEntry', + 'OrgUpdateMemberRepositoryInvitationPermissionAuditEntry', + 'PrivateRepositoryForkingDisableAuditEntry', + 'PrivateRepositoryForkingEnableAuditEntry', + 'RepoAccessAuditEntry', + 'RepoAddMemberAuditEntry', + 'RepoAddTopicAuditEntry', + 'RepoArchivedAuditEntry', + 'RepoChangeMergeSettingAuditEntry', + 'RepoConfigDisableAnonymousGitAccessAuditEntry', + 'RepoConfigDisableCollaboratorsOnlyAuditEntry', + 'RepoConfigDisableContributorsOnlyAuditEntry', + 'RepoConfigDisableSockpuppetDisallowedAuditEntry', + 'RepoConfigEnableAnonymousGitAccessAuditEntry', + 'RepoConfigEnableCollaboratorsOnlyAuditEntry', + 'RepoConfigEnableContributorsOnlyAuditEntry', + 'RepoConfigEnableSockpuppetDisallowedAuditEntry', + 'RepoConfigLockAnonymousGitAccessAuditEntry', + 'RepoConfigUnlockAnonymousGitAccessAuditEntry', + 'RepoCreateAuditEntry', + 'RepoDestroyAuditEntry', + 'RepoRemoveMemberAuditEntry', + 'RepoRemoveTopicAuditEntry', + 'RepositoryVisibilityChangeDisableAuditEntry', + 'RepositoryVisibilityChangeEnableAuditEntry', + 'TeamAddMemberAuditEntry', + 'TeamAddRepositoryAuditEntry', + 'TeamChangeParentTeamAuditEntry', + 'TeamRemoveMemberAuditEntry', + 'TeamRemoveRepositoryAuditEntry' + }, + 'PermissionGranter': {'Organization', 'Repository', 'Team'}, + 'PinnableItem': {'Gist', 'Repository'}, + 'ProjectCardItem': {'Issue', 'PullRequest'}, + 'PullRequestTimelineItem': { + 'AssignedEvent', + 'BaseRefForcePushedEvent', + 'ClosedEvent', + 'Commit', + 'CommitCommentThread', + 'CrossReferencedEvent', + 'DemilestonedEvent', + 'DeployedEvent', + 'DeploymentEnvironmentChangedEvent', + 'HeadRefDeletedEvent', + 'HeadRefForcePushedEvent', + 'HeadRefRestoredEvent', + 'IssueComment', + 'LabeledEvent', + 'LockedEvent', + 'MergedEvent', + 'MilestonedEvent', + 'PullRequestReview', + 'PullRequestReviewComment', + 'PullRequestReviewThread', + 'ReferencedEvent', + 'RenamedTitleEvent', + 'ReopenedEvent', + 'ReviewDismissedEvent', + 'ReviewRequestRemovedEvent', + 'ReviewRequestedEvent', + 'SubscribedEvent', + 'UnassignedEvent', + 'UnlabeledEvent', + 'UnlockedEvent', + 'UnsubscribedEvent', + 'UserBlockedEvent' + }, + 'PullRequestTimelineItems': { + 'AddedToProjectEvent', + 'AssignedEvent', + 'BaseRefChangedEvent', + 'BaseRefForcePushedEvent', + 'ClosedEvent', + 'CommentDeletedEvent', + 'ConnectedEvent', + 'ConvertedNoteToIssueEvent', + 'CrossReferencedEvent', + 'DemilestonedEvent', + 'DeployedEvent', + 'DeploymentEnvironmentChangedEvent', + 'DisconnectedEvent', + 'HeadRefDeletedEvent', + 'HeadRefForcePushedEvent', + 'HeadRefRestoredEvent', + 'IssueComment', + 'LabeledEvent', + 'LockedEvent', + 'MarkedAsDuplicateEvent', + 'MentionedEvent', + 'MergedEvent', + 'MilestonedEvent', + 'MovedColumnsInProjectEvent', + 'PinnedEvent', + 'PullRequestCommit', + 'PullRequestCommitCommentThread', + 'PullRequestReview', + 'PullRequestReviewThread', + 'PullRequestRevisionMarker', + 'ReadyForReviewEvent', + 'ReferencedEvent', + 'RemovedFromProjectEvent', + 'RenamedTitleEvent', + 'ReopenedEvent', + 'ReviewDismissedEvent', + 'ReviewRequestRemovedEvent', + 'ReviewRequestedEvent', + 'SubscribedEvent', + 'TransferredEvent', + 'UnassignedEvent', + 'UnlabeledEvent', + 'UnlockedEvent', + 'UnmarkedAsDuplicateEvent', + 'UnpinnedEvent', + 'UnsubscribedEvent', + 'UserBlockedEvent' + }, + 'PushAllowanceActor': {'App', 'Team', 'User'}, + 'ReferencedSubject': {'Issue', 'PullRequest'}, + 'RenamedTitleSubject': {'Issue', 'PullRequest'}, + 'TopicAuditEntryData': { + 'RepoAddTopicAuditEntry', + 'RepoRemoveTopicAuditEntry' + }, + 'RepositoryInfo': {'Repository'}, + 'RequestedReviewer': {'Mannequin', 'Team', 'User'}, + 'ReviewDismissalAllowanceActor': {'Team', 'User'}, + 'SearchResultItem': { + 'App', + 'Issue', + 'MarketplaceListing', + 'Organization', + 'PullRequest', + 'Repository', + 'User' + } +};