Full Code of MichalLytek/type-graphql for AI

master 0a35c2b8244b cached
873 files
2.5 MB
696.8k tokens
1520 symbols
1 requests
Download .txt
Showing preview only (2,771K chars total). Download the full file or copy to clipboard to get everything.
Repository: MichalLytek/type-graphql
Branch: master
Commit: 0a35c2b8244b
Files: 873
Total size: 2.5 MB

Directory structure:
gitextract_cv2dczwf/

├── .editorconfig
├── .eslintignore
├── .eslintrc
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── config.yml
│   │   ├── documentation-issue-or-request.md
│   │   └── feature_request.md
│   ├── configs/
│   │   └── changelog.json
│   ├── dependabot.yml
│   └── workflows/
│       ├── check.yml
│       ├── codeql.yml
│       ├── license.yml
│       ├── release.yml
│       ├── sponsor.yml
│       └── website.yml
├── .gitignore
├── .husky/
│   └── pre-commit
├── .lintstagedrc
├── .markdownlint.json
├── .markdownlintignore
├── .npmrc
├── .nvmrc
├── .prettierignore
├── .prettierrc
├── .shellcheckrc
├── .vscode/
│   ├── extensions.json
│   ├── launch.json
│   └── settings.json
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── benchmarks/
│   ├── .eslintrc
│   ├── array/
│   │   ├── graphql-js/
│   │   │   ├── async.ts
│   │   │   └── standard.ts
│   │   ├── results.txt
│   │   ├── run.ts
│   │   └── type-graphql/
│   │       ├── async-field-resolvers.ts
│   │       ├── simple-resolvers.ts
│   │       ├── standard.ts
│   │       ├── sync-field-resolvers.ts
│   │       ├── sync-getters.ts
│   │       └── with-global-middleware.ts
│   ├── simple/
│   │   ├── graphql-js.ts
│   │   ├── results.txt
│   │   ├── run.ts
│   │   └── type-graphql.ts
│   └── tsconfig.json
├── cspell.json
├── docs/
│   ├── README.md
│   ├── authorization.md
│   ├── aws-lambda.md
│   ├── azure-functions.md
│   ├── bootstrap.md
│   ├── browser-usage.md
│   ├── complexity.md
│   ├── custom-decorators.md
│   ├── dependency-injection.md
│   ├── directives.md
│   ├── emit-schema.md
│   ├── enums.md
│   ├── esm.md
│   ├── examples.md
│   ├── extensions.md
│   ├── faq.md
│   ├── generic-types.md
│   ├── getting-started.md
│   ├── inheritance.md
│   ├── installation.md
│   ├── interfaces.md
│   ├── introduction.md
│   ├── middlewares.md
│   ├── migration-guide.md
│   ├── nestjs.md
│   ├── performance.md
│   ├── prisma.md
│   ├── resolvers.md
│   ├── scalars.md
│   ├── subscriptions.md
│   ├── types-and-fields.md
│   ├── unions.md
│   └── validation.md
├── examples/
│   ├── .eslintrc
│   ├── README.md
│   ├── apollo-cache/
│   │   ├── cache-control.ts
│   │   ├── examples.graphql
│   │   ├── helpers/
│   │   │   ├── RequireAtLeastOne.d.ts
│   │   │   └── getTime.ts
│   │   ├── index.ts
│   │   ├── recipe.data.ts
│   │   ├── recipe.resolver.ts
│   │   ├── recipe.type.ts
│   │   └── schema.graphql
│   ├── apollo-federation/
│   │   ├── accounts/
│   │   │   ├── data.ts
│   │   │   ├── index.ts
│   │   │   ├── resolver.ts
│   │   │   ├── user.reference.ts
│   │   │   └── user.ts
│   │   ├── examples.graphql
│   │   ├── helpers/
│   │   │   ├── buildFederatedSchema.ts
│   │   │   └── index.ts
│   │   ├── index.ts
│   │   ├── inventory/
│   │   │   ├── data.ts
│   │   │   ├── index.ts
│   │   │   ├── product.reference.ts
│   │   │   ├── product.ts
│   │   │   └── resolver.ts
│   │   ├── products/
│   │   │   ├── data.ts
│   │   │   ├── index.ts
│   │   │   ├── product.reference.ts
│   │   │   ├── product.ts
│   │   │   └── resolver.ts
│   │   ├── reviews/
│   │   │   ├── index.ts
│   │   │   ├── product/
│   │   │   │   ├── index.ts
│   │   │   │   ├── product.ts
│   │   │   │   └── resolver.ts
│   │   │   ├── review/
│   │   │   │   ├── data.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── resolver.ts
│   │   │   │   └── review.ts
│   │   │   └── user/
│   │   │       ├── index.ts
│   │   │       ├── resolver.ts
│   │   │       └── user.ts
│   │   └── schema.graphql
│   ├── apollo-federation-2/
│   │   ├── accounts/
│   │   │   ├── data.ts
│   │   │   ├── index.ts
│   │   │   ├── resolver.ts
│   │   │   ├── user.reference.ts
│   │   │   └── user.ts
│   │   ├── examples.graphql
│   │   ├── helpers/
│   │   │   └── buildFederatedSchema.ts
│   │   ├── index.ts
│   │   ├── inventory/
│   │   │   ├── data.ts
│   │   │   ├── index.ts
│   │   │   ├── product.reference.ts
│   │   │   ├── product.ts
│   │   │   └── resolver.ts
│   │   ├── products/
│   │   │   ├── data.ts
│   │   │   ├── dining.ts
│   │   │   ├── index.ts
│   │   │   ├── product.reference.ts
│   │   │   ├── product.ts
│   │   │   ├── resolver.ts
│   │   │   └── seating.ts
│   │   ├── reviews/
│   │   │   ├── index.ts
│   │   │   ├── product/
│   │   │   │   ├── product.ts
│   │   │   │   └── resolver.ts
│   │   │   ├── review/
│   │   │   │   ├── data.ts
│   │   │   │   ├── resolver.ts
│   │   │   │   └── review.ts
│   │   │   └── user/
│   │   │       ├── resolver.ts
│   │   │       └── user.ts
│   │   └── schema.graphql
│   ├── authorization/
│   │   ├── auth-checker.ts
│   │   ├── context.type.ts
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── recipe.data.ts
│   │   ├── recipe.resolver.ts
│   │   ├── recipe.type.ts
│   │   ├── schema.graphql
│   │   └── user.type.ts
│   ├── automatic-validation/
│   │   ├── examples.graphql
│   │   ├── helpers.ts
│   │   ├── index.ts
│   │   ├── recipe.input.ts
│   │   ├── recipe.resolver.ts
│   │   ├── recipe.type.ts
│   │   ├── recipes.arguments.ts
│   │   └── schema.graphql
│   ├── custom-validation/
│   │   ├── examples.graphql
│   │   ├── helpers.ts
│   │   ├── index.ts
│   │   ├── recipe.input.ts
│   │   ├── recipe.resolver.ts
│   │   ├── recipe.type.ts
│   │   ├── recipes.arguments.ts
│   │   └── schema.graphql
│   ├── enums-and-unions/
│   │   ├── cook.data.ts
│   │   ├── cook.type.ts
│   │   ├── difficulty.enum.ts
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── recipe.data.ts
│   │   ├── recipe.type.ts
│   │   ├── resolver.ts
│   │   ├── schema.graphql
│   │   └── search-result.union.ts
│   ├── extensions/
│   │   ├── context.type.ts
│   │   ├── examples.graphql
│   │   ├── helpers/
│   │   │   └── config.extractors.ts
│   │   ├── index.ts
│   │   ├── log-message.decorator.ts
│   │   ├── logger.middleware.ts
│   │   ├── logger.service.ts
│   │   ├── recipe.data.ts
│   │   ├── recipe.type.ts
│   │   ├── resolver.ts
│   │   ├── schema.graphql
│   │   └── user.type.ts
│   ├── generic-types/
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── paginated-response.type.ts
│   │   ├── recipe.data.ts
│   │   ├── recipe.resolver.ts
│   │   ├── recipe.type.ts
│   │   └── schema.graphql
│   ├── graphql-scalars/
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── recipe.data.ts
│   │   ├── recipe.input.ts
│   │   ├── recipe.resolver.ts
│   │   ├── recipe.type.ts
│   │   └── schema.graphql
│   ├── interfaces-inheritance/
│   │   ├── employee/
│   │   │   ├── employee.input.ts
│   │   │   ├── employee.type.ts
│   │   │   └── index.ts
│   │   ├── examples.graphql
│   │   ├── helpers.ts
│   │   ├── index.ts
│   │   ├── person/
│   │   │   ├── index.ts
│   │   │   ├── person.input.ts
│   │   │   ├── person.interface.ts
│   │   │   └── person.type.ts
│   │   ├── resolver.ts
│   │   ├── resource/
│   │   │   ├── index.ts
│   │   │   └── resource.interface.ts
│   │   ├── schema.graphql
│   │   └── student/
│   │       ├── index.ts
│   │       ├── student.input.ts
│   │       └── student.type.ts
│   ├── middlewares-custom-decorators/
│   │   ├── context.type.ts
│   │   ├── decorators/
│   │   │   ├── current-user.ts
│   │   │   ├── index.ts
│   │   │   ├── random-id-arg.ts
│   │   │   └── validate-args.ts
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── logger.ts
│   │   ├── middlewares/
│   │   │   ├── error-logger.ts
│   │   │   ├── index.ts
│   │   │   ├── log-access.ts
│   │   │   ├── number-interceptor.ts
│   │   │   └── resolve-time.ts
│   │   ├── recipe/
│   │   │   ├── index.ts
│   │   │   ├── recipe.args.ts
│   │   │   ├── recipe.data.ts
│   │   │   ├── recipe.resolver.ts
│   │   │   └── recipe.type.ts
│   │   ├── schema.graphql
│   │   └── user.type.ts
│   ├── mikro-orm/
│   │   ├── context.type.ts
│   │   ├── entities/
│   │   │   ├── index.ts
│   │   │   ├── rating.ts
│   │   │   ├── recipe.ts
│   │   │   └── user.ts
│   │   ├── examples.graphql
│   │   ├── helpers.ts
│   │   ├── index.ts
│   │   ├── resolvers/
│   │   │   ├── index.ts
│   │   │   ├── rating.resolver.ts
│   │   │   ├── recipe.resolver.ts
│   │   │   └── types/
│   │   │       ├── index.ts
│   │   │       ├── rating.input.ts
│   │   │       └── recipe.input.ts
│   │   └── schema.graphql
│   ├── mixin-classes/
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── inputs/
│   │   │   ├── amend.user.input.ts
│   │   │   ├── create.user.input.ts
│   │   │   └── index.ts
│   │   ├── mixins/
│   │   │   ├── index.ts
│   │   │   ├── with.id.ts
│   │   │   └── with.password.ts
│   │   ├── resolver.ts
│   │   ├── schema.graphql
│   │   └── types/
│   │       ├── index.ts
│   │       ├── user.details.ts
│   │       └── user.ts
│   ├── query-complexity/
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── recipe.data.ts
│   │   ├── recipe.resolver.ts
│   │   ├── recipe.type.ts
│   │   └── schema.graphql
│   ├── redis-subscriptions/
│   │   ├── comment.input.ts
│   │   ├── comment.type.ts
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── pubsub.ts
│   │   ├── recipe.data.ts
│   │   ├── recipe.resolver.args.ts
│   │   ├── recipe.resolver.ts
│   │   ├── recipe.type.ts
│   │   └── schema.graphql
│   ├── resolvers-inheritance/
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── person/
│   │   │   ├── index.ts
│   │   │   ├── person.resolver.ts
│   │   │   ├── person.role.ts
│   │   │   └── person.type.ts
│   │   ├── recipe/
│   │   │   ├── index.ts
│   │   │   ├── recipe.resolver.ts
│   │   │   └── recipe.type.ts
│   │   ├── resource/
│   │   │   ├── index.ts
│   │   │   ├── resource.args.ts
│   │   │   ├── resource.resolver.ts
│   │   │   ├── resource.service.factory.ts
│   │   │   ├── resource.service.ts
│   │   │   └── resource.ts
│   │   └── schema.graphql
│   ├── simple-subscriptions/
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── notification.resolver.ts
│   │   ├── notification.type.ts
│   │   ├── pubsub.ts
│   │   └── schema.graphql
│   ├── simple-usage/
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── recipe.data.ts
│   │   ├── recipe.input.ts
│   │   ├── recipe.resolver.ts
│   │   ├── recipe.type.ts
│   │   └── schema.graphql
│   ├── tsconfig.json
│   ├── tsyringe/
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── recipe.data.ts
│   │   ├── recipe.input.ts
│   │   ├── recipe.resolver.ts
│   │   ├── recipe.service.ts
│   │   ├── recipe.type.ts
│   │   └── schema.graphql
│   ├── typegoose/
│   │   ├── .eslintrc
│   │   ├── context.type.ts
│   │   ├── entities/
│   │   │   ├── index.ts
│   │   │   ├── rating.ts
│   │   │   ├── recipe.ts
│   │   │   └── user.ts
│   │   ├── examples.graphql
│   │   ├── helpers.ts
│   │   ├── index.ts
│   │   ├── object-id.scalar.ts
│   │   ├── resolvers/
│   │   │   ├── index.ts
│   │   │   ├── rating.resolver.ts
│   │   │   ├── recipe.resolver.ts
│   │   │   └── types/
│   │   │       ├── index.ts
│   │   │       ├── rating.input.ts
│   │   │       └── recipe.input.ts
│   │   ├── schema.graphql
│   │   ├── typegoose.middleware.ts
│   │   └── types.ts
│   ├── typeorm-basic-usage/
│   │   ├── context.type.ts
│   │   ├── datasource.ts
│   │   ├── entities/
│   │   │   ├── index.ts
│   │   │   ├── rating.ts
│   │   │   ├── recipe.ts
│   │   │   └── user.ts
│   │   ├── examples.graphql
│   │   ├── helpers.ts
│   │   ├── index.ts
│   │   ├── resolvers/
│   │   │   ├── index.ts
│   │   │   ├── rating.resolver.ts
│   │   │   ├── recipe.resolver.ts
│   │   │   └── types/
│   │   │       ├── index.ts
│   │   │       ├── rating.input.ts
│   │   │       └── recipe.input.ts
│   │   └── schema.graphql
│   ├── typeorm-lazy-relations/
│   │   ├── context.type.ts
│   │   ├── datasource.ts
│   │   ├── entities/
│   │   │   ├── index.ts
│   │   │   ├── rating.ts
│   │   │   ├── recipe.ts
│   │   │   └── user.ts
│   │   ├── examples.graphql
│   │   ├── helpers.ts
│   │   ├── index.ts
│   │   ├── resolvers/
│   │   │   ├── index.ts
│   │   │   ├── recipe.resolver.ts
│   │   │   └── types/
│   │   │       ├── index.ts
│   │   │       ├── rating.input.ts
│   │   │       └── recipe.input.ts
│   │   └── schema.graphql
│   ├── using-container/
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── recipe.data.ts
│   │   ├── recipe.input.ts
│   │   ├── recipe.resolver.ts
│   │   ├── recipe.service.ts
│   │   ├── recipe.type.ts
│   │   └── schema.graphql
│   └── using-scoped-container/
│       ├── context.type.ts
│       ├── examples.graphql
│       ├── index.ts
│       ├── logger.ts
│       ├── recipe/
│       │   ├── recipe.data.ts
│       │   ├── recipe.input.ts
│       │   ├── recipe.resolver.ts
│       │   ├── recipe.service.ts
│       │   └── recipe.type.ts
│       └── schema.graphql
├── images/
│   └── payid_pookies.avif
├── jest.config.cts
├── package.json
├── scripts/
│   ├── .eslintrc
│   ├── markdown.ts
│   ├── package.json.ts
│   ├── tsconfig.json
│   └── version.ts
├── sponsorkit.config.mts
├── src/
│   ├── @types/
│   │   └── Reflect.d.ts
│   ├── decorators/
│   │   ├── Arg.ts
│   │   ├── Args.ts
│   │   ├── ArgsType.ts
│   │   ├── Authorized.ts
│   │   ├── Ctx.ts
│   │   ├── Directive.ts
│   │   ├── Extensions.ts
│   │   ├── Field.ts
│   │   ├── FieldResolver.ts
│   │   ├── Info.ts
│   │   ├── InputType.ts
│   │   ├── InterfaceType.ts
│   │   ├── Mutation.ts
│   │   ├── ObjectType.ts
│   │   ├── Query.ts
│   │   ├── Resolver.ts
│   │   ├── Root.ts
│   │   ├── Subscription.ts
│   │   ├── UseMiddleware.ts
│   │   ├── createMethodMiddlewareDecorator.ts
│   │   ├── createParameterDecorator.ts
│   │   ├── createResolverClassMiddlewareDecorator.ts
│   │   ├── enums.ts
│   │   ├── index.ts
│   │   ├── types.ts
│   │   └── unions.ts
│   ├── errors/
│   │   ├── CannotDetermineGraphQLTypeError.ts
│   │   ├── ConflictingDefaultValuesError.ts
│   │   ├── GeneratingSchemaError.ts
│   │   ├── InterfaceResolveTypeError.ts
│   │   ├── InvalidDirectiveError.ts
│   │   ├── MissingPubSubError.ts
│   │   ├── MissingSubscriptionTopicsError.ts
│   │   ├── NoExplicitTypeError.ts
│   │   ├── ReflectMetadataMissingError.ts
│   │   ├── SymbolKeysNotSupportedError.ts
│   │   ├── UnionResolveTypeError.ts
│   │   ├── UnmetGraphQLPeerDependencyError.ts
│   │   ├── WrongNullableListOptionError.ts
│   │   ├── graphql/
│   │   │   ├── ArgumentValidationError.ts
│   │   │   ├── AuthenticationError.ts
│   │   │   ├── AuthorizationError.ts
│   │   │   └── index.ts
│   │   └── index.ts
│   ├── helpers/
│   │   ├── auth-middleware.ts
│   │   ├── decorators.ts
│   │   ├── filesystem.ts
│   │   ├── findType.ts
│   │   ├── isThrowing.ts
│   │   ├── params.ts
│   │   ├── resolver-metadata.ts
│   │   ├── returnTypes.ts
│   │   ├── types.ts
│   │   └── utils.ts
│   ├── index.ts
│   ├── metadata/
│   │   ├── definitions/
│   │   │   ├── authorized-metadata.ts
│   │   │   ├── class-metadata.ts
│   │   │   ├── directive-metadata.ts
│   │   │   ├── enum-metadata.ts
│   │   │   ├── extensions-metadata.ts
│   │   │   ├── field-metadata.ts
│   │   │   ├── index.ts
│   │   │   ├── interface-class-metadata.ts
│   │   │   ├── middleware-metadata.ts
│   │   │   ├── object-class-metadata.ts
│   │   │   ├── param-metadata.ts
│   │   │   ├── resolver-metadata.ts
│   │   │   └── union-metadata.ts
│   │   ├── getMetadataStorage.ts
│   │   ├── index.ts
│   │   ├── metadata-storage.ts
│   │   └── utils.ts
│   ├── resolvers/
│   │   ├── convert-args.ts
│   │   ├── create.ts
│   │   ├── helpers.ts
│   │   └── validate-arg.ts
│   ├── scalars/
│   │   ├── aliases.ts
│   │   └── index.ts
│   ├── schema/
│   │   ├── build-context.ts
│   │   ├── definition-node.ts
│   │   ├── schema-generator.ts
│   │   └── utils.ts
│   ├── shim.ts
│   ├── typings/
│   │   ├── Complexity.ts
│   │   ├── ResolverInterface.ts
│   │   ├── SubscribeResolverData.ts
│   │   ├── SubscriptionHandlerData.ts
│   │   ├── TypeResolver.ts
│   │   ├── ValidatorFn.ts
│   │   ├── auth-checker.ts
│   │   ├── index.ts
│   │   ├── legacy-decorators.ts
│   │   ├── middleware.ts
│   │   ├── resolver-data.ts
│   │   ├── resolvers-map.ts
│   │   ├── subscriptions.ts
│   │   └── utils/
│   │       ├── ClassType.ts
│   │       ├── Constructor.ts
│   │       ├── Except.ts
│   │       ├── IsEqual.ts
│   │       ├── Maybe.ts
│   │       ├── MaybePromise.ts
│   │       ├── MergeExclusive.ts
│   │       ├── NonEmptyArray.ts
│   │       ├── SetRequired.ts
│   │       ├── Simplify.ts
│   │       └── index.ts
│   └── utils/
│       ├── buildSchema.ts
│       ├── buildTypeDefsAndResolvers.ts
│       ├── container.ts
│       ├── createResolversMap.ts
│       ├── emitSchemaDefinitionFile.ts
│       ├── graphql-version.ts
│       ├── index.ts
│       └── isPromiseLike.ts
├── tests/
│   ├── .eslintrc
│   ├── functional/
│   │   ├── authorization.ts
│   │   ├── circular-refs.ts
│   │   ├── default-nullable.ts
│   │   ├── default-values.ts
│   │   ├── deprecation.ts
│   │   ├── description.ts
│   │   ├── directives.ts
│   │   ├── emit-schema-sdl.ts
│   │   ├── enums.ts
│   │   ├── errors/
│   │   │   └── metadata-polyfill.ts
│   │   ├── extensions.ts
│   │   ├── fields.ts
│   │   ├── generic-types.ts
│   │   ├── inputtype-enumerable-properties.ts
│   │   ├── interface-resolvers-args.ts
│   │   ├── interfaces-and-inheritance.ts
│   │   ├── ioc-container.ts
│   │   ├── manual-decorators.ts
│   │   ├── metadata-storage.ts
│   │   ├── middlewares.ts
│   │   ├── nested-interface-inheritance.ts
│   │   ├── peer-dependency.ts
│   │   ├── query-complexity.ts
│   │   ├── resolvers.ts
│   │   ├── scalars.ts
│   │   ├── simple-resolvers.ts
│   │   ├── subscriptions.ts
│   │   ├── typedefs-resolvers.ts
│   │   ├── unions.ts
│   │   └── validation.ts
│   ├── helpers/
│   │   ├── circular-refs/
│   │   │   ├── good/
│   │   │   │   ├── CircularRef1.ts
│   │   │   │   └── CircularRef2.ts
│   │   │   └── wrong/
│   │   │       ├── CircularRef1.ts
│   │   │       └── CircularRef2.ts
│   │   ├── customScalar.ts
│   │   ├── directives/
│   │   │   ├── TestDirective.ts
│   │   │   └── assertValidDirective.ts
│   │   ├── expectToThrow.ts
│   │   ├── getInnerFieldType.ts
│   │   ├── getSampleObjectFieldType.ts
│   │   ├── getSchemaInfo.ts
│   │   ├── getTypeField.ts
│   │   └── sleep.ts
│   └── tsconfig.json
├── tsconfig.cjs.json
├── tsconfig.esm.json
├── tsconfig.json
├── tsconfig.typings.json
└── website/
    ├── .gitignore
    ├── blog/
    │   ├── 2018-03-25-medium-article.md
    │   └── 2020-08-19-devto-article.md
    ├── core/
    │   └── Footer.js
    ├── i18n/
    │   └── en.json
    ├── package.json
    ├── pages/
    │   ├── en/
    │   │   ├── help.js
    │   │   ├── index.js
    │   │   ├── users.js
    │   │   └── versions.js
    │   └── snippets/
    │       ├── object-type.md
    │       ├── testability.md
    │       ├── typeorm.md
    │       └── validation.md
    ├── sidebars.json
    ├── siteConfig.js
    ├── static/
    │   ├── css/
    │   │   ├── custom.css
    │   │   └── prism-theme.css
    │   └── img/
    │       └── payid_pookies.avif
    ├── versioned_docs/
    │   ├── version-0.16.0/
    │   │   ├── authorization.md
    │   │   ├── bootstrap.md
    │   │   ├── browser-usage.md
    │   │   ├── complexity.md
    │   │   ├── dependency-injection.md
    │   │   ├── emit-schema.md
    │   │   ├── enums.md
    │   │   ├── examples.md
    │   │   ├── faq.md
    │   │   ├── getting-started.md
    │   │   ├── interfaces-and-inheritance.md
    │   │   ├── introduction.md
    │   │   ├── middlewares.md
    │   │   ├── resolvers.md
    │   │   ├── scalars.md
    │   │   ├── subscriptions.md
    │   │   ├── types-and-fields.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   ├── version-0.17.0/
    │   │   ├── authorization.md
    │   │   ├── bootstrap.md
    │   │   ├── browser-usage.md
    │   │   ├── complexity.md
    │   │   ├── dependency-injection.md
    │   │   ├── emit-schema.md
    │   │   ├── enums.md
    │   │   ├── examples.md
    │   │   ├── faq.md
    │   │   ├── generic-types.md
    │   │   ├── getting-started.md
    │   │   ├── inheritance.md
    │   │   ├── installation.md
    │   │   ├── interfaces.md
    │   │   ├── introduction.md
    │   │   ├── middlewares.md
    │   │   ├── resolvers.md
    │   │   ├── scalars.md
    │   │   ├── subscriptions.md
    │   │   ├── types-and-fields.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   ├── version-0.17.1/
    │   │   ├── authorization.md
    │   │   ├── bootstrap.md
    │   │   ├── browser-usage.md
    │   │   ├── complexity.md
    │   │   ├── dependency-injection.md
    │   │   ├── emit-schema.md
    │   │   ├── enums.md
    │   │   ├── examples.md
    │   │   ├── faq.md
    │   │   ├── generic-types.md
    │   │   ├── getting-started.md
    │   │   ├── inheritance.md
    │   │   ├── installation.md
    │   │   ├── interfaces.md
    │   │   ├── introduction.md
    │   │   ├── middlewares.md
    │   │   ├── resolvers.md
    │   │   ├── scalars.md
    │   │   ├── subscriptions.md
    │   │   ├── types-and-fields.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   ├── version-0.17.2/
    │   │   ├── examples.md
    │   │   ├── getting-started.md
    │   │   ├── interfaces.md
    │   │   ├── introduction.md
    │   │   ├── types-and-fields.md
    │   │   └── unions.md
    │   ├── version-0.17.4/
    │   │   ├── custom-decorators.md
    │   │   ├── examples.md
    │   │   ├── interfaces.md
    │   │   ├── middlewares.md
    │   │   ├── subscriptions.md
    │   │   └── unions.md
    │   ├── version-0.17.5/
    │   │   ├── complexity.md
    │   │   ├── custom-decorators.md
    │   │   ├── dependency-injection.md
    │   │   ├── enums.md
    │   │   ├── examples.md
    │   │   ├── faq.md
    │   │   ├── generic-types.md
    │   │   ├── interfaces.md
    │   │   ├── middlewares.md
    │   │   ├── subscriptions.md
    │   │   ├── types-and-fields.md
    │   │   └── unions.md
    │   ├── version-0.17.6/
    │   │   └── custom-decorators.md
    │   ├── version-1.0.0/
    │   │   ├── bootstrap.md
    │   │   ├── browser-usage.md
    │   │   ├── complexity.md
    │   │   ├── custom-decorators.md
    │   │   ├── dependency-injection.md
    │   │   ├── directives.md
    │   │   ├── emit-schema.md
    │   │   ├── examples.md
    │   │   ├── extensions.md
    │   │   ├── generic-types.md
    │   │   ├── getting-started.md
    │   │   ├── installation.md
    │   │   ├── interfaces.md
    │   │   ├── middlewares.md
    │   │   ├── nestjs.md
    │   │   ├── performance.md
    │   │   ├── prisma.md
    │   │   ├── resolvers.md
    │   │   ├── scalars.md
    │   │   ├── subscriptions.md
    │   │   ├── types-and-fields.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   ├── version-1.1.0/
    │   │   ├── enums.md
    │   │   ├── examples.md
    │   │   └── validation.md
    │   ├── version-1.1.1/
    │   │   ├── complexity.md
    │   │   ├── custom-decorators.md
    │   │   ├── dependency-injection.md
    │   │   ├── examples.md
    │   │   ├── extensions.md
    │   │   ├── generic-types.md
    │   │   ├── interfaces.md
    │   │   ├── middlewares.md
    │   │   ├── performance.md
    │   │   ├── resolvers.md
    │   │   ├── subscriptions.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   ├── version-1.2.0-rc.1/
    │   │   ├── authorization.md
    │   │   ├── bootstrap.md
    │   │   ├── complexity.md
    │   │   ├── custom-decorators.md
    │   │   ├── dependency-injection.md
    │   │   ├── directives.md
    │   │   ├── examples.md
    │   │   ├── extensions.md
    │   │   ├── generic-types.md
    │   │   ├── interfaces.md
    │   │   ├── middlewares.md
    │   │   ├── performance.md
    │   │   ├── resolvers.md
    │   │   ├── subscriptions.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   ├── version-2.0.0-beta.3/
    │   │   ├── authorization.md
    │   │   ├── bootstrap.md
    │   │   ├── browser-usage.md
    │   │   ├── complexity.md
    │   │   ├── custom-decorators.md
    │   │   ├── dependency-injection.md
    │   │   ├── directives.md
    │   │   ├── emit-schema.md
    │   │   ├── enums.md
    │   │   ├── esm.md
    │   │   ├── examples.md
    │   │   ├── extensions.md
    │   │   ├── faq.md
    │   │   ├── generic-types.md
    │   │   ├── getting-started.md
    │   │   ├── inheritance.md
    │   │   ├── installation.md
    │   │   ├── interfaces.md
    │   │   ├── introduction.md
    │   │   ├── middlewares.md
    │   │   ├── nestjs.md
    │   │   ├── performance.md
    │   │   ├── prisma.md
    │   │   ├── resolvers.md
    │   │   ├── scalars.md
    │   │   ├── subscriptions.md
    │   │   ├── types-and-fields.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   ├── version-2.0.0-beta.4/
    │   │   ├── authorization.md
    │   │   ├── aws-lambda.md
    │   │   ├── browser-usage.md
    │   │   ├── complexity.md
    │   │   ├── custom-decorators.md
    │   │   ├── dependency-injection.md
    │   │   ├── directives.md
    │   │   ├── emit-schema.md
    │   │   ├── esm.md
    │   │   ├── examples.md
    │   │   ├── extensions.md
    │   │   ├── generic-types.md
    │   │   ├── inheritance.md
    │   │   ├── interfaces.md
    │   │   ├── middlewares.md
    │   │   ├── migration-guide.md
    │   │   ├── resolvers.md
    │   │   ├── subscriptions.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   ├── version-2.0.0-beta.6/
    │   │   ├── authorization.md
    │   │   ├── complexity.md
    │   │   ├── custom-decorators.md
    │   │   ├── dependency-injection.md
    │   │   ├── examples.md
    │   │   ├── extensions.md
    │   │   ├── generic-types.md
    │   │   ├── inheritance.md
    │   │   ├── interfaces.md
    │   │   ├── middlewares.md
    │   │   ├── resolvers.md
    │   │   ├── subscriptions.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   ├── version-2.0.0-rc.1/
    │   │   ├── authorization.md
    │   │   ├── complexity.md
    │   │   ├── custom-decorators.md
    │   │   ├── dependency-injection.md
    │   │   ├── examples.md
    │   │   ├── extensions.md
    │   │   ├── generic-types.md
    │   │   ├── inheritance.md
    │   │   ├── installation.md
    │   │   ├── interfaces.md
    │   │   ├── middlewares.md
    │   │   ├── migration-guide.md
    │   │   ├── resolvers.md
    │   │   ├── subscriptions.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   ├── version-2.0.0-rc.2/
    │   │   ├── authorization.md
    │   │   ├── azure-functions.md
    │   │   ├── browser-usage.md
    │   │   ├── complexity.md
    │   │   ├── custom-decorators.md
    │   │   ├── dependency-injection.md
    │   │   ├── examples.md
    │   │   ├── extensions.md
    │   │   ├── generic-types.md
    │   │   ├── inheritance.md
    │   │   ├── interfaces.md
    │   │   ├── middlewares.md
    │   │   ├── resolvers.md
    │   │   ├── subscriptions.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   ├── version-2.0.0-rc.3/
    │   │   ├── authorization.md
    │   │   ├── complexity.md
    │   │   ├── custom-decorators.md
    │   │   ├── dependency-injection.md
    │   │   ├── emit-schema.md
    │   │   ├── examples.md
    │   │   ├── extensions.md
    │   │   ├── generic-types.md
    │   │   ├── inheritance.md
    │   │   ├── installation.md
    │   │   ├── interfaces.md
    │   │   ├── middlewares.md
    │   │   ├── resolvers.md
    │   │   ├── subscriptions.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   └── version-2.0.0-rc.4/
    │       ├── authorization.md
    │       ├── complexity.md
    │       ├── custom-decorators.md
    │       ├── dependency-injection.md
    │       ├── examples.md
    │       ├── extensions.md
    │       ├── generic-types.md
    │       ├── inheritance.md
    │       ├── interfaces.md
    │       ├── middlewares.md
    │       ├── resolvers.md
    │       ├── subscriptions.md
    │       ├── unions.md
    │       └── validation.md
    ├── versioned_sidebars/
    │   ├── version-0.16.0-sidebars.json
    │   ├── version-0.17.0-sidebars.json
    │   ├── version-0.17.4-sidebars.json
    │   ├── version-1.0.0-sidebars.json
    │   ├── version-2.0.0-beta.3-sidebars.json
    │   ├── version-2.0.0-beta.4-sidebars.json
    │   └── version-2.0.0-rc.2-sidebars.json
    └── versions.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
root = true

[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

[*.md]
max_line_length = off
trim_trailing_whitespace = false


================================================
FILE: .eslintignore
================================================
**/build/
**/dist/
**/coverage/
**/node_modules/
jest.config.cts
sponsorkit.config.mts

# FIXME: Remove
website/


================================================
FILE: .eslintrc
================================================
{
  "root": true,
  "env": {
    "node": true
  },
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "ecmaVersion": "latest",
    "sourceType": "module",
    "project": [
      "./tsconfig.json",
      "./benchmarks/tsconfig.json",
      "./examples/tsconfig.json",
      "./scripts/tsconfig.json",
      "./tests/tsconfig.json"
    ]
  },
  "settings": {
    "import/parsers": {
      "@typescript-eslint/parser": [".ts"]
    },
    "import/resolver": {
      "typescript": {
        "alwaysTryTypes": true,
        "project": [
          "./tsconfig.json",
          "./benchmarks/tsconfig.json",
          "./examples/tsconfig.json",
          "./scripts/tsconfig.json",
          "./tests/tsconfig.json"
        ]
      }
    }
  },
  "reportUnusedDisableDirectives": true,
  "plugins": ["import", "@typescript-eslint", "eslint-plugin-tsdoc", "jest"],
  "extends": [
    "airbnb-base",
    "airbnb-typescript/base",
    "eslint:recommended",
    "plugin:@cspell/recommended",
    "plugin:@typescript-eslint/recommended",
    // "plugin:@typescript-eslint/recommended-type-checked",
    "plugin:@typescript-eslint/stylistic",
    // "plugin:@typescript-eslint/stylistic-type-checked",
    "plugin:import/recommended",
    "plugin:import/typescript",
    "plugin:jest/recommended",
    "prettier"
  ],
  "rules": {
    "tsdoc/syntax": "warn",
    "semi": "off",
    "@typescript-eslint/semi": "error",
    "no-restricted-syntax": "off",
    "curly": ["error", "all"],
    "nonblock-statement-body-position": ["error", "below"],
    "sort-imports": ["error", { "ignoreDeclarationSort": true }],
    "import/order": [
      "error",
      {
        "alphabetize": {
          "caseInsensitive": true,
          "order": "asc"
        },
        "groups": ["builtin", "external", "internal", ["sibling", "parent"], "index", "unknown"],
        "newlines-between": "never",
        "pathGroups": [
          { "pattern": "@/**", "group": "internal", "position": "before" },
          { "pattern": "type-graphql", "group": "external" }
        ],
        "pathGroupsExcludedImportTypes": ["builtin"]
      }
    ],
    "import/no-default-export": "error",
    "import/prefer-default-export": "off",
    "no-unused-vars": "off",
    "no-duplicate-imports": "error",
    "@typescript-eslint/no-unused-vars": [
      "error",
      {
        "argsIgnorePattern": "^_",
        "varsIgnorePattern": "^_",
        "caughtErrorsIgnorePattern": "^_"
      }
    ],
    "@typescript-eslint/array-type": ["error", { "default": "array-simple" }],
    "@typescript-eslint/consistent-type-imports": [
      "error",
      {
        "disallowTypeAnnotations": false,
        "fixStyle": "inline-type-imports",
        "prefer": "type-imports"
      }
    ],
    "@typescript-eslint/consistent-type-exports": "error",
    "@typescript-eslint/consistent-type-definitions": ["error", "interface"],
    "@typescript-eslint/no-inferrable-types": [
      "error",
      { "ignoreParameters": true, "ignoreProperties": true }
    ],
    // FIXME: Remove
    "@typescript-eslint/ban-types": [
      "error",
      {
        "types": {
          "Function": false,
          "Object": false,
          "{}": false
        },
        "extendDefaults": true
      }
    ],
    // FIXME: Remove
    "@typescript-eslint/no-explicit-any": "off"
  }
}


================================================
FILE: .gitattributes
================================================
*                 text=auto eol=lf

# Source code
*.bash            text eol=lf
*.bat             text eol=crlf
*.cmd             text eol=crlf
*.coffee          text
*.css             text diff=css
*.htm             text diff=html
*.html            text diff=html
*.inc             text
*.ini             text
*.js              text
*.json            text
*.jsx             text
*.less            text
*.ls              text
*.map             text -diff
*.od              text
*.onlydata        text
*.php             text diff=php
*.pl              text
*.ps1             text eol=crlf
*.py              text diff=python
*.rb              text diff=ruby
*.sass            text
*.scm             text
*.scss            text diff=css
*.sh              text eol=lf
*.sql             text
*.styl            text
*.tag             text
*.ts              text
*.tsx             text
*.xml             text
*.xhtml           text diff=html

# Docker
Dockerfile        text

# Documentation
*.ipynb           text
*.markdown        text diff=markdown
*.md              text diff=markdown
*.mdwn            text diff=markdown
*.mdown           text diff=markdown
*.mkd             text diff=markdown
*.mkdn            text diff=markdown
*.mdtxt           text
*.mdtext          text
*.txt             text
AUTHORS           text
CHANGELOG         text
CHANGES           text
CONTRIBUTING      text
COPYING           text
copyright         text
*COPYRIGHT*       text
INSTALL           text
license           text
LICENSE           text
NEWS              text
readme            text
*README*          text
TODO              text

# Templates
*.dot             text
*.ejs             text
*.erb             text
*.haml            text
*.handlebars      text
*.hbs             text
*.hbt             text
*.jade            text
*.latte           text
*.mustache        text
*.njk             text
*.phtml           text
*.svelte          text
*.tmpl            text
*.tpl             text
*.twig            text
*.vue             text

# Configs
*.cnf             text
*.conf            text
*.config          text
.editorconfig     text
.env              text
.gitattributes    text
.gitconfig        text
.htaccess         text
*.lock            text -diff
package.json      text eol=lf
package-lock.json text -diff
pnpm-lock.yaml    text eol=lf -diff
.prettierrc       text
yarn.lock         text -diff
*.toml            text
*.yaml            text
*.yml             text
browserslist      text
Makefile          text
makefile          text

# Heroku
Procfile          text

# Graphics
*.ai              binary
*.bmp             binary
*.eps             binary
*.gif             binary
*.gifv            binary
*.ico             binary
*.jng             binary
*.jp2             binary
*.jpg             binary
*.jpeg            binary
*.jpx             binary
*.jxr             binary
*.pdf             binary
*.png             binary
*.psb             binary
*.psd             binary
*.svg             text
*.svgz            binary
*.tif             binary
*.tiff            binary
*.wbmp            binary
*.webp            binary

# Audio
*.kar             binary
*.m4a             binary
*.mid             binary
*.midi            binary
*.mp3             binary
*.ogg             binary
*.ra              binary

# Video
*.3gpp            binary
*.3gp             binary
*.as              binary
*.asf             binary
*.asx             binary
*.avi             binary
*.fla             binary
*.flv             binary
*.m4v             binary
*.mng             binary
*.mov             binary
*.mp4             binary
*.mpeg            binary
*.mpg             binary
*.ogv             binary
*.swc             binary
*.swf             binary
*.webm            binary

# Archives
*.7z              binary
*.gz              binary
*.jar             binary
*.rar             binary
*.tar             binary
*.zip             binary

# Fonts
*.ttf             binary
*.eot             binary
*.otf             binary
*.woff            binary
*.woff2           binary

# Executables
*.exe             binary
*.pyc             binary

# RC files
*.*rc             text

# Ignore files
*.*ignore         text


================================================
FILE: .github/CODEOWNERS
================================================
* @MichalLytek


================================================
FILE: .github/FUNDING.yml
================================================
github: typegraphql
open_collective: typegraphql


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Something works incorrectly or doesn't work at all
---

**Describe the Bug**
A clear and concise description of what the bug is.

**To Reproduce**
A quick guide how to reproduce the bug.
You can paste here code snippets or even better, provide a link to the repository with minimal reproducible code example.

**Expected Behavior**
A clear and concise description of what you expected to happen.

**Logs**
If applicable, add some console logs to help explain your problem.
You can paste the errors with stack trace that were printed when the error occurred.

**Environment (please complete the following information):**

- OS: [e.g. Windows]
- Node (e.g. 10.5.0)
- Package version [e.g. 0.12.2] (please check if the bug still exist in newest release)
- TypeScript version (e.g. 2.8.2)

**Additional Context**
Add any other context about the problem here.


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: Question or help request
    url: https://github.com/MichalLytek/type-graphql/discussions
    about: Github Discussions is the place to ask a question or discuss with other community members
  - name: Prisma 2 integration
    url: https://github.com/MichalLytek/typegraphql-prisma
    about: All problems or a questions about `typegraphql-prisma` package should be placed in the separate repository


================================================
FILE: .github/ISSUE_TEMPLATE/documentation-issue-or-request.md
================================================
---
name: Documentation issue or request
about: There's something wrong in docs or something is missing
---

**Describe the issue**
A clear and concise description of what is wrong or what feature is missing.
You may ask here for guides, e.g. "How to run TypeGraphQL on AWS Lamda?" if nobody helped you on Github Discussions or StackOverflow.

**Are you able to make a PR that fix this?**
If you can, it would be great if you create a pull request that fixes the docs, fills the gap with new chapter or new code example.

**Additional context**
Add any other context about the problem here.


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: You want to suggest an idea for this project
---

**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

**Describe the solution you'd like**
A clear and concise description of what you want to happen.
You can also propose how the new API should looks like.

**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.

**Additional context**
Add any other context or screenshots about the feature request here.


================================================
FILE: .github/configs/changelog.json
================================================
{
  "categories": [
    {
      "title": "## 🚀 Enhancements",
      "labels": ["Enhancement 🆕"]
    },
    {
      "title": "## 🐛 Fixes",
      "labels": ["Bugfix 🐛 🔨"]
    },
    {
      "title": "## 🧪 Tests",
      "labels": ["Test 🧪"]
    },
    {
      "title": "## 📦 Dependencies",
      "labels": ["Dependencies 📦"]
    },
    {
      "title": "## 📚 Documentation",
      "labels": ["Documentation 📖"]
    },
    {
      "title": "## 🏠 Internal",
      "labels": ["Chore 🔨", "Internal 🏠"]
    }
  ]
}


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    versioning-strategy: increase
    schedule:
      interval: "weekly"
    ignore:
      - dependency-name: "*"
        update-types: ["version-update:semver-patch"]

  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"


================================================
FILE: .github/workflows/check.yml
================================================
name: check

on:
  push:
    branches:
      - master
    tags:
      - v*
  pull_request:
    branches:
      - master

concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

jobs:
  version:
    name: Ensure package version match
    if: startsWith(github.ref_name, 'v')
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Check Git tag format
        env:
          TYPE_GRAPHQL_REF_NAME: ${{ github.ref_name }}
        run: |
          _tag="$TYPE_GRAPHQL_REF_NAME"
          if ! printf "%s\n" "$_tag" | grep -q -P '^v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-(alpha|beta|rc)\.(0|[1-9][0-9]*))?$'; then
            printf '[ERROR]: Git tag (%s) wrong format\n' "$_tag"
            exit 1
          fi

      - name: Read package.json version
        uses: sergeysova/jq-action@v2
        id: version_package
        with:
          cmd: jq --raw-output .version package.json

      - name: Read GitHub version
        uses: pozetroninc/github-action-get-latest-release@master
        id: version_v_github
        with:
          owner: MichalLytek
          repo: type-graphql
          excludes: prerelease, draft

      - name: Remove leading v* from GitHub version
        id: version_github
        env:
          TYPE_GRAPHQL_VERSION: ${{ steps.version_v_github.outputs.release }}
        run: |
          _version="$TYPE_GRAPHQL_VERSION"
          printf 'value=%s\n' "${_version#?}" >> "$GITHUB_OUTPUT"

      - name: Read Git tag version
        id: version_gittag
        env:
          TYPE_GRAPHQL_REF_NAME: ${{ github.ref_name }}
        run: |
          _version="$TYPE_GRAPHQL_REF_NAME"
          printf 'value=%s\n' "${_version#?}" >> "$GITHUB_OUTPUT"

      - name: Compare package.json with Git tag
        uses: madhead/semver-utils@latest
        id: comparison_package_gittag
        with:
          version: ${{ steps.version_package.outputs.value }}
          compare-to: ${{ steps.version_gittag.outputs.value }}
          lenient: false

      - name: Compare Git tag with GitHub
        uses: madhead/semver-utils@latest
        id: comparison_gittag_github
        with:
          version: ${{ steps.version_gittag.outputs.value }}
          compare-to: ${{ steps.version_github.outputs.value }}
          lenient: false

      - name: Check package.json == Git tag
        env:
          TYPE_GRAPHQL_COMPARISON: ${{ steps.comparison_package_gittag.outputs.comparison-result }}
          TYPE_GRAPHQL_VERSION_PACKAGE: ${{ steps.version_package.outputs.value }}
          TYPE_GRAPHQL_VERSION_TAG: ${{ steps.version_gittag.outputs.value }}
        run: |
          if [ ! "$TYPE_GRAPHQL_COMPARISON" = "=" ]; then
            printf '[ERROR]: package.json (%s) != Git tag (%s)\n' "$TYPE_GRAPHQL_VERSION_PACKAGE" "$TYPE_GRAPHQL_VERSION_TAG"
            exit 1
          fi

      - name: Check Git tag > GitHub
        env:
          TYPE_GRAPHQL_COMPARISON: ${{ steps.comparison_gittag_github.outputs.comparison-result }}
          TYPE_GRAPHQL_VERSION_TAG: ${{ steps.version_gittag.outputs.value }}
          TYPE_GRAPHQL_VERSION_GITHUB: ${{ steps.version_github.outputs.value }}
        run: |
          if [ ! "$TYPE_GRAPHQL_COMPARISON" = ">" ]; then
            printf '[ERROR]: Git tag (%s) !> GitHub (%s)\n' "$TYPE_GRAPHQL_VERSION_TAG" "$TYPE_GRAPHQL_VERSION_GITHUB"
            exit 1
          fi

  check:
    name: Build & Lint & Test
    needs: version
    if: always() && (needs.version.result == 'success' || needs.version.result == 'skipped')
    runs-on: ubuntu-latest
    strategy:
      fail-fast: true
      matrix:
        node-version: [20.x, 22.x, 24.x, 25.x]
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}

      - name: Install Dependencies
        run: |
          npm ci

      - name: Build
        run: |
          npm run build
          npm run build:benchmarks

      - name: Check
        run: |
          npm run check
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Test
        run: npm run test:ci
        env:
          CI: true

      - name: Upload code coverage
        uses: codecov/codecov-action@v4
        if: matrix.node-version == '24.x'


================================================
FILE: .github/workflows/codeql.yml
================================================
name: codeql

on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - master
  schedule:
    - cron: "0 0 * * 0"

concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

jobs:
  analyze:
    name: Analyze
    runs-on: ubuntu-latest
    permissions:
      actions: read
      contents: read
      security-events: write
    strategy:
      fail-fast: false
      matrix:
        language:
          - javascript-typescript
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Initialize CodeQL
        uses: github/codeql-action/init@v3
        with:
          languages: ${{ matrix.language }}
          queries: security-and-quality
          config: |
            paths-ignore:
              - "**/node_modules"
              - "**/*.test.ts"

      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v3


================================================
FILE: .github/workflows/license.yml
================================================
name: license

on:
  schedule:
    - cron: "0 0 1 1 *"

concurrency:
  group: ${{ github.workflow }}
  cancel-in-progress: true

jobs:
  license:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - uses: FantasticFiasco/action-update-license-year@v3
        with:
          token: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .github/workflows/release.yml
================================================
name: release

on:
  workflow_run:
    workflows:
      - check
    types:
      - completed

permissions:
  id-token: write # Required for OIDC
  contents: read

concurrency:
  group: ${{ github.workflow }}
  cancel-in-progress: true

jobs:
  release:
    name: Release package on NPM
    runs-on: ubuntu-latest
    if: github.event.workflow_run.conclusion == 'success' && github.ref_name == 'master' && startsWith(github.event.workflow_run.head_branch, 'v')
    permissions:
      contents: write
      id-token: write
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          ref: ${{ github.event.workflow_run.head_branch }}

      - name: Determine if version is prerelease
        id: prerelease
        env:
          TYPE_GRAPHQL_VERSION: ${{ github.event.workflow_run.head_branch }}
        run: |
          _prerelease=
          if printf "%s\n" "$TYPE_GRAPHQL_VERSION" | grep -q -P '^v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$'; then
            _prerelease=false
          else
            _prerelease=true
          fi

          printf 'value=%s\n' "$_prerelease" >> "$GITHUB_OUTPUT"

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 24.x
          registry-url: "https://registry.npmjs.org"

      - name: Install latest npm
        run: |
          npm install -g npm@latest

      - name: Install Dependencies
        run: |
          npm ci

      - name: Prepare package
        run: |
          npm run prepublishOnly
        env:
          TYPE_GRAPHQL_REF: ${{ github.event.workflow_run.head_branch }}

      - name: Build Changelog
        id: changelog
        uses: mikepenz/release-changelog-builder-action@v5
        with:
          configuration: "./.github/configs/changelog.json"
          failOnError: true
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Release
        uses: softprops/action-gh-release@v2
        with:
          tag_name: ${{ github.event.workflow_run.head_branch }}
          body: ${{ steps.changelog.outputs.changelog }}
          prerelease: ${{ steps.prerelease.outputs.value == 'true' }}

      - name: Publish
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
          TYPE_GRAPHQL_PRERELEASE: ${{ steps.prerelease.outputs.value }}
        run: |
          _tag=
          if [ "$TYPE_GRAPHQL_PRERELEASE" = "true" ]; then
            _tag="next"
          else
            _tag="latest"
          fi

          npm publish --ignore-scripts --tag "$_tag"


================================================
FILE: .github/workflows/sponsor.yml
================================================
name: sponsor

on:
  schedule:
    - cron: "0 0 * * *"

concurrency:
  group: ${{ github.workflow }}
  cancel-in-progress: true

jobs:
  sponsor:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: "24.x"

      - name: Install Dependencies
        run: |
          npm ci

      - name: Regenerate sponsors images
        run: npm run gen:sponsorkit
        env:
          SPONSORKIT_GITHUB_TOKEN: ${{ secrets.SPONSORKIT_GITHUB_TOKEN }}
          # SPONSORKIT_OPENCOLLECTIVE_KEY: ${{ secrets.SPONSORKIT_GITHUB_TOKEN_OPENCOLLECTIVE_TOKEN }}

      - name: Commit updated images
        uses: EndBug/add-and-commit@v9
        with:
          add: "img/github-sponsors.svg website/static/img/github-sponsors.svg"
          message: "chore(sponsors): update sponsors image"
          push: true
          committer_name: github-actions[bot]
          committer_email: github-actions[bot]@users.noreply.github.com
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .github/workflows/website.yml
================================================
name: website

on:
  workflow_run:
    workflows:
      - check
    types:
      - completed

concurrency:
  group: ${{ github.workflow }}
  cancel-in-progress: true

jobs:
  website:
    name: Publish website
    runs-on: ubuntu-latest
    if: github.event.workflow_run.conclusion == 'success' && github.ref_name == 'master' && (github.event.workflow_run.head_branch == 'master' || startsWith(github.event.workflow_run.head_branch, 'v'))
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          ref: ${{ github.event.workflow_run.head_branch }}
          fetch-depth: 0

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 24.x

      - name: Install Dependencies
        run: |
          npm ci
          npm ci --prefix ./website

      - name: Build
        run: |
          npm run build --prefix ./website

      - name: Publish
        uses: peaceiris/actions-gh-pages@v4
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ./website/build/type-graphql
          user_name: "github-actions[bot]"
          user_email: "github-actions[bot]@users.noreply.github.com"
          full_commit_message: |
            Deploy website based on ${{ github.event.workflow_run.head_sha }}


================================================
FILE: .gitignore
================================================
# Node.js modules
**/node_modules/

# Builded sources
**/build/
**/dist/

# Coverage
**/coverage/

# IntelliJ stuffs
.idea/

# Parcel cache
.cache
.parcel-cache

# Sponsorkit cache
./images/.cache.json

# Environments
.env

# Archives
*.tar.gz
*.tgz


================================================
FILE: .husky/pre-commit
================================================
#!/usr/bin/env sh

# shellcheck disable=SC1007 source=SCRIPTDIR/_/husky.sh
. "$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)/_/husky.sh"

npx --no -- lint-staged


================================================
FILE: .lintstagedrc
================================================
{
  "**/*.ts": ["eslint --fix", "prettier --write"],
  "**/*.md": ["markdownlint --fix", "prettier --write"],
  "!**/*.{ts,md}": "prettier --write --ignore-unknown"
}


================================================
FILE: .markdownlint.json
================================================
{
  "default": true,
  "line-length": false,
  "no-blanks-blockquote": false
}


================================================
FILE: .markdownlintignore
================================================
**/build/
**/dist/
**/coverage/
**/node_modules/
website/blog/2018-03-25-medium-article.md
website/blog/2020-08-19-devto-article.md
website/versioned_docs/*
# FIXME: Remove
CHANGELOG.md


================================================
FILE: .npmrc
================================================
engine-strict=true


================================================
FILE: .nvmrc
================================================
25


================================================
FILE: .prettierignore
================================================
**/build/
**/dist/
**/coverage/
**/node_modules/
/.husky/_/
/.gitattributes
website/versioned_docs
website/versioned_sidebars


================================================
FILE: .prettierrc
================================================
{
  "endOfLine": "lf",
  "trailingComma": "all",
  "tabWidth": 2,
  "printWidth": 100,
  "bracketSpacing": true,
  "semi": true,
  "singleQuote": false,
  "arrowParens": "avoid",
  "useTabs": false
}


================================================
FILE: .shellcheckrc
================================================
external-sources=true


================================================
FILE: .vscode/extensions.json
================================================
{
  "recommendations": [
    "bierner.comment-tagged-templates",
    "DavidAnson.vscode-markdownlint",
    "dbaeumer.vscode-eslint",
    "EditorConfig.EditorConfig",
    "esbenp.prettier-vscode",
    "GitHub.vscode-github-actions",
    "GraphQL.vscode-graphql",
    "streetsidesoftware.code-spell-checker",
    "timonwong.shellcheck",
    "tlent.jest-snapshot-language-support",
    "wayou.vscode-todo-highlight"
  ]
}


================================================
FILE: .vscode/launch.json
================================================
{
  // Use IntelliSense to learn about possible attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Run example project",
      "type": "node",
      "request": "launch",
      "cwd": "${workspaceFolder}/examples/${input:exampleProjectName}",
      "args": ["./index.ts"],
      "runtimeArgs": ["--nolazy", "-r", "ts-node/register/transpile-only"],
      "skipFiles": ["<node_internals>/**"]
    }
  ],
  "inputs": [
    {
      "id": "exampleProjectName",
      "description": "Choose an example to run",
      "type": "pickString",
      // TODO: add new examples here
      "options": [
        "apollo-cache",
        "apollo-federation",
        "apollo-federation-2",
        "authorization",
        "automatic-validation",
        "custom-validation",
        "enums-and-unions",
        "extensions",
        "generic-types",
        "graphql-scalars",
        "interfaces-inheritance",
        "middlewares-custom-decorators",
        "mikro-orm",
        "mixin-classes",
        "query-complexity",
        "redis-subscriptions",
        "resolvers-inheritance",
        "simple-subscriptions",
        "simple-usage",
        "tsyringe",
        "typegoose",
        "typeorm-basic-usage",
        "typeorm-lazy-relations",
        "using-container",
        "using-scoped-container"
      ]
    }
  ]
}


================================================
FILE: .vscode/settings.json
================================================
{
  "typescript.tsdk": "${workspaceFolder}/node_modules/typescript/lib",
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "[jsonc]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  },
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": "explicit"
  }
}


================================================
FILE: CHANGELOG.md
================================================
# Changelog and release notes

## Unreleased

### Fixes

- support resolver inheritance with dynamic field resolvers name by matching field resolvers by schemaName instead of methodName (#1806)

<!-- Here goes all the unreleased changes descriptions -->

## v2.0.0-rc.4

### Fixes

- prevent duplicated params when building schema multiple times (#1803)

## v2.0.0-rc.3

### Features

- optimize performance of building metadata storage with HashMap caching for O(1) lookups (#1779)

### Fixes

- prevent enumerable undefined properties in input types instances (#1789)
- add missing support for GraphQL extensions in interface types (#1776)

### Others

- **Breaking Change**: update `graphql-js` peer dependency to `^16.12.0`
- **Breaking Change**: drop support for Node.js < 20.11.1
- **Breaking Change**: update `graphql-scalars` peer dependency to `^1.25.0`
- **Breaking Change**: update `class-validator` peer dependency to `>=0.14.3`

## v2.0.0-rc.2

### Features

- support declaring middlewares on resolver class level (#620)
- support declaring auth roles on resolver class level (#620)
- make possible creating custom decorators on resolver class level - `createResolverClassMiddlewareDecorator`
- support registering custom arg decorator via `createParameterDecorator` and its second argument `CustomParameterOptions` - `arg` (#1325)

### Fixes

- properly build multiple schemas with generic resolvers, args and field resolvers (#1321)

### Others

- **Breaking Change**: update `graphql-scalars` peer dependency to `^1.23.0`
- **Breaking Change**: rename `createMethodDecorator` into `createMethodMiddlewareDecorator`
- **Breaking Change**: rename `createParamDecorator` to `createParameterDecorator`

## v2.0.0-rc.1

### Features

- support other `Reflect` polyfills than `reflect-metadata` by checking only used `Reflect` API (#1102)

### Fixes

- properly override fields of `@ArgsType` classes in deeply nested inheritance chain (#1644)
- allow for leading spaces and multiline directives definitions in `@Directive` decorator (#1423)

## v2.0.0-beta.6

### Fixes

- allow overriding field resolver method with different `name` arguments (#1284)
- allow object type's `name` argument string contain a double underscore (`__`) when using `buildTypeDefsAndResolvers()` (#1309)

### Others

- **Breaking Change**: update `graphql-scalars` peer dependency to `^1.22.4`
- properly configure esm build pipeline to publish working esm version of the package

## v2.0.0-beta.4

### Features

- **Breaking Change**: expose shim as a package entry point `type-graphql/shim` (and `/node_modules/type-graphql/build/typings/shim.ts`)
- **Breaking Change**: update `graphql-js` peer dependency to `^16.8.1`
- **Breaking Change**: use `@graphql-yoga` instead of `graphql-subscriptions` as the subscriptions engine
- **Breaking Change**: require providing `PubSub` implementation into `buildSchema` option when using `@Subscription`
- **Breaking Change**: remove `@PubSub` in favor of directly importing created `PubSub` implementation
- **Breaking Change**: remove `Publisher` and `PubSubEngine` types
- **Breaking Change**: rename interface `ResolverFilterData` into `SubscriptionHandlerData` and `ResolverTopicData` into `SubscribeResolverData`
- support defining directives on `@Field` of `@Args`
- support defining directives on inline `@Arg`
- allow passing custom validation function as `validateFn` option of `@Arg` and `@Args` decorators
- add support for dynamic topic id function in `@Subscription` decorator option

## v2.0.0-beta.3

### Features

- **Breaking Change**: update `graphql-js` peer dependency to `^16.7.1`
- **Breaking Change**: upgrade `ArgumentValidationError` and replace `UnauthorizedError` and `ForbiddenError` with `AuthenticationError`, `AuthorizationError` that are extending `GraphQLError` to let the error details be accessible in the `extensions` property
- **Breaking Change**: change `ClassType` constraint from `ClassType<T = any>` to `ClassType<T extends object = object>` in order to make it work properly with new TS features
- **Breaking Change**: remove `dateScalarMode` option from `buildSchema`
- **Breaking Change**: make `graphql-scalars` package a peer dependency and use date scalars from it instead of custom ones
- **Breaking Change**: exported `GraphQLISODateTime` scalar has now a name `DateTimeISO`
- **Breaking Change**: change `ValidatorFn` signature from `ValidatorFn<TArgs>` to `ValidatorFn<TContext>`
- support custom validation function getting resolver data on validate
- bring compatibility with the ESM ecosystem by exposing the double bundle of the `type-graphql` package (CJS and ESM versions)

### Fixes

- allow `ValidatorFn` to accept array of values (instead of only `object | undefined`)

## v2.0.0-beta.2

### Features

- **Breaking Change**: `AuthChecker` type is now "function or class" - update to `AuthCheckerFn` if the function form is needed in the code
- **Breaking Change**: update `graphql-js` peer dependency to `^16.6.0`
- **Breaking Change**: `buildSchemaSync` is now also checking the generated schema for errors
- **Breaking Change**: `validate` option of `buildSchema` is set to `false` by default - integration with `class-validator` has to be turned on explicitly
- **Breaking Change**: `validate` option of `buildSchema` doesn't accept anymore a custom validation function - use `validateFn` option instead
- support class-based auth checker, which allows for dependency injection
- allow defining directives for interface types and theirs fields, with inheritance for object types fields (#744)
- allow deprecating input fields and args (#794)
- support disabling inferring default values (#793)
- support readonly arrays for roles of `@Authorized` decorator (#935)
- add sync version of `buildTypeDefsAndResolvers` function (#803)
- lift restriction of listing all interfaces from inheritance chain in `implements` option of `@ObjectType` decorator (#1425)

### Fixes

- **Breaking Change**: properly emit types nullability when `defaultValue` is provided and remove `ConflictingDefaultWithNullableError` error (#751)
- allow defining extension on field resolver level for fields also defined as a property of the class (#776)
- fix throwing error when schema with dynamic default value was built again (#787)
- fix converting inputs with fields of nested array type (#801)
- disable broken exposing input types fields under a changed name via `@Field({ name: "..." })`
- support overwriting fields of extended types (#1109)
- properly execute args validation for nullable items array (#1328)

### Others

- **Breaking Change**: update `class-validator` peer dependency to `>=0.14.0`
- **Breaking Change**: change build config to ES2021 - drop support for Node.js < 16.16.0
- **Breaking Change**: remove support for loading resolvers by glob paths (`resolvers: string[]` build schema option)
- **Breaking Change**: remove `isAbstract` legacy decorator option
- **Breaking Change**: remove the `commentDescriptions` option from `PrintSchemaOptions` (no more support for `#` comments in SDL by GraphQL v16)

## v1.1.1

### Fixes

- fix crashing when of union's or interface type's `resolveType` function returns `undefined` or `null` (#731)
- fix crashing when no reflected type available for fields with params decorators (#724)
- fix not registering object types implementing interface type when interface type is used as object type field type (#736)
- properly transform nested array of input type classes (#737)

## v1.1.0

### Features

- allow passing custom validation function as `validate` option to `buildSchema`
- support defining deprecation reason and description of enum members (#714)

### Fixes

- **Breaking Change**: throw error when wrong type of value provided as arg or input for `GraphQLISODateTime` and `GraphQLTimestamp` scalars
- don't include in schema the fields declared as `@FieldResolver` when that resolvers classes aren't provided in `resolvers` array
- fix grammar in `CannotDetermineGraphQLTypeError` error message
- properly inherit extensions from parent class and its fields

## v1.0.0

### Features

- **Breaking Change**: emit in schema only types actually used by provided resolvers classes (#415)
- **Breaking Change**: update `graphql-js` peer dependency to `^15.3.0`
- **Breaking Change**: update `graphql-query-complexity` dependency to `^0.7.0` and drop support for `fieldConfigEstimator` (use `fieldExtensionsEstimator` instead)
- **Breaking Change**: introduce `sortedSchema` option in `PrintSchemaOptions` and emit sorted schema file by default
- **Breaking Change**: make `class-validator` a peer dependency of version `>=0.12.0` that needs to be installed manually (#366)
- **Breaking Change**: remove `CannotDetermineTypeError` and make other error messages more detailed and specific
- **Breaking Change**: remove legacy array inference - now explicit array syntax (`[Item]`) is required
- update `TypeResolver` interface to match with `GraphQLTypeResolver` from `graphql-js`
- add basic support for directives with `@Directive()` decorator (#369)
- add possibility to tune up the performance and disable auth & middlewares stack for simple field resolvers (#479)
- optimize resolvers execution paths to speed up a lot basic scenarios (#488)
- add `@Extensions` decorator for putting metadata into GraphQL types config (#521)
- add support for defining arguments and implementing resolvers for interface types fields (#579)
- add `{ autoRegisterImplementations: false }` option to prevent automatic emitting in schema all the object types that implements used interface type (#595)
- allow interfaces to implement other interfaces (#602)
- expose `createResolversMap` utility that generates apollo-like resolvers object
- support IoC containers which `.get()` method returns a `Promise` of resolver instance
- update deps to newest major versions (`tslib`, `graphql-query-complexity`)

### Fixes

- **Breaking Change**: stop returning null for `GraphQLTimestamp` and `GraphQLISODateTime` scalars when returned value is not a `Date` instance - now it throws explicit error instead
- **Breaking Change**: fix transforming and validating nested inputs and arrays (#462)
- refactor union types function syntax handling to prevent possible errors with circular refs
- remove duplicated entries for resolver classes that use inheritance (#499)
- fix using `name` option on interface fields (#567)
- fix not calling `authChecker` during subscribe phase for subscriptions (#578)
- fix using shared union type in multiple schemas
- fix using shared interface type in multiple schemas
- fix calling field resolver without providing resolver class to `buildSchema`
- fix generated TS union type for union type of object type classes extending themselves (#587)
- fix using shared union and interface types in multiple schemas when `resolveType` is used
- properly inherit directives while extending `@InputType` or `@ObjectType` classes (#626)
- skip transforming empty array items into input classes

### Others

- **Breaking Change**: change build config to ES2018 - drop support for Node.js < 10.3
- **Breaking Change**: remove deprecated `DepreciationOptions` interface
- **Breaking Change**: remove deprecated direct array syntax for declaring union types

## v0.17.6

### Fixes

- fix leaking resolver source code in `MissingSubscriptionTopicsError` error message (#489)

## v0.17.5

### Features

- rename `DepreciationOptions` interface to `DeprecationOptions` and deprecate the old one
- update deps to newest minor versions (`tslib`, `semver`, `graphql-query-complexity` and `glob`)
- support nested array types (`@Field(type => [[Int]])`) (#393)
- deprecate the direct array syntax for union types

### Fixes

- fix errors on circular refs in union types (#364) by adding the function syntax (`() => TClassTypes`)

## v0.17.4

### Features

- add support for creating custom parameter decorators (#329)
- allow to provide custom `subscribe` function in `@Subscription` decorator (#328)

## v0.17.3

### Features

- update packages `semver` to `^6.0.0` and `graphql-subscriptions` to `^1.1.0`

### Fixes

- fix broken compatibility with newer `@types/graphql` due to using removed private types (e.g. `MaybePromise`) (#320)

## v0.17.2

### Features

- add support for defining `resolveType` function for interfaces and unions (#319)
- add support for setting default nullability for fields and return types (#297)
- add `skipCheck` option in `buildSchema` to disable checking the correctness of a schema
- add postinstall script for printing info on console about supporting the project

### Fixes

- fix generating plain resolvers for queries and mutations (compatibility with Apollo client state)

## v0.17.1

### Features

- add support for emitting schema file in not existing directory (#269)
- drop support for Node.js v6 (end of LTS in April 2019)

### Fixes

- fix typings discovery support for WebStorm (#276)
- allow for returning plain objects when using `ObjectType`s that implements `InterfaceType`s or extends other classes (#160)

## v0.17.0

### Features

- **Breaking Change**: make `graphql-js` packages a peer dependencies, bump `graphql` to `^14.1.1` and `@types/graphql` to `^14.0.7` (#239)
- **Breaking Change**: remove `useContainer` function and allow to register container by `buildSchema` options (#241)
- **Breaking Change**: change the default `PrintSchemaOptions` option `commentDescriptions` to false (no more `#` comments in SDL)
- add support for passing `PrintSchemaOptions` in `buildSchema.emitSchemaFile` (e.g. `commentDescriptions: true` to restore previous behavior)
- add `buildTypeDefsAndResolvers` utils function for generating apollo-like `typeDefs` and `resolvers` pair (#233)
- add support for generic types (#255)

### Fixes

- **Breaking Change**: remove the `formatArgumentValidationError` helper as it's not compatible and not needed in new Apollo Server (#258)
- fix calling return type getter function `@Field(type => Foo)` before finishing module evaluation (allow for extending circular classes using `require`)
- fix nullifying other custom method decorators - call the method on target instance, not the stored reference to original function (#247)
- fix throwing error when extending non args class in the `@ArgsType()` class
- prevent unnecessary conversion of an object that is already an instance of the requested type (avoid constructor side-effects)

## v0.16.0

### Features

- add support for default values in schema (#203)
- add support for lists with nullable items (#211)

### Fixes

- fix browser shim (compatibility with polyfills for decorator support)

## v0.15.0

### Features

- **Breaking Change**: upgrade `graphql` to `^14.0.2`, `graphql-subscriptions` to `^1.0.0` and `@types/graphql` to `^14.0.2`
- update all other dependencies
- drop support for Node.js v9
- add capability to emit the schema definition file (\*.gql) as a `buildSchema` option
- add `emitSchemaDefinitionFile` helper function for emitting the schema SDL

## v0.14.0

### Features

- **Breaking Change**: change `ClassType` type and export it in package index
- **Breaking Change**: refactor generic `createUnionType` to remove the 10 types limit (note: requires TypeScript >=3.0.1)
- add support for subscribing to dynamic topics - based on args/ctx/root (#137)
- add support for query complexity analysis - integration with `graphql-query-complexity` (#139)

## v0.13.1

### Fixes

- fix missing loosely typed overload signature for `createUnionType` (remove the 10 types limit)

## v0.13.0

### Features

- make `class-validator` a virtual peer dependency and update it to newest `0.9.1` version
- add support for creating scoped containers (#113)

## v0.12.3

### Features

- add reflect-metadata checks and informative error if no polyfill provided
- update `@types/graphql` to latest version (`^0.13.3`)

### Fixes

- fix throwing error when `of => objectType` wasn't provided in abstract resolver class
- fix calling `Object.assign` with boolean arguments (#111)

## v0.12.2

### Features

- add support for using type classes in browser (configure webpack to use decorators shim)

### Fixes

- fix swallowing false argument value (#101)

## v0.12.1

### Fixes

- fix bug with overriding methods from parent resolver class (#95)

## v0.12.0

### Features

- **Breaking Change**: remove deprecated `ActionData` and `FilterActionData` interfaces
- add support for resolver classes inheritance
- add `name` decorator option for `@Field` and `@FieldResolver` decorators that allows to set the schema name different than the property name

## v0.11.3

### Features

- make auth checker feature generic typed (default `string` for backward compatibility)

## v0.11.2

### Features

- attach `MetadataStorage` to global scope (support multiple packages/modules)
- rename and deprecate `ActionData` and `FilterActionData` interfaces to `ResolverData` and `ResolverFilterData`

## v0.11.1

### Features

- add support for returning null instead of throwing authorization error (`authMode` property of `buildSchema` config)
- add support for generating object type field in schema from method with `@FieldResolver`

### Fixes

- fix bug when converting object scalars to target class instance (#65)

## v0.11.0

### Features

- add support for creating and attaching middlewares, guards and interceptors to fields and resolvers
- **Breaking Change**: remove deprecated decorators with `GraphQL` prefix and `{ array: true }` type option

## v0.10.0

### Features

- add `buildSchemaSync` function to build the schema synchronously (unsafe! without additional errors checks)
- update package dependencies
- **Breaking Change**: update `@types/graphql` to `0.13.0`

### Fixes

- decorator option `validate` is now merged with `buildSchema`'s `validate` config instead of overwriting it

## v0.9.1

### Fixes

- fix bug with extending non-TypeGraphQL classes

## v0.9.0

### Features

- add support for GraphQL subscriptions using `graphql-subscriptions`
- update package dependencies
- deprecate `{ array: true }` type option

## v0.8.1

### Features

- add `@Info()` decorator for injecting GraphQL resolve info to resolvers
- add support for injecting parts of `root` and `context` objects with `@Root("field")` and `@Ctx("field")` decorators

## v0.8.0

### Features

- add base support for GraphQL enums using TypeScript enums
- add support for defining GraphQL unions
- add support for importing resolvers from file path glob
- deprecate decorators with `GraphQL` prefix - use `@ArgsType`, `@InputType`, `@InterfaceType`, `@ObjectType` and `@Resolver` instead

### Fixes

- fix not working array type notation in circular dependencies (correct thunk generation)

## v0.7.0

### Features

- add authorization feature - `@Authorized` decorator and `authChecker` function in schema options ([see docs](https://github.com/MichalLytek/type-graphql/blob/master/docs/authorization.md))
- add support for defining array type using mongoose-like notation `[Type]`
- **Breaking Change**: remove deprecated `@GraphQLArgumentType` decorator - use `@GraphQLArgsType` instead

## v0.6.0

### Features

- add support for defining GraphQL interfaces and implementing it by object types
- add support for extending input, args, object and interface types classes
- add support for implementing GraphQL interfaces without decorators duplication
- **Breaking Change**: make `buildSchema` async - now it returns a Promise of `GraphQLSchema`
- rename and deprecate `@GraphQLArgumentType` decorator - use `@GraphQLArgsType` instead

### Fixes

- allow for no args in `@GraphQLResolver` decorator to keep consistency with other resolver classes

## v0.5.0

### Features

- create instance of root object when it's type provided in resolver
- change `Date` scalar names to `GraphQLISODateTime` and `GraphQLTimestamp`
- support only `Date` objects (instances) serialization in `GraphQLTimestamp` (and in `GraphQLISODateTime` too)
- update package dependencies
- add test suite with 92%+ coverage

### Fixes

- **Breaking change**: switch array `nullable` option behavior from `[Type]!` to `[Type!]`
- add more detailed type reflection error message (parameters support)
- fix `ResolverInterface` resolver function type (allow additional parameters)
- add support for named param in `@GraphQLResolver` lambda and for object class as param

## v0.4.0

### Features

- add basic support for automatic arguments and inputs validation using `class-validator`
- add interface `ResolverInterface` for type checking of resolver class methods (field resolvers)
- update `graphql` dependency from `^0.12.3` to `^0.13.0`

### Fixes

- fix default values for arg/input fields (class property initializers) - use `new` instead of `Object.create`

## v0.3.0

### Features

- add support for descriptions in schema (types, args, queries, etc.)
- add support for declaring deprecation reason on object fields and queries/mutations

### Fixes

- fix scalars ID alias (GraphQLID not GraphQLString)

## v0.2.0

### Features

- add support for Date type (built-in scalar)
- add support for custom scalars (and mapping it to TS types)
- change `@Context` decorator name to `@Ctx`

## v0.1.2

### Fixes

- fix missing type args in schema when declared in field resolver
- fix missing resolver function when defined as type field method
- fix creating instances of root object when internal fields are Promises (switch from `plainToClass` to vanilla JS)
- fix converting field and resolvers args errors while converting gql objects (weird `prototype` stuffs)

## v0.1.1

### Features

- add support for omitting return type when use type options, in selected decorators (`@Field`, `@Arg`)

### Fixes

- fix class getter resolvers bug - missing fields from prototype (`plainToClass` bug)

## v0.1.0

### Initial release


================================================
FILE: CONTRIBUTING.md
================================================
<!-- markdownlint-disable MD033 -->

# Contributing to TypeGraphQL

We would love for you to contribute to TypeGraphQL and help make it even better than it is today!
As a contributor, here are the guidelines we would like you to follow:

- [Question or Problem?](#question)
- [Issues and Bugs](#issue)
- [Feature Requests](#feature)
- [Submission Guidelines](#submit)
- [Coding Rules](#rules)
- [Commit Message Guidelines](#commit)

<h2 id="question">Got a Question or Problem?</h2>

Do not open issues for general support questions as we want to keep GitHub issues for bug reports and feature requests.

Instead, consider using [Stack Overflow](https://stackoverflow.com/questions/tagged/typegraphql) to ask support-related questions. When creating a new question on Stack Overflow, make sure to add the `typegraphql` tag.

You can also ask community for help using the [Github Discussion platform][discussions].

<h2 id="issue">Found a Bug?</h2>

If you find a bug in the source code, you can help us by [submitting an issue](#submit-issue) to our [GitHub Repository][github].
Even better, you can [submit a Pull Request](#submit-pr) with a failing test case that reproduces the issue.

<h2 id="feature">Missing a Feature?</h2>

You can _request_ a new feature by [submitting an issue](#submit-issue) to our GitHub Repository.

If you would like to _implement_ a new feature, please consider the size of the change in order to determine the right steps to proceed:

- For a **Major Feature**, first open an issue and outline your proposal so that it can be discussed.
  This process allows us to better coordinate our efforts, prevent duplication of work, and help you to craft the change so that it is successfully accepted into the project.

- **Small Features** can be crafted and directly [submitted as a Pull Request](#submit-pr).

<h2 id="submit">Submission Guidelines</h2>

<h3 id="submit-issue">Submitting an Issue</h3>

Before you submit an issue, please search the issue tracker. An issue for your problem may already exist and the discussion might inform you of workarounds readily available.

You can file new issues by selecting from our [new issue templates](https://github.com/MichalLytek/type-graphql/issues/new/choose) and filling out the issue template.

<h3 id="submit-pr">Submitting a Pull Request (PR)</h3>

Before you submit your Pull Request (PR) consider the following guidelines:

1. Search [GitHub](https://github.com/MichalLytek/type-graphql/pulls) for an open or closed PR that relates to your submission.
   You don't want to duplicate existing efforts.

2. Be sure that an issue describes the problem you're fixing, or documents the design for the feature you'd like to add.
   Discussing the design upfront helps to ensure that we're ready to accept your work.

3. Fork this repo.

4. Make your changes in a new git branch:

   ```shell
   git checkout -b my-fix-branch master
   ```

5. Create your patch, **including appropriate test cases**.

6. Follow our [Coding Rules](#rules).

7. Run the full test suite, and ensure that all tests pass.

8. Commit your changes using a descriptive commit message that follows our [commit message guidelines](#commit).
   Adherence to these conventions is necessary because release notes are automatically generated from these messages.

   ```shell
   git commit -a
   ```

   Note: the optional commit `-a` command line option will automatically "add" and "rm" edited files.

9. Push your branch to GitHub:

   ```shell
   git push origin my-fix-branch
   ```

10. In GitHub, send a pull request to `type-graphql:master`.
    Make sure to [allow edits from maintainers][allow-maintainer-edits].

If we ask for changes via code reviews then:

- Make the required updates.
- Re-run the test suites to ensure tests are still passing.
- Rebase your branch and force push to your GitHub repository (this will update your Pull Request):

  ```shell
  git rebase master -i
  git push -f
  ```

That's it! Thank you for your contribution!

<!-- prettier-ignore-start -->
<!-- markdownlint-disable-next-line MD001 -->
### After your pull request is merged
<!-- prettier-ignore-end -->

After your pull request is merged, you can safely delete your branch and pull the changes from the main (upstream) repository:

- Delete the remote branch on GitHub either through the GitHub web UI or your local shell as follows:

  ```shell
  git push origin --delete my-fix-branch
  ```

- Check out the master branch:

  ```shell
  git checkout master -f
  ```

- Delete the local branch:

  ```shell
  git branch -D my-fix-branch
  ```

- Update your master with the latest upstream version:

  ```shell
  git pull --ff upstream master
  ```

<h2 id="rules">Coding Rules</h2>

To ensure consistency throughout the source code, keep these rules in mind as you are working:

- All features or bug fixes **must be covered by tests**.

- The code must pass type checking and fullfil all the ESLint rules.

<h2 id="commit">Commit Message Guidelines</h2>

For more information checkout this [commit rules guide](https://www.conventionalcommits.org/en/v1.0.0).

[github]: https://github.com/MichalLytek/type-graphql
[discussions]: https://github.com/MichalLytek/type-graphql/discussions
[allow-maintainer-edits]: https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/allowing-changes-to-a-pull-request-branch-created-from-a-fork#enabling-repository-maintainer-permissions-on-existing-pull-requests


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2018-2026 Michał Lytek

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
<!-- prettier-ignore-start -->
<!-- markdownlint-disable-next-line MD041 -->
![logo](./images/logo.png)
<!-- prettier-ignore-end -->

# TypeGraphQL

[![release](https://github.com/MichalLytek/type-graphql/actions/workflows/release.yml/badge.svg)](https://github.com/MichalLytek/type-graphql/actions/workflows/release.yml)
[![website](https://github.com/MichalLytek/type-graphql/actions/workflows/website.yml/badge.svg)](https://github.com/MichalLytek/type-graphql/actions/workflows/website.yml)
[![codeql](https://github.com/MichalLytek/type-graphql/actions/workflows/codeql.yml/badge.svg)](https://github.com/MichalLytek/type-graphql/actions/workflows/codeql.yml)
[![discord](https://img.shields.io/discord/1195751245386875040?logo=discord&color=%237289da)](https://discord.gg/cWnBAQcbg2)
[![codecov](https://codecov.io/gh/MichalLytek/type-graphql/branch/master/graph/badge.svg)](https://codecov.io/gh/MichalLytek/type-graphql)
[![npm](https://img.shields.io/npm/v/type-graphql?logo=npm&color=%23CC3534)](https://www.npmjs.com/package/type-graphql)
[![open collective](https://opencollective.com/typegraphql/tiers/badge.svg)](https://opencollective.com/typegraphql)

Create [GraphQL](https://graphql.org) schema and resolvers with [TypeScript](https://www.typescriptlang.org), using classes and decorators!

**<https://typegraphql.com>**

[![donate](https://opencollective.com/typegraphql/donate/button.png?color=black)](https://opencollective.com/typegraphql)

## Introduction

**TypeGraphQL** makes developing GraphQL APIs an enjoyable process, i.e. by defining the schema using only classes and a bit of decorator magic.

So, to create types like object type or input type, we use a kind of DTO class.
For example, to declare `Recipe` type we simply create a class and annotate it with decorators:

```ts
@ObjectType()
class Recipe {
  @Field(type => ID)
  id: string;

  @Field()
  title: string;

  @Field(type => [Rate])
  ratings: Rate[];

  @Field({ nullable: true })
  averageRating?: number;
}
```

And we get the corresponding part of the schema in SDL:

```graphql
type Recipe {
  id: ID!
  title: String!
  ratings: [Rate!]!
  averageRating: Float
}
```

Then we can create queries, mutations and field resolvers. For this purpose, we use controller-like classes that are called "resolvers" by convention. We can also use awesome features like dependency injection and auth guards:

```ts
@Resolver(Recipe)
class RecipeResolver {
  // dependency injection
  constructor(private recipeService: RecipeService) {}

  @Query(returns => [Recipe])
  recipes() {
    return this.recipeService.findAll();
  }

  @Mutation()
  @Authorized(Roles.Admin) // auth guard
  removeRecipe(@Arg("id") id: string): boolean {
    return this.recipeService.removeById(id);
  }

  @FieldResolver()
  averageRating(@Root() recipe: Recipe) {
    return recipe.ratings.reduce((a, b) => a + b, 0) / recipe.ratings.length;
  }
}
```

And in this simple way, we get this part of the schema in SDL:

```graphql
type Query {
  recipes: [Recipe!]!
}

type Mutation {
  removeRecipe(id: String!): Boolean!
}
```

## Motivation

We all know that GraphQL is great and solves many problems we have with REST APIs, like Over-Fetching and Under-Fetching. But developing a GraphQL API in Node.js with TypeScript is sometimes a bit of a pain. Why? Let's take a look at the steps we usually have to take.

First, we create all the GraphQL types in `schema.graphql` using SDL. Then we create our data models using [ORM classes](https://github.com/typeorm/typeorm), which represent our DB entities. Then we start to write resolvers for our queries, mutations and fields, but this forces us to first create TS interfaces for all arguments, inputs, and even object types.

Only then can we implement the resolvers using weird generic signatures and manually performing common tasks, like validation, authorization and loading dependencies:

```ts
export const getRecipesResolver: GraphQLFieldResolver<void, Context, GetRecipesArgs> = async (
  _,
  args,
  ctx,
) => {
  // common tasks repeatable for almost every resolver
  const repository = TypeORM.getRepository(Recipe);
  const auth = Container.get(AuthService);
  await joi.validate(getRecipesSchema, args);
  if (!auth.check(ctx.user)) {
    throw new NotAuthorizedError();
  }

  // our business logic, e.g.:
  return repository.find({ skip: args.offset, take: args.limit });
};
```

The biggest problem is redundancy in our codebase, which makes it difficult to keep things in sync. To add a new field to our entity, we have to jump through all the files - modify an entity class, the schema, as well as the interface. The same goes for inputs or arguments. It's easy to forget to update one piece or make a mistake with a single type. Also, what if we've made a typo in the field name? The rename feature (F2) won't work correctly.

Tools like [GraphQL Code Generator](https://github.com/dotansimha/graphql-code-generator) or [graphqlgen](https://github.com/prisma/graphqlgen) only solve the first part - they generate the corresponding interfaces (and resolvers skeletons) for our GraphQL schema but they don't fix the schema <--> models redundancy and developer experience (F2 rename won't work, you have to remember about the codegen watch task in the background, etc.), as well as common tasks like validation, authorization, etc.

**TypeGraphQL** comes to address these issues, based on experience from a few years of developing GraphQL APIs in TypeScript. The main idea is to have only one source of truth by defining the schema using classes and some help from decorators. Additional features like dependency injection, validation and auth guards help with common tasks that normally we would have to handle ourselves.

## Documentation

The documentation, installation guide, and detailed description of the API and all of its features are [available on the website](https://typegraphql.com).

### Getting started

A full getting started guide with a simple walkthrough (tutorial) can be found at [getting started docs](https://typegraphql.com/docs/getting-started.html).

### Video tutorial

If you prefer video tutorials, you can watch [Ben Awad](https://github.com/benawad)'s [TypeGraphQL video series](https://www.youtube.com/playlist?list=PLN3n1USn4xlma1bBu3Tloe4NyYn9Ko8Gs) on YouTube.

### Examples

You can also check the [examples folder](./examples) in this repository for more examples of usage: simple fields resolvers, DI Container support, TypeORM integration, automatic validation, etc.

The [Tests folder](./tests) might also give you some tips on how to get various things done.

## Security contact information

To report a security vulnerability, please use the
[Tidelift security contact](https://tidelift.com/security).
Tidelift will coordinate the fix and disclosure.

## The future

The currently released version is a stable 1.0.0 release. It is well-tested (97% coverage, ~500 test cases) and has most of the planned features already implemented. Plenty of companies and independent developers are using it in production with success.

However, there are also plans for a lot more features like better TypeORM, Prisma and DataLoader integration, custom decorators and metadata annotations support - [the full list of ideas](https://github.com/MichalLytek/type-graphql/issues?q=is%3Aissue+is%3Aopen+label%3A"Enhancement+%3Anew%3A") is available on the GitHub repo. You can also keep track of [development's progress on the project board](https://github.com/MichalLytek/type-graphql/projects/1).

If you have any interesting feature requests, feel free to open an issue on GitHub so we can discuss that!

## Support

**TypeGraphQL** is an MIT-licensed open-source project. This framework is a result of the tremendous amount of work - sleepless nights, busy evenings and weekends.

It doesn't have a large company that sits behind it - its ongoing development is possible only thanks to the support of the community.

[![donate](https://opencollective.com/typegraphql/donate/button.png?color=blue)](https://opencollective.com/typegraphql)

### Gold Sponsors 🏆

> Please ask your company to support this open source project by [becoming a gold sponsor](https://opencollective.com/typegraphql/contribute/gold-sponsors-8340) and getting a premium technical support from our core contributors.

### Silver Sponsors 🥈

<!-- markdownlint-disable MD033 -->

| [<img src="./images/leofame.png" width="250" alt="Leofame" />](https://leofame.com/buy-instagram-followers) |
| :---------------------------------------------------------------------------------------------------------: |
|                         [**Leofame**](https://leofame.com/buy-instagram-followers)                          |

### Bronze Sponsors 🥉

| [<img src="./images/live-graphics-system.png" width="55" alt="live graphic systems" />](https://www.ligrsystems.com) | [<img src="./images/felix.png" width="60" alt="Felix Technologies" />](https://github.com/joinlifex) | [<img src="./images/instinctools.svg" width="100" alt="instinctools" />](https://instinctools.com/manufacturing) |
| :------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------: |
|                               [**Live Graphic Systems**](https://www.ligrsystems.com)                                |                       [**Felix Technologies**](https://github.com/joinlifex/)                        |                            [**instinctools**](https://instinctools.com/manufacturing)                            |

| [<img src="./images/betwinner.svg" width="100" alt="BetWinner" />](https://guidebook.betwinner.com/) | [<img src="./images/logo-buzzv.png" width="70" alt="BuzzVoice" />](https://buzzvoice.com/) | [<img src="./images/socialwick-logo.png" width="60" alt="SocialWick" />](https://www.socialwick.com/) | [<img src="./images/c19.png" width="40" alt="C19" />](https://www.c19.cl/) | [<img src="./images/nove_casino.svg" width="70" alt="Nove Casino" />](https://novecasino.net/) | [<img src="./images/play_fortune.png" width="80" alt="Play Fortune" />](https://play-fortune.pl/gry-online/jednoreki-bandyta/) | [<img src="./images/moonkasyno.png" width="60" alt="MoonKasyno" />](https://wechoosethemoon.org/kasyna-online/) | [<img src="./images/kasyno-online.png" width="50" alt="Kasyno Online" />](https://www.casinobillions.com/pl/) | [<img src="./images/fbpostlikes.webp" width="90" alt="FBPostLikes" />](https://www.fbpostlikes.com/) |
| :--------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------: |
|                          [**BetWinner**](https://guidebook.betwinner.com/)                           |                          [**BuzzVoice**](https://buzzvoice.com/)                           |                             [**SocialWick**](https://www.socialwick.com/)                             |                       [**C19**](https://www.c19.cl/)                       |                           [**Nove Casino**](https://novecasino.net/)                           |                           [**Play Fortune**](https://play-fortune.pl/gry-online/jednoreki-bandyta/)                            |                          [**MoonKasyno**](https://wechoosethemoon.org/kasyna-online/)                           |                            [**Kasyno Online**](https://www.casinobillions.com/pl/)                            |                           [**FBPostLikes**](https://www.fbpostlikes.com/)                            |

| [<img src="./images/sidesmedia.png" width="40" alt="SidesMedia" />](https://sidesmedia.com/) | [<img src="./images/social_followers.png" width="60" alt="Social Followers" />](https://www.socialfollowers.uk/buy-tiktok-followers/) | [<img src="./images/ig-comment.png" width="80" alt="IG Comment" />](https://igcomment.com/buy-instagram-comments/) | [<img src="./images/twicsy.svg" width="100" alt="Twicsy" />](https://twicsy.com/buy-instagram-followers) | [<img src="./images/buzzoid.svg" width="90" alt="Buzzoid" />](https://buzzoid.com/buy-instagram-followers/) | [<img src="./images/v4u.png" width="80" alt="Views4You" />](https://views4you.com/) | [<img src="./images/payid_pookies.avif" width="50" alt="PayID Pokies" />](https://au.trustpilot.com/review/bestpayidpokies.net) | [<img src="./images/fun88.png" width="40" alt="Fun88" />](https://global.fun88.com/) |
| :------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------: |
|                          [**SidesMedia**](https://sidesmedia.com/)                           |                             [**Social Followers**](https://www.socialfollowers.uk/buy-tiktok-followers/)                              |                          [**IG Comment**](https://igcomment.com/buy-instagram-comments/)                           |                         [**Twicsy**](https://twicsy.com/buy-instagram-followers)                         |                         [**Buzzoid**](https://buzzoid.com/buy-instagram-followers/)                         |                       [**Views4You**](https://views4you.com/)                       |                            [**PayID Pokies**](https://au.trustpilot.com/review/bestpayidpokies.net)                             |                        [**Fun88**](https://global.fun88.com/)                        |

<!-- markdownlint-enable MD033 -->

[![become a sponsor](https://opencollective.com/static/images/become_sponsor.svg)](https://opencollective.com/typegraphql)

### Members 💪

[![Members](https://opencollective.com/typegraphql/tiers/members.svg?avatarHeight=45&width=320&button=false)](https://opencollective.com/typegraphql#contributors)

### GitHub Sponsors

[![GitHub Sponsors](./images/github-sponsors.svg)](https://github.com/sponsors/TypeGraphQL)

## Community

- Visit the [Official Website](https://typegraphql.com)
- Chat on [Discord](https://discord.gg/cWnBAQcbg2)

## Want to help?

Want to file a bug, contribute some code, or improve the documentation? Great! Please read our
guidelines for [CONTRIBUTING](./CONTRIBUTING.md) and then check out one of our [help-wanted issues](https://github.com/MichalLytek/type-graphql/labels/Help%20Wanted%20%3Asos%3A).


================================================
FILE: benchmarks/.eslintrc
================================================
{
  "rules": {
    "no-console": "off",
    "max-classes-per-file": "off",
    "class-methods-use-this": "off",
    "import/no-extraneous-dependencies": [
      "error",
      {
        "devDependencies": true
      }
    ]
  }
}


================================================
FILE: benchmarks/array/graphql-js/async.ts
================================================
import {
  GraphQLBoolean,
  GraphQLInt,
  GraphQLList,
  GraphQLNonNull,
  GraphQLObjectType,
  GraphQLSchema,
  GraphQLString,
} from "graphql";
import { ARRAY_ITEMS, runBenchmark } from "../run";

const SampleObjectType: GraphQLObjectType = new GraphQLObjectType({
  name: "SampleObject",
  fields: () => ({
    stringField: {
      type: new GraphQLNonNull(GraphQLString),
      resolve: async source => source.stringField,
    },
    numberField: {
      type: new GraphQLNonNull(GraphQLInt),
      resolve: async source => source.numberField,
    },
    booleanField: {
      type: new GraphQLNonNull(GraphQLBoolean),
      resolve: async source => source.booleanField,
    },
    nestedField: {
      type: SampleObjectType,
      resolve: async source => source.nestedField,
    },
  }),
});

const schema = new GraphQLSchema({
  query: new GraphQLObjectType({
    name: "Query",
    fields: {
      multipleNestedObjects: {
        type: new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(SampleObjectType))),
        resolve: () =>
          Array.from({ length: ARRAY_ITEMS }, (_, index) => ({
            stringField: "stringField",
            booleanField: true,
            numberField: index,
            nestedField: {
              stringField: "stringField",
              booleanField: true,
              numberField: index,
            },
          })),
      },
    },
  }),
});

runBenchmark(schema).catch(console.error);


================================================
FILE: benchmarks/array/graphql-js/standard.ts
================================================
import {
  GraphQLBoolean,
  GraphQLInt,
  GraphQLList,
  GraphQLNonNull,
  GraphQLObjectType,
  GraphQLSchema,
  GraphQLString,
} from "graphql";
import { ARRAY_ITEMS, runBenchmark } from "../run";

const SampleObjectType: GraphQLObjectType = new GraphQLObjectType({
  name: "SampleObject",
  fields: () => ({
    stringField: {
      type: new GraphQLNonNull(GraphQLString),
    },
    numberField: {
      type: new GraphQLNonNull(GraphQLInt),
    },
    booleanField: {
      type: new GraphQLNonNull(GraphQLBoolean),
    },
    nestedField: {
      type: SampleObjectType,
    },
  }),
});

const schema = new GraphQLSchema({
  query: new GraphQLObjectType({
    name: "Query",
    fields: {
      multipleNestedObjects: {
        type: new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(SampleObjectType))),
        resolve: () =>
          Array.from({ length: ARRAY_ITEMS }, (_, index) => ({
            stringField: "stringField",
            booleanField: true,
            numberField: index,
            nestedField: {
              stringField: "stringField",
              booleanField: true,
              numberField: index,
            },
          })),
      },
    },
  }),
});

runBenchmark(schema).catch(console.error);


================================================
FILE: benchmarks/array/results.txt
================================================
Core i7 2700K @ 3.5GHz
Windows 10 x64
25 000 array items | 50 iterations
Node.js v13.5

-----
TypeGraphQL

standard
- 15.518s

using sync field resolvers
- 18.180s

using async field resolvers
- 39.934s

using getters
- 31.207s

standard with global middleware
- 62.664s

with `simpleResolvers: true`
- 14.980s

-----
`graphql-js`

standard
- 13.276s

async field resolvers
- 25.630s


================================================
FILE: benchmarks/array/run.ts
================================================
import { type GraphQLSchema, execute } from "graphql";
import { gql } from "graphql-tag";

const BENCHMARK_ITERATIONS = 50;
export const ARRAY_ITEMS = 25000;

export async function runBenchmark(schema: GraphQLSchema) {
  const multipleNestedObjectsQuery = gql`
    query {
      multipleNestedObjects {
        stringField
        booleanField
        numberField
        nestedField {
          stringField
          booleanField
          numberField
        }
      }
    }
  `;
  console.time("multipleNestedObjects");
  for (let i = 0; i < BENCHMARK_ITERATIONS; i += 1) {
    // eslint-disable-next-line no-await-in-loop
    const result = await execute({ schema, document: multipleNestedObjectsQuery });
    console.assert(result.data !== undefined, "result data is undefined");
    console.assert(
      (result.data?.multipleNestedObjects as unknown[]).length === ARRAY_ITEMS,
      "result data is not a proper array",
    );
    console.assert(
      (result.data?.multipleNestedObjects as any[])[0].nestedField.booleanField === true,
      "data nestedField are incorrect",
    );
  }
  console.timeEnd("multipleNestedObjects");
}


================================================
FILE: benchmarks/array/type-graphql/async-field-resolvers.ts
================================================
import "reflect-metadata";
import {
  Field,
  FieldResolver,
  Int,
  ObjectType,
  Query,
  Resolver,
  Root,
  buildSchema,
} from "type-graphql";
import { ARRAY_ITEMS, runBenchmark } from "../run";

@ObjectType()
class SampleObject {
  @Field()
  stringField!: string;

  @Field(() => Int)
  numberField!: number;

  @Field()
  booleanField!: boolean;

  @Field({ nullable: true })
  nestedField?: SampleObject;
}

@Resolver(SampleObject)
class SampleResolver {
  @Query(() => [SampleObject])
  multipleNestedObjects(): SampleObject[] {
    return Array.from(
      { length: ARRAY_ITEMS },
      (_, index): SampleObject => ({
        stringField: "stringField",
        booleanField: true,
        numberField: index,
        nestedField: {
          stringField: "stringField",
          booleanField: true,
          numberField: index,
        },
      }),
    );
  }

  @FieldResolver()
  async stringField(@Root() source: SampleObject) {
    return source.stringField;
  }

  @FieldResolver()
  async numberField(@Root() source: SampleObject) {
    return source.numberField;
  }

  @FieldResolver()
  async booleanField(@Root() source: SampleObject) {
    return source.booleanField;
  }

  @FieldResolver()
  async nestedField(@Root() source: SampleObject) {
    return source.nestedField;
  }
}

async function main() {
  const schema = await buildSchema({
    resolvers: [SampleResolver],
  });

  await runBenchmark(schema);
}

main().catch(console.error);


================================================
FILE: benchmarks/array/type-graphql/simple-resolvers.ts
================================================
import "reflect-metadata";
import {
  Field,
  Int,
  type MiddlewareFn,
  ObjectType,
  Query,
  Resolver,
  buildSchema,
} from "type-graphql";
import { ARRAY_ITEMS, runBenchmark } from "../run";

@ObjectType({ simpleResolvers: true })
class SampleObject {
  @Field()
  stringField!: string;

  @Field(() => Int)
  numberField!: number;

  @Field()
  booleanField!: boolean;

  @Field({ nullable: true })
  nestedField?: SampleObject;
}

@Resolver()
class SampleResolver {
  @Query(() => [SampleObject])
  multipleNestedObjects(): SampleObject[] {
    return Array.from(
      { length: ARRAY_ITEMS },
      (_, index): SampleObject => ({
        stringField: "stringField",
        booleanField: true,
        numberField: index,
        nestedField: {
          stringField: "stringField",
          booleanField: true,
          numberField: index,
        },
      }),
    );
  }
}

const log = (..._: unknown[]) => undefined; // noop

const loggingMiddleware: MiddlewareFn = ({ info }, next) => {
  log(`${info.parentType.name}.${info.fieldName} accessed`);
  return next();
};

async function main() {
  const schema = await buildSchema({
    resolvers: [SampleResolver],
    globalMiddlewares: [loggingMiddleware],
  });

  await runBenchmark(schema);
}

main().catch(console.error);


================================================
FILE: benchmarks/array/type-graphql/standard.ts
================================================
import "reflect-metadata";
import { Field, Int, ObjectType, Query, Resolver, buildSchema } from "type-graphql";
import { ARRAY_ITEMS, runBenchmark } from "../run";

@ObjectType()
class SampleObject {
  @Field()
  stringField!: string;

  @Field(() => Int)
  numberField!: number;

  @Field()
  booleanField!: boolean;

  @Field({ nullable: true })
  nestedField?: SampleObject;
}

@Resolver()
class SampleResolver {
  @Query(() => [SampleObject])
  multipleNestedObjects(): SampleObject[] {
    return Array.from(
      { length: ARRAY_ITEMS },
      (_, index): SampleObject => ({
        stringField: "stringField",
        booleanField: true,
        numberField: index,
        nestedField: {
          stringField: "stringField",
          booleanField: true,
          numberField: index,
        },
      }),
    );
  }
}

async function main() {
  const schema = await buildSchema({
    resolvers: [SampleResolver],
  });

  await runBenchmark(schema);
}

main().catch(console.error);


================================================
FILE: benchmarks/array/type-graphql/sync-field-resolvers.ts
================================================
import "reflect-metadata";
import {
  Field,
  FieldResolver,
  Int,
  ObjectType,
  Query,
  Resolver,
  Root,
  buildSchema,
} from "type-graphql";
import { ARRAY_ITEMS, runBenchmark } from "../run";

@ObjectType()
class SampleObject {
  @Field()
  stringField!: string;

  @Field(() => Int)
  numberField!: number;

  @Field()
  booleanField!: boolean;

  @Field({ nullable: true })
  nestedField?: SampleObject;
}

@Resolver(SampleObject)
class SampleResolver {
  @Query(() => [SampleObject])
  multipleNestedObjects(): SampleObject[] {
    return Array.from(
      { length: ARRAY_ITEMS },
      (_, index): SampleObject => ({
        stringField: "stringField",
        booleanField: true,
        numberField: index,
        nestedField: {
          stringField: "stringField",
          booleanField: true,
          numberField: index,
        },
      }),
    );
  }

  @FieldResolver()
  stringField(@Root() source: SampleObject) {
    return source.stringField;
  }

  @FieldResolver()
  numberField(@Root() source: SampleObject) {
    return source.numberField;
  }

  @FieldResolver()
  booleanField(@Root() source: SampleObject) {
    return source.booleanField;
  }

  @FieldResolver()
  nestedField(@Root() source: SampleObject) {
    return source.nestedField;
  }
}

async function main() {
  const schema = await buildSchema({
    resolvers: [SampleResolver],
  });

  await runBenchmark(schema);
}

main().catch(console.error);


================================================
FILE: benchmarks/array/type-graphql/sync-getters.ts
================================================
import "reflect-metadata";
import { Field, Int, ObjectType, Query, Resolver, buildSchema } from "type-graphql";
import { ARRAY_ITEMS, runBenchmark } from "../run";

@ObjectType()
class SampleObject {
  stringField!: string;

  @Field({ name: "stringField" })
  get getStringField(): string {
    return this.stringField;
  }

  numberField!: number;

  @Field(() => Int, { name: "numberField" })
  get getNumberField(): number {
    return this.numberField;
  }

  booleanField!: boolean;

  @Field({ name: "booleanField" })
  get getBooleanField(): boolean {
    return this.booleanField;
  }

  nestedField?: SampleObject;

  @Field(() => SampleObject, { name: "nestedField", nullable: true })
  get getNestedField(): SampleObject | undefined {
    return this.nestedField;
  }
}

@Resolver(SampleObject)
class SampleResolver {
  @Query(() => [SampleObject])
  multipleNestedObjects(): SampleObject[] {
    return Array.from(
      { length: ARRAY_ITEMS },
      (_, index): SampleObject =>
        ({
          stringField: "stringField",
          booleanField: true,
          numberField: index,
          nestedField: {
            stringField: "stringField",
            booleanField: true,
            numberField: index,
          } as SampleObject,
        }) as SampleObject,
    );
  }
}

async function main() {
  const schema = await buildSchema({
    resolvers: [SampleResolver],
  });

  await runBenchmark(schema);
}

main().catch(console.error);


================================================
FILE: benchmarks/array/type-graphql/with-global-middleware.ts
================================================
import "reflect-metadata";
import {
  Field,
  Int,
  type MiddlewareFn,
  ObjectType,
  Query,
  Resolver,
  buildSchema,
} from "type-graphql";
import { ARRAY_ITEMS, runBenchmark } from "../run";

@ObjectType()
class SampleObject {
  @Field()
  stringField!: string;

  @Field(() => Int)
  numberField!: number;

  @Field()
  booleanField!: boolean;

  @Field({ nullable: true })
  nestedField?: SampleObject;
}

@Resolver()
class SampleResolver {
  @Query(() => [SampleObject])
  multipleNestedObjects(): SampleObject[] {
    return Array.from(
      { length: ARRAY_ITEMS },
      (_, index): SampleObject => ({
        stringField: "stringField",
        booleanField: true,
        numberField: index,
        nestedField: {
          stringField: "stringField",
          booleanField: true,
          numberField: index,
        },
      }),
    );
  }
}

const log = (..._: unknown[]) => undefined; // noop

const loggingMiddleware: MiddlewareFn = ({ info }, next) => {
  log(`${info.parentType.name}.${info.fieldName} accessed`);
  return next();
};

async function main() {
  const schema = await buildSchema({
    resolvers: [SampleResolver],
    globalMiddlewares: [loggingMiddleware],
  });

  await runBenchmark(schema);
}

main().catch(console.error);


================================================
FILE: benchmarks/simple/graphql-js.ts
================================================
import { GraphQLObjectType, GraphQLSchema, GraphQLString } from "graphql";
import { runBenchmark } from "./run";

const SampleObject: GraphQLObjectType = new GraphQLObjectType({
  name: "SampleObject",
  fields: () => ({
    sampleField: {
      type: GraphQLString,
    },
    nestedField: {
      type: SampleObject,
    },
  }),
});

const schema = new GraphQLSchema({
  query: new GraphQLObjectType({
    name: "Query",
    fields: {
      singleObject: {
        type: SampleObject,
        resolve: () => ({ sampleField: "sampleField" }),
      },
      nestedObject: {
        type: SampleObject,
        resolve: () => ({
          sampleField: "sampleField",
          nestedField: {
            sampleField: "sampleField",
            nestedField: {
              sampleField: "sampleField",
              nestedField: {
                sampleField: "sampleField",
                nestedField: {
                  sampleField: "sampleField",
                },
              },
            },
          },
        }),
      },
    },
  }),
});

runBenchmark(schema).catch(console.error);


================================================
FILE: benchmarks/simple/results.txt
================================================
Core i7 2700K @ 3.5GHz
Windows 10 x64
100 000 iterations

-----
Node.js v10.17

ES2016 build
-  singleObject: 4831.113ms
-  nestedObject: 17067.581ms

ES2018 build
- singleObject: 2196.958ms
- nestedObject: 7311.419ms

graphql-js
- singleObject: 871.424ms
- nestedObject: 2206.372ms

-----
Node.js v13.2

ES2018 build
- singleObject: 1.622s
- nestedObject: 4.557s

without field resolvers (`graphql-js` implicit ones)
- singleObject: 1.465s
- nestedObject: 3.086s

graphql-js
- singleObject: 1.003s
- nestedObject: 2.422s


================================================
FILE: benchmarks/simple/run.ts
================================================
import { type ExecutionResult, type GraphQLSchema, execute } from "graphql";
import { gql } from "graphql-tag";

const BENCHMARK_ITERATIONS = 100000;

export async function runBenchmark(schema: GraphQLSchema) {
  const singleObjectQuery = gql`
    query {
      singleObject {
        sampleField
      }
    }
  `;
  console.time("singleObject");
  for (let i = 0; i < BENCHMARK_ITERATIONS; i += 1) {
    // eslint-disable-next-line no-await-in-loop
    const result: ExecutionResult<any> = await execute({ schema, document: singleObjectQuery });
    console.assert(result.data !== undefined, "result data is undefined");
    console.assert(result.data?.singleObject !== undefined, "data singleObject is undefined");
  }
  console.timeEnd("singleObject");

  const nestedObjectQuery = gql`
    query {
      nestedObject {
        sampleField
        nestedField {
          sampleField
          nestedField {
            sampleField
            nestedField {
              sampleField
              nestedField {
                sampleField
              }
            }
          }
        }
      }
    }
  `;
  console.time("nestedObject");
  for (let i = 0; i < BENCHMARK_ITERATIONS; i += 1) {
    // eslint-disable-next-line no-await-in-loop
    const result: ExecutionResult<any> = await execute({ schema, document: nestedObjectQuery });
    console.assert(result.data !== undefined, "result data is undefined");
    console.assert(
      result.data.nestedObject.nestedField.nestedField.nestedField.nestedField.sampleField !==
        undefined,
      "data nestedField are incorrect",
    );
  }
  console.timeEnd("nestedObject");
}


================================================
FILE: benchmarks/simple/type-graphql.ts
================================================
import "reflect-metadata";
import { Field, ObjectType, Query, Resolver, buildSchema } from "type-graphql";
import { runBenchmark } from "./run";

@ObjectType()
class SampleObject {
  @Field()
  sampleField!: string;

  @Field()
  nestedField?: SampleObject;
}

@Resolver()
class SampleResolver {
  @Query()
  singleObject(): SampleObject {
    return { sampleField: "sampleField" };
  }

  @Query()
  nestedObject(): SampleObject {
    return {
      sampleField: "sampleField",
      nestedField: {
        sampleField: "sampleField",
        nestedField: {
          sampleField: "sampleField",
          nestedField: {
            sampleField: "sampleField",
            nestedField: {
              sampleField: "sampleField",
            },
          },
        },
      },
    };
  }
}

async function main() {
  const schema = await buildSchema({
    resolvers: [SampleResolver],
  });

  await runBenchmark(schema);
}

main().catch(console.error);


================================================
FILE: benchmarks/tsconfig.json
================================================
{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "./build"
  },
  "include": [".", "../src"]
}


================================================
FILE: cspell.json
================================================
{
  "version": "0.2",
  "language": "en",
  "useGitignore": true,
  "import": [
    "@cspell/dict-node/cspell-ext.json",
    "@cspell/dict-npm/cspell-ext.json",
    "@cspell/dict-shell/cspell-ext.json",
    "@cspell/dict-typescript/cspell-ext.json"
  ],
  "ignorePaths": [
    "**/build/",
    "**/dist/",
    "**/coverage/",
    "**/node_modules/",
    "**/package.json",
    "./images/**/*.svg",
    "./images/**/*.avif",
    // FIXME: Remove
    "website/",
    "examples"
  ],
  "words": [
    "amet",
    "argumented",
    "asynciterable",
    "authed",
    "awad",
    "betwinner",
    "buzzoid",
    "buzzv",
    "casinodeps",
    "cdpath",
    "codecov",
    "codegen",
    "codeql",
    "Famety",
    "Fansoria",
    "fbpostlikes",
    "gamstop",
    "graming",
    "graphiql",
    "graphqlgen",
    "graphqlid",
    "graphqlisodate",
    "graphqlisodatetime",
    "Insfollowpro",
    "instanceof",
    "instinctools",
    "inversifyjs",
    "isodate",
    "joiful",
    "Kasyno",
    "kaszinomagyar",
    "Leofame",
    "lifex",
    "lovd",
    "lytek",
    "michał",
    "middlewares",
    "mikroorm",
    "moonkasyno",
    "nestjs",
    "netrc",
    "nongamstopbets",
    "Nove",
    "opencollective",
    "overfetching",
    "paramtypes",
    "payid",
    "pookies",
    "postbuild",
    "realpath",
    "returntype",
    "shellcheck",
    "sidesmedia",
    "sindresorhus",
    "Socialift",
    "socialmention",
    "socialwick",
    "sponsorkit",
    "supergraph",
    "tiktok",
    "todos",
    "Tokmax",
    "Twicsy",
    "typedefs",
    "typedi",
    "typegql",
    "typegraphql",
    "typeof",
    "typeorm",
    "underfetching",
    "webp",
    "wordhint",
    "Zahranicni",
    "zahranicnicasino"
  ]
}


================================================
FILE: docs/README.md
================================================
# Documentation

**The documentation has been prepared to be viewed on [TypeGraphQL website](https://typegraphql.com), please read it there.**


================================================
FILE: docs/authorization.md
================================================
---
title: Authorization
---

Authorization is a core feature used in almost all APIs. Sometimes we want to restrict data access or actions for a specific group of users.

In express.js (and other Node.js frameworks) we use middleware for this, like `passport.js` or the custom ones. However, in GraphQL's resolver architecture we don't have middleware so we have to imperatively call the auth checking function and manually pass context data to each resolver, which might be a bit tedious.

That's why authorization is a first-class feature in `TypeGraphQL`!

## Declaration

First, we need to use the `@Authorized` decorator as a guard on a field, query or mutation.
Example object type field guards:

```ts
@ObjectType()
class MyObject {
  @Field()
  publicField: string;

  @Authorized()
  @Field()
  authorizedField: string;

  @Authorized("ADMIN")
  @Field()
  adminField: string;

  @Authorized(["ADMIN", "MODERATOR"])
  @Field({ nullable: true })
  hiddenField?: string;
}
```

We can leave the `@Authorized` decorator brackets empty or we can specify the role/roles that the user needs to possess in order to get access to the field, query or mutation.
By default the roles are of type `string` but they can easily be changed as the decorator is generic - `@Authorized<number>(1, 7, 22)`.

Thus, authorized users (regardless of their roles) can only read the `publicField` or the `authorizedField` from the `MyObject` object. They will receive `null` when accessing the `hiddenField` field and will receive an error (that will propagate through the whole query tree looking for a nullable field) for the `adminField` when they don't satisfy the role constraints.

Sample query and mutation guards:

```ts
@Resolver()
class MyResolver {
  @Query()
  publicQuery(): MyObject {
    return {
      publicField: "Some public data",
      authorizedField: "Data for logged users only",
      adminField: "Top secret info for admin",
    };
  }

  @Authorized()
  @Query()
  authedQuery(): string {
    return "Authorized users only!";
  }

  @Authorized("ADMIN", "MODERATOR")
  @Mutation()
  adminMutation(): string {
    return "You are an admin/moderator, you can safely drop the database ;)";
  }
}
```

Authorized users (regardless of their roles) will be able to read data from the `publicQuery` and the `authedQuery` queries, but will receive an error when trying to perform the `adminMutation` when their roles don't include `ADMIN` or `MODERATOR`.

However, declaring `@Authorized()` on all the resolver's class methods would be not only a tedious task but also an error-prone one, as it's easy to forget to put it on some newly added method, etc.
Hence, TypeGraphQL support declaring `@Authorized()` or the resolver class level. This way you can declare it once per resolver's class but you can still overwrite the defaults and narrows the authorization rules:

```ts
@Authorized()
@Resolver()
class MyResolver {
  // this will inherit the auth guard defined on the class level
  @Query()
  authedQuery(): string {
    return "Authorized users only!";
  }

  // this one overwrites the resolver's one
  // and registers roles required for this mutation
  @Authorized("ADMIN", "MODERATOR")
  @Mutation()
  adminMutation(): string {
    return "You are an admin/moderator, you can safely drop the database ;)";
  }
}
```

## Runtime checks

Having all the metadata for authorization set, we need to create our auth checker function. Its implementation may depend on our business logic:

```ts
export const customAuthChecker: AuthChecker<ContextType> = (
  { root, args, context, info },
  roles,
) => {
  // Read user from context
  // and check the user's permission against the `roles` argument
  // that comes from the '@Authorized' decorator, eg. ["ADMIN", "MODERATOR"]

  return true; // or 'false' if access is denied
};
```

The second argument of the `AuthChecker` generic type is `RoleType` - used together with the `@Authorized` decorator generic type.

Auth checker can be also defined as a class - this way we can leverage the dependency injection mechanism:

```ts
export class CustomAuthChecker implements AuthCheckerInterface<ContextType> {
  constructor(
    // Dependency injection
    private readonly userRepository: Repository<User>,
  ) {}

  check({ root, args, context, info }: ResolverData<ContextType>, roles: string[]) {
    const userId = getUserIdFromToken(context.token);
    // Use injected service
    const user = this.userRepository.getById(userId);

    // Custom logic, e.g.:
    return user % 2 === 0;
  }
}
```

The last step is to register the function or class while building the schema:

```ts
import { customAuthChecker } from "../auth/custom-auth-checker.ts";

const schema = await buildSchema({
  resolvers: [MyResolver],
  // Register the auth checking function
  // or defining it inline
  authChecker: customAuthChecker,
});
```

And it's done! 😉

If we need silent auth guards and don't want to return authorization errors to users, we can set the `authMode` property of the `buildSchema` config object to `"null"`:

```ts
const schema = await buildSchema({
  resolvers: ["./**/*.resolver.ts"],
  authChecker: customAuthChecker,
  authMode: "null",
});
```

It will then return `null` instead of throwing an authorization error.

## Recipes

We can also use `TypeGraphQL` with JWT authentication.
Here's an example using `@apollo/server`:

```ts
import { ApolloServer } from "@apollo/server";
import { expressMiddleware } from "@apollo/server/express4";
import express from "express";
import jwt from "express-jwt";
import bodyParser from "body-parser";
import { schema } from "./graphql/schema";
import { User } from "./User.type";

// GraphQL path
const GRAPHQL_PATH = "/graphql";

// GraphQL context
type Context = {
  user?: User;
};

// Express
const app = express();

// Apollo server
const server = new ApolloServer<Context>({ schema });
await server.start();

// Mount a JWT or other authentication middleware that is run before the GraphQL execution
app.use(
  GRAPHQL_PATH,
  jwt({
    secret: "TypeGraphQL",
    credentialsRequired: false,
  }),
);

// Apply GraphQL server middleware
app.use(
  GRAPHQL_PATH,
  bodyParser.json(),
  expressMiddleware(server, {
    // Build context
    // 'req.user' comes from 'express-jwt'
    context: async ({ req }) => ({ user: req.user }),
  }),
);

// Start server
await new Promise<void>(resolve => app.listen({ port: 4000 }, resolve));
console.log(`GraphQL server ready at http://localhost:4000/${GRAPHQL_PATH}`);
```

Then we can use standard, token based authorization in the HTTP header like in classic REST APIs and take advantage of the `TypeGraphQL` authorization mechanism.

## Example

See how this works in the [simple real life example](https://github.com/MichalLytek/type-graphql/tree/master/examples/authorization).


================================================
FILE: docs/aws-lambda.md
================================================
---
title: AWS Lambda integration
---

## Using TypeGraphQL in AWS Lambda environment

AWS Lambda environment is a bit different than a standard Node.js server deployment.

However, the only tricky part with the setup is that we need to "cache" the built schema, to save some computing time by avoiding rebuilding the schema on every request to our lambda.

So all we need to do is to assign the built schema to the local variable using the `??=` conditional assignment operator.
We can do the same thing for `ApolloServer`.

Below you you can find the full snippet for the AWS Lambda integration:

```ts
import { APIGatewayProxyHandlerV2 } from "aws-lambda";
import { ApolloServer } from "apollo-server-lambda";

let cachedSchema: GraphQLSchema | null = null;
let cachedServer: ApolloServer | null = null;

export const handler: APIGatewayProxyHandlerV2 = async (event, context, callback) => {
  // build TypeGraphQL executable schema only once, then read it from local "cached" variable
  cachedSchema ??= await buildSchema({
    resolvers: [RecipeResolver],
  });

  // create the GraphQL server only once
  cachedServer ??= new ApolloServer({ schema: cachedSchema });

  // make a handler for `aws-lambda`
  return cachedServer.createHandler({})(event, context, callback);
};
```


================================================
FILE: docs/azure-functions.md
================================================
---
title: Azure Functions Integration
---

## Using TypeGraphQL in Microsoft Azure Functions

Integrating TypeGraphQL with Azure Functions involves the following key steps:

1. Generate GraphQL schema based on your resolvers
2. Notify Apollo Server about your schema

Below is how you can implement the azure function entry point (with explanations in-line):

```ts
// index.ts

import "reflect-metadata";
import path from "path";
import { ApolloServer } from "@apollo/server";
import { startServerAndCreateHandler } from "@as-integrations/azure-functions";
import { buildSchemaSync } from "type-graphql";
import { Container } from "typedi";
import { GraphQLFormattedError } from "graphql";
import { UserResolver } from "YOUR_IMPORT_PATH"; // TypeGraphQL Resolver
import { AccountResolver } from "YOUR_IMPORT_PATH"; // TypeGraphQL Resolver

// Bundle resolvers to build the schema
const schema = buildSchemaSync({
  // Include resolvers you'd like to expose to the API
  // Deployment to Azure functions might fail if
  // you include too much resolvers (means your app is too big)
  resolvers: [
    UserResolver,
    AccountResolver,
    // your other resolvers
  ],

  // Only build the GraphQL schema locally
  // The resulting schema.graphql will be generated to the following path:
  // Path: /YOUR_PROJECT/src/schema.graphql
  emitSchemaFile: process.env.NODE_ENV === "local" ? path.resolve("./src/schema.graphql") : false,
  container: Container,
  validate: true,
});

// Add schema into Apollo Server
const server = new ApolloServer({
  // include your schema
  schema,

  // only allow introspection in non-prod environments
  introspection: process.env.NODE_ENV !== "production",

  // you can handle errors in your own styles
  formatError: (err: GraphQLFormattedError) => err,
});

// Start the server(less handler/function)
export default startServerAndCreateHandler(server);
```

Each Azure Function needs to have an equivalent configuration file called `function.json`, here's how you can configure it:

```json
// function.json

{
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "route": "graphql",
      "methods": ["get", "post", "options"]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ],
  "scriptFile": "../dist/handler-graphql/index.js"
}
```

For better maintainability of your codebase, we recommend separate your Azure Functions into its own folders, away from the actual GraphQL Resolvers. Here's an example:

```text
/YOUR_PROJECT
  /handlers
    /handler-graphql
      index.ts
      function.json
    /handler-SOME-OTHER-FUNCTION-1
      index.ts
      function.json
    /handler-SOME-OTHER-FUNCTION-2
      index.ts
      function.json

  /src
    /resolvers
      user.resolver.ts
      account.resolver.ts
    /services
      user.service.ts
      account.service.ts

  package.json
  host.json
  .eslintrc.js
  .prettierrc
  .eslintignore
  .prettierignore

etc etc etc...
```


================================================
FILE: docs/bootstrap.md
================================================
---
title: Bootstrapping
---

After creating our resolvers, type classes, and other business-related code, we need to make our app run. First we have to build the schema, then we can expose it with an HTTP server, WebSockets or even MQTT.

## Create Executable Schema

To create an executable schema from type and resolver definitions, we need to use the `buildSchema` function.
It takes a configuration object as a parameter and returns a promise of a `GraphQLSchema` object.

In the configuration object we must provide a `resolvers` property, which is supposed to be an array of resolver classes:

```ts
import { FirstResolver, SecondResolver } from "./resolvers";
// ...
const schema = await buildSchema({
  resolvers: [FirstResolver, SecondResolver],
});
```

Be aware that only operations (queries, mutation, etc.) defined in the resolvers classes (and types directly connected to them) will be emitted in schema.

So if we have defined some object types (that implements an interface type [with disabled auto registering](./interfaces.md#registering-in-schema)) but are not directly used in other types definition (like a part of an union, a type of a field or a return type of an operation), we need to provide them manually in `orphanedTypes` options of `buildSchema`:

```ts
import { FirstResolver, SecondResolver } from "../app/src/resolvers";
import { FirstObject } from "../app/src/types";
// ...
const schema = await buildSchema({
  resolvers: [FirstResolver, SecondResolver],
  // Provide all the types that are missing in schema
  orphanedTypes: [FirstObject],
});
```

In case of defining the resolvers array somewhere else (not inline in the `buildSchema`), we need to use the `as const` syntax to inform the TS compiler and satisfy the `NonEmptyArray<T>` constraints:

```ts
// resolvers.ts
export const resolvers = [FirstResolver, SecondResolver] as const;

// schema.ts
import { resolvers } from "./resolvers";

const schema = await buildSchema({ resolvers });
```

There are also other options related to advanced features like [authorization](./authorization.md) or [validation](./validation.md) - you can read about them in docs.

To make `await` work, we need to declare it as an async function. Example of `main.ts` file:

```ts
import { buildSchema } from "type-graphql";

async function bootstrap() {
  const schema = await buildSchema({
    resolvers: [
      // ... Resolvers classes
    ],
  });

  // ...
}

bootstrap(); // Actually run the async function
```

## Create an HTTP GraphQL endpoint

In most cases, the GraphQL app is served by an HTTP server. After building the schema we can create the GraphQL endpoint with a variety of tools such as [`graphql-yoga`](https://github.com/dotansimha/graphql-yoga) or [`@apollo/server`](https://github.com/apollographql/apollo-server).

Below is an example using [`@apollo/server`](https://github.com/apollographql/apollo-server):

```ts
import { ApolloServer } from "@apollo/server";
import { startStandaloneServer } from "@apollo/server/standalone";

const PORT = process.env.PORT || 4000;

async function bootstrap() {
  // ... Build GraphQL schema

  // Create GraphQL server
  const server = new ApolloServer({ schema });

  // Start server
  const { url } = await startStandaloneServer(server, { listen: { port: 4000 } });
  console.log(`GraphQL server ready at ${url}`);
}

bootstrap();
```

Remember to install the `@apollo/server` package from npm - it's not bundled with TypeGraphQL.

Of course you can use the `express-graphql` middleware, `graphql-yoga` or whatever you want 😉

## Create typeDefs and resolvers map

TypeGraphQL provides a second way to generate the GraphQL schema - the `buildTypeDefsAndResolvers` function.

It accepts the same `BuildSchemaOptions` as the `buildSchema` function but instead of an executable `GraphQLSchema`, it creates a typeDefs and resolversMap pair that you can use e.g. with [@graphql-tools/\*`](https://the-guild.dev/graphql/tools):

```ts
import { makeExecutableSchema } from "@graphql-tools/schema";

const { typeDefs, resolvers } = await buildTypeDefsAndResolvers({
  resolvers: [FirstResolver, SecondResolver],
});

const schema = makeExecutableSchema({ typeDefs, resolvers });
```

Or even with other libraries that expect the schema info in that shape, like [`apollo-link-state`](https://github.com/apollographql/apollo-link-state):

```ts
import { withClientState } from "apollo-link-state";

const { typeDefs, resolvers } = await buildTypeDefsAndResolvers({
  resolvers: [FirstResolver, SecondResolver],
});

const stateLink = withClientState({
  // ... Other options like `cache`
  typeDefs,
  resolvers,
});

// ... Rest of `ApolloClient` initialization code
```

There's also a `sync` version of it - `buildTypeDefsAndResolversSync`:

```ts
const { typeDefs, resolvers } = buildTypeDefsAndResolversSync({
  resolvers: [FirstResolver, SecondResolver],
});
```

However, be aware that some of the TypeGraphQL features (i.a. [query complexity](./complexity.md)) might not work with the `buildTypeDefsAndResolvers` approach because they use some low-level `graphql-js` features.


================================================
FILE: docs/browser-usage.md
================================================
---
title: Browser usage
---

## Using classes in a client app

Sometimes we might want to use the classes we've created and annotated with TypeGraphQL decorators, in our client app that works in the browser. For example, reusing the args or input classes with `class-validator` decorators or the object type classes with some helpful custom methods.

Since TypeGraphQL is a Node.js framework, it doesn't work in a browser environment, so we may quickly get an error, e.g. `ERROR in ./node_modules/fs.realpath/index.js` or `utils1_promisify is not a function`, while trying to build our app e.g. with Webpack. To correct this, we have to configure bundler or compiler to use the decorator shim instead of the normal module.

The steps to accomplish this are different, depending on the framework, bundler or compiler we use.
However, in all cases, using shim makes our bundle much lighter as we don't need to embed the whole TypeGraphQL library code in our app.

## CRA and similar

We simply add this plugin code to our webpack config:

```js
module.exports = {
  // ... Rest of Webpack configuration
  plugins: [
    // ... Other existing plugins
    new webpack.NormalModuleReplacementPlugin(/type-graphql$/, resource => {
      resource.request = resource.request.replace(/type-graphql/, "type-graphql/shim");
    }),
  ];
}
```

In case of cypress, we can adapt the same webpack config trick just by applying the [cypress-webpack-preprocessor](https://github.com/cypress-io/cypress-webpack-preprocessor) plugin.

## Angular and similar

In some TypeScript projects, like the ones using Angular, which AoT compiler requires that a full `*.ts` file is provided instead of just a `*.js` and `*.d.ts` files, to use this shim we have to simply set up our TypeScript configuration in `tsconfig.json` to use this file instead of a normal TypeGraphQL module:

```json
{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "type-graphql": ["node_modules/type-graphql/build/typings/shim.ts"]
    }
  }
}
```

## Next.js and similar

When using the shim with Next.js as a dedicated frontend server be aware that Next has pre-renders on the server. This means that in development mode the `webpack: {}` config in `next.config.js` is skipped and full `type-graphql` is bundled. But we still need to handle some webpack rewiring for the client bundling which still happens with webpack both in development and in production mode.

The easiest way is to accomplish this is also done in `tsconfig.json` - add the same keys like in the example before to `compilerOptions`:

```json
{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "type-graphql": ["node_modules/type-graphql/build/typings/shim.ts"]
    }
  }
}
```

Then, `npm install -D tsconfig-paths` and enable it with `NODE_OPTIONS="-r tsconfig-paths/register"` in our environment variables setup.


================================================
FILE: docs/complexity.md
================================================
---
title: Query complexity
---

A single GraphQL query can potentially generate a huge workload for a server, like thousands of database operations which can be used to cause DDoS attacks. In order to limit and keep track of what each GraphQL operation can do, `TypeGraphQL` provides the option of integrating with Query Complexity tools like [graphql-query-complexity](https://github.com/ivome/graphql-query-complexity).

This cost analysis-based solution is very promising, since we can define a “cost” per field and then analyze the AST to estimate the total cost of the GraphQL query. Of course all the analysis is handled by `graphql-query-complexity`.

All we must do is define our complexity cost for the fields, mutations or subscriptions in `TypeGraphQL` and implement `graphql-query-complexity` in whatever GraphQL server that is being used.

## How to use

First, we need to pass `complexity` as an option to the decorator on a field, query or mutation.

Example of complexity

```ts
@ObjectType()
class MyObject {
  @Field({ complexity: 2 })
  publicField: string;

  @Field({ complexity: ({ args, childComplexity }) => childComplexity + 1 })
  complexField: string;
}
```

The `complexity` option may be omitted if the complexity value is 1.
Complexity can be passed as an option to any `@Field`, `@FieldResolver`, `@Mutation` or `@Subscription` decorator. If both `@FieldResolver` and `@Field` decorators of the same property have complexity defined, then the complexity passed to the field resolver decorator takes precedence.

In the next step, we will integrate `graphql-query-complexity` with the server that expose our GraphQL schema over HTTP.
You can use it with `express-graphql` like [in the lib examples](https://github.com/slicknode/graphql-query-complexity/blob/b6a000c0984f7391f3b4e886e3df6a7ed1093b07/README.md#usage-with-express-graphql), however we will use Apollo Server like in our other examples:

```ts
async function bootstrap() {
  // ... Build GraphQL schema

  // Create GraphQL server
  const server = new ApolloServer({
    schema,
    // Create a plugin to allow query complexity calculation for every request
    plugins: [
      {
        requestDidStart: async () => ({
          async didResolveOperation({ request, document }) {
            /**
             * Provides GraphQL query analysis to be able to react on complex queries to the GraphQL server
             * It can be used to protect the GraphQL server against resource exhaustion and DoS attacks
             * More documentation can be found at https://github.com/ivome/graphql-query-complexity
             */
            const complexity = getComplexity({
              // GraphQL schema
              schema,
              // To calculate query complexity properly,
              // check only the requested operation
              // not the whole document that may contains multiple operations
              operationName: request.operationName,
              // GraphQL query document
              query: document,
              // GraphQL query variables
              variables: request.variables,
              // Add any number of estimators. The estimators are invoked in order, the first
              // numeric value that is being returned by an estimator is used as the field complexity
              // If no estimator returns a value, an exception is raised
              estimators: [
                // Using fieldExtensionsEstimator is mandatory to make it work with type-graphql
                fieldExtensionsEstimator(),
                // Add more estimators here...
                // This will assign each field a complexity of 1
                // if no other estimator returned a value
                simpleEstimator({ defaultComplexity: 1 }),
              ],
            });

            // React to the calculated complexity,
            // like compare it with max and throw error when the threshold is reached
            if (complexity > MAX_COMPLEXITY) {
              throw new Error(
                `Sorry, too complicated query! ${complexity} exceeded the maximum allowed complexity of ${MAX_COMPLEXITY}`,
              );
            }
            console.log("Used query complexity points:", complexity);
          },
        }),
      },
    ],
  });

  // Start server
  const { url } = await startStandaloneServer(server, { listen: { port: 4000 } });
  console.log(`GraphQL server ready at ${url}`);
}
```

And it's done! 😉

For more info about how query complexity is computed, please visit [graphql-query-complexity](https://github.com/ivome/graphql-query-complexity).

## Example

See how this works in the [simple query complexity example](https://github.com/MichalLytek/type-graphql/tree/master/examples/query-complexity).


================================================
FILE: docs/custom-decorators.md
================================================
---
title: Custom decorators
---

Custom decorators are a great way to reduce the boilerplate and reuse some common logic between different resolvers. TypeGraphQL supports three kinds of custom decorators - method, resolver class and parameter.

## Method decorators

Using [middlewares](./middlewares.md) allows to reuse some code between resolvers. To further reduce the boilerplate and have a nicer API, we can create our own custom method decorators.

They work in the same way as the [reusable middleware function](./middlewares.md#reusable-middleware), however, in this case we need to call `createMethodMiddlewareDecorator` helper function with our middleware logic and return its value:

```ts
export function ValidateArgs(schema: JoiSchema) {
  return createMethodMiddlewareDecorator(async ({ args }, next) => {
    // Middleware code that uses custom decorator arguments

    // e.g. Validation logic based on schema using 'joi'
    await joiValidate(schema, args);
    return next();
  });
}
```

The usage is then very simple, as we have a custom, descriptive decorator - we just place it above the resolver/field and pass the required arguments to it:

```ts
@Resolver()
export class RecipeResolver {
  @ValidateArgs(MyArgsSchema) // Custom decorator
  @UseMiddleware(ResolveTime) // Explicit middleware
  @Query()
  randomValue(@Args() { scale }: MyArgs): number {
    return Math.random() * scale;
  }
}
```

## Resolver class decorators

Similar to method decorators, we can create our own custom resolver class decorators.
In this case we need to call `createResolverClassMiddlewareDecorator` helper function, just like we did for `createMethodMiddlewareDecorator`:

```ts
export function ValidateArgs(schema: JoiSchema) {
  return createResolverClassMiddlewareDecorator(async ({ args }, next) => {
    // Middleware code that uses custom decorator arguments

    // e.g. Validation logic based on schema using 'joi'
    await joiValidate(schema, args);
    return next();
  });
}
```

The usage is then analogue - we just place it above the resolver class and pass the required arguments to it:

```ts
@ValidateArgs(MyArgsSchema) // Custom decorator
@UseMiddleware(ResolveTime) // Explicit middleware
@Resolver()
export class RecipeResolver {
  @Query()
  randomValue(@Args() { scale }: MyArgs): number {
    return Math.random() * scale;
  }
}
```

This way, we just need to put it once in the code and our custom decorator will be applied to all the resolver's queries or mutations. As simple as that!

## Parameter decorators

Parameter decorators are just like the custom method decorators or middlewares but with an ability to return some value that will be injected to the method as a parameter. Thanks to this, it reduces the pollution in `context` which was used as a workaround for the communication between reusable middlewares and resolvers.

They might be just a simple data extractor function, that makes our resolver more unit test friendly:

```ts
function CurrentUser() {
  return createParameterDecorator<MyContextType>(({ context }) => context.currentUser);
}
```

Or might be a more advanced one that performs some calculations and encapsulates some logic. Compared to middlewares, they allow for a more granular control on executing the code, like calculating fields map based on GraphQL info only when it's really needed (requested by using the `@Fields()` decorator):

```ts
function Fields(level = 1): ParameterDecorator {
  return createParameterDecorator(async ({ info }) => {
    const fieldsMap: FieldsMap = {};
    // Calculate an object with info about requested fields
    // based on GraphQL 'info' parameter of the resolver and the level parameter
    // or even call some async service, as it can be a regular async function and we can just 'await'
    return fieldsMap;
  });
}
```

> Be aware, that `async` function as a custom param decorators logic can make the GraphQL resolver execution slower, so try to avoid them, if possible.

Then we can use our custom param decorators in the resolvers just like the built-in decorators:

```ts
@Resolver()
export class RecipeResolver {
  constructor(private readonly recipesRepository: Repository<Recipe>) {}

  @Authorized()
  @Mutation(returns => Recipe)
  async addRecipe(
    @Args() recipeData: AddRecipeInput,
    // Custom decorator just like the built-in one
    @CurrentUser() currentUser: User,
  ) {
    const recipe: Recipe = {
      ...recipeData,
      // and use the data returned from custom decorator in the resolver code
      author: currentUser,
    };
    await this.recipesRepository.save(recipe);

    return recipe;
  }

  @Query(returns => Recipe, { nullable: true })
  async recipe(
    @Arg("id") id: string,
    // Custom decorator that parses the fields from GraphQL query info
    @Fields() fields: FieldsMap,
  ) {
    return await this.recipesRepository.find(id, {
      // use the fields map as a select projection to optimize db queries
      select: fields,
    });
  }
}
```

### Custom `@Arg` decorator

In some cases we might want to create a custom decorator that will also register/expose an argument in the GraphQL schema.
Calling both `Arg()` and `createParameterDecorator()` inside a custom decorator does not play well with the internals of TypeGraphQL.

Hence, the `createParameterDecorator()` function supports second argument, `CustomParameterOptions` which allows to set decorator metadata for `@Arg` under the `arg` key:

```ts
function RandomIdArg(argName = "id") {
  return createParameterDecorator(
    // here we do the logic of getting provided argument or generating a random one
    ({ args }) => args[argName] ?? Math.round(Math.random() * MAX_ID_VALUE),
    {
      // here we provide the metadata to register the parameter as a GraphQL argument
      arg: {
        name: argName,
        typeFunc: () => Int,
        options: {
          nullable: true,
          description: "Accepts provided id or generates a random one.",
        },
      },
    },
  );
}
```

The usage of that custom decorator is very similar to the previous one and `@Arg` decorator itself:

```ts
@Resolver()
export class RecipeResolver {
  constructor(private readonly recipesRepository: Repository<Recipe>) {}

  @Query(returns => Recipe, { nullable: true })
  async recipe(
    // custom decorator that will expose an arg in the schema
    @RandomIdArg("id") id: number,
  ) {
    return await this.recipesRepository.findById(id);
  }
}
```

## Example

See how different kinds of custom decorators work in the [custom decorators and middlewares example](https://github.com/MichalLytek/type-graphql/tree/master/examples/middlewares-custom-decorators).


================================================
FILE: docs/dependency-injection.md
================================================
---
title: Dependency injection
---

Dependency injection is a really useful pattern that helps in decoupling parts of the app.

TypeGraphQL supports this technique by allowing users to provide their IoC container that will be used by the framework.

## Basic usage

The usage of this feature is very simple - all you need to do is register a 3rd party container.

Example using TypeDI:

```ts
import { buildSchema } from "type-graphql";
// IOC container
import { Container } from "typedi";
import { SampleResolver } from "./resolvers";

// Build TypeGraphQL executable schema
const schema = await buildSchema({
  // Array of resolvers
  resolvers: [SampleResolver],
  // Registry 3rd party IOC container
  container: Container,
});
```

Resolvers will then be able to declare their dependencies and TypeGraphQL will use the container to solve them:

```ts
import { Service } from "typedi";

@Service()
@Resolver(of => Recipe)
export class RecipeResolver {
  constructor(
    // Dependency injection
    private readonly recipeService: RecipeService,
  ) {}

  @Query(returns => Recipe, { nullable: true })
  async recipe(@Arg("recipeId") recipeId: string) {
    // Usage of the injected service
    return this.recipeService.getOne(recipeId);
  }
}
```

A sample recipe service implementation may look like this:

```ts
import { Service, Inject } from "typedi";

@Service()
export class RecipeService {
  @Inject("SAMPLE_RECIPES")
  private readonly items: Recipe[],

  async getAll() {
    return this.items;
  }

  async getOne(id: string) {
    return this.items.find(item => item.id === id);
  }
}
```

> Be aware than when you use [InversifyJS](https://github.com/inversify/InversifyJS), you have to bind the resolver class with the [self-binding of concrete types](https://github.com/inversify/InversifyJS/blob/master/wiki/classes_as_id.md#self-binding-of-concrete-types), e.g.:
>
> ```ts
> container.bind<SampleResolver>(SampleResolver).to(SampleResolver).inSingletonScope();
> ```

## Scoped containers

Dependency injection is a really powerful pattern, but some advanced users may encounter the need for creating fresh instances of some services or resolvers for every request. Since `v0.13.0`, **TypeGraphQL** supports this feature, that is extremely useful for tracking logs by individual requests or managing stateful services.

To register a scoped container, we need to make some changes in the server bootstrapping config code.
First we need to provide a container resolver function. It takes the resolver data (like context) as an argument and should return an instance of the container scoped to the request.

For simple container libraries we may define it inline, e.g. using `TypeDI`:

```ts
await buildSchema({
  container: (({ context }: ResolverData<TContext>) => Container.of(context.requestId));
};
```

The tricky part is where the `context.requestId` comes from. Unfortunately, we need to provide it manually using hooks that are exposed by HTTP GraphQL middleware like `express-graphql`, `@apollo/server` or `graphql-yoga`.

For some other advanced libraries, we might need to create an instance of the container, place it in the context object and then retrieve it in the `container` getter function:

```ts
await buildSchema({
  container: (({ context }: ResolverData<TContext>) => context.container);
};
```

Example using `TypeDI` and `@apollo/server` with the `context` creation method:

```ts
import { ApolloServer } from "@apollo/server";
import { startStandaloneServer } from "@apollo/server/standalone";
import { Container } from "typedi";

// Create GraphQL server
const server = new ApolloServer({
  // GraphQL schema
  schema,
});

// Start server
const { url } = await startStandaloneServer(server, {
  listen: { port: 4000 },
  // Provide unique context with 'requestId' for each request
  context: async () => {
    const requestId = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); // uuid-like
    const container = Container.of(requestId.toString()); // Get scoped container
    const context = { requestId, container }; // Create context
    container.set("context", context); // Set context or other data in container

    return context;
  },
});
console.log(`GraphQL server ready at ${url}`);
```

We also have to dispose the container after the request has been handled and the response is ready. Otherwise, there would be a huge memory leak as the new instances of services and resolvers have been created for each request but they haven't been cleaned up.

Apollo Server has a [plugins](https://www.apollographql.com/docs/apollo-server/integrations/plugins) feature that supports [`willSendResponse`](https://www.apollographql.com/docs/apollo-server/integrations/plugins/#willsendresponse) lifecycle event. We can leverage it to clean up the container after handling the request.

Example using `TypeDI` and `@apollo/server` with plugins approach:

```ts
import { ApolloServer } from "@apollo/server";
import { startStandaloneServer } from "@apollo/server/standalone";
import { Container } from "typedi";

const server = new ApolloServer({
  // GraphQL schema
  schema,
  // Create a plugin to allow for disposing the scoped container created for every request
  plugins: [
    {
      requestDidStart: async () => ({
        async willSendResponse(requestContext) {
          // Dispose the scoped container to prevent memory leaks
          Container.reset(requestContext.contextValue.requestId.toString());

          // For developers curiosity purpose, here is the logging of current scoped container instances
          // Make multiple parallel requests to see in console how this works
          const instancesIds = ((Container as any).instances as ContainerInstance[]).map(
            instance => instance.id,
          );
          console.log("Instances left in memory: ", instancesIds);
        },
      }),
    },
  ],
});
```

And basically that's it! The configuration of the container is done and TypeGraphQL will be able to use different instances of resolvers for each request.

The only thing that's left is the container configuration - we need to check out the docs for our container library (`InversifyJS`, `injection-js`, `TypeDI` or other) to get know how to setup the lifetime of the injectable objects (transient, scoped or singleton).

> Be aware that some libraries (like `TypeDI`) by default create new instances for every scoped container, so you might experience a **significant increase in memory usage** and some slowing down in query resolving speed, so please be careful with using this feature!

## Example

You can see how this fits together in the [simple example](https://github.com/MichalLytek/type-graphql/tree/master/examples/using-container).

For a more advanced usage example with scoped containers, check out [advanced example with scoped containers](https://github.com/MichalLytek/type-graphql/tree/master/examples/using-scoped-container).

Integration with [TSyringe](https://github.com/MichalLytek/type-graphql/tree/master/examples/tsyringe).


================================================
FILE: docs/directives.md
================================================
---
title: Directives
---

> A directive is an identifier preceded by a `@` character, optionally followed by a list of named arguments, which can appear after almost any form of syntax in the GraphQL query or schema languages.

Though the [GraphQL directives](https://www.apollographql.com/docs/graphql-tools/schema-directives) syntax is similar to TS decorators, they are purely an SDL (Schema Definition Language) feature that allows you to add metadata to a selected type or its field:

```graphql
type Foo @auth(requires: USER) {
  field: String!
}

type Bar {
  field: String! @auth(requires: USER)
}
```

That metadata can be read at runtime to modify the structure and behavior of a GraphQL schema to support reusable code and tasks like authentication, permission, formatting, and plenty more. They are also really useful for some external services like [Apollo Cache Control](https://www.apollographql.com/docs/apollo-server/performance/caching/#adding-cache-hints-statically-in-your-schema) or [Apollo Federation](https://www.apollographql.com/docs/apollo-server/federation/introduction/#federated-schema-example).

**TypeGraphQL** of course provides some basic support for using the schema directives via the `@Directive` decorator.

## Usage

### Declaring in schema

Basically, we declare the usage of directives just like in SDL, with the `@` syntax:

```ts
@Directive('@deprecated(reason: "Use newField")')
```

Currently, you can use the directives only on object types, input types, interface types and their fields or fields resolvers, args type fields, as well as queries, mutations and subscriptions and the inline arguments. Other locations like scalars, enums or unions are not yet supported.

So the `@Directive` decorator can be placed over the class property/method or over the type class itself, depending on the needs and the placements supported by the implementation:

```ts
@Directive("@auth(requires: USER)")
@ObjectType()
class Foo {
  @Field()
  field: string;
}

@ObjectType()
class Bar {
  @Directive("@auth(requires: USER)")
  @Field()
  field: string;
}

@ArgsType()
class FooBarArgs {
  @Directive('@deprecated(reason: "Not used anymore")')
  @Field({ nullable: true })
  baz?: string;
}

@Resolver(of => Foo)
class FooBarResolver {
  @Directive("@auth(requires: ANY)")
  @Query()
  foobar(@Args() { baz }: FooBarArgs): string {
    return "foobar";
  }

  @Directive("@auth(requires: ADMIN)")
  @FieldResolver()
  bar(): string {
    return "foobar";
  }
}
```

In case of inline args using `@Arg` decorator, directives can be placed over the parameter of the class method:

```ts
@Resolver(of => Foo)
class FooBarResolver {
  @Query()
  foo(
    @Directive('@deprecated(reason: "Not used anymore")')
    @Arg("foobar", { defaultValue: "foobar" })
    foobar: string,
  ) {
    return "foo";
  }

  @FieldResolver()
  bar(
    @Directive('@deprecated(reason: "Not used anymore")')
    @Arg("foobar", { defaultValue: "foobar" })
    foobar: string,
  ) {
    return "bar";
  }
}
```

> Note that even as directives are a purely SDL thing, they won't appear in the generated schema definition file. Current implementation of directives in TypeGraphQL is using some crazy workarounds because [`graphql-js` doesn't support setting them by code](https://github.com/graphql/graphql-js/issues/1343) and the built-in `printSchema` utility omits the directives while printing. See [emit schema with custom directives](./emit-schema.md#emit-schema-with-custom-directives) for more info.

Also please note that `@Directive` can only contain a single GraphQL directive name or declaration. If you need to have multiple directives declared, just place multiple decorators:

```ts
@ObjectType()
class Foo {
  @Directive("@lowercase")
  @Directive('@deprecated(reason: "Use `newField`")')
  @Directive("@hasRole(role: Manager)")
  @Field()
  bar: string;
}
```

### Providing the implementation

Besides declaring the usage of directives, you also have to register the runtime part of the used directives.

> Be aware that TypeGraphQL doesn't have any special way for implementing schema directives. You should use some [3rd party libraries](https://the-guild.dev/graphql/tools/docs/schema-directives#implementing-schema-directives) depending on the tool set you use in your project, e.g. `@graphql-tools/*` or `ApolloServer`.

If you write your custom GraphQL directive or import a package that exports a `GraphQLDirective` instance, you need to register the directives definitions in the `buildSchema` options:

```ts
// Build TypeGraphQL executable schema
const tempSchema = await buildSchema({
  resolvers: [SampleResolver],
  // Register the directives definitions
  directives: [myDirective],
});
```

Then you need to apply the schema transformer for your directive, that implements the desired logic of your directive:

```ts
// Transform and obtain the final schema
const schema = myDirectiveTransformer(tempSchema);
```

If the directive package used by you exports a string-based `typeDefs`, you need to add those typedefs to the schema and then apply directive transformer.

Here is an example using the [`@graphql-tools/*`](https://the-guild.dev/graphql/tools):

```ts
import { mergeSchemas } from "@graphql-tools/schema";
import { renameDirective } from "fake-rename-directive-package";

// Build TypeGraphQL executable schema
const schemaSimple = await buildSchema({
  resolvers: [SampleResolver],
});

// Merge schema with sample directive type definitions
const schemaMerged = mergeSchemas({
  schemas: [schemaSimple],
  // Register the directives definitions
  typeDefs: [renameDirective.typeDefs],
});

// Transform and obtain the final schema
const schema = renameDirective.transformer(schemaMerged);
```


================================================
FILE: docs/emit-schema.md
================================================
---
title: Emitting the schema SDL
---

TypeGraphQL's main feature is creating the schema using only TypeScript classes and decorators. However, there might be a need for the schema to be printed into a `schema.graphql` file and there are plenty of reasons for that. Mainly, the schema SDL file is needed for GraphQL ecosystem tools that perform client-side queries autocompletion and validation. Some developers also may want to use it as a kind of snapshot for detecting schema regression or they just prefer to read the SDL file to explore the API instead of reading the complicated TypeGraphQL-based app code, navigating through the GraphiQL or GraphQL Playground. To accomplish this demand, TypeGraphQL allows you to create a schema definition file in two ways.

The first one is to generate it automatically on every build of the schema - just pass `emitSchemaFile: true` to the `buildSchema` options in order to emit the `schema.graphql` in the root of the project's working directory. You can also manually specify the path and the file name where the schema definition should be written or even specify `PrintSchemaOptions` to configure the look and format of the schema definition.

```ts
const schema = await buildSchema({
  resolvers: [ExampleResolver],
  // Automatically create `schema.graphql` file with schema definition in project's working directory
  emitSchemaFile: true,
  // Or create the file with schema in selected path
  emitSchemaFile: path.resolve(__dirname, "__snapshots__/schema/schema.graphql"),
  // Or pass a config object
  emitSchemaFile: {
    path: __dirname + "/schema.graphql",
    sortedSchema: false, // By default the printed schema is sorted alphabetically
  },
});
```

The second way to emit the schema definition file is by doing it programmatically. We would use the `emitSchemaDefinitionFile` function (or it's sync version `emitSchemaDefinitionFileSync`) and pass in the path, along with the schema object. We can use this among others as part of a testing script that checks if the snapshot of the schema definition is correct or to automatically generate it on every file change during local development.

```ts
import { emitSchemaDefinitionFile } from "type-graphql";

// ...
hypotheticalFileWatcher.watch("./src/**/*.{resolver,type,input,arg}.ts", async () => {
  const schema = getSchemaNotFromBuildSchemaFunction();
  await emitSchemaDefinitionFile("/path/to/folder/schema.graphql", schema);
});
```

## Emit schema with custom directives

Currently TypeGraphQL does not directly support emitting the schema with custom directives due to `printSchema` function limitations from `graphql-js`.

If we want the custom directives to appear in the generated schema definition file we have to create a custom function that use a third-party `printSchema` function.

Below there is an example that uses the `printSchemaWithDirectives` function from [`@graphql-tools/utils`](https://www.graphql-tools.com/docs/api/modules/utils):

```ts
import { GraphQLSchema, lexicographicSortSchema } from "graphql";
import { printSchemaWithDirectives } from "@graphql-tools/utils";
import fs from "node:fs/promises";

export async function emitSchemaDefinitionWithDirectivesFile(
  schemaFilePath: string,
  schema: GraphQLSchema,
): Promise<void> {
  const schemaFileContent = printSchemaWithDirectives(lexicographicSortSchema(schema));
  await fs.writeFile(schemaFilePath, schemaFileContent);
}
```

The usage of `emitSchemaDefinitionWithDirectivesFile` function is the same as with standard `emitSchemaDefinitionFile`:

```ts
const schema = await buildSchema(/*...*/);

await emitSchemaDefinitionWithDirectivesFile("/path/to/folder/schema.graphql", schema);
```


================================================
FILE: docs/enums.md
================================================
---
title: Enums
---

Nowadays almost all typed languages have support for enumerated types, including TypeScript. Enums limit the range of a variable's values to a set of predefined constants, which makes it easier to document intent.

GraphQL also has enum type support, so TypeGraphQL allows us to use TypeScript enums in our GraphQL schema.

## Creating enum

Let's create a TypeScript enum. It can be a numeric or string enum - the internal values of enums are taken from the enum definition values and the public names taken from the enum keys:

```ts
// Implicit value 0, 1, 2, 3
enum Direction {
  UP,
  DOWN,
  LEFT,
  RIGHT,
}

// Or explicit values
enum Direction {
  UP = "UP",
  DOWN = "DOWN",
  LEFT = "LEFT",
  RIGHT = "RIGHT",
}
```

To tell TypeGraphQL about our enum, we would ideally mark the enums with the `@EnumType()` decorator. However, TypeScript decorators only work with classes, so we need to make TypeGraphQL aware of the enums manually by calling the `registerEnumType` function and providing the enum name for GraphQL:

```ts
import { registerEnumType } from "type-graphql";

registerEnumType(Direction, {
  name: "Direction", // Mandatory
  description: "The basic directions", // Optional
});
```

In case we need to provide additional GraphQL-related config for values, like description or deprecation reason, we can use `valuesConfig` property and put the data inside it, e.g.:

```ts
enum Direction {
  UP = "UP",
  DOWN = "DOWN",
  LEFT = "LEFT",
  RIGHT = "RIGHT",
  SIDEWAYS = "SIDEWAYS",
}

registerEnumType(Direction, {
  name: "Direction",
  description: "The basic directions",
  valuesConfig: {
    SIDEWAYS: {
      deprecationReason: "Replaced with Left or Right",
    },
    RIGHT: {
      description: "The other left",
    },
  },
});
```

This way, the additional info will be emitted in the GraphQL schema:

```graphql
enum Direction {
  UP
  DOWN
  LEFT
  """
  The other left
  """
  RIGHT
  SIDEWAYS @deprecated(reason: "Replaced with Left or Right")
}
```

## Using enum

The last step is very important: TypeScript has limited reflection ability, so this is a case where we have to explicitly provide the enum type for object type fields, input type fields, args, and the return type of queries and mutations:

```ts
@InputType()
class JourneyInput {
  @Field(type => Direction) // Mandatory
  direction: Direction;
}
```

Without this annotation, the generated GQL type would be `String` or `Float` (depending on the enum type), rather than the `ENUM` we are aiming for.

With all that in place, we can use our enum directly in our code 😉

```ts
@Resolver()
class SpriteResolver {
  private sprite = getMarioSprite();

  @Mutation()
  move(@Arg("direction", type => Direction) direction: Direction): boolean {
    switch (direction) {
      case Direction.Up:
        this.sprite.position.y++;
        break;
      case Direction.Down:
        this.sprite.position.y--;
        break;
      case Direction.Left:
        this.sprite.position.x--;
        break;
      case Direction.Right:
        this.sprite.position.x++;
        break;
      default:
        // Never reached
        return false;
    }

    return true;
  }
}
```

## Interoperability

Enums in TypeGraphQL are designed with server side in mind - the runtime will map the string value from input into a corresponding enum value, like `"UP"` into `0`. While this is very handy e.g. for mapping database values into GraphQL API enum names, it makes it unusable on the query side because `Direction.UP` will put `0` in the query which is an invalid value (should be `UP`).

So if we would like to share the types definition and use the enum on the client side app or use the enums directly on the server app e.g. in tests, we have to use the direct mapping of the enum member names with values, e.g.:

```ts
enum Direction {
  UP = "UP",
  DOWN = "DOWN",
  LEFT = "LEFT",
  RIGHT = "RIGHT",
}
```


================================================
FILE: docs/esm.md
================================================
---
title: ECMAScript Modules
---

Since `v2.0.0` release, TypeGraphQL is compatible with ECMAScript modules.

Thanks to this, we can `import` the `type-graphql` package in the ESM projects without any hassle.

## TypeScript configuration

It's important to properly configure the project, so that it uses ESM correctly:

- the `module` option should be set to `NodeNext`
- the `moduleResolution` option should be set to `"NodeNext"`

All in all, the `tsconfig.json` file should looks like this:

```json title="tsconfig.json"
{
  "compilerOptions": {
    "target": "es2021",
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true
  }
}
```

## Package.json configuration

It is also important to set `type` option to `"module"` in your `package.json` file:

```json title="package.json"
{
  "type": "module"
}
```

## Imports

Apart from using `import` syntax, your local imports have to use the `.js` suffix, e.g.:

```ts
import { MyResolver } from "./resolvers/MyResolver.js";
```


================================================
FILE: docs/examples.md
================================================
---
title: Examples
sidebar_label: List of examples
---

On the [GitHub repository](https://github.com/MichalLytek/type-graphql) there are a few simple [`examples`](https://github.com/MichalLytek/type-graphql/tree/master/examples) of how to use different `TypeGraphQL` features and how well they integrate with 3rd party libraries.

To run an example, simply go to the subdirectory (e.g. `cd ./simple-usage`), and then start the server (`npx ts-node ./index.ts`).

Each subdirectory contains a `examples.graphql` file with predefined GraphQL queries/mutations/subscriptions that you can use in Apollo Studio (<http://localhost:4000>) and play with them by modifying their shape and data.

## Basics

- [Simple usage of fields, basic types and resolvers](https://github.com/MichalLytek/type-graphql/tree/master/examples/simple-usage)

## Advanced

- [Enums and unions](https://github.com/MichalLytek/type-graphql/tree/master/examples/enums-and-unions)
- [Subscriptions (simple)](https://github.com/MichalLytek/type-graphql/tree/master/examples/simple-subscriptions)
- [Subscriptions (using Redis) \*\*](https://github.com/MichalLytek/type-graphql/tree/master/examples/redis-subscriptions)
- [Interfaces](https://github.com/MichalLytek/type-graphql/tree/master/examples/interfaces-inheritance)
- [Extensions (metadata)](https://github.com/MichalLytek/type-graphql/tree/master/examples/extensions)

## Features usage

- [Dependency injection (IoC container)](https://github.com/MichalLytek/type-graphql/tree/master/examples/using-container)
  - [Scoped containers](https://github.com/MichalLytek/type-graphql/tree/master/examples/using-scoped-container)
- [Authorization](https://github.com/MichalLytek/type-graphql/tree/master/examples/authorization)
- [Validation](https://github.com/MichalLytek/type-graphql/tree/master/examples/automatic-validation)
  - [Custom validation](https://github.com/MichalLytek/type-graphql/tree/master/examples/custom-validation)
- [Types inheritance](https://github.com/MichalLytek/type-graphql/tree/master/examples/interfaces-inheritance)
- [Resolvers inheritance](https://github.com/MichalLytek/type-graphql/tree/master/examples/resolvers-inheritance)
- [Generic types](https://github.com/MichalLytek/type-graphql/tree/master/examples/generic-types)
- [Mixin classes](https://github.com/MichalLytek/type-graphql/tree/master/examples/mixin-classes)
- [Middlewares and Custom Decorators](https://github.com/MichalLytek/type-graphql/tree/master/examples/middlewares-custom-decorators)
- [Query complexity](https://github.com/MichalLytek/type-graphql/tree/master/examples/query-complexity)

## 3rd party libs integration

- [TypeORM (manual, synchronous) \*](https://github.com/MichalLytek/type-graphql/tree/master/examples/typeorm-basic-usage)
- [TypeORM (automatic, lazy relations) \*](https://github.com/MichalLytek/type-graphql/tree/master/examples/typeorm-lazy-relations)
- [MikroORM \*](https://github.com/MichalLytek/type-graphql/tree/master/examples/mikro-orm)
- [Typegoose \*](https://github.com/MichalLytek/type-graphql/tree/master/examples/typegoose)
- [Apollo Federation](https://github.com/MichalLytek/type-graphql/tree/master/examples/apollo-federation)
- [Apollo Federation 2](https://github.com/MichalLytek/type-graphql/tree/master/examples/apollo-federation-2)
- [Apollo Cache Control](https://github.com/MichalLytek/type-graphql/tree/master/examples/apollo-cache)
- [GraphQL Scalars](https://github.com/MichalLytek/type-graphql/tree/master/examples/graphql-scalars)
- [TSyringe](https://github.com/MichalLytek/type-graphql/tree/master/examples/tsyringe)

_\* Note that we need to provide the environment variable `DATABASE_URL` with connection parameters to your local database_ \
_\*\* Note that we need to provide the environment variable `REDIS_URL` with connection parameters to your local Redis instance_


================================================
FILE: docs/extensions.md
================================================
---
title: Extensions
---

The `graphql-js` library allows for putting arbitrary data into GraphQL types config inside the `extensions` property.
Annotating schema types or fields with a custom metadata, that can be then used at runtime by middlewares or resolvers, is a really powerful and useful feature.

For such use cases, **TypeGraphQL** provides the `@Extensions` decorator, which adds the data we defined to the `extensions` property of the executable schema for the decorated classes, methods or properties.

> Be aware that this is a low-level decorator and you generally have to provide your own logic to make use of the `extensions` metadata.

## Using the `@Extensions` decorator

Adding extensions to the schema type is as simple as using the `@Extensions` decorator and passing it an object of the custom data we want:

```ts
@Extensions({ complexity: 2 })
```

We can pass several fields to the decorator:

```ts
@Extensions({ logMessage: "Restricted access", logLevel: 1 })
```

And we can also decorate a type several times. The snippet below shows that this attaches the exact same extensions data to the schema type as the snippet above:

```ts
@Extensions({ logMessage: "Restricted access" })
@Extensions({ logLevel: 1 })
```

If we decorate the same type several times with the same extensions key, the one defined at the bottom takes precedence:

```ts
@Extensions({ logMessage: "Restricted access" })
@Extensions({ logMessage: "Another message" })
```

The above usage results in your GraphQL type having a `logMessage: "Another message"` property in its extensions.

TypeGraphQL classes with the following decorators can be annotated with `@Extensions` decorator:

- `@ObjectType`
- `@InputType`
- `@Field`
- `@Query`
- `@Mutation`
- `@FieldResolver`

So the `@Extensions` decorator can be placed over the class property/method or over the type class itself, and multiple times if necessary, depending on what we want to do with the extensions data:

```ts
@Extensions({ roles: ["USER"] })
@ObjectType()
class Foo {
  @Field()
  field: string;
}

@ObjectType()
class Bar {
  @Extensions({ roles: ["USER"] })
  @Field()
  field: string;
}

@ObjectType()
class Bar {
  @Extensions({ roles: ["USER"] })
  @Extensions({ visible: false, logMessage: "User accessed restricted field" })
  @Field()
  field: string;
}

@Resolver(of => Foo)
class FooBarResolver {
  @Extensions({ roles: ["USER"] })
  @Query()
  foobar(@Arg("baz") baz: string): string {
    return "foobar";
  }

  @Extensions({ roles: ["ADMIN"] })
  @FieldResolver()
  bar(): string {
    return "foobar";
  }
}
```

## Using the extensions data in runtime

Once we have decorated the necessary types with extensions, the executable schema will contain the extensions data, and we can make use of it in any way we choose. The most common use will be to read it at runtime in resolvers or middlewares and perform some custom logic there.

Here is a simple example of a global middleware that will be logging a message on field resolver execution whenever the field is decorated appropriately with `@Extensions`:

```ts
export class LoggerMiddleware implements MiddlewareInterface<Context> {
  constructor(private readonly logger: Logger) {}

  use({ info }: ResolverData, next: NextFn) {
    // extract `extensions` object from GraphQLResolveInfo object to get the `logMessage` value
    const { logMessage } = info.parentType.getFields()[info.fieldName].extensions || {};

    if (logMessage) {
      this.logger.log(logMessage);
    }

    return next();
  }
}
```

## Examples

You can see [more detailed examples of usage here](https://github.com/MichalLytek/type-graphql/tree/master/examples/extensions).


================================================
FILE: docs/faq.md
================================================
---
title: Frequently Asked Questions
---

## Resolvers

### Should I implement a field resolver as an object type getter, a method or a resolver class method?

This depends on various factors:

- if the resolver only needs access to the root/object value - use a getter
- if the field has arguments
  - and must perform side effects e.g. a database call - use a resolver class method and leverage the dependency injection mechanism
  - otherwise, use object type methods (pure functions, calculations based on object values and arguments)
- if the business logic must be separated from the type definition - use a resolver class method

### Are there any global error handlers to catch errors from resolvers or services?

Use middleware for this purpose - just wrap `await next()` in a try-catch block then register it as the first global middleware.

### Why did I receive this error? `GraphQLError: Expected value of type "MyType" but got: [object Object]`

This error occurs when the resolver (query, mutation, field) type is an interface/union and a plain object is returned from it.
In this case, what should be returned is an instance of the selected object type class in the resolver.
Otherwise, `graphql-js` will not be able to correctly detect the underlying GraphQL type.

## Bootstrapping

### How do I fix this error? `Cannot use GraphQLSchema "[object Object]" from another module or realm`

This error occurs mostly when there are more than one version of the `graphql-js` module in the project.
In most cases it means that one of our dependencies has a dependency on a different version of `graphql-js`, e.g. we, or TypeGraphQL use `v14.0.2` but `apollo-server-express` depends on `v0.13.2`.
We can print the dependency tree by running `npm ls graphql` (or the yarn equivalent) to find the faulty dependencies.
Then we should update or downgrade them until they all match the semver on `graphql`, e.g. `^14.0.0`.
Dependencies may also need to be flattened, so that they all share a single instance of the `graphql` module in the `node_modules` directory - to achieve this, just run `npm dedupe` (or the yarn equivalent).

The same rule applies to this error: `node_modules/type-graphql/node_modules/@types/graphql/type/schema").GraphQLSchema' is not assignable to type 'import("node_modules/@types/graphql/type/schema").GraphQLSchema'`.
In this case we repeat the same checks but for the `@types/graphql` module in our dependencies.

## Types

### Is `@InputType()` different from `@ArgsType()`?

Of course!
`@InputType` will generate a real `GraphQLInputType` type and should be used when we need a nested object in the args:

```graphql
updateItem(data: UpdateItemInput!): Item!
```

`@ArgsType` is virtual and it will be flattened in schema:

```graphql
updateItem(id: Int!, userId: Int!): Item!
```

### When should I use the `() => [ItemType]` syntax?

We should use the `[ItemType]` syntax any time the field type or the return type is an array from a query or mutation.

Even though technically the array notation can be omitted (when the base type is not `Promise`) and only provide the type of array item (e.g. `@Field(() => ItemType) field: ItemType[]`) - it's better to be consistent with other annotations by explicitly defining the type.

### How can I define a tuple?

Unfortunately, [GraphQL spec doesn't support tuples](https://github.com/graphql/graphql-spec/issues/423), so you can't just use `data: [Int, Float]` as a GraphQL type.

Instead, you have to create a transient object (or input) type that fits your data, e.g.:

```graphql
type DataPoint {
  x: Int
  y: Float
}
```

and then use it in the list type as your GraphQL type:

```graphql
data: [DataPoint]
```

### Situations frequently arise where InputType and ObjectType have exactly the same shape. How can I share the definitions?

In GraphQL, input objects have a separate type in the system because object types can contain fields that express circular references or references to interfaces and unions, neither of which are appropriate for use as input arguments.
However, if there are only simple fields in the class definition, reuse the code between the InputType and the ObjectType by decorating the ObjectType class with `@InputType`. Remember to set a new name of the type in the decorator parameter:

```ts
@ObjectType() // Name inferred as 'Person' from class name
@InputType("PersonInput")
export class Person {}
```


================================================
FILE: docs/generic-types.md
================================================
---
title: Generic Types
---

[Type Inheritance](./inheritance.md) is a great way to reduce code duplication by extracting common fields to the base class. But in some cases, the strict set of fields is not enough because we might need to declare the types of some fields in a more flexible way, like a type parameter (e.g. `items: T[]` in case of a pagination).

Hence TypeGraphQL also has support for describing generic GraphQL types.

## How to?

Unfortunately, the limited reflection capabilities of TypeScript don't allow for combining decorators with standard generic classes. To achieve behavior like that of generic types, we use the same class-creator pattern like the one described in the [Resolvers Inheritance](./inheritance.md) docs.

### Basic usage

Start by defining a `PaginatedResponse` function that creates and returns an abstract `PaginatedResponseClass`:

```ts
export default function PaginatedResponse() {
  abstract class PaginatedResponseClass {
    // ...
  }
  return PaginatedResponseClass;
}
```

To achieve generic-like behavior, the function has to be generic and take some runtime argument related to the type parameter:

```ts
export default function PaginatedResponse<TItem extends object>(TItemClass: ClassType<TItem>) {
  abstract class PaginatedResponseClass {
    // ...
  }
  return PaginatedResponseClass;
}
```

Then, add proper decorators to the class which might be `@ObjectType`, `@InterfaceType` or `@InputType`:

```ts
export default function PaginatedResponse<TItem extends object>(TItemClass: ClassType<TItem>) {
  @ObjectType()
  abstract class PaginatedResponseClass {
    // ...
  }
  return PaginatedResponseClass;
}
```

After that, add fields like in a normal class but using the generic type and parameters:

```ts
export default function PaginatedResponse<TItem extends object>(TItemClass: ClassType<TItem>) {
  @ObjectType()
  abstract class PaginatedResponseClass {
    // Runtime argument
    @Field(type => [TItemClass])
    // Generic type
    items: TItem[];

    @Field(type => Int)
    total: number;

    @Field()
    hasMore: boolean;
  }
  return PaginatedResponseClass;
}
```

Finally, use the generic function factory to create a dedicated type class:

```ts
@ObjectType()
class PaginatedUserResponse extends PaginatedResponse(User) {
  // Add more fields or overwrite the existing one's types
  @Field(type => [String])
  otherInfo: string[];
}
```

And then use it in our resolvers:

```ts
@Resolver()
class UserResolver {
  @Query()
  users(): PaginatedUserResponse {
    // Custom business logic,
    // depending on underlying data source and libraries
    return {
      items,
      total,
      hasMore,
      otherInfo,
    };
  }
}
```

### Complex generic type values

When we need to provide something different than a class (object type) for the field type, we need to enhance the parameter type signature and provide the needed types.

Basically, the parameter that the `PaginatedResponse` function accepts is the value we can provide to `@Field` decorator.
So if we want to return an array of strings as the `items` field, we need to add proper types to the function signature, like `GraphQLScalarType` or `String`:

```ts
export default function PaginatedResponse<TItemsFieldValue extends object>(
  itemsFieldValue: ClassType<TItemsFieldValue> | GraphQLScalarType | String | Number | Boolean,
) {
  @ObjectType()
  abstract class PaginatedResponseClass {
    @Field(type => [itemsFieldValue])
    items: TItemsFieldValue[];

    // ... Other fields
  }
  return PaginatedResponseClass;
}
```

And then provide a proper runtime value (like `String`) while creating a proper subtype of generic `PaginatedResponse` object type:

```ts
@ObjectType()
class PaginatedStringsResponse extends PaginatedResponse<string>(String) {
  // ...
}
```

### Types factory

We can also create a generic class without using the `abstract` keyword.
But with this approach, types created with this kind of factory will be registered in the schema, so this way is not recommended to extend the types for adding fields.

To avoid generating schema errors of duplicated `PaginatedResponseClass` type names, we must provide our own unique, generated type name:

```ts
export default function PaginatedResponse<TItem extends object>(TItemClass: ClassType<TItem>) {
  // Provide a unique type name used in schema
  @ObjectType(`Paginated${TItemClass.name}Response`)
  class PaginatedResponseClass {
    // ...
  }
  return PaginatedResponseClass;
}
```

Then, we can store the generated class in a variable and in order to use it both as a runtime object and as a type, we must also create a type for this new class:

```ts
const PaginatedUserResponse = PaginatedResponse(User);
type PaginatedUserResponse = InstanceType<typeof PaginatedUserResponse>;

@Resolver()
class UserResolver {
  // Provide a runtime type argument to the decorator
  @Query(returns => PaginatedUserResponse)
  users(): PaginatedUserResponse {
    // Same implementation as in the earlier code snippet
  }
}
```

## Examples

A more advanced usage example of the generic types feature can be found in [this examples folder](https://github.com/MichalLytek/type-graphql/tree/master/examples/generic-types).


================================================
FILE: docs/getting-started.md
================================================
---
title: Getting started
---

> Make sure you've completed all the steps described in the [installation instructions](./installation.md).

To explore all of the powerful capabilities of TypeGraphQL, we will create a sample GraphQL API for cooking recipes.

Let's start with the `Recipe` type, which is the foundation of our API.

## Types

Our goal is to get the equivalent of this type described in SDL:

```graphql
type Recipe {
  id: ID!
  title: String!
  description: String
  creationDate: Date!
  ingredients: [String!]!
}
```

So we create the `Recipe` class with all its properties and types:

```ts
class Recipe {
  id: string;
  title: string;
  description?: string;
  creationDate: Date;
  ingredients: string[];
}
```

Then we decorate the class and its properties with decorators:

```ts
@ObjectType()
class Recipe {
  @Field(type => ID)
  id: string;

  @Field()
  title: string;

  @Field({ nullable: true })
  description?: string;

  @Field()
  creationDate: Date;

  @Field(type => [String])
  ingredients: string[];
}
```

The detailed rules of when to use `nullable`, `array` and others are described in the [fields and types docs](./types-and-fields.md).

## Resolvers

After that we want to create typical crud queries and mutations. To do so, we create the resolver (controller) class that will have injected the `RecipeService` in the constructor:

```ts
@Resolver(Recipe)
class RecipeResolver {
  constructor(private recipeService: RecipeService) {}

  @Query(returns => Recipe)
  async recipe(@Arg("id") id: string) {
    const recipe = await this.recipeService.findById(id);
    if (recipe === undefined) {
      throw new RecipeNotFoundError(id);
    }
    return recipe;
  }

  @Query(returns => [Recipe])
  recipes(@Args() { skip, take }: RecipesArgs) {
    return this.recipeService.findAll({ skip, take });
  }

  @Mutation(returns => Recipe)
  @Authorized()
  addRecipe(
    @Arg("newRecipeData") newRecipeData: NewRecipeInput,
    @Ctx("user") user: User,
  ): Promise<Recipe> {
    return this.recipeService.addNew({ data: newRecipeData, user });
  }

  @Mutation(returns => Boolean)
  @Authorized(Roles.Admin)
  async removeRecipe(@Arg("id") id: string) {
    try {
      await this.recipeService.removeById(id);
      return true;
    } catch {
      return false;
    }
  }
}
```

We use the `@Authorized()` decorator to restrict access to authorized users only or the users that fulfil the roles requirements.
The detailed rules for when and why we declare `returns => Recipe` functions and others are described in [resolvers docs](./resolvers.md).

## Inputs and Arguments

Ok, but what are `NewRecipeInput` and `RecipesArgs`? They are, of course, classes:

```ts
@InputType()
class NewRecipeInput {
  @Field()
  @MaxLength(30)
  title: string;

  @Field({ nullable: true })
  @Length(30, 255)
  description?: string;

  @Field(type => [String])
  @ArrayMaxSize(30)
  ingredients: string[];
}

@ArgsType()
class RecipesArgs {
  @Field(type => Int)
  @Min(0)
  skip: number = 0;

  @Field(type => Int)
  @Min(1)
  @Max(50)
  take: number = 25;
}
```

`@Length`, `@Min` and `@ArrayMaxSize` are decorators from [`class-validator`](https://github.com/typestack/class-validator) that automatically perform field validation in TypeGraphQL.

## Building schema

The last step that needs to be done is to actually build the schema from the TypeGraphQL definition. We use the `buildSchema` function for this:

```ts
const schema = await buildSchema({
  resolvers: [RecipeResolver],
});

// ... Server
```

Et voilà! Now we have fully functional GraphQL schema!
If we print it, this is how it would look:

```graphql
type Recipe {
  id: ID!
  title: String!
  description: String
  creationDate: Date!
  ingredients: [String!]!
}
input NewRecipeInput {
  title: String!
  description: String
  ingredients: [String!]!
}
type Query {
  recipe(id: ID!): Recipe
  recipes(skip: Int = 0, take: Int = 25): [Recipe!]!
}
type Mutation {
  addRecipe(newRecipeData: NewRecipeInput!): Recipe!
  removeRecipe(id: ID!): Boolean!
}
```

## Want more?

That was only the tip of the iceberg - a very simple example with basic GraphQL types. Do you use interfaces, enums, unions and custom scalars? That's great because TypeGraphQL fully supports them too! There are also more advanced concepts like the authorization checker, inheritance support and field resolvers.

A lot of these topics are covered in [Ben Awad](https://github.com/benawad)'s [TypeGraphQL video series](https://www.youtube.com/playlist?list=PLN3n1USn4xlma1bBu3Tloe4NyYn9Ko8Gs) on YouTube.

For more complicated cases, go to the [Examples section](./examples.md) where you can discover e.g. how well TypeGraphQL integrates with TypeORM.


================================================
FILE: docs/inheritance.md
================================================
---
title: Inheritance
---

The main idea of TypeGraphQL is to create GraphQL types based on TypeScript classes.

In object-oriented programming it is common to compose classes using inheritance. Hence, TypeGraphQL supports composing type definitions by extending classes.

## Types inheritance

One of the most known principles of software development is DRY - Don't Repeat Yourself - which is about avoiding code redundancy.

While creating a GraphQL API, it's a common pattern to have pagination args in resolvers, like `skip` and `take`. So instead of repeating ourselves, we declare it once:

```ts
@ArgsType()
class PaginationArgs {
  @Field(type => Int)
  skip: number = 0;

  @Field(type => Int)
  take: number = 25;
}
```

and then reuse it everywhere:

```ts
@ArgsType()
class GetTodosArgs extends PaginationArgs {
  @Field()
  onlyCompleted: boolean = false;
}
```

This technique also works with input type classes, as well as with object type classes:

```ts
@ObjectType()
class Person {
  @Field()
  age: number;
}

@ObjectType()
class Student extends Person {
  @Field()
  universityName: string;
}
```

Note that both the subclass and the parent class must be decorated with the same type of decorator, like `@ObjectType()` in the example `Person -> Student` above. Mixing decorator types across parent and child classes is prohibited and might result in a schema building error, e.g. we can't decorate the subclass with `@ObjectType()` and the parent with `@InputType()`.

## Resolver Inheritance

A special kind of inheritance in TypeGraphQL is resolver class inheritance. This pattern allows us e.g. to create a base CRUD resolver class for our resource/entity, so we don't have to repeat common boilerplate code.

Since we need to generate unique query/mutation names, we have to create a factory function for our base class:

```ts
function createBaseResolver() {
  abstract class BaseResolver {}

  return BaseResolver;
}
```

Be aware that with some `tsconfig.json` settings (like `declarations: true`) we might receive a `[ts] Return type of exported function has or is using private name 'BaseResolver'` error - in this case we might need to use `any` as the return type or create a separate class/interface describing the class methods and properties.

This factory should take a parameter that we can use to generate the query/mutation names, as well as the type that we would return from the resolvers:

```ts
function createBaseResolver<T extends ClassType>(suffix: string, objectTypeCls: T) {
  abstract class BaseResolver {}

  return BaseResolver;
}
```

It's very important to mark the `BaseResolver` class using the `@Resolver` decorator:

```ts
function createBaseResolver<T extends ClassType>(suffix: string, objectTypeCls: T) {
  @Resolver()
  abstract class BaseResolver {}

  return BaseResolver;
}
```

We can then implement the resolver methods as usual. The only difference is that we can use the `name` decorator option for `@Query`, `@Mutation` and `@Subscription` decorators to overwrite the name that will be emitted in schema:

```ts
function createBaseResolver<T extends ClassType>(suffix: string, objectTypeCls: T) {
  @Resolver()
  abstract class BaseResolver {
    protected items: T[] = [];

    @Query(type => [objectTypeCls], { name: `getAll${suffix}` })
    async getAll(@Arg("first", type => Int) first: number): Promise<T[]> {
      return this.items.slice(0, first);
    }
  }

  return BaseResolver;
}
```

Now we can create a specific resolver class that will extend the base resolver class:

```ts
const PersonBaseResolver = createBaseResolver("person", Person);

@Resolver(of => Person)
export class PersonResolver extends PersonBaseResolver {
  // ...
}
```

We can also add specific queries and mutations in our resolver class, as always:

```ts
const PersonBaseResolver = createBaseResolver("person", Person);

@Resolver(of => Person)
export class PersonResolver extends PersonBaseResolver {
  @Mutation()
  addPerson(@Arg("input") personInput: PersonInput): Person {
    this.items.push(personInput);
    return personInput;
  }
}
```

And that's it! We just need to normally register `PersonResolver` in `buildSchema` and the extended resolver will work correctly.

We must be aware that if we want to overwrite the query/mutation/subscription from the parent resolver class, we need to generate the same schema name (using the `name` decorator option or the class method name). It will overwrite the implementation along with the GraphQL args and return types. If we only provide a different implementation of the inherited method like `getOne`, it won't work.

## Examples

More advanced usage examples of type inheritance (and interfaces) can be found in [the example folder](https://github.com/MichalLytek/type-graphql/tree/master/examples/interfaces-inheritance).

For a more advanced resolver inheritance example, please go to [this example folder](https://github.com/MichalLytek/type-graphql/tree/master/examples/resolvers-inheritance).


================================================
FILE: docs/installation.md
================================================
---
title: Installation
---

Before getting started with TypeGraphQL we need to install some additional dependencies and properly configure the TypeScript configuration for our project.

> **Prerequisites**
>
> Before we begin, we must make sure our development environment includes Node.js and npm.

## Packages installation

First, we have to install the main package, as well as [`graphql-js`](https://github.com/graphql/graphql-js) and [`graphql-scalars`](https://github.com/urigo/graphql-scalars) which are peer dependencies of TypeGraphQL:

```sh
npm install graphql graphql-scalars type-graphql
```

Also, the `Reflect.metadata()` shim is required to make the type reflection work:

```sh
npm install reflect-metadata
# or
npm install core-js
```

We must ensure that it is imported at the top of our entry file (before we use/import `type-graphql` or our resolvers):

```ts
import "reflect-metadata";
// or
import "core-js/features/reflect";
```

## TypeScript configuration

It's important to set these options in the `tsconfig.json` file of our project:

```json
{
  "emitDecoratorMetadata": true,
  "experimentalDecorators": true
}
```

`TypeGraphQL` is designed to work with Node.js LTS and the latest stable releases. It uses features from ES2021 so we should set our `tsconfig.json` file appropriately:

```js
{
  "target": "es2021" // Or newer if Node.js version supports it
}
```

All in all, the minimal `tsconfig.json` file example looks like this:

```json
{
  "compilerOptions": {
    "target": "es2021",
    "module": "commonjs",
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true
  }
}
```


================================================
FILE: docs/interfaces.md
================================================
---
title: Interfaces
---

The main idea of TypeGraphQL is to create GraphQL types based on TypeScript classes.

In object-oriented programming it is common to create interfaces which describe the contract that classes implementing them must adhere to. Hence, TypeGraphQL supports defining GraphQL interfaces.

Read more about the GraphQL Interface Type in the [official GraphQL docs](https://graphql.org/learn/schema/#interfaces).

## Abstract classes

TypeScript has first class support for interfaces. Unfortunately, they only exist at compile-time, so we can't use them to build GraphQL schema at runtime by using decorators.

Luckily, we can use an abstract class for this purpose. It behaves almost like an interface as it can't be instantiated but it can be implemented by another class. The only difference is that it just won't prevent developers from implementing a method or initializing a field. So, as long as we treat the abstract class like an interface, we can safely use it.

## Defining interface type

How do we create a GraphQL interface definition? We create an abstract class and decorate it with the `@InterfaceType()` decorator. The rest is exactly the same as with object types: we use the `@Field` decorator to declare the shape of the type:

```ts
@InterfaceType()
abstract class IPerson {
  @Field(type => ID)
  id: string;

  @Field()
  name: string;

  @Field(type => Int)
  age: number;
}
```

We can then use this interface type class like an interface in the object type class definition:

```ts
@ObjectType({ implements: IPerson })
class Person implements IPerson {
  id: string;
  name: string;
  age: number;
}
```

The only difference is that we have to let TypeGraphQL know that this `ObjectType` is implementing the `InterfaceType`. We do this by passing the param `({ implements: IPerson })` to the decorator. If we implement multiple interfaces, we pass an array of interfaces like so: `({ implements: [IPerson, IAnimal, IMachine] })`.

It is also allowed to omit the decorators since the GraphQL types will be copied from the interface definition - this way we won't have to maintain two definitions and solely rely on TypeScript type checking for correct interface implementation.

We can also extend the base interface type abstract class as well because all the fields are inherited and emitted in schema:

```ts
@ObjectType({ implements: IPerson })
class Person extends IPerson {
  @Field()
  hasKids: boolean;
}
```

## Implementing other interfaces

Since `graphql-js` version `15.0`, it's also possible for interface type to [implement other interface types](https://github.com/graphql/graphql-js/pull/2084).

To accomplish this, we can just use the same syntax that we utilize for object types - the `implements` decorator option:

```ts
@InterfaceType()
class Node {
  @Field(type => ID)
  id: string;
}

@InterfaceType({ implements: Node })
class Person extends Node {
  @Field()
  name: string;

  @Field(type => Int)
  age: number;
}
```

Also, when we implement the interface that already implements other interface, there's no need to put them all in `implements` array in `@ObjectType` decorator option - only the closest one in the inheritance chain is required, e.g.:

```ts
@ObjectType({ implements: [Person] })
class Student extends Person {
  @Field()
  universityName: string;
}
```

This example produces following representation in GraphQL SDL:

```graphql
interface Node {
  id: ID!
}

interface Person implements Node {
  id: ID!
  name: String!
  age: Int!
}

type Student implements Node & Person {
  id: ID!
  name: String!
  age: Int!
  universityName: String!
}
```

## Resolvers and arguments

What's more, we can define resolvers for the interface fields, using the same syntax we would use when defining one for our object type:

```ts
@InterfaceType()
abstract class IPerson {
  @Field()
  firstName: string;

  @Field()
  lastName: string;

  @Field()
  fullName(): string {
    return `${this.firstName} ${this.lastName}`;
  }
}
```

They're inherited by all the object types that implements this interface type but does not provide their own resolver implementation for those fields.

Additionally, if we want to declare that the interface accepts some arguments, e.g.:

```graphql
interface IPerson {
  avatar(size: Int!): String!
}
```

We can just use `@Arg` or `@Args` decorators as usual:

```ts
@InterfaceType()
abstract class IPerson {
  @Field()
  avatar(@Arg("size") size: number): string {
    return `http://i.pravatar.cc/${size}`;
  }
}
```

Unfortunately, TypeScript doesn't allow using decorators on abstract methods.
So if we don't want to provide implementation for that field resolver, only to enforce some signature (args and return type), we have to throw an error inside the body:

```ts
@InterfaceType()
abstract class IPerson {
  @Field()
  avatar(@Arg("size") size: number): string {
    throw new Error("Method not implemented!");
  }
}
```

And then we need to extend the interface class and override the method by providing its body - it is required for all object types that implements that interface type:

```ts
@ObjectType({ implements: IPerson })
class Person extends IPerson {
  avatar(size: number): string {
    return `http://i.pravatar.cc/${size}`;
  }
}
```

In order to extend the signature by providing additional arguments (like `format`), we need to redeclare the whole field signature:

```ts
@ObjectType({ implements: IPerson })
class Person implements IPerson {
  @Field()
  avatar(@Arg("size") size: number, @Arg("format") format: string): string {
    return `http://i.pravatar.cc/${size}.${format}`;
  }
}
```

Resolvers for interface type fields can be also defined on resolvers classes level, by using the `@FieldResolver` decorator:

```ts
@Resolver(of => IPerson)
class IPersonResolver {
  @FieldResolver()
  avatar(@Root() person: IPerson, @Arg("size") size: number): string {
    return `http://typegraphql.com/${person.id}/${size}`;
  }
}
```

## Registering in schema

By default, if the interface type is explicitly used in schema definition (used as a return type of a query/mutation or as some field type), all object types that implement that interface will be emitted in schema, so we don't need to do anything.

However, in some cases like the `Node` interface that is used in Relay-based systems, this behavior might be not intended when exposing multiple, separates schemas (like a public and the private ones).

In this situation, we can provide an `{ autoRegisterImplementations: false }` option to the `@InterfaceType` decorator to prevent emitting all this object types in the schema:

```ts
@InterfaceType({ autoRegisterImplementations: false })
abstract class Node {
  @Field(type => ID)
  id: string;
}
```

Then we need to add all the object types (that implement this interface type and which we want to expose in selected schema) to the `orphanedTypes` array option in `buildSchema`:

```ts
const schema = await buildSchema({
  resolvers,
  // Provide orphaned object types
  orphanedTypes: [Person, Animal, Recipe],
});
```

Be aware that if the object type class is explicitly used as the GraphQL type (like `Recipe` type as the return type of `addRecipe` mutation), it will be emitted regardless the `orphanedTypes` setting.

## Resolving Type

Be aware that when our object type is implementing a GraphQL interface type, **we have to return an instance of the type class** in our resolvers. Otherwise, `graphql-js` will not be able to detect the underlying GraphQL type correctly.

We can also provide our own `resolveType` function implementation to the `@InterfaceType` options. This way we can return plain objects in resolvers and then determine the returned object type by checking the shape of the data object, the same ways [like in unions](./unions.md), e.g.:

```ts
@InterfaceType({
  resolveType: value => {
    if ("grades" in value) {
      return "Student"; // Schema name of type string
    }
    return Person; // Or object type class
  },
})
abstract class IPerson {
  // ...
}
```

However in case of interfaces, it might be a little bit more tricky than with unions, as we might not remember all the object types that implements this particular interface.

## Examples

For more advanced usage examples of interfaces (and type inheritance), e.g. with query returning an interface type, go to [this examples folder](https://github.com/MichalLytek/type-graphql/tree/master/examples/interfaces-inheritance).


================================================
FILE: docs/introduction.md
================================================
---
title: Introduction
sidebar_label: What & Why
---

We all love GraphQL! It's really great and solves many problems that we have with REST APIs, such as overfetching and underfetching. But developing a GraphQL API in Node.js with TypeScript is sometimes a bit of a pain.

## What?

**TypeGraphQL** is a library that makes this process enjoyable by defining the schema using only classes and a bit of decorator magic.
Example object type:

```ts
@ObjectType()
class Recipe {
  @Field()
  title: string;

  @Field(type => [Rate])
  ratings: Rate[];

  @Field({ nullable: true })
  averageRating?: number;
}
```

It also has a set of useful features, like validation, authorization and dependency injection, which helps develop GraphQL APIs quickly & easily!

## Why?

As mentioned, developing a GraphQL API in Node.js with TypeScript is sometimes a bit of a pain.
Why? Let's take a look at the steps we usually have to take.

First, we create all the schema types in SDL. We also create our data models using [ORM classes](https://github.com/typeorm/typeorm), which represent our database entities. Then we start to write resolvers for our queries, mutations and fields. This forces us, however, to begin with creating TypeScript interfaces for all arguments and inputs and/or object types. After that, we can actually implement the resolvers, using weird generic signatures, e.g.:

```ts
export const getRecipesResolver: GraphQLFieldResolver<void, Context, GetRecipesArgs> = async (
  _,
  args,
  ctx,
) => {
  // Common tasks repeatable for almost every resolver
  const auth = Container.get(AuthService);
  if (!auth.check(ctx.user)) {
    throw new NotAuthorizedError();
  }
  await joi.validate(getRecipesSchema, args);
  const repository = TypeORM.getRepository(Recipe);

  // Business logic, e.g.:
  return repository.find({ skip: args.offset, take: args.limit });
};
```

The biggest problem is code redundancy which makes it difficult to keep things in sync. To add a new field to our entity, we have to jump through all the files: modify the entity class, then modify the schema, and finally update the interface. The same goes with inputs or arguments: it's easy to forget to update one of them or make a mistake with a type. Also, what if we've made a typo in a field name? The rename feature (F2) won't work correctly.

**TypeGraphQL** comes to address these issues, based on experience from a few years of developing GraphQL APIs in TypeScript. The main idea is to have only one source of truth by defining the schema using classes and a bit of decorator help. Additional features like dependency injection, validation and auth guards help with common tasks that would normally have to be handled by ourselves.


================================================
FILE: docs/middlewares.md
================================================
---
title: Middleware and guards
---

Middleware are pieces of reusable code that can be easily attached to resolvers and fields. By using middleware we can extract the commonly used code from our resolvers and then declaratively attach it using a decorator or even registering it globally.

## Creating Middleware

### What is Middleware?

Middleware is a very powerful but somewhat complicated feature. Basically, middleware is a function that takes 2 arguments:

- resolver data - the same as resolvers (`root`, `args`, `context`, `info`)
- the `next` function - used to control the execution of the next middleware and the resolver to which it is attached

We may be familiar with how middleware works in [`express.js`](https://expressjs.com/en/guide/writing-middleware.html) but TypeGraphQL middleware is inspired by [`koa.js`](http://koajs.com/#application). The difference is that the `next` function returns a promise of the value of subsequent middleware and resolver execution from the stack.

This makes it easy to perform actions before or after resolver execution. So things like measuring execution time are simple to implement:

```ts
export const ResolveTime: MiddlewareFn = async ({ info }, next) => {
  const start = Date.now();
  await next();
  const resolveTime = Date.now() - start;
  console.log(`${info.parentType.name}.${info.fieldName} [${resolveTime} ms]`);
};
```

### Intercepting the execution result

Middleware also has the ability to intercept the result of a resolver's execution. It's not only able to e.g. create a log but also replace the result with a new value:

```ts
export const CompetitorInterceptor: MiddlewareFn = async (_, next) => {
  const result = await next();
  if (result === "typegql") {
    return "type-graphql";
  }
  return result;
};
```

It might not seem very useful from the perspective of this library's users but this feature was mainly introduced for plugin systems and 3rd-party library integration. Thanks to this, it's possible to e.g. wrap the returned object with a lazy-relation wrapper that automatically fetches relations from a database on demand under the hood.

### Simple Middleware

If we only want to do something before an action, like log the access to the resolver, we can just place the `return next()` statement at the end of our middleware:

```ts
const LogAccess: MiddlewareFn<TContext> = ({ context, info }, next) => {
  const username: string = context.username || "guest";
  console.log(`Logging access: ${username} -> ${info.parentType.name}.${info.fieldName}`);
  return next();
};
```

### Guards

Middleware can also break the middleware stack by not calling the `next` function. This way, the result returned from the middleware will be used instead of calling the resolver and returning it's result.

We can also throw an error in the middleware if the execution must be terminated and an error returned to the user, e.g. when resolver arguments are incorrect.

This way we can create a guard that blocks access to the resolver and prevents execution or any data return.

```ts
export const CompetitorDetector: MiddlewareFn = async ({ args }, next) => {
  if (args.frameworkName === "type-graphql") {
    return "TypeGraphQL";
  }
  if (args.frameworkName === "typegql") {
    throw new Error("Competitive framework detected!");
  }
  return next();
};
```

### Reusable Middleware

Sometimes middleware has to be configurable, just like we pass a `roles` array to the [`@Authorized()` decorator](./authorization.md). In this case, we should create a simple middleware factory - a function that takes our configuration as a parameter and returns a middleware that uses the provided value.

```ts
export function NumberInterceptor(minValue: number): MiddlewareFn {
  return async (_, next) => {
    const result = await next();
    // Hide values below minValue
    if (typeof result === "number" && result < minValue) {
      return null;
    }
    return result;
  };
}
```

Remember to call this middleware with an argument, e.g. `NumberInterceptor(3.0)`, when attaching it to a resolver!

### Error Interceptors

Middleware can also catch errors that were thrown during execution. This way, they can easily be logged and even filtered for info that can't be returned to the user:

```ts
export const ErrorInterceptor: MiddlewareFn<any> = async ({ context, info }, next) => {
  try {
    return await next();
  } catch (err) {
    // Write error to file log
    fileLog.write(err, context, info);

    // Hide errors from db like printing sql query
    if (someCondition(err)) {
      throw new Error("Unknown error occurred!");
    }

    // Rethrow the error
    throw err;
  }
};
```

### Class-based Middleware

Sometimes our middleware logic can be a bit complicated - it may communicate with a database, write logs to file, etc., so we might want to test it. In that case we create class middleware that is able to benefit from [dependency injection](./dependency-injection.md) and easily mock a file logger or a database repository.

To accomplish this, we implement a `MiddlewareInterface`. Our class must have the `use` method that conforms with the `MiddlewareFn` signature. Below we can see how the previously defined `LogAccess` middleware looks after the transformation:

```ts
export class LogAccess implements MiddlewareInterface<TContext> {
  constructor(private readonly logger: Logger) {}

  async use({ context, info }: ResolverData<TContext>, next: NextFn) {
    const username: string = context.username || "guest";
    this.logger.log(`Logging access: ${username} -> ${info.parentType.name}.${info.fieldName}`);
    return next();
  }
}
```

## How to use

### Attaching Middleware

To attach middleware to a resolver method, place the `@UseMiddleware()` decorator above the method declaration. It accepts an array of middleware that will be called in the provided order. We can also pass them without an array as it supports [rest parameters](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters):

```ts
@Resolver()
export class RecipeResolver {
  @Query()
  @UseMiddleware(ResolveTime, LogAccess)
  randomValue(): number {
    return Math.random();
  }
}
```

If we want to apply the middlewares to all the resolver's class methods, we can put the decorator on top of the class declaration:

```ts
@UseMiddleware(ResolveTime, LogAccess)
@Resolver()
export class RecipeResolver {
  @Query()
  randomValue(): number {
    return Math.random();
  }

  @Query()
  constantValue(): number {
    return 21.37;
  }
}
```

> Be aware that resolver's class middlewares are executed first, before the method's ones.

We can also attach the middleware to the `ObjectType` fields, the same way as with the [`@Authorized()` decorator](./authorization.md).

```ts
@ObjectType()
export class Recipe {
  @Field()
  title: string;

  @Field(type => [Int])
  @UseMiddleware(LogAccess)
  ratings: number[];
}
```

### Global Middleware

However, for common middlewares like measuring resolve time or catching errors, it might be annoying to place a `@UseMiddleware(ResolveTime)` decorator on every field, method or resolver class.

Hence, in TypeGraphQL we can also register a global middleware that will be called for each query, mutation, subscription and a field. For this, we use the `globalMiddlewares` property of the `buildSchema` configuration object:

```ts
const schema = await buildSchema({
  resolvers: [RecipeResolver],
  globalMiddlewares: [ErrorInterceptor, ResolveTime],
});
```

### Custom Decorators

If we want to use middlewares with a more descriptive and declarative API, we can also create a custom method decorators. See how to do this in [custom decorators docs](./custom-decorators.md#method-decorators).

## Example

See how different kinds of middlewares work in the [middlewares and custom decorators example](https://github.com/MichalLytek/type-graphql/tree/master/examples/middlewares-custom-decorators).


================================================
FILE: docs/migration-guide.md
================================================
---
title: Migration Guide
sidebar_label: v1.x -> v2.0
---

> This chapter contains migration guide, that will help you upgrade your codebase from using old Typegraphql `v1.x` into the newest `v2.0` release.
>
> If you just started using TypeGraphQL and you have `v2.0` installed, you can skip this chapter and go straight into the "Advanced guides" section.

## New `DateTimeISO` scalar name in schema

One of the breaking change released in `v2.0` is using `Date` scalars from `graphql-scalars` package, instead of custom ones that were built-in in TypegraphQL.

This means that the exported `GraphQLISODateTime` scalar is registered in schema under a changed name - `DateTimeISO`. If you don't plan to use other `DateTime` scalar in your project and you need to restore the existing scalar name for an easy upgrade to the latest TypeGraphQL version (without rewriting your GraphQL queries), here's a simple snippet for you to use.

First, you need to create an alias for the `GraphQLDateTimeISO` scalar:

```ts
import { GraphQLDateTimeISO } from "graphql-scalars";
import { GraphQLScalarType } from "graphql";

const AliasedGraphQLDateTimeISO = new GraphQLScalarType({
  ...GraphQLDateTimeISO.toConfig(),
  name: "DateTime", // use old name
});
```

And then register the scalars mapping in the schema you build, in order to overwrite the default date scalar:

```ts
import { buildSchema } from "type-graphql";

const schema = await buildSchema({
  res
Download .txt
gitextract_cv2dczwf/

├── .editorconfig
├── .eslintignore
├── .eslintrc
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── config.yml
│   │   ├── documentation-issue-or-request.md
│   │   └── feature_request.md
│   ├── configs/
│   │   └── changelog.json
│   ├── dependabot.yml
│   └── workflows/
│       ├── check.yml
│       ├── codeql.yml
│       ├── license.yml
│       ├── release.yml
│       ├── sponsor.yml
│       └── website.yml
├── .gitignore
├── .husky/
│   └── pre-commit
├── .lintstagedrc
├── .markdownlint.json
├── .markdownlintignore
├── .npmrc
├── .nvmrc
├── .prettierignore
├── .prettierrc
├── .shellcheckrc
├── .vscode/
│   ├── extensions.json
│   ├── launch.json
│   └── settings.json
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── benchmarks/
│   ├── .eslintrc
│   ├── array/
│   │   ├── graphql-js/
│   │   │   ├── async.ts
│   │   │   └── standard.ts
│   │   ├── results.txt
│   │   ├── run.ts
│   │   └── type-graphql/
│   │       ├── async-field-resolvers.ts
│   │       ├── simple-resolvers.ts
│   │       ├── standard.ts
│   │       ├── sync-field-resolvers.ts
│   │       ├── sync-getters.ts
│   │       └── with-global-middleware.ts
│   ├── simple/
│   │   ├── graphql-js.ts
│   │   ├── results.txt
│   │   ├── run.ts
│   │   └── type-graphql.ts
│   └── tsconfig.json
├── cspell.json
├── docs/
│   ├── README.md
│   ├── authorization.md
│   ├── aws-lambda.md
│   ├── azure-functions.md
│   ├── bootstrap.md
│   ├── browser-usage.md
│   ├── complexity.md
│   ├── custom-decorators.md
│   ├── dependency-injection.md
│   ├── directives.md
│   ├── emit-schema.md
│   ├── enums.md
│   ├── esm.md
│   ├── examples.md
│   ├── extensions.md
│   ├── faq.md
│   ├── generic-types.md
│   ├── getting-started.md
│   ├── inheritance.md
│   ├── installation.md
│   ├── interfaces.md
│   ├── introduction.md
│   ├── middlewares.md
│   ├── migration-guide.md
│   ├── nestjs.md
│   ├── performance.md
│   ├── prisma.md
│   ├── resolvers.md
│   ├── scalars.md
│   ├── subscriptions.md
│   ├── types-and-fields.md
│   ├── unions.md
│   └── validation.md
├── examples/
│   ├── .eslintrc
│   ├── README.md
│   ├── apollo-cache/
│   │   ├── cache-control.ts
│   │   ├── examples.graphql
│   │   ├── helpers/
│   │   │   ├── RequireAtLeastOne.d.ts
│   │   │   └── getTime.ts
│   │   ├── index.ts
│   │   ├── recipe.data.ts
│   │   ├── recipe.resolver.ts
│   │   ├── recipe.type.ts
│   │   └── schema.graphql
│   ├── apollo-federation/
│   │   ├── accounts/
│   │   │   ├── data.ts
│   │   │   ├── index.ts
│   │   │   ├── resolver.ts
│   │   │   ├── user.reference.ts
│   │   │   └── user.ts
│   │   ├── examples.graphql
│   │   ├── helpers/
│   │   │   ├── buildFederatedSchema.ts
│   │   │   └── index.ts
│   │   ├── index.ts
│   │   ├── inventory/
│   │   │   ├── data.ts
│   │   │   ├── index.ts
│   │   │   ├── product.reference.ts
│   │   │   ├── product.ts
│   │   │   └── resolver.ts
│   │   ├── products/
│   │   │   ├── data.ts
│   │   │   ├── index.ts
│   │   │   ├── product.reference.ts
│   │   │   ├── product.ts
│   │   │   └── resolver.ts
│   │   ├── reviews/
│   │   │   ├── index.ts
│   │   │   ├── product/
│   │   │   │   ├── index.ts
│   │   │   │   ├── product.ts
│   │   │   │   └── resolver.ts
│   │   │   ├── review/
│   │   │   │   ├── data.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── resolver.ts
│   │   │   │   └── review.ts
│   │   │   └── user/
│   │   │       ├── index.ts
│   │   │       ├── resolver.ts
│   │   │       └── user.ts
│   │   └── schema.graphql
│   ├── apollo-federation-2/
│   │   ├── accounts/
│   │   │   ├── data.ts
│   │   │   ├── index.ts
│   │   │   ├── resolver.ts
│   │   │   ├── user.reference.ts
│   │   │   └── user.ts
│   │   ├── examples.graphql
│   │   ├── helpers/
│   │   │   └── buildFederatedSchema.ts
│   │   ├── index.ts
│   │   ├── inventory/
│   │   │   ├── data.ts
│   │   │   ├── index.ts
│   │   │   ├── product.reference.ts
│   │   │   ├── product.ts
│   │   │   └── resolver.ts
│   │   ├── products/
│   │   │   ├── data.ts
│   │   │   ├── dining.ts
│   │   │   ├── index.ts
│   │   │   ├── product.reference.ts
│   │   │   ├── product.ts
│   │   │   ├── resolver.ts
│   │   │   └── seating.ts
│   │   ├── reviews/
│   │   │   ├── index.ts
│   │   │   ├── product/
│   │   │   │   ├── product.ts
│   │   │   │   └── resolver.ts
│   │   │   ├── review/
│   │   │   │   ├── data.ts
│   │   │   │   ├── resolver.ts
│   │   │   │   └── review.ts
│   │   │   └── user/
│   │   │       ├── resolver.ts
│   │   │       └── user.ts
│   │   └── schema.graphql
│   ├── authorization/
│   │   ├── auth-checker.ts
│   │   ├── context.type.ts
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── recipe.data.ts
│   │   ├── recipe.resolver.ts
│   │   ├── recipe.type.ts
│   │   ├── schema.graphql
│   │   └── user.type.ts
│   ├── automatic-validation/
│   │   ├── examples.graphql
│   │   ├── helpers.ts
│   │   ├── index.ts
│   │   ├── recipe.input.ts
│   │   ├── recipe.resolver.ts
│   │   ├── recipe.type.ts
│   │   ├── recipes.arguments.ts
│   │   └── schema.graphql
│   ├── custom-validation/
│   │   ├── examples.graphql
│   │   ├── helpers.ts
│   │   ├── index.ts
│   │   ├── recipe.input.ts
│   │   ├── recipe.resolver.ts
│   │   ├── recipe.type.ts
│   │   ├── recipes.arguments.ts
│   │   └── schema.graphql
│   ├── enums-and-unions/
│   │   ├── cook.data.ts
│   │   ├── cook.type.ts
│   │   ├── difficulty.enum.ts
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── recipe.data.ts
│   │   ├── recipe.type.ts
│   │   ├── resolver.ts
│   │   ├── schema.graphql
│   │   └── search-result.union.ts
│   ├── extensions/
│   │   ├── context.type.ts
│   │   ├── examples.graphql
│   │   ├── helpers/
│   │   │   └── config.extractors.ts
│   │   ├── index.ts
│   │   ├── log-message.decorator.ts
│   │   ├── logger.middleware.ts
│   │   ├── logger.service.ts
│   │   ├── recipe.data.ts
│   │   ├── recipe.type.ts
│   │   ├── resolver.ts
│   │   ├── schema.graphql
│   │   └── user.type.ts
│   ├── generic-types/
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── paginated-response.type.ts
│   │   ├── recipe.data.ts
│   │   ├── recipe.resolver.ts
│   │   ├── recipe.type.ts
│   │   └── schema.graphql
│   ├── graphql-scalars/
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── recipe.data.ts
│   │   ├── recipe.input.ts
│   │   ├── recipe.resolver.ts
│   │   ├── recipe.type.ts
│   │   └── schema.graphql
│   ├── interfaces-inheritance/
│   │   ├── employee/
│   │   │   ├── employee.input.ts
│   │   │   ├── employee.type.ts
│   │   │   └── index.ts
│   │   ├── examples.graphql
│   │   ├── helpers.ts
│   │   ├── index.ts
│   │   ├── person/
│   │   │   ├── index.ts
│   │   │   ├── person.input.ts
│   │   │   ├── person.interface.ts
│   │   │   └── person.type.ts
│   │   ├── resolver.ts
│   │   ├── resource/
│   │   │   ├── index.ts
│   │   │   └── resource.interface.ts
│   │   ├── schema.graphql
│   │   └── student/
│   │       ├── index.ts
│   │       ├── student.input.ts
│   │       └── student.type.ts
│   ├── middlewares-custom-decorators/
│   │   ├── context.type.ts
│   │   ├── decorators/
│   │   │   ├── current-user.ts
│   │   │   ├── index.ts
│   │   │   ├── random-id-arg.ts
│   │   │   └── validate-args.ts
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── logger.ts
│   │   ├── middlewares/
│   │   │   ├── error-logger.ts
│   │   │   ├── index.ts
│   │   │   ├── log-access.ts
│   │   │   ├── number-interceptor.ts
│   │   │   └── resolve-time.ts
│   │   ├── recipe/
│   │   │   ├── index.ts
│   │   │   ├── recipe.args.ts
│   │   │   ├── recipe.data.ts
│   │   │   ├── recipe.resolver.ts
│   │   │   └── recipe.type.ts
│   │   ├── schema.graphql
│   │   └── user.type.ts
│   ├── mikro-orm/
│   │   ├── context.type.ts
│   │   ├── entities/
│   │   │   ├── index.ts
│   │   │   ├── rating.ts
│   │   │   ├── recipe.ts
│   │   │   └── user.ts
│   │   ├── examples.graphql
│   │   ├── helpers.ts
│   │   ├── index.ts
│   │   ├── resolvers/
│   │   │   ├── index.ts
│   │   │   ├── rating.resolver.ts
│   │   │   ├── recipe.resolver.ts
│   │   │   └── types/
│   │   │       ├── index.ts
│   │   │       ├── rating.input.ts
│   │   │       └── recipe.input.ts
│   │   └── schema.graphql
│   ├── mixin-classes/
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── inputs/
│   │   │   ├── amend.user.input.ts
│   │   │   ├── create.user.input.ts
│   │   │   └── index.ts
│   │   ├── mixins/
│   │   │   ├── index.ts
│   │   │   ├── with.id.ts
│   │   │   └── with.password.ts
│   │   ├── resolver.ts
│   │   ├── schema.graphql
│   │   └── types/
│   │       ├── index.ts
│   │       ├── user.details.ts
│   │       └── user.ts
│   ├── query-complexity/
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── recipe.data.ts
│   │   ├── recipe.resolver.ts
│   │   ├── recipe.type.ts
│   │   └── schema.graphql
│   ├── redis-subscriptions/
│   │   ├── comment.input.ts
│   │   ├── comment.type.ts
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── pubsub.ts
│   │   ├── recipe.data.ts
│   │   ├── recipe.resolver.args.ts
│   │   ├── recipe.resolver.ts
│   │   ├── recipe.type.ts
│   │   └── schema.graphql
│   ├── resolvers-inheritance/
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── person/
│   │   │   ├── index.ts
│   │   │   ├── person.resolver.ts
│   │   │   ├── person.role.ts
│   │   │   └── person.type.ts
│   │   ├── recipe/
│   │   │   ├── index.ts
│   │   │   ├── recipe.resolver.ts
│   │   │   └── recipe.type.ts
│   │   ├── resource/
│   │   │   ├── index.ts
│   │   │   ├── resource.args.ts
│   │   │   ├── resource.resolver.ts
│   │   │   ├── resource.service.factory.ts
│   │   │   ├── resource.service.ts
│   │   │   └── resource.ts
│   │   └── schema.graphql
│   ├── simple-subscriptions/
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── notification.resolver.ts
│   │   ├── notification.type.ts
│   │   ├── pubsub.ts
│   │   └── schema.graphql
│   ├── simple-usage/
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── recipe.data.ts
│   │   ├── recipe.input.ts
│   │   ├── recipe.resolver.ts
│   │   ├── recipe.type.ts
│   │   └── schema.graphql
│   ├── tsconfig.json
│   ├── tsyringe/
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── recipe.data.ts
│   │   ├── recipe.input.ts
│   │   ├── recipe.resolver.ts
│   │   ├── recipe.service.ts
│   │   ├── recipe.type.ts
│   │   └── schema.graphql
│   ├── typegoose/
│   │   ├── .eslintrc
│   │   ├── context.type.ts
│   │   ├── entities/
│   │   │   ├── index.ts
│   │   │   ├── rating.ts
│   │   │   ├── recipe.ts
│   │   │   └── user.ts
│   │   ├── examples.graphql
│   │   ├── helpers.ts
│   │   ├── index.ts
│   │   ├── object-id.scalar.ts
│   │   ├── resolvers/
│   │   │   ├── index.ts
│   │   │   ├── rating.resolver.ts
│   │   │   ├── recipe.resolver.ts
│   │   │   └── types/
│   │   │       ├── index.ts
│   │   │       ├── rating.input.ts
│   │   │       └── recipe.input.ts
│   │   ├── schema.graphql
│   │   ├── typegoose.middleware.ts
│   │   └── types.ts
│   ├── typeorm-basic-usage/
│   │   ├── context.type.ts
│   │   ├── datasource.ts
│   │   ├── entities/
│   │   │   ├── index.ts
│   │   │   ├── rating.ts
│   │   │   ├── recipe.ts
│   │   │   └── user.ts
│   │   ├── examples.graphql
│   │   ├── helpers.ts
│   │   ├── index.ts
│   │   ├── resolvers/
│   │   │   ├── index.ts
│   │   │   ├── rating.resolver.ts
│   │   │   ├── recipe.resolver.ts
│   │   │   └── types/
│   │   │       ├── index.ts
│   │   │       ├── rating.input.ts
│   │   │       └── recipe.input.ts
│   │   └── schema.graphql
│   ├── typeorm-lazy-relations/
│   │   ├── context.type.ts
│   │   ├── datasource.ts
│   │   ├── entities/
│   │   │   ├── index.ts
│   │   │   ├── rating.ts
│   │   │   ├── recipe.ts
│   │   │   └── user.ts
│   │   ├── examples.graphql
│   │   ├── helpers.ts
│   │   ├── index.ts
│   │   ├── resolvers/
│   │   │   ├── index.ts
│   │   │   ├── recipe.resolver.ts
│   │   │   └── types/
│   │   │       ├── index.ts
│   │   │       ├── rating.input.ts
│   │   │       └── recipe.input.ts
│   │   └── schema.graphql
│   ├── using-container/
│   │   ├── examples.graphql
│   │   ├── index.ts
│   │   ├── recipe.data.ts
│   │   ├── recipe.input.ts
│   │   ├── recipe.resolver.ts
│   │   ├── recipe.service.ts
│   │   ├── recipe.type.ts
│   │   └── schema.graphql
│   └── using-scoped-container/
│       ├── context.type.ts
│       ├── examples.graphql
│       ├── index.ts
│       ├── logger.ts
│       ├── recipe/
│       │   ├── recipe.data.ts
│       │   ├── recipe.input.ts
│       │   ├── recipe.resolver.ts
│       │   ├── recipe.service.ts
│       │   └── recipe.type.ts
│       └── schema.graphql
├── images/
│   └── payid_pookies.avif
├── jest.config.cts
├── package.json
├── scripts/
│   ├── .eslintrc
│   ├── markdown.ts
│   ├── package.json.ts
│   ├── tsconfig.json
│   └── version.ts
├── sponsorkit.config.mts
├── src/
│   ├── @types/
│   │   └── Reflect.d.ts
│   ├── decorators/
│   │   ├── Arg.ts
│   │   ├── Args.ts
│   │   ├── ArgsType.ts
│   │   ├── Authorized.ts
│   │   ├── Ctx.ts
│   │   ├── Directive.ts
│   │   ├── Extensions.ts
│   │   ├── Field.ts
│   │   ├── FieldResolver.ts
│   │   ├── Info.ts
│   │   ├── InputType.ts
│   │   ├── InterfaceType.ts
│   │   ├── Mutation.ts
│   │   ├── ObjectType.ts
│   │   ├── Query.ts
│   │   ├── Resolver.ts
│   │   ├── Root.ts
│   │   ├── Subscription.ts
│   │   ├── UseMiddleware.ts
│   │   ├── createMethodMiddlewareDecorator.ts
│   │   ├── createParameterDecorator.ts
│   │   ├── createResolverClassMiddlewareDecorator.ts
│   │   ├── enums.ts
│   │   ├── index.ts
│   │   ├── types.ts
│   │   └── unions.ts
│   ├── errors/
│   │   ├── CannotDetermineGraphQLTypeError.ts
│   │   ├── ConflictingDefaultValuesError.ts
│   │   ├── GeneratingSchemaError.ts
│   │   ├── InterfaceResolveTypeError.ts
│   │   ├── InvalidDirectiveError.ts
│   │   ├── MissingPubSubError.ts
│   │   ├── MissingSubscriptionTopicsError.ts
│   │   ├── NoExplicitTypeError.ts
│   │   ├── ReflectMetadataMissingError.ts
│   │   ├── SymbolKeysNotSupportedError.ts
│   │   ├── UnionResolveTypeError.ts
│   │   ├── UnmetGraphQLPeerDependencyError.ts
│   │   ├── WrongNullableListOptionError.ts
│   │   ├── graphql/
│   │   │   ├── ArgumentValidationError.ts
│   │   │   ├── AuthenticationError.ts
│   │   │   ├── AuthorizationError.ts
│   │   │   └── index.ts
│   │   └── index.ts
│   ├── helpers/
│   │   ├── auth-middleware.ts
│   │   ├── decorators.ts
│   │   ├── filesystem.ts
│   │   ├── findType.ts
│   │   ├── isThrowing.ts
│   │   ├── params.ts
│   │   ├── resolver-metadata.ts
│   │   ├── returnTypes.ts
│   │   ├── types.ts
│   │   └── utils.ts
│   ├── index.ts
│   ├── metadata/
│   │   ├── definitions/
│   │   │   ├── authorized-metadata.ts
│   │   │   ├── class-metadata.ts
│   │   │   ├── directive-metadata.ts
│   │   │   ├── enum-metadata.ts
│   │   │   ├── extensions-metadata.ts
│   │   │   ├── field-metadata.ts
│   │   │   ├── index.ts
│   │   │   ├── interface-class-metadata.ts
│   │   │   ├── middleware-metadata.ts
│   │   │   ├── object-class-metadata.ts
│   │   │   ├── param-metadata.ts
│   │   │   ├── resolver-metadata.ts
│   │   │   └── union-metadata.ts
│   │   ├── getMetadataStorage.ts
│   │   ├── index.ts
│   │   ├── metadata-storage.ts
│   │   └── utils.ts
│   ├── resolvers/
│   │   ├── convert-args.ts
│   │   ├── create.ts
│   │   ├── helpers.ts
│   │   └── validate-arg.ts
│   ├── scalars/
│   │   ├── aliases.ts
│   │   └── index.ts
│   ├── schema/
│   │   ├── build-context.ts
│   │   ├── definition-node.ts
│   │   ├── schema-generator.ts
│   │   └── utils.ts
│   ├── shim.ts
│   ├── typings/
│   │   ├── Complexity.ts
│   │   ├── ResolverInterface.ts
│   │   ├── SubscribeResolverData.ts
│   │   ├── SubscriptionHandlerData.ts
│   │   ├── TypeResolver.ts
│   │   ├── ValidatorFn.ts
│   │   ├── auth-checker.ts
│   │   ├── index.ts
│   │   ├── legacy-decorators.ts
│   │   ├── middleware.ts
│   │   ├── resolver-data.ts
│   │   ├── resolvers-map.ts
│   │   ├── subscriptions.ts
│   │   └── utils/
│   │       ├── ClassType.ts
│   │       ├── Constructor.ts
│   │       ├── Except.ts
│   │       ├── IsEqual.ts
│   │       ├── Maybe.ts
│   │       ├── MaybePromise.ts
│   │       ├── MergeExclusive.ts
│   │       ├── NonEmptyArray.ts
│   │       ├── SetRequired.ts
│   │       ├── Simplify.ts
│   │       └── index.ts
│   └── utils/
│       ├── buildSchema.ts
│       ├── buildTypeDefsAndResolvers.ts
│       ├── container.ts
│       ├── createResolversMap.ts
│       ├── emitSchemaDefinitionFile.ts
│       ├── graphql-version.ts
│       ├── index.ts
│       └── isPromiseLike.ts
├── tests/
│   ├── .eslintrc
│   ├── functional/
│   │   ├── authorization.ts
│   │   ├── circular-refs.ts
│   │   ├── default-nullable.ts
│   │   ├── default-values.ts
│   │   ├── deprecation.ts
│   │   ├── description.ts
│   │   ├── directives.ts
│   │   ├── emit-schema-sdl.ts
│   │   ├── enums.ts
│   │   ├── errors/
│   │   │   └── metadata-polyfill.ts
│   │   ├── extensions.ts
│   │   ├── fields.ts
│   │   ├── generic-types.ts
│   │   ├── inputtype-enumerable-properties.ts
│   │   ├── interface-resolvers-args.ts
│   │   ├── interfaces-and-inheritance.ts
│   │   ├── ioc-container.ts
│   │   ├── manual-decorators.ts
│   │   ├── metadata-storage.ts
│   │   ├── middlewares.ts
│   │   ├── nested-interface-inheritance.ts
│   │   ├── peer-dependency.ts
│   │   ├── query-complexity.ts
│   │   ├── resolvers.ts
│   │   ├── scalars.ts
│   │   ├── simple-resolvers.ts
│   │   ├── subscriptions.ts
│   │   ├── typedefs-resolvers.ts
│   │   ├── unions.ts
│   │   └── validation.ts
│   ├── helpers/
│   │   ├── circular-refs/
│   │   │   ├── good/
│   │   │   │   ├── CircularRef1.ts
│   │   │   │   └── CircularRef2.ts
│   │   │   └── wrong/
│   │   │       ├── CircularRef1.ts
│   │   │       └── CircularRef2.ts
│   │   ├── customScalar.ts
│   │   ├── directives/
│   │   │   ├── TestDirective.ts
│   │   │   └── assertValidDirective.ts
│   │   ├── expectToThrow.ts
│   │   ├── getInnerFieldType.ts
│   │   ├── getSampleObjectFieldType.ts
│   │   ├── getSchemaInfo.ts
│   │   ├── getTypeField.ts
│   │   └── sleep.ts
│   └── tsconfig.json
├── tsconfig.cjs.json
├── tsconfig.esm.json
├── tsconfig.json
├── tsconfig.typings.json
└── website/
    ├── .gitignore
    ├── blog/
    │   ├── 2018-03-25-medium-article.md
    │   └── 2020-08-19-devto-article.md
    ├── core/
    │   └── Footer.js
    ├── i18n/
    │   └── en.json
    ├── package.json
    ├── pages/
    │   ├── en/
    │   │   ├── help.js
    │   │   ├── index.js
    │   │   ├── users.js
    │   │   └── versions.js
    │   └── snippets/
    │       ├── object-type.md
    │       ├── testability.md
    │       ├── typeorm.md
    │       └── validation.md
    ├── sidebars.json
    ├── siteConfig.js
    ├── static/
    │   ├── css/
    │   │   ├── custom.css
    │   │   └── prism-theme.css
    │   └── img/
    │       └── payid_pookies.avif
    ├── versioned_docs/
    │   ├── version-0.16.0/
    │   │   ├── authorization.md
    │   │   ├── bootstrap.md
    │   │   ├── browser-usage.md
    │   │   ├── complexity.md
    │   │   ├── dependency-injection.md
    │   │   ├── emit-schema.md
    │   │   ├── enums.md
    │   │   ├── examples.md
    │   │   ├── faq.md
    │   │   ├── getting-started.md
    │   │   ├── interfaces-and-inheritance.md
    │   │   ├── introduction.md
    │   │   ├── middlewares.md
    │   │   ├── resolvers.md
    │   │   ├── scalars.md
    │   │   ├── subscriptions.md
    │   │   ├── types-and-fields.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   ├── version-0.17.0/
    │   │   ├── authorization.md
    │   │   ├── bootstrap.md
    │   │   ├── browser-usage.md
    │   │   ├── complexity.md
    │   │   ├── dependency-injection.md
    │   │   ├── emit-schema.md
    │   │   ├── enums.md
    │   │   ├── examples.md
    │   │   ├── faq.md
    │   │   ├── generic-types.md
    │   │   ├── getting-started.md
    │   │   ├── inheritance.md
    │   │   ├── installation.md
    │   │   ├── interfaces.md
    │   │   ├── introduction.md
    │   │   ├── middlewares.md
    │   │   ├── resolvers.md
    │   │   ├── scalars.md
    │   │   ├── subscriptions.md
    │   │   ├── types-and-fields.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   ├── version-0.17.1/
    │   │   ├── authorization.md
    │   │   ├── bootstrap.md
    │   │   ├── browser-usage.md
    │   │   ├── complexity.md
    │   │   ├── dependency-injection.md
    │   │   ├── emit-schema.md
    │   │   ├── enums.md
    │   │   ├── examples.md
    │   │   ├── faq.md
    │   │   ├── generic-types.md
    │   │   ├── getting-started.md
    │   │   ├── inheritance.md
    │   │   ├── installation.md
    │   │   ├── interfaces.md
    │   │   ├── introduction.md
    │   │   ├── middlewares.md
    │   │   ├── resolvers.md
    │   │   ├── scalars.md
    │   │   ├── subscriptions.md
    │   │   ├── types-and-fields.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   ├── version-0.17.2/
    │   │   ├── examples.md
    │   │   ├── getting-started.md
    │   │   ├── interfaces.md
    │   │   ├── introduction.md
    │   │   ├── types-and-fields.md
    │   │   └── unions.md
    │   ├── version-0.17.4/
    │   │   ├── custom-decorators.md
    │   │   ├── examples.md
    │   │   ├── interfaces.md
    │   │   ├── middlewares.md
    │   │   ├── subscriptions.md
    │   │   └── unions.md
    │   ├── version-0.17.5/
    │   │   ├── complexity.md
    │   │   ├── custom-decorators.md
    │   │   ├── dependency-injection.md
    │   │   ├── enums.md
    │   │   ├── examples.md
    │   │   ├── faq.md
    │   │   ├── generic-types.md
    │   │   ├── interfaces.md
    │   │   ├── middlewares.md
    │   │   ├── subscriptions.md
    │   │   ├── types-and-fields.md
    │   │   └── unions.md
    │   ├── version-0.17.6/
    │   │   └── custom-decorators.md
    │   ├── version-1.0.0/
    │   │   ├── bootstrap.md
    │   │   ├── browser-usage.md
    │   │   ├── complexity.md
    │   │   ├── custom-decorators.md
    │   │   ├── dependency-injection.md
    │   │   ├── directives.md
    │   │   ├── emit-schema.md
    │   │   ├── examples.md
    │   │   ├── extensions.md
    │   │   ├── generic-types.md
    │   │   ├── getting-started.md
    │   │   ├── installation.md
    │   │   ├── interfaces.md
    │   │   ├── middlewares.md
    │   │   ├── nestjs.md
    │   │   ├── performance.md
    │   │   ├── prisma.md
    │   │   ├── resolvers.md
    │   │   ├── scalars.md
    │   │   ├── subscriptions.md
    │   │   ├── types-and-fields.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   ├── version-1.1.0/
    │   │   ├── enums.md
    │   │   ├── examples.md
    │   │   └── validation.md
    │   ├── version-1.1.1/
    │   │   ├── complexity.md
    │   │   ├── custom-decorators.md
    │   │   ├── dependency-injection.md
    │   │   ├── examples.md
    │   │   ├── extensions.md
    │   │   ├── generic-types.md
    │   │   ├── interfaces.md
    │   │   ├── middlewares.md
    │   │   ├── performance.md
    │   │   ├── resolvers.md
    │   │   ├── subscriptions.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   ├── version-1.2.0-rc.1/
    │   │   ├── authorization.md
    │   │   ├── bootstrap.md
    │   │   ├── complexity.md
    │   │   ├── custom-decorators.md
    │   │   ├── dependency-injection.md
    │   │   ├── directives.md
    │   │   ├── examples.md
    │   │   ├── extensions.md
    │   │   ├── generic-types.md
    │   │   ├── interfaces.md
    │   │   ├── middlewares.md
    │   │   ├── performance.md
    │   │   ├── resolvers.md
    │   │   ├── subscriptions.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   ├── version-2.0.0-beta.3/
    │   │   ├── authorization.md
    │   │   ├── bootstrap.md
    │   │   ├── browser-usage.md
    │   │   ├── complexity.md
    │   │   ├── custom-decorators.md
    │   │   ├── dependency-injection.md
    │   │   ├── directives.md
    │   │   ├── emit-schema.md
    │   │   ├── enums.md
    │   │   ├── esm.md
    │   │   ├── examples.md
    │   │   ├── extensions.md
    │   │   ├── faq.md
    │   │   ├── generic-types.md
    │   │   ├── getting-started.md
    │   │   ├── inheritance.md
    │   │   ├── installation.md
    │   │   ├── interfaces.md
    │   │   ├── introduction.md
    │   │   ├── middlewares.md
    │   │   ├── nestjs.md
    │   │   ├── performance.md
    │   │   ├── prisma.md
    │   │   ├── resolvers.md
    │   │   ├── scalars.md
    │   │   ├── subscriptions.md
    │   │   ├── types-and-fields.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   ├── version-2.0.0-beta.4/
    │   │   ├── authorization.md
    │   │   ├── aws-lambda.md
    │   │   ├── browser-usage.md
    │   │   ├── complexity.md
    │   │   ├── custom-decorators.md
    │   │   ├── dependency-injection.md
    │   │   ├── directives.md
    │   │   ├── emit-schema.md
    │   │   ├── esm.md
    │   │   ├── examples.md
    │   │   ├── extensions.md
    │   │   ├── generic-types.md
    │   │   ├── inheritance.md
    │   │   ├── interfaces.md
    │   │   ├── middlewares.md
    │   │   ├── migration-guide.md
    │   │   ├── resolvers.md
    │   │   ├── subscriptions.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   ├── version-2.0.0-beta.6/
    │   │   ├── authorization.md
    │   │   ├── complexity.md
    │   │   ├── custom-decorators.md
    │   │   ├── dependency-injection.md
    │   │   ├── examples.md
    │   │   ├── extensions.md
    │   │   ├── generic-types.md
    │   │   ├── inheritance.md
    │   │   ├── interfaces.md
    │   │   ├── middlewares.md
    │   │   ├── resolvers.md
    │   │   ├── subscriptions.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   ├── version-2.0.0-rc.1/
    │   │   ├── authorization.md
    │   │   ├── complexity.md
    │   │   ├── custom-decorators.md
    │   │   ├── dependency-injection.md
    │   │   ├── examples.md
    │   │   ├── extensions.md
    │   │   ├── generic-types.md
    │   │   ├── inheritance.md
    │   │   ├── installation.md
    │   │   ├── interfaces.md
    │   │   ├── middlewares.md
    │   │   ├── migration-guide.md
    │   │   ├── resolvers.md
    │   │   ├── subscriptions.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   ├── version-2.0.0-rc.2/
    │   │   ├── authorization.md
    │   │   ├── azure-functions.md
    │   │   ├── browser-usage.md
    │   │   ├── complexity.md
    │   │   ├── custom-decorators.md
    │   │   ├── dependency-injection.md
    │   │   ├── examples.md
    │   │   ├── extensions.md
    │   │   ├── generic-types.md
    │   │   ├── inheritance.md
    │   │   ├── interfaces.md
    │   │   ├── middlewares.md
    │   │   ├── resolvers.md
    │   │   ├── subscriptions.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   ├── version-2.0.0-rc.3/
    │   │   ├── authorization.md
    │   │   ├── complexity.md
    │   │   ├── custom-decorators.md
    │   │   ├── dependency-injection.md
    │   │   ├── emit-schema.md
    │   │   ├── examples.md
    │   │   ├── extensions.md
    │   │   ├── generic-types.md
    │   │   ├── inheritance.md
    │   │   ├── installation.md
    │   │   ├── interfaces.md
    │   │   ├── middlewares.md
    │   │   ├── resolvers.md
    │   │   ├── subscriptions.md
    │   │   ├── unions.md
    │   │   └── validation.md
    │   └── version-2.0.0-rc.4/
    │       ├── authorization.md
    │       ├── complexity.md
    │       ├── custom-decorators.md
    │       ├── dependency-injection.md
    │       ├── examples.md
    │       ├── extensions.md
    │       ├── generic-types.md
    │       ├── inheritance.md
    │       ├── interfaces.md
    │       ├── middlewares.md
    │       ├── resolvers.md
    │       ├── subscriptions.md
    │       ├── unions.md
    │       └── validation.md
    ├── versioned_sidebars/
    │   ├── version-0.16.0-sidebars.json
    │   ├── version-0.17.0-sidebars.json
    │   ├── version-0.17.4-sidebars.json
    │   ├── version-1.0.0-sidebars.json
    │   ├── version-2.0.0-beta.3-sidebars.json
    │   ├── version-2.0.0-beta.4-sidebars.json
    │   └── version-2.0.0-rc.2-sidebars.json
    └── versions.json
Download .txt
Showing preview only (243K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (1520 symbols across 387 files)

FILE: benchmarks/array/run.ts
  constant BENCHMARK_ITERATIONS (line 4) | const BENCHMARK_ITERATIONS = 50;
  constant ARRAY_ITEMS (line 5) | const ARRAY_ITEMS = 25000;
  function runBenchmark (line 7) | async function runBenchmark(schema: GraphQLSchema) {

FILE: benchmarks/array/type-graphql/async-field-resolvers.ts
  class SampleObject (line 14) | @ObjectType()
  class SampleResolver (line 29) | @Resolver(SampleObject)
    method multipleNestedObjects (line 32) | multipleNestedObjects(): SampleObject[] {
    method stringField (line 49) | async stringField(@Root() source: SampleObject) {
    method numberField (line 54) | async numberField(@Root() source: SampleObject) {
    method booleanField (line 59) | async booleanField(@Root() source: SampleObject) {
    method nestedField (line 64) | async nestedField(@Root() source: SampleObject) {
  function main (line 69) | async function main() {

FILE: benchmarks/array/type-graphql/simple-resolvers.ts
  class SampleObject (line 13) | @ObjectType({ simpleResolvers: true })
  class SampleResolver (line 28) | @Resolver()
    method multipleNestedObjects (line 31) | multipleNestedObjects(): SampleObject[] {
  function main (line 55) | async function main() {

FILE: benchmarks/array/type-graphql/standard.ts
  class SampleObject (line 5) | @ObjectType()
  class SampleResolver (line 20) | @Resolver()
    method multipleNestedObjects (line 23) | multipleNestedObjects(): SampleObject[] {
  function main (line 40) | async function main() {

FILE: benchmarks/array/type-graphql/sync-field-resolvers.ts
  class SampleObject (line 14) | @ObjectType()
  class SampleResolver (line 29) | @Resolver(SampleObject)
    method multipleNestedObjects (line 32) | multipleNestedObjects(): SampleObject[] {
    method stringField (line 49) | stringField(@Root() source: SampleObject) {
    method numberField (line 54) | numberField(@Root() source: SampleObject) {
    method booleanField (line 59) | booleanField(@Root() source: SampleObject) {
    method nestedField (line 64) | nestedField(@Root() source: SampleObject) {
  function main (line 69) | async function main() {

FILE: benchmarks/array/type-graphql/sync-getters.ts
  class SampleObject (line 5) | @ObjectType()
    method getStringField (line 10) | get getStringField(): string {
    method getNumberField (line 17) | get getNumberField(): number {
    method getBooleanField (line 24) | get getBooleanField(): boolean {
    method getNestedField (line 31) | get getNestedField(): SampleObject | undefined {
  class SampleResolver (line 36) | @Resolver(SampleObject)
    method multipleNestedObjects (line 39) | multipleNestedObjects(): SampleObject[] {
  function main (line 57) | async function main() {

FILE: benchmarks/array/type-graphql/with-global-middleware.ts
  class SampleObject (line 13) | @ObjectType()
  class SampleResolver (line 28) | @Resolver()
    method multipleNestedObjects (line 31) | multipleNestedObjects(): SampleObject[] {
  function main (line 55) | async function main() {

FILE: benchmarks/simple/run.ts
  constant BENCHMARK_ITERATIONS (line 4) | const BENCHMARK_ITERATIONS = 100000;
  function runBenchmark (line 6) | async function runBenchmark(schema: GraphQLSchema) {

FILE: benchmarks/simple/type-graphql.ts
  class SampleObject (line 5) | @ObjectType()
  class SampleResolver (line 14) | @Resolver()
    method singleObject (line 17) | singleObject(): SampleObject {
    method nestedObject (line 22) | nestedObject(): SampleObject {
  function main (line 41) | async function main() {

FILE: examples/apollo-cache/cache-control.ts
  function CacheControl (line 5) | function CacheControl({ maxAge, scope }: RequireAtLeastOne<CacheHint>) {

FILE: examples/apollo-cache/helpers/RequireAtLeastOne.d.ts
  type RequireAtLeastOne (line 3) | type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Pick<T, Excl...

FILE: examples/apollo-cache/helpers/getTime.ts
  function getTime (line 1) | function getTime(date: Date = new Date()) {

FILE: examples/apollo-cache/index.ts
  function bootstrap (line 10) | async function bootstrap() {

FILE: examples/apollo-cache/recipe.data.ts
  function createRecipe (line 3) | function createRecipe(recipeData: Partial<Recipe>) {
  function createRecipeSamples (line 7) | function createRecipeSamples() {

FILE: examples/apollo-cache/recipe.resolver.ts
  class RecipeResolver (line 8) | class RecipeResolver {
    method recipe (line 12) | async recipe(@Arg("title") title: string): Promise<Recipe | undefined> {
    method cachedRecipe (line 20) | async cachedRecipe(@Arg("title") title: string): Promise<Recipe | unde...
    method recipes (line 26) | async recipes(): Promise<Recipe[]> {

FILE: examples/apollo-cache/recipe.type.ts
  class Recipe (line 6) | class Recipe {
    method cachedAverageRating (line 22) | get cachedAverageRating() {
    method averageRating (line 28) | get averageRating(): number | null {

FILE: examples/apollo-federation-2/accounts/data.ts
  function createUser (line 3) | function createUser(userData: Partial<User>) {

FILE: examples/apollo-federation-2/accounts/index.ts
  function listen (line 8) | async function listen(port: number): Promise<string> {

FILE: examples/apollo-federation-2/accounts/resolver.ts
  class AccountsResolver (line 6) | class AccountsResolver {
    method me (line 8) | me(): User {

FILE: examples/apollo-federation-2/accounts/user.reference.ts
  function resolveUserReference (line 4) | async function resolveUserReference(reference: Pick<User, "id">): Promis...

FILE: examples/apollo-federation-2/accounts/user.ts
  class User (line 5) | class User {

FILE: examples/apollo-federation-2/helpers/buildFederatedSchema.ts
  function buildFederatedSchema (line 7) | async function buildFederatedSchema(

FILE: examples/apollo-federation-2/index.ts
  function bootstrap (line 17) | async function bootstrap() {

FILE: examples/apollo-federation-2/inventory/data.ts
  type Inventory (line 1) | interface Inventory {

FILE: examples/apollo-federation-2/inventory/index.ts
  function listen (line 8) | async function listen(port: number): Promise<string> {

FILE: examples/apollo-federation-2/inventory/product.reference.ts
  function resolveProductReference (line 4) | async function resolveProductReference(

FILE: examples/apollo-federation-2/inventory/product.ts
  class Product (line 7) | class Product {

FILE: examples/apollo-federation-2/inventory/resolver.ts
  class InventoryResolver (line 5) | class InventoryResolver {
    method shippingEstimate (line 8) | async shippingEstimate(@Root() product: Product): Promise<number> {

FILE: examples/apollo-federation-2/products/dining.ts
  class Dining (line 6) | class Dining extends Product {

FILE: examples/apollo-federation-2/products/index.ts
  function listen (line 8) | async function listen(port: number): Promise<string> {

FILE: examples/apollo-federation-2/products/product.reference.ts
  function resolveProductReference (line 4) | async function resolveProductReference(

FILE: examples/apollo-federation-2/products/resolver.ts
  class ProductsResolver (line 6) | class ProductsResolver {
    method topProducts (line 8) | async topProducts(

FILE: examples/apollo-federation-2/products/seating.ts
  class Seating (line 6) | class Seating extends Product {

FILE: examples/apollo-federation-2/reviews/index.ts
  function listen (line 11) | async function listen(port: number): Promise<string> {

FILE: examples/apollo-federation-2/reviews/product/product.ts
  class Product (line 7) | class Product {

FILE: examples/apollo-federation-2/reviews/product/resolver.ts
  class ProductReviewsResolver (line 7) | class ProductReviewsResolver {
    method reviews (line 9) | async reviews(@Root() product: Product): Promise<Review[]> {

FILE: examples/apollo-federation-2/reviews/review/data.ts
  function createReview (line 5) | function createReview(reviewData: Partial<Review>) {
  function createUser (line 9) | function createUser(userData: Partial<User>) {
  function createProduct (line 13) | function createProduct(productData: Partial<Product>) {

FILE: examples/apollo-federation-2/reviews/review/resolver.ts
  class ReviewsResolver (line 6) | class ReviewsResolver {
    method reviews (line 8) | async reviews(): Promise<Review[]> {

FILE: examples/apollo-federation-2/reviews/review/review.ts
  class Review (line 7) | class Review {

FILE: examples/apollo-federation-2/reviews/user/resolver.ts
  class UserReviewsResolver (line 7) | class UserReviewsResolver {
    method reviews (line 9) | async reviews(@Root() user: User): Promise<Review[]> {

FILE: examples/apollo-federation-2/reviews/user/user.ts
  class User (line 5) | class User {

FILE: examples/apollo-federation/accounts/data.ts
  function createUser (line 3) | function createUser(userData: Partial<User>) {

FILE: examples/apollo-federation/accounts/index.ts
  function listen (line 8) | async function listen(port: number): Promise<string> {

FILE: examples/apollo-federation/accounts/resolver.ts
  class AccountsResolver (line 6) | class AccountsResolver {
    method me (line 8) | me(): User {

FILE: examples/apollo-federation/accounts/user.reference.ts
  function resolveUserReference (line 4) | async function resolveUserReference(reference: Pick<User, "id">): Promis...

FILE: examples/apollo-federation/accounts/user.ts
  class User (line 5) | class User {

FILE: examples/apollo-federation/helpers/buildFederatedSchema.ts
  function buildFederatedSchema (line 7) | async function buildFederatedSchema(

FILE: examples/apollo-federation/index.ts
  function bootstrap (line 12) | async function bootstrap() {

FILE: examples/apollo-federation/inventory/data.ts
  type Inventory (line 1) | interface Inventory {

FILE: examples/apollo-federation/inventory/index.ts
  function listen (line 8) | async function listen(port: number): Promise<string> {

FILE: examples/apollo-federation/inventory/product.reference.ts
  function resolveProductReference (line 4) | async function resolveProductReference(

FILE: examples/apollo-federation/inventory/product.ts
  class Product (line 6) | class Product {

FILE: examples/apollo-federation/inventory/resolver.ts
  class InventoryResolver (line 5) | class InventoryResolver {
    method shippingEstimate (line 8) | async shippingEstimate(@Root() product: Product): Promise<number> {

FILE: examples/apollo-federation/products/data.ts
  function createProduct (line 3) | function createProduct(productData: Partial<Product>) {

FILE: examples/apollo-federation/products/index.ts
  function listen (line 8) | async function listen(port: number): Promise<string> {

FILE: examples/apollo-federation/products/product.reference.ts
  function resolveProductReference (line 4) | async function resolveProductReference(

FILE: examples/apollo-federation/products/product.ts
  class Product (line 5) | class Product {

FILE: examples/apollo-federation/products/resolver.ts
  class ProductsResolver (line 6) | class ProductsResolver {
    method topProducts (line 8) | async topProducts(

FILE: examples/apollo-federation/reviews/index.ts
  function listen (line 8) | async function listen(port: number): Promise<string> {

FILE: examples/apollo-federation/reviews/product/product.ts
  class Product (line 6) | class Product {

FILE: examples/apollo-federation/reviews/product/resolver.ts
  class ProductReviewsResolver (line 6) | class ProductReviewsResolver {
    method reviews (line 8) | async reviews(@Root() product: Product): Promise<Review[]> {

FILE: examples/apollo-federation/reviews/review/data.ts
  function createReview (line 5) | function createReview(reviewData: Partial<Review>) {
  function createUser (line 9) | function createUser(userData: Partial<User>) {
  function createProduct (line 13) | function createProduct(productData: Partial<Product>) {

FILE: examples/apollo-federation/reviews/review/resolver.ts
  class ReviewsResolver (line 6) | class ReviewsResolver {
    method reviews (line 8) | async reviews(): Promise<Review[]> {

FILE: examples/apollo-federation/reviews/review/review.ts
  class Review (line 7) | class Review {

FILE: examples/apollo-federation/reviews/user/resolver.ts
  class UserReviewsResolver (line 6) | class UserReviewsResolver {
    method reviews (line 8) | async reviews(@Root() user: User): Promise<Review[]> {

FILE: examples/apollo-federation/reviews/user/user.ts
  class User (line 6) | class User {

FILE: examples/authorization/context.type.ts
  type Context (line 3) | interface Context {

FILE: examples/authorization/index.ts
  function bootstrap (line 10) | async function bootstrap() {

FILE: examples/authorization/recipe.data.ts
  function createRecipe (line 3) | function createRecipe(recipeData: Partial<Recipe>): Recipe {

FILE: examples/authorization/recipe.resolver.ts
  class RecipeResolver (line 6) | class RecipeResolver {
    method recipes (line 11) | async recipes(): Promise<Recipe[]> {
    method addRecipe (line 17) | addRecipe(
    method deleteRecipe (line 33) | deleteRecipe(@Arg("title") title: string): boolean {

FILE: examples/authorization/recipe.type.ts
  class Recipe (line 4) | class Recipe {
    method averageRating (line 20) | get averageRating(): number | null {

FILE: examples/authorization/user.type.ts
  type User (line 1) | interface User {

FILE: examples/automatic-validation/helpers.ts
  function generateRecipes (line 3) | function generateRecipes(count: number): Recipe[] {

FILE: examples/automatic-validation/index.ts
  function bootstrap (line 8) | async function bootstrap() {

FILE: examples/automatic-validation/recipe.input.ts
  class RecipeInput (line 6) | class RecipeInput implements Partial<Recipe> {

FILE: examples/automatic-validation/recipe.resolver.ts
  class RecipeResolver (line 8) | class RecipeResolver {
    method recipes (line 12) | async recipes(@Args() options: RecipesArguments): Promise<Recipe[]> {
    method addRecipe (line 19) | async addRecipe(@Arg("input") recipeInput: RecipeInput): Promise<Recip...

FILE: examples/automatic-validation/recipe.type.ts
  class Recipe (line 4) | class Recipe {

FILE: examples/automatic-validation/recipes.arguments.ts
  class RecipesArguments (line 5) | class RecipesArguments {

FILE: examples/custom-validation/helpers.ts
  function generateRecipes (line 3) | function generateRecipes(count: number): Recipe[] {

FILE: examples/custom-validation/index.ts
  function bootstrap (line 9) | async function bootstrap() {

FILE: examples/custom-validation/recipe.input.ts
  class RecipeInput (line 6) | class RecipeInput implements Partial<Recipe> {

FILE: examples/custom-validation/recipe.resolver.ts
  class RecipeResolver (line 8) | class RecipeResolver {
    method recipes (line 12) | async recipes(@Args() options: RecipesArguments): Promise<Recipe[]> {
    method addRecipe (line 19) | async addRecipe(@Arg("input") recipeInput: RecipeInput): Promise<Recip...

FILE: examples/custom-validation/recipe.type.ts
  class Recipe (line 4) | class Recipe {

FILE: examples/custom-validation/recipes.arguments.ts
  class RecipesArguments (line 5) | class RecipesArguments {

FILE: examples/enums-and-unions/cook.data.ts
  function createCook (line 3) | function createCook(cookData: Partial<Cook>): Cook {

FILE: examples/enums-and-unions/cook.type.ts
  class Cook (line 4) | class Cook {

FILE: examples/enums-and-unions/difficulty.enum.ts
  type Difficulty (line 3) | enum Difficulty {

FILE: examples/enums-and-unions/index.ts
  function bootstrap (line 8) | async function bootstrap() {

FILE: examples/enums-and-unions/recipe.data.ts
  function createRecipe (line 5) | function createRecipe(recipeData: Partial<Recipe>): Recipe {

FILE: examples/enums-and-unions/recipe.type.ts
  class Recipe (line 6) | class Recipe {

FILE: examples/enums-and-unions/resolver.ts
  class ExampleResolver (line 10) | class ExampleResolver {
    method recipes (line 16) | async recipes(
    method search (line 27) | async search(@Arg("cookName") cookName: string): Promise<Array<typeof ...

FILE: examples/extensions/context.type.ts
  type Context (line 3) | interface Context {

FILE: examples/extensions/index.ts
  function bootstrap (line 11) | async function bootstrap() {

FILE: examples/extensions/log-message.decorator.ts
  type LogOptions (line 3) | interface LogOptions {
  function LogMessage (line 8) | function LogMessage(messageOrOptions: string | LogOptions) {

FILE: examples/extensions/logger.middleware.ts
  type LoggerConfig (line 12) | interface LoggerConfig {
  class LoggerMiddleware (line 35) | class LoggerMiddleware implements MiddlewareInterface<Context> {
    method constructor (line 36) | constructor(private readonly logger: Logger) {}
    method use (line 38) | use({ context: { user }, info }: ResolverData<Context>, next: NextFn) {

FILE: examples/extensions/logger.service.ts
  class Logger (line 4) | class Logger {
    method log (line 5) | log(...args: unknown[]) {

FILE: examples/extensions/recipe.data.ts
  function createRecipe (line 3) | function createRecipe(recipeData: Partial<Recipe>): Recipe {

FILE: examples/extensions/recipe.type.ts
  class Recipe (line 7) | class Recipe {
    method averageRating (line 25) | get averageRating(): number | null {

FILE: examples/extensions/resolver.ts
  class RecipeResolver (line 9) | class RecipeResolver {
    method recipes (line 13) | async recipes(): Promise<Recipe[]> {
    method addRecipe (line 18) | addRecipe(
    method deleteRecipe (line 33) | deleteRecipe(@Arg("title") title: string): boolean {

FILE: examples/extensions/user.type.ts
  type User (line 1) | interface User {

FILE: examples/generic-types/index.ts
  function bootstrap (line 8) | async function bootstrap() {

FILE: examples/generic-types/paginated-response.type.ts
  function PaginatedResponse (line 3) | function PaginatedResponse<TItemsFieldValue extends object>(

FILE: examples/generic-types/recipe.data.ts
  function createSampleRecipes (line 3) | function createSampleRecipes(): Recipe[] {

FILE: examples/generic-types/recipe.resolver.ts
  class RecipesResponse (line 8) | @ObjectType()
  class RecipeResolver (line 14) | class RecipeResolver {
    method getRecipes (line 18) | getRecipes(
    method addSampleRecipe (line 30) | addSampleRecipe(): Recipe {

FILE: examples/generic-types/recipe.type.ts
  class Recipe (line 4) | class Recipe {

FILE: examples/graphql-scalars/index.ts
  function bootstrap (line 8) | async function bootstrap() {

FILE: examples/graphql-scalars/recipe.data.ts
  function createRecipe (line 3) | function createRecipe(recipeData: Partial<Recipe>) {
  function createRecipeSamples (line 7) | function createRecipeSamples() {

FILE: examples/graphql-scalars/recipe.input.ts
  class RecipeInput (line 6) | class RecipeInput implements Partial<Recipe> {

FILE: examples/graphql-scalars/recipe.resolver.ts
  class RecipeResolver (line 17) | class RecipeResolver implements ResolverInterface<Recipe> {
    method recipe (line 21) | async recipe(@Arg("title") title: string): Promise<Recipe | undefined> {
    method recipes (line 26) | async recipes(): Promise<Recipe[]> {
    method addRecipe (line 31) | async addRecipe(@Arg("recipe") recipeInput: RecipeInput): Promise<Reci...
    method ratingsCount (line 44) | ratingsCount(

FILE: examples/graphql-scalars/recipe.type.ts
  class Recipe (line 10) | class Recipe {
    method specification (line 18) | get specification(): string | undefined {
    method averageRating (line 38) | get averageRating(): number | null {

FILE: examples/interfaces-inheritance/employee/employee.input.ts
  class EmployeeInput (line 5) | class EmployeeInput extends PersonInput {

FILE: examples/interfaces-inheritance/employee/employee.type.ts
  class Employee (line 5) | class Employee extends Person {

FILE: examples/interfaces-inheritance/helpers.ts
  function getId (line 3) | function getId(): string {
  function calculateAge (line 10) | function calculateAge(birthday: Date) {

FILE: examples/interfaces-inheritance/index.ts
  function bootstrap (line 9) | async function bootstrap() {

FILE: examples/interfaces-inheritance/person/person.input.ts
  class PersonInput (line 4) | class PersonInput {

FILE: examples/interfaces-inheritance/person/person.interface.ts
  method avatar (line 19) | avatar(@Arg("size") _size: number): string {

FILE: examples/interfaces-inheritance/person/person.type.ts
  class Person (line 5) | class Person implements IPerson {
    method avatar (line 13) | avatar(@Arg("size") size: number): string {

FILE: examples/interfaces-inheritance/resolver.ts
  class MultiResolver (line 8) | class MultiResolver {
    method persons (line 12) | persons(): IPerson[] {
    method addStudent (line 19) | addStudent(@Arg("input") input: StudentInput): Student {
    method addEmployee (line 32) | addEmployee(@Arg("input") input: EmployeeInput): Employee {

FILE: examples/interfaces-inheritance/student/student.input.ts
  class StudentInput (line 5) | class StudentInput extends PersonInput {

FILE: examples/interfaces-inheritance/student/student.type.ts
  class Student (line 5) | class Student extends Person {

FILE: examples/middlewares-custom-decorators/context.type.ts
  type Context (line 3) | interface Context {

FILE: examples/middlewares-custom-decorators/decorators/current-user.ts
  function CurrentUser (line 4) | function CurrentUser() {

FILE: examples/middlewares-custom-decorators/decorators/random-id-arg.ts
  constant MAX_ID_VALUE (line 3) | const MAX_ID_VALUE = 3;
  function RandomIdArg (line 5) | function RandomIdArg(argName = "id") {

FILE: examples/middlewares-custom-decorators/decorators/validate-args.ts
  function ValidateArgs (line 10) | function ValidateArgs<T extends object>(Type: ClassType<T>) {

FILE: examples/middlewares-custom-decorators/index.ts
  function bootstrap (line 11) | async function bootstrap() {

FILE: examples/middlewares-custom-decorators/logger.ts
  class Logger (line 4) | class Logger {
    method log (line 5) | log(...args: any[]) {

FILE: examples/middlewares-custom-decorators/middlewares/error-logger.ts
  class ErrorLoggerMiddleware (line 12) | class ErrorLoggerMiddleware implements MiddlewareInterface<Context> {
    method constructor (line 13) | constructor(private readonly logger: Logger) {}
    method use (line 15) | async use({ context, info }: ResolverData<Context>, next: NextFn) {

FILE: examples/middlewares-custom-decorators/middlewares/log-access.ts
  class LogAccessMiddleware (line 7) | class LogAccessMiddleware implements MiddlewareInterface<Context> {
    method constructor (line 8) | constructor(private readonly logger: Logger) {}
    method use (line 10) | async use({ context, info }: ResolverData<Context>, next: NextFn) {

FILE: examples/middlewares-custom-decorators/middlewares/number-interceptor.ts
  function NumberInterceptor (line 3) | function NumberInterceptor(minValue: number): MiddlewareFn {

FILE: examples/middlewares-custom-decorators/recipe/recipe.args.ts
  class RecipesArgs (line 5) | class RecipesArgs {

FILE: examples/middlewares-custom-decorators/recipe/recipe.data.ts
  function createRecipe (line 5) | function createRecipe(recipeData: Partial<Recipe>): Recipe {

FILE: examples/middlewares-custom-decorators/recipe/recipe.resolver.ts
  class RecipeResolver (line 14) | class RecipeResolver {
    method recipe (line 18) | async recipe(@RandomIdArg("id") id: number) {
    method recipes (line 25) | async recipes(

FILE: examples/middlewares-custom-decorators/recipe/recipe.type.ts
  class Recipe (line 5) | class Recipe {
    method averageRating (line 21) | get averageRating(): number | null {

FILE: examples/middlewares-custom-decorators/user.type.ts
  type User (line 1) | interface User {

FILE: examples/mikro-orm/context.type.ts
  type Context (line 4) | interface Context {

FILE: examples/mikro-orm/entities/rating.ts
  class Rating (line 8) | class Rating {

FILE: examples/mikro-orm/entities/recipe.ts
  class Recipe (line 8) | class Recipe {

FILE: examples/mikro-orm/entities/user.ts
  class User (line 6) | class User {

FILE: examples/mikro-orm/helpers.ts
  function seedDatabase (line 4) | async function seedDatabase(em: EntityManager) {

FILE: examples/mikro-orm/index.ts
  function bootstrap (line 14) | async function bootstrap() {

FILE: examples/mikro-orm/resolvers/rating.resolver.ts
  class RatingResolver (line 6) | class RatingResolver {
    method user (line 8) | async user(@Root() rating: Rating, @Ctx() { entityManager }: Context):...

FILE: examples/mikro-orm/resolvers/recipe.resolver.ts
  class RecipeResolver (line 7) | class RecipeResolver {
    method recipe (line 9) | recipe(@Arg("recipeId", _type => Int) recipeId: number, @Ctx() { entit...
    method recipes (line 14) | recipes(@Ctx() { entityManager }: Context): Promise<Recipe[]> {
    method addRecipe (line 19) | async addRecipe(
    method rate (line 33) | async rate(
    method ratings (line 60) | ratings(@Root() recipe: Recipe, @Ctx() { entityManager }: Context) {
    method author (line 65) | async author(@Root() recipe: Recipe, @Ctx() { entityManager }: Context...

FILE: examples/mikro-orm/resolvers/types/rating.input.ts
  class RatingInput (line 4) | class RatingInput {

FILE: examples/mikro-orm/resolvers/types/recipe.input.ts
  class RecipeInput (line 5) | class RecipeInput implements Partial<Recipe> {

FILE: examples/mixin-classes/index.ts
  function bootstrap (line 8) | async function bootstrap() {

FILE: examples/mixin-classes/inputs/amend.user.input.ts
  class AmendUserInput (line 7) | class AmendUserInput extends withId(UserDetails) {}

FILE: examples/mixin-classes/inputs/create.user.input.ts
  class CreateUserInput (line 7) | class CreateUserInput extends withPassword(UserDetails) {}

FILE: examples/mixin-classes/mixins/with.id.ts
  function withId (line 4) | function withId<TClassType extends ClassType>(BaseClass: TClassType) {

FILE: examples/mixin-classes/mixins/with.password.ts
  function withPassword (line 5) | function withPassword<TClassType extends ClassType>(BaseClass: TClassTyp...

FILE: examples/mixin-classes/resolver.ts
  class UserResolver (line 6) | class UserResolver {
    method users (line 12) | async users(): Promise<User[]> {
    method createUser (line 17) | async createUser(@Arg("input") userData: CreateUserInput): Promise<Use...
    method amendUser (line 26) | async amendUser(@Arg("input") { id, ...userData }: AmendUserInput): Pr...

FILE: examples/mixin-classes/types/user.details.ts
  class UserDetails (line 7) | class UserDetails {

FILE: examples/mixin-classes/types/user.ts
  class User (line 7) | class User extends withId(UserDetails) {

FILE: examples/query-complexity/index.ts
  constant MAX_COMPLEXITY (line 10) | const MAX_COMPLEXITY = 20;
  function bootstrap (line 12) | async function bootstrap() {

FILE: examples/query-complexity/recipe.data.ts
  function createRecipe (line 3) | function createRecipe(recipeData: Partial<Recipe>): Recipe {
  function createRecipeSamples (line 7) | function createRecipeSamples() {

FILE: examples/query-complexity/recipe.resolver.ts
  class RecipeResolver (line 6) | class RecipeResolver implements ResolverInterface<Recipe> {
    method recipes (line 19) | async recipes(@Arg("count") count: number): Promise<Recipe[]> {
    method ratingsCount (line 25) | ratingsCount(@Root() recipe: Recipe): number {

FILE: examples/query-complexity/recipe.type.ts
  class Recipe (line 4) | class Recipe {
    method averageRating (line 17) | get averageRating(): number | null {

FILE: examples/redis-subscriptions/comment.input.ts
  class CommentInput (line 5) | class CommentInput implements Partial<Comment> {

FILE: examples/redis-subscriptions/comment.type.ts
  class Comment (line 4) | class Comment {
  type NewCommentPayload (line 15) | interface NewCommentPayload {

FILE: examples/redis-subscriptions/index.ts
  function bootstrap (line 10) | async function bootstrap() {

FILE: examples/redis-subscriptions/pubsub.ts
  type Topic (line 11) | const enum Topic {

FILE: examples/redis-subscriptions/recipe.data.ts
  function createRecipe (line 4) | function createRecipe(recipeData: Partial<Recipe>): Recipe {
  function createComment (line 8) | function createComment(commentData: Partial<Comment>): Comment {

FILE: examples/redis-subscriptions/recipe.resolver.args.ts
  class NewCommentsArgs (line 4) | class NewCommentsArgs {

FILE: examples/redis-subscriptions/recipe.resolver.ts
  class RecipeResolver (line 20) | class RecipeResolver {
    method recipe (line 24) | async recipe(@Arg("id", _type => ID) id: string) {
    method addNewComment (line 29) | async addNewComment(@Arg("comment") input: CommentInput): Promise<bool...
    method newComments (line 57) | newComments(@Root() newComment: NewCommentPayload, @Args() _args: NewC...

FILE: examples/redis-subscriptions/recipe.type.ts
  class Recipe (line 5) | class Recipe {

FILE: examples/resolvers-inheritance/index.ts
  function bootstrap (line 10) | async function bootstrap() {

FILE: examples/resolvers-inheritance/person/person.resolver.ts
  class PersonResolver (line 24) | class PersonResolver extends ResourceResolver(Person, persons) {
    method promote (line 28) | promote(@Arg("personId", _type => Int) personId: number): boolean {

FILE: examples/resolvers-inheritance/person/person.role.ts
  type PersonRole (line 3) | enum PersonRole {

FILE: examples/resolvers-inheritance/person/person.type.ts
  class Person (line 6) | class Person implements Resource {

FILE: examples/resolvers-inheritance/recipe/recipe.resolver.ts
  class RecipeResolver (line 16) | class RecipeResolver extends ResourceResolver(Recipe, recipes) {
    method averageRating (line 20) | averageRating(@Root() recipe: Recipe): number {

FILE: examples/resolvers-inheritance/recipe/recipe.type.ts
  class Recipe (line 5) | class Recipe implements Resource {

FILE: examples/resolvers-inheritance/resource/resource.args.ts
  class GetAllArgs (line 4) | class GetAllArgs {

FILE: examples/resolvers-inheritance/resource/resource.resolver.ts
  function ResourceResolver (line 8) | function ResourceResolver<TResource extends Resource>(

FILE: examples/resolvers-inheritance/resource/resource.service.factory.ts
  class ResourceServiceFactory (line 7) | class ResourceServiceFactory {
    method create (line 8) | create<TResource extends Resource>(resources?: TResource[]) {

FILE: examples/resolvers-inheritance/resource/resource.service.ts
  class ResourceService (line 3) | class ResourceService<TResource extends Resource> {
    method constructor (line 4) | constructor(protected resources: TResource[] = []) {}
    method getOne (line 6) | getOne(id: number): TResource | undefined {
    method getAll (line 10) | getAll(skip: number, take: number): TResource[] {

FILE: examples/resolvers-inheritance/resource/resource.ts
  type Resource (line 1) | interface Resource {

FILE: examples/simple-subscriptions/index.ts
  function bootstrap (line 9) | async function bootstrap() {

FILE: examples/simple-subscriptions/notification.resolver.ts
  class NotificationResolver (line 16) | class NotificationResolver {
    method currentDate (line 20) | currentDate() {
    method pubSubMutation (line 25) | async pubSubMutation(@Arg("message", { nullable: true }) message?: str...
    method normalSubscription (line 33) | normalSubscription(@Root() { id, message }: NotificationPayload): Noti...
    method subscriptionWithFilter (line 41) | subscriptionWithFilter(@Root() { id, message }: NotificationPayload) {
    method subscriptionWithMultipleTopics (line 52) | subscriptionWithMultipleTopics(@Root() { id, message }: NotificationPa...
    method publishToDynamicTopic (line 60) | async publishToDynamicTopic(
    method subscribeToTopicFromArg (line 73) | subscribeToTopicFromArg(
    method publishWithDynamicTopicId (line 83) | async publishWithDynamicTopicId(
    method subscribeToTopicIdFromArg (line 97) | subscribeToTopicIdFromArg(

FILE: examples/simple-subscriptions/notification.type.ts
  class Notification (line 4) | class Notification {
  type NotificationPayload (line 15) | interface NotificationPayload {

FILE: examples/simple-subscriptions/pubsub.ts
  type Topic (line 4) | const enum Topic {

FILE: examples/simple-usage/index.ts
  function bootstrap (line 8) | async function bootstrap() {

FILE: examples/simple-usage/recipe.data.ts
  function createRecipe (line 3) | function createRecipe(recipeData: Partial<Recipe>) {
  function createRecipeSamples (line 7) | function createRecipeSamples() {

FILE: examples/simple-usage/recipe.input.ts
  class RecipeInput (line 5) | class RecipeInput implements Partial<Recipe> {

FILE: examples/simple-usage/recipe.resolver.ts
  class RecipeResolver (line 16) | class RecipeResolver implements ResolverInterface<Recipe> {
    method recipe (line 20) | async recipe(@Arg("title") title: string): Promise<Recipe | undefined> {
    method recipes (line 25) | async recipes(): Promise<Recipe[]> {
    method addRecipe (line 30) | async addRecipe(@Arg("recipe") recipeInput: RecipeInput): Promise<Reci...
    method ratingsCount (line 43) | ratingsCount(

FILE: examples/simple-usage/recipe.type.ts
  class Recipe (line 4) | class Recipe {
    method specification (line 9) | get specification(): string | undefined {
    method averageRating (line 26) | get averageRating(): number | null {

FILE: examples/tsyringe/index.ts
  function bootstrap (line 13) | async function bootstrap() {

FILE: examples/tsyringe/recipe.data.ts
  function createRecipe (line 3) | function createRecipe(recipeData: Partial<Recipe>): Recipe {

FILE: examples/tsyringe/recipe.input.ts
  class RecipeInput (line 5) | class RecipeInput implements Partial<Recipe> {

FILE: examples/tsyringe/recipe.resolver.ts
  class RecipeResolver (line 9) | class RecipeResolver {
    method constructor (line 10) | constructor(
    method recipe (line 17) | async recipe(@Arg("recipeId") recipeId: string) {
    method recipes (line 22) | async recipes(): Promise<Recipe[]> {
    method addRecipe (line 27) | async addRecipe(@Arg("recipe") recipe: RecipeInput): Promise<Recipe> {
    method numberInCollection (line 32) | async numberInCollection(@Root() recipe: Recipe): Promise<number> {

FILE: examples/tsyringe/recipe.service.ts
  class RecipeService (line 5) | class RecipeService {
    method constructor (line 8) | constructor(
    method getAll (line 15) | async getAll() {
    method getOne (line 19) | async getOne(id: string) {
    method add (line 23) | async add(data: RecipeInput) {
    method findIndex (line 30) | async findIndex(recipe: Recipe) {
    method createRecipe (line 34) | private createRecipe(recipeData: Partial<Recipe>): Recipe {
    method getId (line 41) | private getId(): string {

FILE: examples/tsyringe/recipe.type.ts
  class Recipe (line 4) | class Recipe {
    method ingredientsLength (line 21) | protected get ingredientsLength(): number {

FILE: examples/typegoose/context.type.ts
  type Context (line 3) | interface Context {

FILE: examples/typegoose/entities/rating.ts
  class Rating (line 7) | class Rating {

FILE: examples/typegoose/entities/recipe.ts
  class Recipe (line 9) | class Recipe {

FILE: examples/typegoose/entities/user.ts
  class User (line 6) | class User {

FILE: examples/typegoose/helpers.ts
  function seedDatabase (line 3) | async function seedDatabase() {

FILE: examples/typegoose/index.ts
  function bootstrap (line 14) | async function bootstrap() {

FILE: examples/typegoose/object-id.scalar.ts
  method serialize (line 7) | serialize(value: unknown): string {
  method parseValue (line 13) | parseValue(value: unknown): Types.ObjectId {
  method parseLiteral (line 19) | parseLiteral(ast): Types.ObjectId {

FILE: examples/typegoose/resolvers/rating.resolver.ts
  class RatingResolver (line 5) | class RatingResolver {
    method user (line 7) | async user(@Root() rating: Rating): Promise<User> {

FILE: examples/typegoose/resolvers/recipe.resolver.ts
  class RecipeResolver (line 9) | class RecipeResolver {
    method recipe (line 11) | recipe(@Arg("recipeId", () => ObjectIdScalar) recipeId: Types.ObjectId) {
    method recipes (line 16) | async recipes(): Promise<Recipe[]> {
    method addRecipe (line 21) | async addRecipe(
    method rating (line 36) | async rating(@Arg("rating") ratingInput: RatingInput, @Ctx() { user }:...
    method author (line 58) | async author(@Root() recipe: Recipe): Promise<User> {

FILE: examples/typegoose/resolvers/types/rating.input.ts
  class RatingInput (line 5) | class RatingInput {

FILE: examples/typegoose/resolvers/types/recipe.input.ts
  class RecipeInput (line 5) | class RecipeInput implements Partial<Recipe> {

FILE: examples/typegoose/typegoose.middleware.ts
  function convertDocument (line 5) | function convertDocument(doc: Document) {

FILE: examples/typegoose/types.ts
  type Ref (line 3) | type Ref<T> = T | Types.ObjectId;

FILE: examples/typeorm-basic-usage/context.type.ts
  type Context (line 3) | interface Context {

FILE: examples/typeorm-basic-usage/entities/rating.ts
  class Rating (line 15) | class Rating {

FILE: examples/typeorm-basic-usage/entities/recipe.ts
  class Recipe (line 8) | class Recipe {

FILE: examples/typeorm-basic-usage/entities/user.ts
  class User (line 6) | class User {

FILE: examples/typeorm-basic-usage/helpers.ts
  function seedDatabase (line 4) | async function seedDatabase() {

FILE: examples/typeorm-basic-usage/index.ts
  function bootstrap (line 12) | async function bootstrap() {

FILE: examples/typeorm-basic-usage/resolvers/rating.resolver.ts
  class RatingResolver (line 7) | class RatingResolver {
    method constructor (line 10) | constructor() {
    method user (line 15) | async user(@Root() rating: Rating): Promise<User> {

FILE: examples/typeorm-basic-usage/resolvers/recipe.resolver.ts
  class RecipeResolver (line 9) | class RecipeResolver {
    method constructor (line 16) | constructor() {
    method recipe (line 23) | recipe(@Arg("recipeId", _type => Int) recipeId: number) {
    method recipes (line 28) | recipes(): Promise<Recipe[]> {
    method addRecipe (line 33) | async addRecipe(
    method rating (line 45) | async rating(@Arg("rating") ratingInput: RatingInput, @Ctx() { user }:...
    method ratings (line 69) | ratings(@Root() recipe: Recipe) {
    method author (line 77) | async author(@Root() recipe: Recipe): Promise<User> {

FILE: examples/typeorm-basic-usage/resolvers/types/rating.input.ts
  class RatingInput (line 4) | class RatingInput {

FILE: examples/typeorm-basic-usage/resolvers/types/recipe.input.ts
  class RecipeInput (line 5) | class RecipeInput implements Partial<Recipe> {

FILE: examples/typeorm-lazy-relations/context.type.ts
  type Context (line 3) | interface Context {

FILE: examples/typeorm-lazy-relations/entities/rating.ts
  class Rating (line 8) | class Rating {

FILE: examples/typeorm-lazy-relations/entities/recipe.ts
  class Recipe (line 8) | class Recipe {

FILE: examples/typeorm-lazy-relations/entities/user.ts
  class User (line 7) | class User {

FILE: examples/typeorm-lazy-relations/helpers.ts
  function seedDatabase (line 4) | async function seedDatabase() {

FILE: examples/typeorm-lazy-relations/index.ts
  function bootstrap (line 12) | async function bootstrap() {

FILE: examples/typeorm-lazy-relations/resolvers/recipe.resolver.ts
  class RecipeResolver (line 9) | class RecipeResolver {
    method constructor (line 14) | constructor() {
    method recipe (line 20) | recipe(@Arg("recipeId", _type => Int) recipeId: number) {
    method recipes (line 25) | recipes(): Promise<Recipe[]> {
    method addRecipe (line 30) | addRecipe(@Arg("recipe") recipeInput: RecipeInput, @Ctx() { user }: Co...
    method rating (line 39) | async rating(@Ctx() { user }: Context, @Arg("rating") rateInput: Ratin...

FILE: examples/typeorm-lazy-relations/resolvers/types/rating.input.ts
  class RatingInput (line 4) | class RatingInput {

FILE: examples/typeorm-lazy-relations/resolvers/types/recipe.input.ts
  class RecipeInput (line 5) | class RecipeInput implements Partial<Recipe> {

FILE: examples/using-container/index.ts
  function bootstrap (line 13) | async function bootstrap() {

FILE: examples/using-container/recipe.data.ts
  function createRecipe (line 3) | function createRecipe(recipeData: Partial<Recipe>): Recipe {

FILE: examples/using-container/recipe.input.ts
  class RecipeInput (line 5) | class RecipeInput implements Partial<Recipe> {

FILE: examples/using-container/recipe.resolver.ts
  class RecipeResolver (line 9) | class RecipeResolver {
    method constructor (line 10) | constructor(
    method recipe (line 17) | async recipe(@Arg("recipeId") recipeId: string) {
    method recipes (line 22) | async recipes(): Promise<Recipe[]> {
    method addRecipe (line 27) | async addRecipe(@Arg("recipe") recipe: RecipeInput): Promise<Recipe> {
    method numberInCollection (line 32) | async numberInCollection(@Root() recipe: Recipe): Promise<number> {

FILE: examples/using-container/recipe.service.ts
  class RecipeService (line 6) | class RecipeService {
    method constructor (line 9) | constructor(
    method getAll (line 16) | async getAll() {
    method getOne (line 20) | async getOne(id: string) {
    method add (line 24) | async add(data: RecipeInput) {
    method findIndex (line 31) | async findIndex(recipe: Recipe) {
    method createRecipe (line 35) | private createRecipe(recipeData: Partial<Recipe>): Recipe {
    method getId (line 42) | private getId(): string {

FILE: examples/using-container/recipe.type.ts
  class Recipe (line 4) | class Recipe {
    method ingredientsLength (line 21) | protected get ingredientsLength(): number {

FILE: examples/using-scoped-container/context.type.ts
  type Context (line 3) | interface Context {

FILE: examples/using-scoped-container/index.ts
  function bootstrap (line 11) | async function bootstrap() {

FILE: examples/using-scoped-container/logger.ts
  class Logger (line 6) | class Logger {
    method constructor (line 7) | constructor(@Inject("context") private readonly context: Context) {
    method log (line 11) | log(...messages: any[]) {

FILE: examples/using-scoped-container/recipe/recipe.data.ts
  function createRecipe (line 4) | function createRecipe(recipeData: Partial<Recipe>): Recipe {
  function setSamplesInContainer (line 28) | function setSamplesInContainer() {

FILE: examples/using-scoped-container/recipe/recipe.input.ts
  class RecipeInput (line 5) | class RecipeInput implements Partial<Recipe> {

FILE: examples/using-scoped-container/recipe/recipe.resolver.ts
  class RecipeResolver (line 17) | class RecipeResolver {
    method constructor (line 18) | constructor(
    method recipe (line 28) | async recipe(@Arg("recipeId") recipeId: string, @Ctx() { requestId }: ...
    method recipes (line 39) | async recipes(): Promise<Recipe[]> {
    method addRecipe (line 45) | async addRecipe(@Arg("recipe") recipe: RecipeInput): Promise<Recipe> {

FILE: examples/using-scoped-container/recipe/recipe.service.ts
  class RecipeService (line 7) | class RecipeService {
    method constructor (line 10) | constructor(@Inject("SAMPLE_RECIPES") private readonly items: Recipe[]) {
    method getAll (line 15) | async getAll() {
    method getOne (line 19) | async getOne(id: string) {
    method add (line 23) | async add(data: RecipeInput) {
    method createRecipe (line 30) | private createRecipe(recipeData: Partial<Recipe>): Recipe {
    method getId (line 39) | private getId(): string {

FILE: examples/using-scoped-container/recipe/recipe.type.ts
  class Recipe (line 4) | class Recipe {

FILE: scripts/markdown.ts
  function toUrlPath (line 9) | function toUrlPath(
  function escapeRegExp (line 18) | function escapeRegExp(string: string): string {
  type Analyze (line 22) | const enum Analyze {

FILE: scripts/package.json.ts
  type TsConfig (line 8) | type TsConfig = Omit<typescript.ParsedCommandLine, "raw"> & { raw: { inc...
  function readTsConfig (line 10) | function readTsConfig(fileName: string): TsConfig {
  function writePackageJson (line 28) | function writePackageJson(fileName: string, fileContent: string | NodeJS...

FILE: src/decorators/Arg.ts
  type ArgOptions (line 13) | type ArgOptions = DecoratorTypeOptions &
  function Arg (line 24) | function Arg(

FILE: src/decorators/Args.ts
  function Args (line 13) | function Args(

FILE: src/decorators/ArgsType.ts
  function ArgsType (line 3) | function ArgsType(): ClassDecorator {

FILE: src/decorators/Authorized.ts
  function Authorized (line 11) | function Authorized<RoleType = string>(

FILE: src/decorators/Ctx.ts
  function Ctx (line 5) | function Ctx(propertyName?: string): ParameterDecorator {

FILE: src/decorators/Directive.ts
  function Directive (line 8) | function Directive(

FILE: src/decorators/Extensions.ts
  function Extensions (line 7) | function Extensions(

FILE: src/decorators/Field.ts
  type FieldOptions (line 7) | type FieldOptions = AdvancedOptions & {
  function Field (line 18) | function Field(

FILE: src/decorators/FieldResolver.ts
  function FieldResolver (line 18) | function FieldResolver(

FILE: src/decorators/Info.ts
  function Info (line 5) | function Info(): ParameterDecorator {

FILE: src/decorators/InputType.ts
  type InputTypeOptions (line 5) | type InputTypeOptions = DescriptionOptions;
  function InputType (line 10) | function InputType(

FILE: src/decorators/InterfaceType.ts
  type InterfaceTypeOptions (line 9) | type InterfaceTypeOptions = DescriptionOptions &
  function InterfaceType (line 22) | function InterfaceType(

FILE: src/decorators/Mutation.ts
  function Mutation (line 12) | function Mutation(

FILE: src/decorators/ObjectType.ts
  type ObjectTypeOptions (line 5) | type ObjectTypeOptions = DescriptionOptions &
  function ObjectType (line 14) | function ObjectType(

FILE: src/decorators/Query.ts
  function Query (line 9) | function Query(

FILE: src/decorators/Resolver.ts
  function Resolver (line 8) | function Resolver(objectTypeOrTypeFunc?: Function): ClassDecorator {

FILE: src/decorators/Root.ts
  function Root (line 7) | function Root(propertyName?: string): ParameterDecorator {

FILE: src/decorators/Subscription.ts
  type PubSubOptions (line 15) | interface PubSubOptions {
  type SubscribeOptions (line 21) | interface SubscribeOptions {
  type SubscriptionOptions (line 25) | type SubscriptionOptions = AdvancedOptions & MergeExclusive<PubSubOption...
  function Subscription (line 32) | function Subscription(

FILE: src/decorators/UseMiddleware.ts
  function UseMiddleware (line 9) | function UseMiddleware(

FILE: src/decorators/createMethodMiddlewareDecorator.ts
  function createMethodMiddlewareDecorator (line 4) | function createMethodMiddlewareDecorator<TContextType extends object = o...

FILE: src/decorators/createParameterDecorator.ts
  type CustomParameterOptions (line 9) | interface CustomParameterOptions {
  type ParameterResolver (line 17) | type ParameterResolver<TContextType extends object = object> = (
  function createParameterDecorator (line 21) | function createParameterDecorator<TContextType extends object = object>(

FILE: src/decorators/createResolverClassMiddlewareDecorator.ts
  function createResolverClassMiddlewareDecorator (line 4) | function createResolverClassMiddlewareDecorator<TContextType extends obj...

FILE: src/decorators/enums.ts
  function registerEnumType (line 4) | function registerEnumType<TEnum extends object>(

FILE: src/decorators/types.ts
  type RecursiveArray (line 13) | type RecursiveArray<TValue> = Array<RecursiveArray<TValue> | TValue>;
  type TypeValue (line 15) | type TypeValue = ClassType | GraphQLScalarType | Function | object | sym...
  type ReturnTypeFuncValue (line 16) | type ReturnTypeFuncValue = TypeValue | RecursiveArray<TypeValue>;
  type TypeValueThunk (line 18) | type TypeValueThunk = (type?: void) => TypeValue;
  type ClassTypeResolver (line 19) | type ClassTypeResolver = (of?: void) => ClassType | Function;
  type ReturnTypeFunc (line 21) | type ReturnTypeFunc = (returns?: void) => ReturnTypeFuncValue;
  type SubscriptionFilterFunc (line 23) | type SubscriptionFilterFunc = (
  type SubscriptionTopicsFunc (line 27) | type SubscriptionTopicsFunc = (
  type SubscriptionSubscribeFunc (line 31) | type SubscriptionSubscribeFunc = (
  type SubscriptionTopicIdFunc (line 35) | type SubscriptionTopicIdFunc = (resolverData: SubscribeResolverData<any,...
  type DecoratorTypeOptions (line 37) | interface DecoratorTypeOptions {
  type NullableListOptions (line 42) | type NullableListOptions = "items" | "itemsAndList";
  type TypeOptions (line 44) | interface TypeOptions extends DecoratorTypeOptions {
  type DescriptionOptions (line 48) | interface DescriptionOptions {
  type DeprecationOptions (line 51) | interface DeprecationOptions {
  type ValidateOptions (line 54) | interface ValidateOptions {
  type ComplexityOptions (line 58) | interface ComplexityOptions {
  type SchemaNameOptions (line 61) | interface SchemaNameOptions {
  type ImplementsClassOptions (line 64) | interface ImplementsClassOptions {
  type ResolveTypeOptions (line 67) | interface ResolveTypeOptions<TSource = any, TContext = any> {
  type BasicOptions (line 70) | type BasicOptions = DecoratorTypeOptions & DescriptionOptions;
  type AdvancedOptions (line 71) | type AdvancedOptions = BasicOptions &
  type EnumConfig (line 76) | interface EnumConfig<TEnum extends object> {
  type EnumValuesConfig (line 81) | type EnumValuesConfig<TEnum extends object> = Partial<
  type MethodAndPropDecorator (line 85) | type MethodAndPropDecorator = PropertyDecorator & MethodDecorator;
  type MethodPropClassDecorator (line 87) | type MethodPropClassDecorator = PropertyDecorator & MethodDecorator & Cl...

FILE: src/decorators/unions.ts
  type UnionTypeConfig (line 6) | type UnionTypeConfig<TClassTypes extends readonly ClassType[]> = {
  function createUnionType (line 15) | function createUnionType({

FILE: src/errors/CannotDetermineGraphQLTypeError.ts
  class CannotDetermineGraphQLTypeError (line 1) | class CannotDetermineGraphQLTypeError extends Error {
    method constructor (line 2) | constructor(

FILE: src/errors/ConflictingDefaultValuesError.ts
  class ConflictingDefaultValuesError (line 1) | class ConflictingDefaultValuesError extends Error {
    method constructor (line 2) | constructor(

FILE: src/errors/GeneratingSchemaError.ts
  class GeneratingSchemaError (line 3) | class GeneratingSchemaError extends Error {
    method constructor (line 6) | constructor(details: readonly GraphQLError[]) {

FILE: src/errors/InterfaceResolveTypeError.ts
  class InterfaceResolveTypeError (line 3) | class InterfaceResolveTypeError extends Error {
    method constructor (line 4) | constructor(interfaceMetadata: ClassMetadata) {

FILE: src/errors/InvalidDirectiveError.ts
  class InvalidDirectiveError (line 1) | class InvalidDirectiveError extends Error {
    method constructor (line 2) | constructor(msg: string) {

FILE: src/errors/MissingPubSubError.ts
  class MissingPubSubError (line 1) | class MissingPubSubError extends Error {
    method constructor (line 2) | constructor() {

FILE: src/errors/MissingSubscriptionTopicsError.ts
  class MissingSubscriptionTopicsError (line 1) | class MissingSubscriptionTopicsError extends Error {
    method constructor (line 2) | constructor(target: Function, methodName: string) {

FILE: src/errors/NoExplicitTypeError.ts
  class NoExplicitTypeError (line 1) | class NoExplicitTypeError extends Error {
    method constructor (line 2) | constructor(typeName: string, propertyKey: string, parameterIndex?: nu...

FILE: src/errors/ReflectMetadataMissingError.ts
  class ReflectMetadataMissingError (line 1) | class ReflectMetadataMissingError extends Error {
    method constructor (line 2) | constructor() {

FILE: src/errors/SymbolKeysNotSupportedError.ts
  class SymbolKeysNotSupportedError (line 1) | class SymbolKeysNotSupportedError extends Error {
    method constructor (line 2) | constructor() {

FILE: src/errors/UnionResolveTypeError.ts
  class UnionResolveTypeError (line 3) | class UnionResolveTypeError extends Error {
    method constructor (line 4) | constructor(unionMetadata: UnionMetadata) {

FILE: src/errors/UnmetGraphQLPeerDependencyError.ts
  class UnmetGraphQLPeerDependencyError (line 1) | class UnmetGraphQLPeerDependencyError extends Error {
    method constructor (line 2) | constructor(graphQLVersion: string, graphQLPeerDependencyVersion: stri...

FILE: src/errors/WrongNullableListOptionError.ts
  class WrongNullableListOptionError (line 3) | class WrongNullableListOptionError extends Error {
    method constructor (line 4) | constructor(

FILE: src/errors/graphql/ArgumentValidationError.ts
  class ArgumentValidationError (line 6) | class ArgumentValidationError extends GraphQLError {
    method constructor (line 13) | constructor(validationErrors: ValidationError[]) {

FILE: src/errors/graphql/AuthenticationError.ts
  class AuthenticationError (line 3) | class AuthenticationError extends GraphQLError {
    method constructor (line 9) | constructor(message = "Access denied! You need to be authenticated to ...

FILE: src/errors/graphql/AuthorizationError.ts
  class AuthorizationError (line 3) | class AuthorizationError extends GraphQLError {
    method constructor (line 9) | constructor(message = "Access denied! You don't have permission for th...

FILE: src/helpers/auth-middleware.ts
  function AuthMiddleware (line 6) | function AuthMiddleware(

FILE: src/helpers/decorators.ts
  type TypeDecoratorParams (line 3) | interface TypeDecoratorParams<T> {
  function getTypeDecoratorParams (line 7) | function getTypeDecoratorParams<T extends object>(
  function getNameDecoratorParams (line 22) | function getNameDecoratorParams<T extends DescriptionOptions>(
  function getArrayFromOverloadedRest (line 37) | function getArrayFromOverloadedRest<T>(overloadedArray: Array<T | readon...

FILE: src/helpers/filesystem.ts
  function outputFile (line 5) | async function outputFile(filePath: string, fileContent: any) {
  function outputFileSync (line 17) | function outputFileSync(filePath: string, fileContent: any) {

FILE: src/helpers/findType.ts
  type MetadataKey (line 12) | type MetadataKey = "design:type" | "design:returntype" | "design:paramty...
  type TypeInfo (line 14) | interface TypeInfo {
  type GetTypeParams (line 19) | interface GetTypeParams {
  function findTypeValueArrayDepth (line 29) | function findTypeValueArrayDepth(
  function findType (line 39) | function findType({

FILE: src/helpers/isThrowing.ts
  function isThrowing (line 1) | function isThrowing(fn: () => void) {

FILE: src/helpers/params.ts
  type ParamInfo (line 6) | interface ParamInfo {
  function getParamInfo (line 14) | function getParamInfo({

FILE: src/helpers/resolver-metadata.ts
  function getResolverMetadata (line 6) | function getResolverMetadata(

FILE: src/helpers/types.ts
  function wrapTypeInNestedList (line 15) | function wrapTypeInNestedList(
  function convertTypeIfScalar (line 28) | function convertTypeIfScalar(type: any): GraphQLScalarType | undefined {
  function wrapWithTypeOptions (line 51) | function wrapWithTypeOptions<T extends GraphQLType>(
  function convertToType (line 87) | function convertToType(Target: any, data?: object): object | undefined {
  function getEnumValuesMap (line 123) | function getEnumValuesMap<T extends object>(enumObject: T) {

FILE: src/helpers/utils.ts
  type ArrayElements (line 1) | type ArrayElements<TArray extends readonly any[]> =
  type UnionFromClasses (line 4) | type UnionFromClasses<TClassesArray extends readonly any[]> = InstanceType<

FILE: src/metadata/definitions/authorized-metadata.ts
  type AuthorizedMetadata (line 1) | interface AuthorizedMetadata {
  type AuthorizedClassMetadata (line 7) | type AuthorizedClassMetadata = Omit<AuthorizedMetadata, "fieldName">;

FILE: src/metadata/definitions/class-metadata.ts
  type ClassMetadata (line 5) | interface ClassMetadata {

FILE: src/metadata/definitions/directive-metadata.ts
  type DirectiveMetadata (line 1) | interface DirectiveMetadata {
  type DirectiveClassMetadata (line 6) | interface DirectiveClassMetadata {
  type DirectiveFieldMetadata (line 11) | interface DirectiveFieldMetadata {
  type DirectiveArgumentMetadata (line 17) | interface DirectiveArgumentMetadata {

FILE: src/metadata/definitions/enum-metadata.ts
  type EnumMetadata (line 3) | interface EnumMetadata {

FILE: src/metadata/definitions/extensions-metadata.ts
  type ExtensionsMetadata (line 1) | type ExtensionsMetadata = Readonly<Record<string, any>>;
  type ExtensionsClassMetadata (line 3) | interface ExtensionsClassMetadata {
  type ExtensionsFieldMetadata (line 8) | interface ExtensionsFieldMetadata {

FILE: src/metadata/definitions/field-metadata.ts
  type FieldMetadata (line 8) | interface FieldMetadata {

FILE: src/metadata/definitions/interface-class-metadata.ts
  type InterfaceClassMetadata (line 4) | type InterfaceClassMetadata = {

FILE: src/metadata/definitions/middleware-metadata.ts
  type MiddlewareMetadata (line 3) | interface MiddlewareMetadata {
  type ResolverMiddlewareMetadata (line 9) | type ResolverMiddlewareMetadata = Omit<MiddlewareMetadata, "fieldName">;

FILE: src/metadata/definitions/object-class-metadata.ts
  type ObjectClassMetadata (line 3) | type ObjectClassMetadata = {

FILE: src/metadata/definitions/param-metadata.ts
  type BasicParamMetadata (line 5) | interface BasicParamMetadata {
  type InfoParamMetadata (line 11) | type InfoParamMetadata = {
  type PubSubParamMetadata (line 15) | type PubSubParamMetadata = {
  type ContextParamMetadata (line 20) | type ContextParamMetadata = {
  type RootParamMetadata (line 25) | type RootParamMetadata = {
  type CommonArgMetadata (line 31) | type CommonArgMetadata = {
  type ArgParamMetadata (line 38) | type ArgParamMetadata = {
  type ArgsParamMetadata (line 45) | type ArgsParamMetadata = {
  type CustomParamOptions (line 49) | interface CustomParamOptions {
  type CustomParamMetadata (line 53) | type CustomParamMetadata = {
  type ParamMetadata (line 59) | type ParamMetadata =

FILE: src/metadata/definitions/resolver-metadata.ts
  type BaseResolverMetadata (line 16) | interface BaseResolverMetadata {
  type ResolverMetadata (line 29) | type ResolverMetadata = {
  type FieldResolverMetadata (line 36) | type FieldResolverMetadata = {
  type SubscriptionResolverMetadata (line 45) | type SubscriptionResolverMetadata = {
  type ResolverClassMetadata (line 52) | interface ResolverClassMetadata {

FILE: src/metadata/definitions/union-metadata.ts
  type UnionMetadata (line 3) | interface UnionMetadata {
  type UnionMetadataWithSymbol (line 9) | type UnionMetadataWithSymbol = {

FILE: src/metadata/getMetadataStorage.ts
  function getMetadataStorage (line 8) | function getMetadataStorage(): MetadataStorage {

FILE: src/metadata/metadata-storage.ts
  class MetadataStorage (line 38) | class MetadataStorage {
    method collectQueryHandlerMetadata (line 105) | collectQueryHandlerMetadata(definition: ResolverMetadata) {
    method collectMutationHandlerMetadata (line 109) | collectMutationHandlerMetadata(definition: ResolverMetadata) {
    method collectSubscriptionHandlerMetadata (line 113) | collectSubscriptionHandlerMetadata(definition: SubscriptionResolverMet...
    method collectFieldResolverMetadata (line 117) | collectFieldResolverMetadata(definition: FieldResolverMetadata) {
    method collectObjectMetadata (line 121) | collectObjectMetadata(definition: ObjectClassMetadata) {
    method collectInputMetadata (line 125) | collectInputMetadata(definition: ClassMetadata) {
    method collectArgsMetadata (line 129) | collectArgsMetadata(definition: ClassMetadata) {
    method collectInterfaceMetadata (line 133) | collectInterfaceMetadata(definition: InterfaceClassMetadata) {
    method collectAuthorizedFieldMetadata (line 137) | collectAuthorizedFieldMetadata(definition: AuthorizedMetadata) {
    method collectAuthorizedResolverMetadata (line 141) | collectAuthorizedResolverMetadata(definition: AuthorizedClassMetadata) {
    method collectEnumMetadata (line 145) | collectEnumMetadata(definition: EnumMetadata) {
    method collectUnionMetadata (line 149) | collectUnionMetadata(definition: UnionMetadata) {
    method collectMiddlewareMetadata (line 158) | collectMiddlewareMetadata(definition: MiddlewareMetadata) {
    method collectResolverMiddlewareMetadata (line 162) | collectResolverMiddlewareMetadata(definition: ResolverMiddlewareMetada...
    method collectResolverClassMetadata (line 166) | collectResolverClassMetadata(definition: ResolverClassMetadata) {
    method collectClassFieldMetadata (line 170) | collectClassFieldMetadata(definition: FieldMetadata) {
    method collectHandlerParamMetadata (line 174) | collectHandlerParamMetadata(definition: ParamMetadata) {
    method collectDirectiveClassMetadata (line 178) | collectDirectiveClassMetadata(definition: DirectiveClassMetadata) {
    method collectDirectiveFieldMetadata (line 182) | collectDirectiveFieldMetadata(definition: DirectiveFieldMetadata) {
    method collectDirectiveArgumentMetadata (line 186) | collectDirectiveArgumentMetadata(definition: DirectiveArgumentMetadata) {
    method collectExtensionsClassMetadata (line 190) | collectExtensionsClassMetadata(definition: ExtensionsClassMetadata) {
    method collectExtensionsFieldMetadata (line 194) | collectExtensionsFieldMetadata(definition: ExtensionsFieldMetadata) {
    method initCache (line 198) | initCache() {
    method build (line 333) | build(options: SchemaGeneratorOptions) {
    method clear (line 356) | clear() {
    method clone (line 383) | clone() {
    method clearMapCaches (line 413) | private clearMapCaches() {
    method buildClassMetadata (line 427) | private buildClassMetadata(definitions: ClassMetadata[]) {
    method buildResolversMetadata (line 460) | private buildResolversMetadata(definitions: BaseResolverMetadata[]) {
    method buildFieldResolverMetadata (line 481) | private buildFieldResolverMetadata(
    method buildExtendedResolversMetadata (line 554) | private buildExtendedResolversMetadata() {
    method findFieldRoles (line 576) | private findFieldRoles(target: Function, fieldName: string): any[] | u...
    method findExtensions (line 586) | private findExtensions(target: Function, fieldName?: string): Extensio...

FILE: src/metadata/utils.ts
  function mapSuperResolverHandlers (line 11) | function mapSuperResolverHandlers<T extends BaseResolverMetadata>(
  function mapSuperFieldResolverHandlers (line 27) | function mapSuperFieldResolverHandlers(
  function mapMiddlewareMetadataToArray (line 46) | function mapMiddlewareMetadataToArray(
  function ensureReflectMetadataExists (line 56) | function ensureReflectMetadataExists() {

FILE: src/resolvers/convert-args.ts
  type TransformationTreeField (line 11) | interface TransformationTreeField {
  type TransformationTree (line 17) | interface TransformationTree {
  function getInputType (line 24) | function getInputType(target: TypeValue): ClassMetadata | undefined {
  function getArgsType (line 28) | function getArgsType(target: TypeValue): ClassMetadata | undefined {
  function generateInstanceTransformationTree (line 32) | function generateInstanceTransformationTree(target: TypeValue): Transfor...
  function convertToInput (line 84) | function convertToInput(tree: TransformationTree, data: any): any {
  function convertValueToInstance (line 116) | function convertValueToInstance(target: TypeValue, value: any): any {
  function convertValuesToInstances (line 123) | function convertValuesToInstances(target: TypeValue, value: any): any {
  function convertArgsToInstance (line 135) | function convertArgsToInstance(argsMetadata: ArgsParamMetadata, args: Ar...
  function convertArgToInstance (line 163) | function convertArgToInstance(argMetadata: ArgParamMetadata, args: ArgsD...

FILE: src/resolvers/create.ts
  function createHandlerResolver (line 15) | function createHandlerResolver(
  function createAdvancedFieldResolver (line 75) | function createAdvancedFieldResolver(
  function createBasicFieldResolver (line 120) | function createBasicFieldResolver(
  function wrapResolverWithAuthChecker (line 133) | function wrapResolverWithAuthChecker(

FILE: src/resolvers/helpers.ts
  function getParams (line 12) | function getParams(
  function applyAuthChecker (line 90) | function applyAuthChecker(
  function applyMiddlewares (line 102) | function applyMiddlewares(

FILE: src/resolvers/validate-arg.ts
  function validateArg (line 12) | async function validateArg(

FILE: src/schema/build-context.ts
  type ScalarsTypeMap (line 11) | interface ScalarsTypeMap {
  type ValidateSettings (line 16) | type ValidateSettings = boolean | ValidatorOptions;
  type BuildContextOptions (line 18) | interface BuildContextOptions {
  method create (line 68) | static create(options: BuildContextOptions) {
  method reset (line 111) | static reset() {

FILE: src/schema/definition-node.ts
  function getDirectiveNode (line 20) | function getDirectiveNode(directive: DirectiveMetadata): ConstDirectiveN...
  function getObjectTypeDefinitionNode (line 76) | function getObjectTypeDefinitionNode(
  function getInputObjectTypeDefinitionNode (line 95) | function getInputObjectTypeDefinitionNode(
  function getFieldDefinitionNode (line 114) | function getFieldDefinitionNode(
  function getInputValueDefinitionNode (line 140) | function getInputValueDefinitionNode(
  function getInterfaceTypeDefinitionNode (line 166) | function getInterfaceTypeDefinitionNode(

FILE: src/schema/schema-generator.ts
  type ObjectTypeInfo (line 67) | interface ObjectTypeInfo {
  type InterfaceTypeInfo (line 72) | interface InterfaceTypeInfo {
  type InputObjectTypeInfo (line 77) | interface InputObjectTypeInfo {
  type EnumTypeInfo (line 81) | interface EnumTypeInfo {
  type UnionTypeInfo (line 85) | interface UnionTypeInfo {
  type SchemaGeneratorOptions (line 90) | type SchemaGeneratorOptions = {
  method generateFromMetadata (line 124) | static generateFromMetadata(options: SchemaGeneratorOptions): GraphQLSch...
  method checkForErrors (line 166) | private static checkForErrors(options: SchemaGeneratorOptions) {
  method getDefaultValue (line 175) | private static getDefaultValue(
  method buildTypesInfo (line 204) | private static buildTypesInfo(resolvers: Function[]) {
  method buildRootQueryType (line 578) | private static buildRootQueryType(resolvers: Function[]): GraphQLObjectT...
  method buildRootMutationType (line 587) | private static buildRootMutationType(resolvers: Function[]): GraphQLObje...
  method buildRootSubscriptionType (line 602) | private static buildRootSubscriptionType(resolvers: Function[]): GraphQL...
  method buildOtherTypes (line 617) | private static buildOtherTypes(orphanedTypes: Function[]): GraphQLNamedT...
  method generateHandlerFields (line 650) | private static generateHandlerFields<T = any, U = any>(
  method generateSubscriptionsFields (line 677) | private static generateSubscriptionsFields<
  method generateHandlerArgs (line 755) | private static generateHandlerArgs(
  method mapArgFields (line 820) | private static mapArgFields(
  method getGraphQLOutputType (line 848) | private static getGraphQLOutputType(
  method getGraphQLInputType (line 889) | private static getGraphQLInputType(
  method getResolveTypeFunction (line 925) | private static getResolveTypeFunction<TSource = any, TContext = any>(
  method filterHandlersByResolvers (line 939) | private static filterHandlersByResolvers<T extends ResolverMetadata>(
  method filterTypesInfoByOrphanedTypesAndExtractType (line 946) | private static filterTypesInfoByOrphanedTypesAndExtractType(

FILE: src/schema/utils.ts
  function getFieldMetadataFromInputType (line 10) | function getFieldMetadataFromInputType(type: GraphQLInputObjectType) {
  function getFieldMetadataFromObjectType (line 29) | function getFieldMetadataFromObjectType(type: GraphQLObjectType | GraphQ...

FILE: src/shim.ts
  function dummyFn (line 38) | function dummyFn() {}
  function dummyDecorator (line 39) | function dummyDecorator() {

FILE: src/typings/Complexity.ts
  type Complexity (line 3) | type Complexity = ComplexityEstimator | number;

FILE: src/typings/ResolverInterface.ts
  type ResolverInterface (line 5) | type ResolverInterface<T extends object> = {

FILE: src/typings/SubscribeResolverData.ts
  type SubscribeResolverData (line 4) | interface SubscribeResolverData<TSource = any, TArgs = ArgsDictionary, T...

FILE: src/typings/SubscriptionHandlerData.ts
  type SubscriptionHandlerData (line 4) | interface SubscriptionHandlerData<TPayload = any, TArgs = ArgsDictionary...

FILE: src/typings/TypeResolver.ts
  type TypeResolver (line 4) | type TypeResolver<TSource, TContext> = (

FILE: src/typings/ValidatorFn.ts
  type ValidatorFn (line 4) | type ValidatorFn<TContext extends object = object> = (

FILE: src/typings/auth-checker.ts
  type AuthCheckerFn (line 4) | type AuthCheckerFn<TContextType extends object = object, TRoleType = str...
  type AuthCheckerInterface (line 9) | interface AuthCheckerInterface<TContextType extends object = object, TRo...
  type AuthChecker (line 13) | type AuthChecker<TContextType extends object = object, TRoleType = strin...
  type AuthMode (line 17) | type AuthMode = "error" | "null";

FILE: src/typings/legacy-decorators.ts
  type ParameterDecorator (line 1) | type ParameterDecorator = (

FILE: src/typings/middleware.ts
  type NextFn (line 3) | type NextFn = () => Promise<any>;
  type MiddlewareFn (line 5) | type MiddlewareFn<TContext extends object = object> = (
  type MiddlewareInterface (line 10) | interface MiddlewareInterface<TContext extends object = object> {
  type MiddlewareClass (line 13) | type MiddlewareClass<TContext extends object = object> = new (
  type Middleware (line 17) | type Middleware<TContext extends object = object> =

FILE: src/typings/resolver-data.ts
  type ArgsDictionary (line 3) | type ArgsDictionary = Record<string, any>;
  type ResolverData (line 5) | interface ResolverData<TContextType extends object = object> {

FILE: src/typings/resolvers-map.ts
  type ResolversMap (line 8) | type ResolversMap<TSource = any, TContext = any> = Record<
  type ResolverObject (line 16) | type ResolverObject<TSource = any, TContext = any> = Record<
  type EnumResolver (line 21) | type EnumResolver = Record<string, string | number>;
  type ResolverOptions (line 23) | interface ResolverOptions<TSource = any, TContext = any> {

FILE: src/typings/subscriptions.ts
  type PubSub (line 1) | interface PubSub {

FILE: src/typings/utils/ClassType.ts
  type ClassType (line 8) | type ClassType<T extends object = object, Arguments extends unknown[] = ...

FILE: src/typings/utils/Constructor.ts
  type Constructor (line 6) | type Constructor<T extends object, Arguments extends unknown[] = any[]> ...

FILE: src/typings/utils/Except.ts
  type Filter (line 30) | type Filter<KeyType, ExcludeType> =
  type ExceptOptions (line 37) | interface ExceptOptions {
  type Except (line 79) | type Except<

FILE: src/typings/utils/IsEqual.ts
  type IsEqual (line 26) | type IsEqual<A, B> =

FILE: src/typings/utils/Maybe.ts
  type Maybe (line 1) | type Maybe<T> = T | null | undefined;

FILE: src/typings/utils/MaybePromise.ts
  type MaybePromise (line 1) | type MaybePromise<T> = Promise<T> | T;

FILE: src/typings/utils/MergeExclusive.ts
  type Without (line 4) | type Without<FirstType, SecondType> = {
  type MergeExclusive (line 39) | type MergeExclusive<FirstType, SecondType> = FirstType | SecondType exte...

FILE: src/typings/utils/NonEmptyArray.ts
  type NonEmptyArray (line 3) | type NonEmptyArray<T> = readonly [T, ...T[]] | [T, ...T[]];

FILE: src/typings/utils/SetRequired.ts
  type SetRequired (line 29) | type SetRequired<BaseType, Keys extends keyof BaseType> = Simplify<

FILE: src/typings/utils/Simplify.ts
  type Simplify (line 58) | type Simplify<T> = { [KeyType in keyof T]: T[KeyType] } & {};

FILE: src/utils/buildSchema.ts
  type EmitSchemaFileOptions (line 12) | type EmitSchemaFileOptions = {
  function getEmitSchemaDefinitionFileOptions (line 16) | function getEmitSchemaDefinitionFileOptions(buildSchemaOptions: BuildSch...
  function loadResolvers (line 37) | function loadResolvers(options: BuildSchemaOptions): Function[] {
  type BuildSchemaOptions (line 46) | type BuildSchemaOptions = {
  function buildSchema (line 57) | async function buildSchema(options: BuildSchemaOptions): Promise<GraphQL...
  function buildSchemaSync (line 68) | function buildSchemaSync(options: BuildSchemaOptions): GraphQLSchema {

FILE: src/utils/buildTypeDefsAndResolvers.ts
  function createTypeDefsAndResolversMap (line 5) | function createTypeDefsAndResolversMap(schema: GraphQLSchema) {
  function buildTypeDefsAndResolvers (line 11) | async function buildTypeDefsAndResolvers(options: BuildSchemaOptions) {
  function buildTypeDefsAndResolversSync (line 16) | function buildTypeDefsAndResolversSync(options: BuildSchemaOptions) {

FILE: src/utils/container.ts
  type SupportedType (line 4) | type SupportedType<T> = (new (...args: any[]) => T) | Function;
  type ContainerType (line 6) | interface ContainerType {
  type ContainerGetter (line 10) | type ContainerGetter<TContext extends object> = (
  class DefaultContainer (line 19) | class DefaultContainer {
    method get (line 22) | get<T>(someClass: SupportedType<T>): T {
  class IOCContainer (line 33) | class IOCContainer {
    method constructor (line 40) | constructor(iocContainerOrContainerGetter?: ContainerType | ContainerG...
    method getInstance (line 52) | getInstance<T = any>(

FILE: src/utils/createResolversMap.ts
  function generateTypeResolver (line 15) | function generateTypeResolver(
  function generateFieldsResolvers (line 35) | function generateFieldsResolvers(fields: GraphQLFieldMap<any, any>): Res...
  function createResolversMap (line 50) | function createResolversMap(schema: GraphQLSchema): ResolversMap {

FILE: src/utils/emitSchemaDefinitionFile.ts
  type PrintSchemaOptions (line 4) | interface PrintSchemaOptions {
  function getSchemaFileContent (line 20) | function getSchemaFileContent(schema: GraphQLSchema, options: PrintSchem...
  function emitSchemaDefinitionFileSync (line 25) | function emitSchemaDefinitionFileSync(
  function emitSchemaDefinitionFile (line 34) | async function emitSchemaDefinitionFile(

FILE: src/utils/graphql-version.ts
  function ensureInstalledCorrectGraphQLPackage (line 9) | function ensureInstalledCorrectGraphQLPackage() {

FILE: src/utils/isPromiseLike.ts
  function isPromiseLike (line 1) | function isPromiseLike<TValue>(

FILE: tests/functional/authorization.ts
  class SampleObject (line 27) | @ObjectType()
  class SampleResolver (line 55) | @Resolver(() => SampleObject)
    method normalQuery (line 58) | normalQuery(): boolean {
    method normalObjectQuery (line 63) | normalObjectQuery(): SampleObject {
    method authedQuery (line 73) | authedQuery(@Ctx() ctx: any): boolean {
    method nullableAuthedQuery (line 79) | nullableAuthedQuery() {
    method adminQuery (line 85) | adminQuery(@Ctx() ctx: any): boolean {
    method adminOrRegularQuery (line 91) | adminOrRegularQuery(@Ctx() ctx: any): boolean {
    method adminOrRegularRestQuery (line 97) | adminOrRegularRestQuery(@Ctx() ctx: any): boolean {
    method normalResolvedField (line 102) | normalResolvedField() {
    method authedResolvedField (line 108) | authedResolvedField() {
    method inlineAuthedResolvedField (line 113) | inlineAuthedResolvedField() {
  function findQuery (line 128) | function findQuery(queryName: string) {
  class TestAuthChecker (line 569) | class TestAuthChecker implements AuthCheckerInterface {
    method check (line 570) | check(resolverData: ResolverData, roles: string[]) {
  class TestResolver (line 616) | @Resolver()
    method authedQuery (line 620) | authedQuery(@Ctx() ctx: any): boolean {

FILE: tests/functional/circular-refs.ts
  class SampleObject (line 15) | @ObjectType()
  class SampleResolver (line 23) | @Resolver()
    method objectQuery (line 26) | objectQuery(): SampleObject {
    method objectQuery (line 83) | objectQuery(): SampleObject {
  class SampleObject (line 69) | @ObjectType()
  class SampleResolver (line 80) | @Resolver()
    method objectQuery (line 26) | objectQuery(): SampleObject {
    method objectQuery (line 83) | objectQuery(): SampleObject {

FILE: tests/functional/default-nullable.ts
  class SampleObject (line 21) | @ObjectType()
  class SampleResolver (line 37) | @Resolver(() => SampleObject)
    method normalQuery (line 40) | normalQuery(): string {
    method normalArrayQuery (line 45) | normalArrayQuery(): string[] {
    method nullableQuery (line 50) | nullableQuery() {
    method nonNullableQuery (line 55) | nonNullableQuery(): string {

FILE: tests/functional/default-values.ts
  class SampleInput (line 21) | @InputType()
  class SampleResolver (line 27) | @Resolver()
    method sampleQuery (line 30) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 66) | sampleQuery(
    method sampleQuery (line 117) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 150) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 184) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 220) | sampleQuery(@Arg("input") _input: SampleInput): string {
  class SampleInitializerInput (line 51) | @InputType()
  class SampleOptionInput (line 57) | @InputType()
  class SampleResolver (line 63) | @Resolver()
    method sampleQuery (line 30) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 66) | sampleQuery(
    method sampleQuery (line 117) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 150) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 184) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 220) | sampleQuery(@Arg("input") _input: SampleInput): string {
  class SampleInput (line 108) | @InputType()
  class SampleResolver (line 114) | @Resolver()
    method sampleQuery (line 30) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 66) | sampleQuery(
    method sampleQuery (line 117) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 150) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 184) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 220) | sampleQuery(@Arg("input") _input: SampleInput): string {
  class SampleInput (line 141) | @InputType()
  class SampleResolver (line 147) | @Resolver()
    method sampleQuery (line 30) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 66) | sampleQuery(
    method sampleQuery (line 117) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 150) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 184) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 220) | sampleQuery(@Arg("input") _input: SampleInput): string {
  class SampleInput (line 175) | @InputType()
  class SampleResolver (line 181) | @Resolver()
    method sampleQuery (line 30) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 66) | sampleQuery(
    method sampleQuery (line 117) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 150) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 184) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 220) | sampleQuery(@Arg("input") _input: SampleInput): string {
  class SampleInput (line 211) | @InputType()
  class SampleResolver (line 217) | @Resolver()
    method sampleQuery (line 30) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 66) | sampleQuery(
    method sampleQuery (line 117) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 150) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 184) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 220) | sampleQuery(@Arg("input") _input: SampleInput): string {

FILE: tests/functional/deprecation.ts
  class SampleObject (line 31) | @ObjectType()
    method deprecatedGetterField (line 41) | get deprecatedGetterField(): string {
    method methodField (line 46) | methodField(): string {
  class SampleInput (line 51) | @InputType()
  class SampleArgs (line 63) | @ArgsType()
  class SampleResolver (line 75) | @Resolver(() => SampleObject)
    method normalQuery (line 78) | normalQuery(): SampleObject {
    method inputQuery (line 83) | inputQuery(@Arg("input") _input: SampleInput): SampleObject {
    method argsQuery (line 88) | argsQuery(@Args() _args: SampleArgs): SampleObject {
    method deprecatedArgQuery (line 93) | deprecatedArgQuery(
    method describedQuery (line 104) | describedQuery(): string {
    method normalMutation (line 109) | normalMutation(): string {
    method describedMutation (line 114) | describedMutation(): string {

FILE: tests/functional/description.ts
  class SampleObject (line 29) | @ObjectType({ description: "sample object description" })
    method describedGetterField (line 39) | get describedGetterField(): string {
    method methodField (line 44) | methodField(
  class SampleInput (line 51) | @InputType({ description: "sample input description" })
  class SampleArguments (line 60) | @ArgsType()
  class SampleResolver (line 69) | @Resolver(() => SampleObject)
    method normalQuery (line 72) | normalQuery(): string {
    method describedQuery (line 77) | describedQuery(
    method argumentedQuery (line 86) | argumentedQuery(@Args() _args: SampleArguments): string {
    method inputQuery (line 91) | inputQuery(@Arg("input") _input: SampleInput): string {
    method normalMutation (line 96) | normalMutation(): string {
    method describedMutation (line 101) | describedMutation(
    method argumentedMutation (line 110) | argumentedMutation(@Args() _args: SampleArguments): string {
    method inputMutation (line 115) | inputMutation(@Arg("input") _input: SampleInput): string {

FILE: tests/functional/directives.ts
  class SampleObject (line 40) | @Directive("@test")
    method sampleField (line 137) | sampleField(@Args() { sampleArgument }: SampleArgs): string {
  class SampleResolver (line 46) | @Resolver()
    method sampleQuery (line 49) | sampleQuery(): SampleObject {
    method sampleQuery (line 91) | sampleQuery(): SampleObject {
    method sampleQuery (line 144) | sampleQuery(): SampleObject {
    method sampleQuery (line 192) | sampleQuery(): SampleInterface {
    method sampleQuery (line 239) | sampleQuery(): SampleInterface {
    method sampleQuery (line 288) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 330) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 371) | sampleQuery(): boolean {
    method sampleQuery (line 417) | sampleQuery(@Args() { sampleArgument }: SampleArgs): string {
    method sampleQuery (line 455) | sampleQuery(
    method sampleQuery (line 497) | sampleQuery(): boolean {
    method sampleMutation (line 503) | sampleMutation(): boolean {
    method sampleQuery (line 543) | sampleQuery(): boolean {
    method sampleSubscription (line 549) | sampleSubscription(): boolean {
    method multiline (line 592) | multiline(): boolean {
    method leadingWhiteSpaces (line 598) | leadingWhiteSpaces(): boolean {
    method multilineAndLeadingWhiteSpaces (line 604) | multilineAndLeadingWhiteSpaces(): boolean {
    method rawMultilineAndLeadingWhiteSpaces (line 616) | rawMultilineAndLeadingWhiteSpaces(): boolean {
  class SampleObject (line 82) | @ObjectType()
    method sampleField (line 137) | sampleField(@Args() { sampleArgument }: SampleArgs): string {
  class SampleResolver (line 88) | @Resolver()
    method sampleQuery (line 49) | sampleQuery(): SampleObject {
    method sampleQuery (line 91) | sampleQuery(): SampleObject {
    method sampleQuery (line 144) | sampleQuery(): SampleObject {
    method sampleQuery (line 192) | sampleQuery(): SampleInterface {
    method sampleQuery (line 239) | sampleQuery(): SampleInterface {
    method sampleQuery (line 288) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 330) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 371) | sampleQuery(): boolean {
    method sampleQuery (line 417) | sampleQuery(@Args() { sampleArgument }: SampleArgs): string {
    method sampleQuery (line 455) | sampleQuery(
    method sampleQuery (line 497) | sampleQuery(): boolean {
    method sampleMutation (line 503) | sampleMutation(): boolean {
    method sampleQuery (line 543) | sampleQuery(): boolean {
    method sampleSubscription (line 549) | sampleSubscription(): boolean {
    method multiline (line 592) | multiline(): boolean {
    method leadingWhiteSpaces (line 598) | leadingWhiteSpaces(): boolean {
    method multilineAndLeadingWhiteSpaces (line 604) | multilineAndLeadingWhiteSpaces(): boolean {
    method rawMultilineAndLeadingWhiteSpaces (line 616) | rawMultilineAndLeadingWhiteSpaces(): boolean {
  class SampleArgs (line 128) | @ArgsType()
  class SampleObject (line 134) | @ObjectType()
    method sampleField (line 137) | sampleField(@Args() { sampleArgument }: SampleArgs): string {
  class SampleResolver (line 141) | @Resolver()
    method sampleQuery (line 49) | sampleQuery(): SampleObject {
    method sampleQuery (line 91) | sampleQuery(): SampleObject {
    method sampleQuery (line 144) | sampleQuery(): SampleObject {
    method sampleQuery (line 192) | sampleQuery(): SampleInterface {
    method sampleQuery (line 239) | sampleQuery(): SampleInterface {
    method sampleQuery (line 288) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 330) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 371) | sampleQuery(): boolean {
    method sampleQuery (line 417) | sampleQuery(@Args() { sampleArgument }: SampleArgs): string {
    method sampleQuery (line 455) | sampleQuery(
    method sampleQuery (line 497) | sampleQuery(): boolean {
    method sampleMutation (line 503) | sampleMutation(): boolean {
    method sampleQuery (line 543) | sampleQuery(): boolean {
    method sampleSubscription (line 549) | sampleSubscription(): boolean {
    method multiline (line 592) | multiline(): boolean {
    method leadingWhiteSpaces (line 598) | leadingWhiteSpaces(): boolean {
    method multilineAndLeadingWhiteSpaces (line 604) | multilineAndLeadingWhiteSpaces(): boolean {
    method rawMultilineAndLeadingWhiteSpaces (line 616) | rawMultilineAndLeadingWhiteSpaces(): boolean {
  class SampleInterface (line 181) | @Directive("@test")
  class SampleObject (line 187) | @ObjectType({ implements: [SampleInterface] })
    method sampleField (line 137) | sampleField(@Args() { sampleArgument }: SampleArgs): string {
  class SampleResolver (line 189) | @Resolver()
    method sampleQuery (line 49) | sampleQuery(): SampleObject {
    method sampleQuery (line 91) | sampleQuery(): SampleObject {
    method sampleQuery (line 144) | sampleQuery(): SampleObject {
    method sampleQuery (line 192) | sampleQuery(): SampleInterface {
    method sampleQuery (line 239) | sampleQuery(): SampleInterface {
    method sampleQuery (line 288) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 330) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 371) | sampleQuery(): boolean {
    method sampleQuery (line 417) | sampleQuery(@Args() { sampleArgument }: SampleArgs): string {
    method sampleQuery (line 455) | sampleQuery(
    method sampleQuery (line 497) | sampleQuery(): boolean {
    method sampleMutation (line 503) | sampleMutation(): boolean {
    method sampleQuery (line 543) | sampleQuery(): boolean {
    method sampleSubscription (line 549) | sampleSubscription(): boolean {
    method multiline (line 592) | multiline(): boolean {
    method leadingWhiteSpaces (line 598) | leadingWhiteSpaces(): boolean {
    method multilineAndLeadingWhiteSpaces (line 604) | multilineAndLeadingWhiteSpaces(): boolean {
    method rawMultilineAndLeadingWhiteSpaces (line 616) | rawMultilineAndLeadingWhiteSpaces(): boolean {
  class SampleInterface (line 228) | @InterfaceType()
  class SampleObject (line 234) | @ObjectType({ implements: [SampleInterface] })
    method sampleField (line 137) | sampleField(@Args() { sampleArgument }: SampleArgs): string {
  class SampleResolver (line 236) | @Resolver()
    method sampleQuery (line 49) | sampleQuery(): SampleObject {
    method sampleQuery (line 91) | sampleQuery(): SampleObject {
    method sampleQuery (line 144) | sampleQuery(): SampleObject {
    method sampleQuery (line 192) | sampleQuery(): SampleInterface {
    method sampleQuery (line 239) | sampleQuery(): SampleInterface {
    method sampleQuery (line 288) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 330) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 371) | sampleQuery(): boolean {
    method sampleQuery (line 417) | sampleQuery(@Args() { sampleArgument }: SampleArgs): string {
    method sampleQuery (line 455) | sampleQuery(
    method sampleQuery (line 497) | sampleQuery(): boolean {
    method sampleMutation (line 503) | sampleMutation(): boolean {
    method sampleQuery (line 543) | sampleQuery(): boolean {
    method sampleSubscription (line 549) | sampleSubscription(): boolean {
    method multiline (line 592) | multiline(): boolean {
    method leadingWhiteSpaces (line 598) | leadingWhiteSpaces(): boolean {
    method multilineAndLeadingWhiteSpaces (line 604) | multilineAndLeadingWhiteSpaces(): boolean {
    method rawMultilineAndLeadingWhiteSpaces (line 616) | rawMultilineAndLeadingWhiteSpaces(): boolean {
  class SampleInput (line 279) | @Directive("@test")
  class SampleResolver (line 285) | @Resolver()
    method sampleQuery (line 49) | sampleQuery(): SampleObject {
    method sampleQuery (line 91) | sampleQuery(): SampleObject {
    method sampleQuery (line 144) | sampleQuery(): SampleObject {
    method sampleQuery (line 192) | sampleQuery(): SampleInterface {
    method sampleQuery (line 239) | sampleQuery(): SampleInterface {
    method sampleQuery (line 288) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 330) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 371) | sampleQuery(): boolean {
    method sampleQuery (line 417) | sampleQuery(@Args() { sampleArgument }: SampleArgs): string {
    method sampleQuery (line 455) | sampleQuery(
    method sampleQuery (line 497) | sampleQuery(): boolean {
    method sampleMutation (line 503) | sampleMutation(): boolean {
    method sampleQuery (line 543) | sampleQuery(): boolean {
    method sampleSubscription (line 549) | sampleSubscription(): boolean {
    method multiline (line 592) | multiline(): boolean {
    method leadingWhiteSpaces (line 598) | leadingWhiteSpaces(): boolean {
    method multilineAndLeadingWhiteSpaces (line 604) | multilineAndLeadingWhiteSpaces(): boolean {
    method rawMultilineAndLeadingWhiteSpaces (line 616) | rawMultilineAndLeadingWhiteSpaces(): boolean {
  class SampleInput (line 321) | @InputType()
  class SampleResolver (line 327) | @Resolver()
    method sampleQuery (line 49) | sampleQuery(): SampleObject {
    method sampleQuery (line 91) | sampleQuery(): SampleObject {
    method sampleQuery (line 144) | sampleQuery(): SampleObject {
    method sampleQuery (line 192) | sampleQuery(): SampleInterface {
    method sampleQuery (line 239) | sampleQuery(): SampleInterface {
    method sampleQuery (line 288) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 330) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 371) | sampleQuery(): boolean {
    method sampleQuery (line 417) | sampleQuery(@Args() { sampleArgument }: SampleArgs): string {
    method sampleQuery (line 455) | sampleQuery(
    method sampleQuery (line 497) | sampleQuery(): boolean {
    method sampleMutation (line 503) | sampleMutation(): boolean {
    method sampleQuery (line 543) | sampleQuery(): boolean {
    method sampleSubscription (line 549) | sampleSubscription(): boolean {
    method multiline (line 592) | multiline(): boolean {
    method leadingWhiteSpaces (line 598) | leadingWhiteSpaces(): boolean {
    method multilineAndLeadingWhiteSpaces (line 604) | multilineAndLeadingWhiteSpaces(): boolean {
    method rawMultilineAndLeadingWhiteSpaces (line 616) | rawMultilineAndLeadingWhiteSpaces(): boolean {
  class SampleResolver (line 367) | @Resolver()
    method sampleQuery (line 49) | sampleQuery(): SampleObject {
    method sampleQuery (line 91) | sampleQuery(): SampleObject {
    method sampleQuery (line 144) | sampleQuery(): SampleObject {
    method sampleQuery (line 192) | sampleQuery(): SampleInterface {
    method sampleQuery (line 239) | sampleQuery(): SampleInterface {
    method sampleQuery (line 288) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 330) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 371) | sampleQuery(): boolean {
    method sampleQuery (line 417) | sampleQuery(@Args() { sampleArgument }: SampleArgs): string {
    method sampleQuery (line 455) | sampleQuery(
    method sampleQuery (line 497) | sampleQuery(): boolean {
    method sampleMutation (line 503) | sampleMutation(): boolean {
    method sampleQuery (line 543) | sampleQuery(): boolean {
    method sampleSubscription (line 549) | sampleSubscription(): boolean {
    method multiline (line 592) | multiline(): boolean {
    method leadingWhiteSpaces (line 598) | leadingWhiteSpaces(): boolean {
    method multilineAndLeadingWhiteSpaces (line 604) | multilineAndLeadingWhiteSpaces(): boolean {
    method rawMultilineAndLeadingWhiteSpaces (line 616) | rawMultilineAndLeadingWhiteSpaces(): boolean {
  class SampleArgs (line 408) | @ArgsType()
  class SampleResolver (line 414) | @Resolver()
    method sampleQuery (line 49) | sampleQuery(): SampleObject {
    method sampleQuery (line 91) | sampleQuery(): SampleObject {
    method sampleQuery (line 144) | sampleQuery(): SampleObject {
    method sampleQuery (line 192) | sampleQuery(): SampleInterface {
    method sampleQuery (line 239) | sampleQuery(): SampleInterface {
    method sampleQuery (line 288) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 330) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 371) | sampleQuery(): boolean {
    method sampleQuery (line 417) | sampleQuery(@Args() { sampleArgument }: SampleArgs): string {
    method sampleQuery (line 455) | sampleQuery(
    method sampleQuery (line 497) | sampleQuery(): boolean {
    method sampleMutation (line 503) | sampleMutation(): boolean {
    method sampleQuery (line 543) | sampleQuery(): boolean {
    method sampleSubscription (line 549) | sampleSubscription(): boolean {
    method multiline (line 592) | multiline(): boolean {
    method leadingWhiteSpaces (line 598) | leadingWhiteSpaces(): boolean {
    method multilineAndLeadingWhiteSpaces (line 604) | multilineAndLeadingWhiteSpaces(): boolean {
    method rawMultilineAndLeadingWhiteSpaces (line 616) | rawMultilineAndLeadingWhiteSpaces(): boolean {
  class SampleResolver (line 452) | @Resolver()
    method sampleQuery (line 49) | sampleQuery(): SampleObject {
    method sampleQuery (line 91) | sampleQuery(): SampleObject {
    method sampleQuery (line 144) | sampleQuery(): SampleObject {
    method sampleQuery (line 192) | sampleQuery(): SampleInterface {
    method sampleQuery (line 239) | sampleQuery(): SampleInterface {
    method sampleQuery (line 288) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 330) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 371) | sampleQuery(): boolean {
    method sampleQuery (line 417) | sampleQuery(@Args() { sampleArgument }: SampleArgs): string {
    method sampleQuery (line 455) | sampleQuery(
    method sampleQuery (line 497) | sampleQuery(): boolean {
    method sampleMutation (line 503) | sampleMutation(): boolean {
    method sampleQuery (line 543) | sampleQuery(): boolean {
    method sampleSubscription (line 549) | sampleSubscription(): boolean {
    method multiline (line 592) | multiline(): boolean {
    method leadingWhiteSpaces (line 598) | leadingWhiteSpaces(): boolean {
    method multilineAndLeadingWhiteSpaces (line 604) | multilineAndLeadingWhiteSpaces(): boolean {
    method rawMultilineAndLeadingWhiteSpaces (line 616) | rawMultilineAndLeadingWhiteSpaces(): boolean {
  class SampleResolver (line 494) | @Resolver()
    method sampleQuery (line 49) | sampleQuery(): SampleObject {
    method sampleQuery (line 91) | sampleQuery(): SampleObject {
    method sampleQuery (line 144) | sampleQuery(): SampleObject {
    method sampleQuery (line 192) | sampleQuery(): SampleInterface {
    method sampleQuery (line 239) | sampleQuery(): SampleInterface {
    method sampleQuery (line 288) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 330) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 371) | sampleQuery(): boolean {
    method sampleQuery (line 417) | sampleQuery(@Args() { sampleArgument }: SampleArgs): string {
    method sampleQuery (line 455) | sampleQuery(
    method sampleQuery (line 497) | sampleQuery(): boolean {
    method sampleMutation (line 503) | sampleMutation(): boolean {
    method sampleQuery (line 543) | sampleQuery(): boolean {
    method sampleSubscription (line 549) | sampleSubscription(): boolean {
    method multiline (line 592) | multiline(): boolean {
    method leadingWhiteSpaces (line 598) | leadingWhiteSpaces(): boolean {
    method multilineAndLeadingWhiteSpaces (line 604) | multilineAndLeadingWhiteSpaces(): boolean {
    method rawMultilineAndLeadingWhiteSpaces (line 616) | rawMultilineAndLeadingWhiteSpaces(): boolean {
  class SampleResolver (line 540) | @Resolver()
    method sampleQuery (line 49) | sampleQuery(): SampleObject {
    method sampleQuery (line 91) | sampleQuery(): SampleObject {
    method sampleQuery (line 144) | sampleQuery(): SampleObject {
    method sampleQuery (line 192) | sampleQuery(): SampleInterface {
    method sampleQuery (line 239) | sampleQuery(): SampleInterface {
    method sampleQuery (line 288) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 330) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 371) | sampleQuery(): boolean {
    method sampleQuery (line 417) | sampleQuery(@Args() { sampleArgument }: SampleArgs): string {
    method sampleQuery (line 455) | sampleQuery(
    method sampleQuery (line 497) | sampleQuery(): boolean {
    method sampleMutation (line 503) | sampleMutation(): boolean {
    method sampleQuery (line 543) | sampleQuery(): boolean {
    method sampleSubscription (line 549) | sampleSubscription(): boolean {
    method multiline (line 592) | multiline(): boolean {
    method leadingWhiteSpaces (line 598) | leadingWhiteSpaces(): boolean {
    method multilineAndLeadingWhiteSpaces (line 604) | multilineAndLeadingWhiteSpaces(): boolean {
    method rawMultilineAndLeadingWhiteSpaces (line 616) | rawMultilineAndLeadingWhiteSpaces(): boolean {
  class SampleResolver (line 588) | @Resolver()
    method sampleQuery (line 49) | sampleQuery(): SampleObject {
    method sampleQuery (line 91) | sampleQuery(): SampleObject {
    method sampleQuery (line 144) | sampleQuery(): SampleObject {
    method sampleQuery (line 192) | sampleQuery(): SampleInterface {
    method sampleQuery (line 239) | sampleQuery(): SampleInterface {
    method sampleQuery (line 288) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 330) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
    method sampleQuery (line 371) | sampleQuery(): boolean {
    method sampleQuery (line 417) | sampleQuery(@Args() { sampleArgument }: SampleArgs): string {
    method sampleQuery (line 455) | sampleQuery(
    method sampleQuery (line 497) | sampleQuery(): boolean {
    method sampleMutation (line 503) | sampleMutation(): boolean {
    method sampleQuery (line 543) | sampleQuery(): boolean {
    method sampleSubscription (line 549) | sampleSubscription(): boolean {
    method multiline (line 592) | multiline(): boolean {
    method leadingWhiteSpaces (line 598) | leadingWhiteSpaces(): boolean {
    method multilineAndLeadingWhiteSpaces (line 604) | multilineAndLeadingWhiteSpaces(): boolean {
    method rawMultilineAndLeadingWhiteSpaces (line 616) | rawMultilineAndLeadingWhiteSpaces(): boolean {
  class InvalidQuery (line 686) | @Resolver()
    method invalid (line 690) | invalid(): string {
    method invalid (line 708) | invalid(): string {
    method invalid (line 724) | invalid(): string {
  class InvalidQuery (line 704) | @Resolver()
    method invalid (line 690) | invalid(): string {
    method invalid (line 708) | invalid(): string {
    method invalid (line 724) | invalid(): string {
  class InvalidQuery (line 720) | @Resolver()
    method invalid (line 690) | invalid(): string {
    method invalid (line 708) | invalid(): string {
    method invalid (line 724) | invalid(): string {

FILE: tests/functional/emit-schema-sdl.ts
  constant TEST_DIR (line 21) | const TEST_DIR = path.resolve(process.cwd(), "tests", "test-output-dir");
  class MyObject (line 28) | @ObjectType()
  class MyResolver (line 37) | @Resolver()
    method myQuery (line 40) | myQuery(): MyObject {
  function checkSchemaSDL (line 57) | function checkSchemaSDL(

FILE: tests/functional/enums.ts
  type NumberEnum (line 27) | enum NumberEnum {
  type StringEnum (line 35) | enum StringEnum {
  type AdvancedEnum (line 42) | enum AdvancedEnum {
  class NumberEnumInput (line 54) | @InputType()
  class StringEnumInput (line 60) | @InputType()
  class SampleResolver (line 66) | class SampleResolver {
    method getNumberEnumValue (line 68) | getNumberEnumValue(@Arg("input") _input: NumberEnumInput): NumberEnum {
    method getStringEnumValue (line 73) | getStringEnumValue(@Arg("input") _input: StringEnumInput): StringEnum {
    method getAdvancedEnumValue (line 78) | getAdvancedEnumValue(): AdvancedEnum {
    method isNumberEnumEqualOne (line 83) | isNumberEnumEqualOne(@Arg("enum", () => NumberEnum) numberEnum: Number...
    method isStringEnumEqualOne (line 88) | isStringEnumEqualOne(@Arg("enum", () => StringEnum) stringEnum: String...

FILE: tests/functional/extensions.ts
  class ExtensionsOnFieldInput (line 31) | @InputType()
  class ExtensionsOnClassInput (line 38) | @InputType()
  class ExtensionsOnClassObjectType (line 45) | @ObjectType()
  class SampleObjectType (line 52) | @ObjectType()
    method withInput (line 73) | withInput(@Arg("input") input: ExtensionsOnFieldInput): string {
    method withInputAndField (line 79) | withInputAndField(@Arg("input") input: ExtensionsOnFieldInput): string {
    method withInputOnClass (line 84) | withInputOnClass(@Arg("input") input: ExtensionsOnClassInput): string {
    method withInputAndFieldOnClass (line 90) | withInputAndFieldOnClass(@Arg("input") input: ExtensionsOnClassInput):...
  class SampleInterfaceType (line 95) | @InterfaceType()
  class SampleObjectInterfaceImplementation (line 103) | @ObjectType({
  class SampleInterfaceInterfaceImplementation (line 108) | @InterfaceType({
  class SampleObjectInterfaceInterfaceImplementation (line 113) | @ObjectType({
  class SampleResolver (line 118) | @Resolver()
    method sampleObjectType (line 121) | sampleObjectType(): SampleObjectType {
    method extensionsOnClassObjectType (line 126) | extensionsOnClassObjectType(): ExtensionsOnClassObjectType {
    method sampleObjectInterfaceImplementation (line 131) | sampleObjectInterfaceImplementation(): SampleObjectInterfaceImplementa...
    method sampleInterfaceInterfaceImplementation (line 136) | sampleInterfaceInterfaceImplementation(): SampleInterfaceInterfaceImpl...
    method sampleObjectInterfaceInterfaceImplementation (line 141) | sampleObjectInterfaceInterfaceImplementation(): SampleObjectInterfaceI...
    method sampleInterfaceType (line 146) | sampleInterfaceType(): SampleInterfaceType {
    method queryWithExtensions (line 152) | queryWithExtensions(): string {
    method queryWithMultipleExtensions (line 158) | queryWithMultipleExtensions(): string {
    method queryWithMultipleExtensionsDecorators (line 165) | queryWithMultipleExtensionsDecorators(): string {
    method mutationWithExtensions (line 171) | mutationWithExtensions(): string {
    method mutationWithMultipleExtensions (line 177) | mutationWithMultipleExtensions(): string {
    method mutationWithMultipleExtensionsDecorators (line 184) | mutationWithMultipleExtensionsDecorators(): string {
    method sampleQuery (line 410) | sampleQuery(): Child {
  class SampleObjectTypeResolver (line 189) | @Resolver(() => SampleObjectType)
    method fieldResolverWithExtensions (line 193) | fieldResolverWithExtensions(): string {
  class Parent (line 393) | @ObjectType()
  class Child (line 400) | @Extensions({ childClass: true })
  class SampleResolver (line 407) | @Resolver()
    method sampleObjectType (line 121) | sampleObjectType(): SampleObjectType {
    method extensionsOnClassObjectType (line 126) | extensionsOnClassObjectType(): ExtensionsOnClassObjectType {
    method sampleObjectInterfaceImplementation (line 131) | sampleObjectInterfaceImplementation(): SampleObjectInterfaceImplementa...
    method sampleInterfaceInterfaceImplementation (line 136) | sampleInterfaceInterfaceImplementation(): SampleInterfaceInterfaceImpl...
    method sampleObjectInterfaceInterfaceImplementation (line 141) | sampleObjectInterfaceInterfaceImplementation(): SampleObjectInterfaceI...
    method sampleInterfaceType (line 146) | sampleInterfaceType(): SampleInterfaceType {
    method queryWithExtensions (line 152) | queryWithExtensions(): string {
    method queryWithMultipleExtensions (line 158) | queryWithMultipleExtensions(): string {
    method queryWithMultipleExtensionsDecorators (line 165) | queryWithMultipleExtensionsDecorators(): string {
    method mutationWithExtensions (line 171) | mutationWithExtensions(): string {
    method mutationWithMultipleExtensions (line 177) | mutationWithMultipleExtensions(): string {
    method mutationWithMultipleExtensionsDecorators (line 184) | mutationWithMultipleExtensionsDecorators(): string {
    method sampleQuery (line 410) | sampleQuery(): Child {
  class Child (line 450) | @ObjectType()
  class ChildResolver (line 456) | @Resolver(() => Child)
    method sampleQuery (line 459) | sampleQuery(): Child {
    method childField (line 465) | childField(): string {

FILE: tests/functional/fields.ts
  class SampleNestedObject (line 23) | @ObjectType()
  class SampleObject (line 29) | @ObjectType()
  class SampleResolver (line 80) | @Resolver(() => SampleObject)
    method sampleQuery (line 83) | sampleQuery(): SampleObject {
  function getInnerFieldType (line 99) | function getInnerFieldType(name: string) {
  class SampleObject (line 120) | @ObjectType()
  class SampleObject (line 137) | @ObjectType()
  class SampleObject (line 154) | @ObjectType()
  class SampleObject (line 172) | @ObjectType()

FILE: tests/functional/generic-types.ts
  class SampleType (line 40) | @ObjectType()
  class SampleResolver (line 46) | @Resolver()
    method sampleQuery (line 49) | sampleQuery(): SampleType {
    method sampleQuery (line 93) | sampleQuery(): SampleInterfaceType {
    method sampleQuery (line 130) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
  class SampleType (line 81) | @ObjectType({ implements: SampleInterfaceType })
  class SampleResolver (line 90) | @Resolver()
    method sampleQuery (line 49) | sampleQuery(): SampleType {
    method sampleQuery (line 93) | sampleQuery(): SampleInterfaceType {
    method sampleQuery (line 130) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
  class SampleInput (line 121) | @InputType()
  class SampleResolver (line 127) | @Resolver()
    method sampleQuery (line 49) | sampleQuery(): SampleType {
    method sampleQuery (line 93) | sampleQuery(): SampleInterfaceType {
    method sampleQuery (line 130) | sampleQuery(@Arg("input") _input: SampleInput): boolean {
  function Connection (line 154) | function Connection<TItem extends object>(TItemClass: ClassType<TItem>) {
  class User (line 166) | @ObjectType()
  class Dog (line 172) | @ObjectType()
  type UserConnection (line 180) | type UserConnection = InstanceType<typeof UserConnection>;
  class DogConnection (line 181) | @ObjectType()
  class GenericConnectionResolver (line 189) | @Resolver()
    method users (line 192) | users(): UserConnection {
    method dogs (line 200) | dogs(): DogConnection {
  function Edge (line 266) | function Edge<TNode extends object>(TNodeClass: ClassType<TNode>) {
  class Recipe (line 278) | @ObjectType()
  class User (line 284) | @ObjectType()
  class RecipeEdge (line 290) | @ObjectType()
  class FriendshipEdge (line 303) | @ObjectType()
  class EdgeResolver (line 316) | @Resolver()
    method recipeEdge (line 319) | recipeEdge(): RecipeEdge {
    method friendshipEdge (line 324) | friendshipEdge(): FriendshipEdge {
  function Base (line 412) | function Base<TType extends object>(TTypeClass: ClassType<TType>) {
  class BaseSample (line 421) | @ObjectType()
  class ChildSample (line 427) | @ObjectType()
  class Child (line 436) | @ObjectType()
  class OverwriteResolver (line 442) | @Resolver()
    method child (line 445) | child(): Child {

FILE: tests/functional/inputtype-enumerable-properties.ts
  class SampleInput (line 12) | @InputType()
  class NestedInput (line 24) | @InputType()
  class ParentInput (line 30) | @InputType()
  class SampleResolver (line 39) | @Resolver()
    method testSimpleInput (line 42) | testSimpleInput(@Arg("input") input: SampleInput): string {
    method testNestedInput (line 52) | testNestedInput(@Arg("input") input: ParentInput): string {

FILE: tests/functional/interface-resolvers-args.ts
  class SampleArgs1 (line 33) | @ArgsType()
  method interfaceFieldInlineArgs (line 45) | interfaceFieldInlineArgs(
  method interfaceFieldArgsType (line 53) | interfaceFieldArgsType(@Args() _args: SampleArgs1): string {
  method sampleFieldWithArgs (line 60) | sampleFieldWithArgs(@Arg("sampleArg") _sampleArg: string): string {
  method sampleFieldWithArgs (line 67) | sampleFieldWithArgs(@Arg("sampleArg") sampleArg: string): string {
  class SampleImplementingObjectWithArgsAndOwnResolver (line 74) | @ObjectType({ implements: SampleInterfaceWithArgs })
    method sampleFieldWithArgs (line 76) | sampleFieldWithArgs(sampleArg: string) {
    method sampleFieldWithArgs (line 231) | override sampleFieldWithArgs(sampleArg: string) {
  class SampleImplementingObjectWithArgsAndInheritedResolver (line 80) | @ObjectType({ implements: SampleInterfaceWithArgsAndInlineResolver })
  class SampleImplementingObjectWithArgsAndInheritedFieldResolver (line 82) | @ObjectType({ implements: SampleInterfaceWithArgsAndFieldResolver })
  class SampleResolver (line 85) | @Resolver()
    method sampleQuery (line 88) | sampleQuery(): string {
  class SampleInterfaceWithArgsResolver (line 92) | @Resolver(_of => SampleInterfaceWithArgsAndFieldResolver)
    method sampleFieldWithArgs (line 95) | sampleFieldWithArgs(@Arg("sampleArg") sampleArg: string): string {
  method sampleFieldWithArgs (line 213) | sampleFieldWithArgs(@Arg("sampleArg") _sampleArg: string): string {
  method sampleFieldWithArgs (line 220) | sampleFieldWithArgs(@Arg("sampleArg") sampleArg: string): string {
  class SampleImplementingObjectWithArgsAndOwnResolver (line 229) | @ObjectType({ implements: SampleInterfaceWithArgs })
    method sampleFieldWithArgs (line 76) | sampleFieldWithArgs(sampleArg: string) {
    method sampleFieldWithArgs (line 231) | override sampleFieldWithArgs(sampleArg: string) {
  class SampleImplementingObjectWithArgsAndInheritedResolver (line 235) | @ObjectType({ implements: SampleInterfaceWithArgsAndInlineResolver })
  class SampleObjectImplementingInterfaceImplementingWithArgsAndInheritedResolver (line 237) | @ObjectType({
  class SampleImplementingObjectWithArgsAndInheritedFieldResolver (line 246) | @ObjectType({ implements: SampleInterfaceWithArgsAndFieldResolver })
  class SampleInterfaceResolver (line 249) | @Resolver(_of => SampleInterfaceWithArgsAndFieldResolver)
    method sampleFieldWithArgs (line 252) | sampleFieldWithArgs(@Arg("sampleArg") sampleArg: string): string {
  class TestResolver (line 256) | @Resolver()
    method queryForSampleInterfaceWithArgs (line 259) | queryForSampleInterfaceWithArgs(): SampleInterfaceWithArgs {
    method queryForSampleInterfaceWithArgsAndInlineResolver (line 264) | queryForSampleInterfaceWithArgsAndInlineResolver(): SampleInterfaceWit...
    method queryForSampleInterfaceWithArgsAndFieldResolver (line 269) | queryForSampleInterfaceWithArgsAndFieldResolver(): SampleInterfaceWith...
    method queryForSampleImplementingObjectWithArgsAndOwnResolver (line 274) | queryForSampleImplementingObjectWithArgsAndOwnResolver(): SampleImplem...
    method queryForSampleImplementingObjectWithArgsAndInheritedResolver (line 279) | queryForSampleImplementingObjectWithArgsAndInheritedResolver(): Sample...
    method queryForSampleImplementingObjectWithArgsAndInheritedFieldResolver (line 284) | queryForSampleImplementingObjectWithArgsAndInheritedFieldResolver(): S...
    method queryForSampleInterfaceImplementingInterfaceWithArgsAndInlineResolver (line 289) | queryForSampleInterfaceImplementingInterfaceWithArgsAndInlineResolver(...

FILE: tests/functional/interfaces-and-inheritance.ts
  class SampleImplementingObject1 (line 82) | @ObjectType({ implements: SampleInterface1 })
  class SampleImplementingObject2 (line 91) | @ObjectType({ implements: SampleInterface1 })
  class SampleMultiImplementingObject (line 102) | @ObjectType({ implements: [SampleInterface1, SampleInterface2] })
  class SampleExtendingImplementingObject (line 113) | @ObjectType({ implements: SampleInterface1 })
  class SampleExtendingObject2 (line 121) | @ObjectType()
  class SampleBaseArgs (line 127) | @ArgsType()
  class SampleExtendingArgs (line 132) | @ArgsType()
  class SampleBaseInput (line 138) | @InputType()
  class SampleExtendingInput (line 143) | @InputType()
  class SampleFirstBaseInput (line 150) | @InputType()
  class SampleFirstExtendedInput (line 155) | @InputType()
  class SampleSecondBaseInput (line 160) | @InputType()
  class SampleSecondExtendedInput (line 165) | @InputType()
  class SampleResolver (line 171) | class SampleResolver {
    method sampleQuery (line 173) | sampleQuery(): boolean {
    method queryWithArgs (line 178) | queryWithArgs(@Args() _args: SampleExtendingArgs): boolean {
    method mutationWithInput (line 183) | mutationWithInput(@Arg("input") _input: SampleExtendingInput): boolean {
    method sampleQuery (line 476) | sampleQuery(@Args() _args: SampleArgs): boolean {
    method sampleQuery (line 559) | sampleQuery(): ChildObject {
    method sampleQuery (line 601) | sampleQuery(): SampleImplementingObject {
    method sampleQuery (line 1376) | sampleQuery(): SampleUsedInterface {
    method sampleQuery (line 1480) | sampleQuery(): SampleUsedInterface {
  function getInnerType (line 235) | function getInnerType(fieldType: any) {
  class SampleInput (line 463) | @InputType()
  class SampleArgs (line 468) | @ArgsType()
  class SampleResolver (line 473) | @Resolver()
    method sampleQuery (line 173) | sampleQuery(): boolean {
    method queryWithArgs (line 178) | queryWithArgs(@Args() _args: SampleExtendingArgs): boolean {
    method mutationWithInput (line 183) | mutationWithInput(@Arg("input") _input: SampleExtendingInput): boolean {
    method sampleQuery (line 476) | sampleQuery(@Args() _args: SampleArgs): boolean {
    method sampleQuery (line 559) | sampleQuery(): ChildObject {
    method sampleQuery (line 601) | sampleQuery(): SampleImplementingObject {
    method sampleQuery (line 1376) | sampleQuery(): SampleUsedInterface {
    method sampleQuery (line 1480) | sampleQuery(): SampleUsedInterface {
  class BaseArgs (line 494) | @ArgsType()
  class FirstLevelArgs (line 500) | @ArgsType()
  class SecondLevelArgs (line 506) | @ArgsType()
  class TestResolver (line 512) | @Resolver()
    method testQuery (line 515) | testQuery(@Args() _args: SecondLevelArgs): boolean {
    method foobar (line 1426) | foobar() {
  class IBase (line 544) | @InterfaceType()
  class ChildObject (line 549) | @ObjectType({ implements: IBase })
  class SampleResolver (line 557) | class SampleResolver {
    method sampleQuery (line 173) | sampleQuery(): boolean {
    method queryWithArgs (line 178) | queryWithArgs(@Args() _args: SampleExtendingArgs): boolean {
    method mutationWithInput (line 183) | mutationWithInput(@Arg("input") _input: SampleExtendingInput): boolean {
    method sampleQuery (line 476) | sampleQuery(@Args() _args: SampleArgs): boolean {
    method sampleQuery (line 559) | sampleQuery(): ChildObject {
    method sampleQuery (line 601) | sampleQuery(): SampleImplementingObject {
    method sampleQuery (line 1376) | sampleQuery(): SampleUsedInterface {
    method sampleQuery (line 1480) | sampleQuery(): SampleUsedInterface {
  class SampleNotInterface (line 588) | @ObjectType()
  class SampleImplementingObject (line 593) | @ObjectType({ implements: [SampleNotInterface] })
  class SampleResolver (line 598) | @Resolver()
    method sampleQuery (line 173) | sampleQuery(): boolean {
    method queryWithArgs (line 178) | queryWithArgs(@Args() _args: SampleExtendingArgs): boolean {
    method mutationWithInput (line 183) | mutationWithInput(@Arg("input") _input: SampleExtendingInput): boolean {
    method sampleQuery (line 476) | sampleQuery(@Args() _args: SampleArgs): boolean {
    method sampleQuery (line 559) | sampleQuery(): ChildObject {
    method sampleQuery (line 601) | sampleQuery(): SampleImplementingObject {
    method sampleQuery (line 1376) | sampleQuery(): SampleUsedInterface {
    method sampleQuery (line 1480) | sampleQuery(): SampleUsedInterface {
  class BaseArgs (line 634) | @ArgsType()
  class ChildArgs (line 642) | @ArgsType()
  class BaseInput (line 648) | @InputType()
  class ChildInput (line 656) | @InputType()
  class FirstImplementation (line 670) | @ObjectType({ implements: BaseInterface })
  class SecondImplementation (line 679) | @ObjectType({ implements: BaseInterface })
  class FirstInterfaceWithStringResolveTypeObject (line 702) | @ObjectType({ implements: InterfaceWithStringResolveType })
  class SecondInterfaceWithStringResolveTypeObject (line 709) | @ObjectType({ implements: InterfaceWithStringResolveType })
  class FirstInterfaceWithClassResolveTypeObject (line 734) | @ObjectType({ implements: InterfaceWithClassResolveType })
  class SecondInterfaceWithClassResolveTypeObject (line 741) | @ObjectType({ implements: InterfaceWithClassResolveType })
  class SampleBaseClass (line 749) | class SampleBaseClass {
    method sampleStaticMethod (line 750) | static sampleStaticMethod() {
  class SampleExtendingNormalClassObject (line 754) | @ObjectType()
  class SampleExtendingNormalClassInput (line 759) | @InputType()
  class SampleExtendingNormalClassArgs (line 764) | @ArgsType()
  class SampleFirstBaseInput (line 771) | @InputType()
  class SampleFirstExtendedInput (line 776) | @InputType()
  class SampleSecondBaseInput (line 781) | @InputType()
  class SampleSecondExtendedInput (line 786) | @InputType()
  class InterfacesResolver (line 792) | @Resolver()
    method getInterfacePlainObject (line 795) | getInterfacePlainObject(): BaseInterface {
    method getFirstInterfaceImplementationObject (line 800) | getFirstInterfaceImplementationObject(): BaseInterface {
    method getSecondInterfaceWithStringResolveTypeObject (line 808) | getSecondInterfaceWithStringResolveTypeObject(): InterfaceWithStringRe...
    method getSecondInterfaceWithClassResolveTypeObject (line 816) | getSecondInterfaceWithClassResolveTypeObject(): InterfaceWithClassReso...
    method notMatchingValueForInterfaceWithClassResolveTypeObject (line 824) | notMatchingValueForInterfaceWithClassResolveTypeObject(): InterfaceWit...
    method queryWithArgs (line 829) | queryWithArgs(@Args() args: ChildArgs): boolean {
    method mutationWithInput (line 835) | mutationWithInput(@Arg("input") input: ChildInput): boolean {
    method baseClassQuery (line 841) | baseClassQuery(
    method secondImplementationPlainQuery (line 851) | secondImplementationPlainQuery(): SecondImplementation {
    method renamedFieldInterfaceQuery (line 859) | renamedFieldInterfaceQuery(): BaseInterface {
    method overwritingInputFieldMutation (line 868) | overwritingInputFieldMutation(@Arg("input") input: SampleSecondExtende...
  class BaseInterface (line 1120) | @InterfaceType()
  class One (line 1125) | @ObjectType({ implements: [BaseInterface] })
  class Two (line 1130) | @ObjectType({ implements: [BaseInterface] })
  class OneTwoResolver (line 1135) | @Resolver()
    method base (line 1138) | base(): BaseInterface {
    method base (line 1216) | base(): BaseInterface {
    method base (line 1296) | base(): BaseInterface {
  class BaseInterface (line 1188) | @InterfaceType({
  class One (line 1203) | @ObjectType({ implements: [BaseInterface] })
  class Two (line 1208) | @ObjectType({ implements: [BaseInterface] })
  class OneTwoResolver (line 1213) | @Resolver()
    method base (line 1138) | base(): BaseInterface {
    method base (line 1216) | base(): BaseInterface {
    method base (line 1296) | base(): BaseInterface {
  class BaseInterface (line 1266) | @InterfaceType({
  class One (line 1283) | @ObjectType({ implements: [BaseInterface] })
  class Two (line 1288) | @ObjectType({ implements: [BaseInterface] })
  class OneTwoResolver (line 1293) | @Resolver()
    method base (line 1138) | base(): BaseInterface {
    method base (line 1216) | base(): BaseInterface {
    method base (line 1296) | base(): BaseInterface {
  class SampleUnusedObjectType (line 1351) | @ObjectType({ implements: SampleUnusedInterface })
  class SampleObjectTypeImplementingUsedInterface (line 1365) | @ObjectType({ implements: SampleUsedInterface })
  class SampleResolver (line 1373) | @Resolver()
    method sampleQuery (line 173) | sampleQuery(): boolean {
    method queryWithArgs (line 178) | queryWithArgs(@Args() _args: SampleExtendingArgs): boolean {
    method mutationWithInput (line 183) | mutationWithInput(@Arg("input") _input: SampleExtendingInput): boolean {
    method sampleQuery (line 476) | sampleQuery(@Args() _args: SampleArgs): boolean {
    method sampleQuery (line 559) | sampleQuery(): ChildObject {
    method sampleQuery (line 601) | sampleQuery(): SampleImplementingObject {
    method sampleQuery (line 1376) | sampleQuery(): SampleUsedInterface {
    method sampleQuery (line 1480) | sampleQuery(): SampleUsedInterface {
  class IFooBar (line 1403) | @InterfaceType()
  class Foo (line 1408) | @ObjectType({ implements: IFooBar })
  class Bar (line 1413) | @ObjectType({ implements: IFooBar })
  class FooBar (line 1418) | @ObjectType()
  class TestResolver (line 1423) | @Resolver()
    method testQuery (line 515) | testQuery(@Args() _args: SecondLevelArgs): boolean {
    method foobar (line 1426) | foobar() {
  class FirstSampleObject (line 1460) | @ObjectType({ implements: SampleUsedInterface })
  class SecondSampleObject (line 1468) | @ObjectType({ implements: SampleUsedInterface })
  class SampleResolver (line 1477) | @Resolver()
    method sampleQuery (line 173) | sampleQuery(): boolean {
    method queryWithArgs (line 178) | queryWithArgs(@Args() _args: SampleExtendingArgs): boolean {
    method mutationWithInput (line 183) | mutationWithInput(@Arg("input") _input: SampleExtendingInput): boolean {
    method sampleQuery (line 476) | sampleQuery(@Args() _args: SampleArgs): boolean {
    method sampleQuery (line 559) | sampleQuery(): ChildObject {
    method sampleQuery (line 601) | sampleQuery(): SampleImplementingObject {
    method sampleQuery (line 1376) | sampleQuery(): SampleUsedInterface {
    method sampleQuery (line 1480) | sampleQuery(): SampleUsedInterface {

FILE: tests/functional/ioc-container.ts
  class SampleService (line 25) | @Service()
  class SampleObject (line 29) | @ObjectType()
  class SampleResolver (line 34) | @Service()
    method constructor (line 37) | constructor(private service: SampleService) {}
    method sampleQuery (line 40) | sampleQuery(): SampleObject {
    method sampleQuery (line 74) | sampleQuery(): SampleObject {
    method sampleQuery (line 113) | sampleQuery(): string {
    method sampleQuery (line 140) | sampleQuery(): string {
    method sampleQuery (line 182) | sampleQuery(@Arg("sampleArg") sampleArg: string): string {
  class SampleObject (line 64) | @ObjectType()
  class SampleResolver (line 69) | @Resolver(() => SampleObject)
    method constructor (line 37) | constructor(private service: SampleService) {}
    method sampleQuery (line 40) | sampleQuery(): SampleObject {
    method sampleQuery (line 74) | sampleQuery(): SampleObject {
    method sampleQuery (line 113) | sampleQuery(): string {
    method sampleQuery (line 140) | sampleQuery(): string {
    method sampleQuery (line 182) | sampleQuery(@Arg("sampleArg") sampleArg: string): string {
  method get (line 104) | get(someClass, resolverData: ResolverData<{ requestId: number }>) {
  class SampleResolver (line 110) | @Resolver()
    method constructor (line 37) | constructor(private service: SampleService) {}
    method sampleQuery (line 40) | sampleQuery(): SampleObject {
    method sampleQuery (line 74) | sampleQuery(): SampleObject {
    method sampleQuery (line 113) | sampleQuery(): string {
    method sampleQuery (line 140) | sampleQuery(): string {
    method sampleQuery (line 182) | sampleQuery(@Arg("sampleArg") sampleArg: string): string {
  class SampleResolver (line 137) | @Resolver()
    method constructor (line 37) | constructor(private service: SampleService) {}
    method sampleQuery (line 40) | sampleQuery(): SampleObject {
    method sampleQuery (line 74) | sampleQuery(): SampleObject {
    method sampleQuery (line 113) | sampleQuery(): string {
    method sampleQuery (line 140) | sampleQuery(): string {
    method sampleQuery (line 182) | sampleQuery(@Arg("sampleArg") sampleArg: string): string {
  type TestContext (line 145) | interface TestContext {
  method get (line 161) | get(someClass: any) {
  class SampleResolver (line 178) | @Service()
    method constructor (line 37) | constructor(private service: SampleService) {}
    method sampleQuery (line 40) | sampleQuery(): SampleObject {
    method sampleQuery (line 74) | sampleQuery(): SampleObject {
    method sampleQuery (line 113) | sampleQuery(): string {
    method sampleQuery (line 140) | sampleQuery(): string {
    method sampleQuery (line 182) | sampleQuery(@Arg("sampleArg") sampleArg: string): string {
  method get (line 188) | async get(someClass: any) {

FILE: tests/functional/manual-decorators.ts
  class SampleObject (line 8) | @ObjectType()
  class SampleArgs (line 16) | @ArgsType()
  class SampleResolver (line 24) | @Resolver()
    method sampleQuery (line 27) | sampleQuery(): SampleObject {

FILE: tests/functional/metadata-storage.ts
  function createAbstractResolver (line 26) | function createAbstractResolver(classType: ClassType) {
  class SampleObject (line 52) | @ObjectType()
  class SubClassResolver (line 61) | @Resolver(() => SampleObject)
    method subClassQuery (line 64) | subClassQuery(): boolean {
    method subClassMutation (line 69) | subClassMutation(): boolean {
    method subClassSubscription (line 74) | subClassSubscription(): boolean {
    method sampleField (line 79) | sampleField(): boolean {

FILE: tests/functional/middlewares.ts
  class ClassMiddleware (line 107) | class ClassMiddleware implements MiddlewareInterface {
    method use (line 110) | async use(_: ResolverData, next: NextFn) {
  class SampleObject (line 122) | @ObjectType()
  class SampleResolver (line 135) | @Resolver(() => SampleObject)
    method normalQuery (line 138) | normalQuery(): boolean {
    method sampleObjectQuery (line 143) | sampleObjectQuery(): SampleObject {
    method middlewareOrderQuery (line 152) | async middlewareOrderQuery() {
    method multipleMiddlewareDecoratorsQuery (line 162) | async multipleMiddlewareDecoratorsQuery() {
    method middlewareInterceptQuery (line 169) | middlewareInterceptQuery(): string {
    method middlewareReturnUndefinedQuery (line 180) | middlewareReturnUndefinedQuery(): string {
    method middlewareErrorCatchQuery (line 187) | middlewareErrorCatchQuery(@Arg("throwError") throwError: boolean): str...
    method middlewareThrowErrorAfterQuery (line 197) | middlewareThrowErrorAfterQuery(): string {
    method middlewareThrowErrorQuery (line 204) | middlewareThrowErrorQuery(): string {
    method doubleNextMiddlewareQuery (line 211) | doubleNextMiddlewareQuery(): string {
    method classMiddlewareQuery (line 218) | classMiddlewareQuery(): string {
    method customMethodDecoratorQuery (line 225) | customMethodDecoratorQuery(): string {
    method resolverField (line 232) | resolverField(): string {
  class LocalResolver (line 332) | @UseMiddleware(resolverMiddleware1)
    method normalQuery (line 337) | normalQuery(): boolean {

FILE: tests/functional/nested-interface-inheritance.ts
  class D (line 27) | @ObjectType({ implements: C })
  class TestResolver (line 33) | @Resolver()
    method testQuery (line 36) | testQuery(): string {

FILE: tests/functional/query-complexity.ts
  function calculateComplexityPoints (line 19) | function calculateComplexityPoints(query: string, schema: GraphQLSchema) {
  class SampleObject (line 36) | @ObjectType()
  class SampleResolver (line 42) | @Resolver(() => SampleObject)
    method sampleQuery (line 45) | sampleQuery(): SampleObject {
  class SampleObject (line 81) | @ObjectType()
  function createResolver (line 87) | function createResolver(name: string, objectType: ClassType) {
  class ChildResolver (line 106) | @Resolver()
    method childSubscription (line 109) | childSubscription(): boolean {

FILE: tests/functional/resolvers.ts
  class SampleInput (line 59) | @InputType()
    method isTrue (line 1263) | isTrue() {
  class SampleInputChild (line 74) | @InputType()
  class SampleArgs (line 83) | @ArgsType()
    method isTrue (line 1238) | isTrue() {
  class SampleArgsChild (line 104) | @ArgsType()
  class SampleObject (line 113) | @ObjectType()
    method getterField (line 123) | get getterField(): string {
    method simpleMethodField (line 128) | simpleMethodField(): string {
    method argMethodField (line 133) | argMethodField(
    method isTrue (line 1310) | isTrue() {
    method constructor (line 1314) | constructor() {
    method getterField (line 1339) | get getterField(): number {
    method methodField (line 1344) | methodField(): number {
    method asyncMethodField (line 1349) | async asyncMethodField() {
    method methodFieldWithArg (line 1354) | methodFieldWithArg(@Arg("factor") factor: number): number {
  class LambdaResolver (line 150) | @Resolver(() => SampleObject)
    method lambdaQuery (line 154) | lambdaQuery(): boolean {
  class ClassResolver (line 159) | @Resolver(SampleObject)
    method classQuery (line 163) | classQuery(): boolean {
  class SampleResolver (line 168) | @Resolver(() => SampleObject)
    method emptyQuery (line 171) | emptyQuery(): boolean {
    method implicitStringQuery (line 176) | implicitStringQuery(): string {
    method explicitStringQuery (line 181) | explicitStringQuery(): any {
    method nullableStringQuery (line 186) | nullableStringQuery(): string | null {
    method explicitStringArrayQuery (line 191) | explicitStringArrayQuery(): any {
    method explicitNullableItemArrayQuery (line 196) | explicitNullableItemArrayQuery(): any {
    method explicitNullableArrayWithNullableItemsQuery (line 201) | explicitNullableArrayWithNullableItemsQuery(): any {
    method promiseStringQuery (line 206) | async promiseStringQuery(): Promise<string> {
    method implicitObjectQuery (line 211) | implicitObjectQuery(): SampleObject {
    method asyncObjectQuery (line 216) | async asyncObjectQuery(): Promise<SampleObject> {
    method rootCtxQuery (line 221) | rootCtxQuery(@Root() _root: any, @Ctx() _ctx: any): boolean {
    method argQuery (line 226) | argQuery(@Arg("arg1") _arg1: string, @Arg("arg2") _arg2: boolean): any {
    method argsQuery (line 231) | argsQuery(@Args() _args: SampleArgs): any {
    method argAndArgsQuery (line 236) | argAndArgsQuery(@Arg("arg1") _arg1: string, @Args() _args: SampleArgs)...
    method argsInheritanceQuery (line 241) | argsInheritanceQuery(@Args() _args: SampleArgsChild): any {
    method emptyMutation (line 246) | emptyMutation(): boolean {
    method resolverFieldWithArgs (line 251) | resolverFieldWithArgs(@Arg("arg1") _arg1: string, @Arg("arg2") _arg2: ...
    method independentFieldResolver (line 256) | independentFieldResolver(@Arg("arg1") _arg1: string, @Arg("arg2") _arg...
    method overwrittenFieldResolver (line 261) | overwrittenFieldResolver() {
    method sampleQuery (line 1130) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 1156) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method randomValueGetter (line 1365) | get randomValueGetter() {
    method getRandomValue (line 1369) | getRandomValue() {
    method sampleQuery (line 1374) | sampleQuery(): SampleObject {
    method notInstanceQuery (line 1380) | notInstanceQuery(): SampleObject {
    method queryWithRootContextAndInfo (line 1385) | queryWithRootContextAndInfo(
    method queryWithPartialRootAndContext (line 1397) | queryWithPartialRootAndContext(
    method queryWithCustomDecorators (line 1407) | queryWithCustomDecorators(
    method queryWithCustomDescriptorDecorator (line 1421) | queryWithCustomDescriptorDecorator(): boolean {
    method mutationWithArgs (line 1426) | mutationWithArgs(@Args() args: SampleArgs): number {
    method mutationWithOptionalArgs (line 1435) | mutationWithOptionalArgs(@Args() args: SampleOptionalArgs): boolean {
    method mutationWithInput (line 1441) | mutationWithInput(@Arg("input") input: SampleInput): number {
    method mutationWithNestedInputs (line 1450) | mutationWithNestedInputs(@Arg("input") input: SampleNestedInput): numb...
    method mutationWithTripleNestedInputs (line 1456) | mutationWithTripleNestedInputs(@Arg("input") input: SampleTripleNested...
    method mutationWithNestedArgsInput (line 1462) | mutationWithNestedArgsInput(@Args() { factor, input }: SampleNestedArg...
    method mutationWithInputs (line 1468) | mutationWithInputs(@Arg("inputs", () => [SampleInput]) inputs: SampleI...
    method mutationWithTripleArrayInputs (line 1475) | mutationWithTripleArrayInputs(
    method mutationWithOptionalArg (line 1483) | mutationWithOptionalArg(
    method fieldResolverField (line 1491) | fieldResolverField() {
    method fieldResolverGetter (line 1496) | fieldResolverGetter() {
    method fieldResolverMethod (line 1501) | fieldResolverMethod() {
    method fieldResolverWithRoot (line 1506) | fieldResolverWithRoot(@Root() root: SampleObject) {
    method fieldResolverMethodWithArgs (line 1515) | fieldResolverMethodWithArgs(@Root() _: SampleObject, @Arg("arg") arg: ...
    method sampleQuery (line 1989) | sampleQuery(): SampleObject {
    method sampleQuerySync (line 2034) | sampleQuerySync(): SampleObject {
    method sampleMutation (line 2061) | sampleMutation(): string {
    method sampleQuery (line 2099) | sampleQuery(): SampleObject {
    method sampleQuery (line 2144) | sampleQuery(): SampleObject {
    method sampleQuery (line 2180) | sampleQuery(): SampleObject {
    method greet (line 2213) | greet(@Arg("name") name: string, @Ctx() ctx: { prefix: string }): stri...
    method sampleObject (line 2586) | sampleObject(): SampleObject {
  function getQuery (line 280) | function getQuery(queryName: string) {
  function getMutation (line 283) | function getMutation(mutationName: string) {
  class SampleResolverWithError (line 890) | @Resolver()
    method sampleQuery (line 894) | sampleQuery(@Arg("arg") _arg: any): string {
    method sampleQuery (line 913) | sampleQuery() {
    method sampleQuery (line 932) | sampleQuery(): any {
    method sampleMutation (line 951) | sampleMutation() {
    method sampleMutation (line 970) | sampleMutation(): any {
    method sampleQuery (line 988) | sampleQuery(): string {
    method sampleField (line 993) | sampleField() {
    method sampleQuery (line 1019) | sampleQuery(): string {
    method independentField (line 1024) | independentField() {
    method sampleQuery (line 1049) | sampleQuery(): string {
    method sampleQuery (line 1076) | sampleQuery(@Arg("input") _input: SampleObject): string {
    method sampleQuery (line 1103) | sampleQuery(@Args() _args: SampleObject): string {
  class SampleResolverWithError (line 909) | @Resolver()
    method sampleQuery (line 894) | sampleQuery(@Arg("arg") _arg: any): string {
    method sampleQuery (line 913) | sampleQuery() {
    method sampleQuery (line 932) | sampleQuery(): any {
    method sampleMutation (line 951) | sampleMutation() {
    method sampleMutation (line 970) | sampleMutation(): any {
    method sampleQuery (line 988) | sampleQuery(): string {
    method sampleField (line 993) | sampleField() {
    method sampleQuery (line 1019) | sampleQuery(): string {
    method independentField (line 1024) | independentField() {
    method sampleQuery (line 1049) | sampleQuery(): string {
    method sampleQuery (line 1076) | sampleQuery(@Arg("input") _input: SampleObject): string {
    method sampleQuery (line 1103) | sampleQuery(@Args() _args: SampleObject): string {
  class SampleResolverWithError (line 928) | @Resolver()
    method sampleQuery (line 894) | sampleQuery(@Arg("arg") _arg: any): string {
    method sampleQuery (line 913) | sampleQuery() {
    method sampleQuery (line 932) | sampleQuery(): any {
    method sampleMutation (line 951) | sampleMutation() {
    method sampleMutation (line 970) | sampleMutation(): any {
    method sampleQuery (line 988) | sampleQuery(): string {
    method sampleField (line 993) | sampleField() {
    method sampleQuery (line 1019) | sampleQuery(): string {
    method independentField (line 1024) | independentField() {
    method sampleQuery (line 1049) | sampleQuery(): string {
    method sampleQuery (line 1076) | sampleQuery(@Arg("input") _input: SampleObject): string {
    method sampleQuery (line 1103) | sampleQuery(@Args() _args: SampleObject): string {
  class SampleResolverWithError (line 947) | @Resolver()
    method sampleQuery (line 894) | sampleQuery(@Arg("arg") _arg: any): string {
    method sampleQuery (line 913) | sampleQuery() {
    method sampleQuery (line 932) | sampleQuery(): any {
    method sampleMutation (line 951) | sampleMutation() {
    method sampleMutation (line 970) | sampleMutation(): any {
    method sampleQuery (line 988) | sampleQuery(): string {
    method sampleField (line 993) | sampleField() {
    method sampleQuery (line 1019) | sampleQuery(): string {
    method independentField (line 1024) | independentField() {
    method sampleQuery (line 1049) | sampleQuery(): string {
    method sampleQuery (line 1076) | sampleQuery(@Arg("input") _input: SampleObject): string {
    method sampleQuery (line 1103) | sampleQuery(@Args() _args: SampleObject): string {
  class SampleResolverWithError (line 966) | @Resolver()
    method sampleQuery (line 894) | sampleQuery(@Arg("arg") _arg: any): string {
    method sampleQuery (line 913) | sampleQuery() {
    method sampleQuery (line 932) | sampleQuery(): any {
    method sampleMutation (line 951) | sampleMutation() {
    method sampleMutation (line 970) | sampleMutation(): any {
    method sampleQuery (line 988) | sampleQuery(): string {
    method sampleField (line 993) | sampleField() {
    method sampleQuery (line 1019) | sampleQuery(): string {
    method independentField (line 1024) | independentField() {
    method sampleQuery (line 1049) | sampleQuery(): string {
    method sampleQuery (line 1076) | sampleQuery(@Arg("input") _input: SampleObject): string {
    method sampleQuery (line 1103) | sampleQuery(@Args() _args: SampleObject): string {
  class SampleResolverWithError (line 985) | @Resolver()
    method sampleQuery (line 894) | sampleQuery(@Arg("arg") _arg: any): string {
    method sampleQuery (line 913) | sampleQuery() {
    method sampleQuery (line 932) | sampleQuery(): any {
    method sampleMutation (line 951) | sampleMutation() {
    method sampleMutation (line 970) | sampleMutation(): any {
    method sampleQuery (line 988) | sampleQuery(): string {
    method sampleField (line 993) | sampleField() {
    method sampleQuery (line 1019) | sampleQuery(): string {
    method independentField (line 1024) | independentField() {
    method sampleQuery (line 1049) | sampleQuery(): string {
    method sampleQuery (line 1076) | sampleQuery(@Arg("input") _input: SampleObject): string {
    method sampleQuery (line 1103) | sampleQuery(@Args() _args: SampleObject): string {
  class SampleObjectWithError (line 1011) | @ObjectType()
  class SampleResolverWithError (line 1016) | @Resolver(() => SampleObjectWithError)
    method sampleQuery (line 894) | sampleQuery(@Arg("arg") _arg: any): string {
    method sampleQuery (line 913) | sampleQuery() {
    method sampleQuery (line 932) | sampleQuery(): any {
    method sampleMutation (line 951) | sampleMutation() {
    method sampleMutation (line 970) | sampleMutation(): any {
    method sampleQuery (line 988) | sampleQuery(): string {
    method sampleField (line 993) | sampleField() {
    method sampleQuery (line 1019) | sampleQuery(): string {
    method independentField (line 1024) | independentField() {
    method sampleQuery (line 1049) | sampleQuery(): string {
    method sampleQuery (line 1076) | sampleQuery(@Arg("input") _input: SampleObject): string {
    method sampleQuery (line 1103) | sampleQuery(@Args() _args: SampleObject): string {
  class SampleUndecoratedObject (line 1043) | class SampleUndecoratedObject {
  class SampleResolverWithError (line 1046) | @Resolver()
    method sampleQuery (line 894) | sampleQuery(@Arg("arg") _arg: any): string {
    method sampleQuery (line 913) | sampleQuery() {
    method sampleQuery (line 932) | sampleQuery(): any {
    method sampleMutation (line 951) | sampleMutation() {
    method sampleMutation (line 970) | sampleMutation(): any {
    method sampleQuery (line 988) | sampleQuery(): string {
    method sampleField (line 993) | sampleField() {
    method sampleQuery (line 1019) | sampleQuery(): string {
    method independentField (line 1024) | independentField() {
    method sampleQuery (line 1049) | sampleQuery(): string {
    method sampleQuery (line 1076) | sampleQuery(@Arg("input") _input: SampleObject): string {
    method sampleQuery (line 1103) | sampleQuery(@Args() _args: SampleObject): string {
  class SampleObject (line 1068) | @ObjectType()
    method getterField (line 123) | get getterField(): string {
    method simpleMethodField (line 128) | simpleMethodField(): string {
    method argMethodField (line 133) | argMethodField(
    method isTrue (line 1310) | isTrue() {
    method constructor (line 1314) | constructor() {
    method getterField (line 1339) | get getterField(): number {
    method methodField (line 1344) | methodField(): number {
    method asyncMethodField (line 1349) | async asyncMethodField() {
    method methodFieldWithArg (line 1354) | methodFieldWithArg(@Arg("factor") factor: number): number {
  class SampleResolverWithError (line 1073) | @Resolver()
    method sampleQuery (line 894) | sampleQuery(@Arg("arg") _arg: any): string {
    method sampleQuery (line 913) | sampleQuery() {
    method sampleQuery (line 932) | sampleQuery(): any {
    method sampleMutation (line 951) | sampleMutation() {
    method sampleMutation (line 970) | sampleMutation(): any {
    method sampleQuery (line 988) | sampleQuery(): string {
    method sampleField (line 993) | sampleField() {
    method sampleQuery (line 1019) | sampleQuery(): string {
    method independentField (line 1024) | independentField() {
    method sampleQuery (line 1049) | sampleQuery(): string {
    method sampleQuery (line 1076) | sampleQuery(@Arg("input") _input: SampleObject): string {
    method sampleQuery (line 1103) | sampleQuery(@Args() _args: SampleObject): string {
  class SampleObject (line 1095) | @ObjectType()
    method getterField (line 123) | get getterField(): string {
    method simpleMethodField (line 128) | simpleMethodField(): string {
    method argMethodField (line 133) | argMethodField(
    method isTrue (line 1310) | isTrue() {
    method constructor (line 1314) | constructor() {
    method getterField (line 1339) | get getterField(): number {
    method methodField (line 1344) | methodField(): number {
    method asyncMethodField (line 1349) | async asyncMethodField() {
    method methodFieldWithArg (line 1354) | methodFieldWithArg(@Arg("factor") factor: number): number {
  class SampleResolverWithError (line 1100) | @Resolver()
    method sampleQuery (line 894) | sampleQuery(@Arg("arg") _arg: any): string {
    method sampleQuery (line 913) | sampleQuery() {
    method sampleQuery (line 932) | sampleQuery(): any {
    method sampleMutation (line 951) | sampleMutation() {
    method sampleMutation (line 970) | sampleMutation(): any {
    method sampleQuery (line 988) | sampleQuery(): string {
    method sampleField (line 993) | sampleField() {
    method sampleQuery (line 1019) | sampleQuery(): string {
    method independentField (line 1024) | independentField() {
    method sampleQuery (line 1049) | sampleQuery(): string {
    method sampleQuery (line 1076) | sampleQuery(@Arg("input") _input: SampleObject): string {
    method sampleQuery (line 1103) | sampleQuery(@Args() _args: SampleObject): string {
  class SampleInput (line 1121) | @InputType()
    method isTrue (line 1263) | isTrue() {
  class SampleResolver (line 1127) | @Resolver()
    method emptyQuery (line 171) | emptyQuery(): boolean {
    method implicitStringQuery (line 176) | implicitStringQuery(): string {
    method explicitStringQuery (line 181) | explicitStringQuery(): any {
    method nullableStringQuery (line 186) | nullableStringQuery(): string | null {
    method explicitStringArrayQuery (line 191) | explicitStringArrayQuery(): any {
    method explicitNullableItemArrayQuery (line 196) | explicitNullableItemArrayQuery(): any {
    method explicitNullableArrayWithNullableItemsQuery (line 201) | explicitNullableArrayWithNullableItemsQuery(): any {
    method promiseStringQuery (line 206) | async promiseStringQuery(): Promise<string> {
    method implicitObjectQuery (line 211) | implicitObjectQuery(): SampleObject {
    method asyncObjectQuery (line 216) | async asyncObjectQuery(): Promise<SampleObject> {
    method rootCtxQuery (line 221) | rootCtxQuery(@Root() _root: any, @Ctx() _ctx: any): boolean {
    method argQuery (line 226) | argQuery(@Arg("arg1") _arg1: string, @Arg("arg2") _arg2: boolean): any {
    method argsQuery (line 231) | argsQuery(@Args() _args: SampleArgs): any {
    method argAndArgsQuery (line 236) | argAndArgsQuery(@Arg("arg1") _arg1: string, @Args() _args: SampleArgs)...
    method argsInheritanceQuery (line 241) | argsInheritanceQuery(@Args() _args: SampleArgsChild): any {
    method emptyMutation (line 246) | emptyMutation(): boolean {
    method resolverFieldWithArgs (line 251) | resolverFieldWithArgs(@Arg("arg1") _arg1: string, @Arg("arg2") _arg2: ...
    method independentFieldResolver (line 256) | independentFieldResolver(@Arg("arg1") _arg1: string, @Arg("arg2") _arg...
    method overwrittenFieldResolver (line 261) | overwrittenFieldResolver() {
    method sampleQuery (line 1130) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 1156) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method randomValueGetter (line 1365) | get randomValueGetter() {
    method getRandomValue (line 1369) | getRandomValue() {
    method sampleQuery (line 1374) | sampleQuery(): SampleObject {
    method notInstanceQuery (line 1380) | notInstanceQuery(): SampleObject {
    method queryWithRootContextAndInfo (line 1385) | queryWithRootContextAndInfo(
    method queryWithPartialRootAndContext (line 1397) | queryWithPartialRootAndContext(
    method queryWithCustomDecorators (line 1407) | queryWithCustomDecorators(
    method queryWithCustomDescriptorDecorator (line 1421) | queryWithCustomDescriptorDecorator(): boolean {
    method mutationWithArgs (line 1426) | mutationWithArgs(@Args() args: SampleArgs): number {
    method mutationWithOptionalArgs (line 1435) | mutationWithOptionalArgs(@Args() args: SampleOptionalArgs): boolean {
    method mutationWithInput (line 1441) | mutationWithInput(@Arg("input") input: SampleInput): number {
    method mutationWithNestedInputs (line 1450) | mutationWithNestedInputs(@Arg("input") input: SampleNestedInput): numb...
    method mutationWithTripleNestedInputs (line 1456) | mutationWithTripleNestedInputs(@Arg("input") input: SampleTripleNested...
    method mutationWithNestedArgsInput (line 1462) | mutationWithNestedArgsInput(@Args() { factor, input }: SampleNestedArg...
    method mutationWithInputs (line 1468) | mutationWithInputs(@Arg("inputs", () => [SampleInput]) inputs: SampleI...
    method mutationWithTripleArrayInputs (line 1475) | mutationWithTripleArrayInputs(
    method mutationWithOptionalArg (line 1483) | mutationWithOptionalArg(
    method fieldResolverField (line 1491) | fieldResolverField() {
    method fieldResolverGetter (line 1496) | fieldResolverGetter() {
    method fieldResolverMethod (line 1501) | fieldResolverMethod() {
    method fieldResolverWithRoot (line 1506) | fieldResolverWithRoot(@Root() root: SampleObject) {
    method fieldResolverMethodWithArgs (line 1515) | fieldResolverMethodWithArgs(@Root() _: SampleObject, @Arg("arg") arg: ...
    method sampleQuery (line 1989) | sampleQuery(): SampleObject {
    method sampleQuerySync (line 2034) | sampleQuerySync(): SampleObject {
    method sampleMutation (line 2061) | sampleMutation(): string {
    method sampleQuery (line 2099) | sampleQuery(): SampleObject {
    method sampleQuery (line 2144) | sampleQuery(): SampleObject {
    method sampleQuery (line 2180) | sampleQuery(): SampleObject {
    method greet (line 2213) | greet(@Arg("name") name: string, @Ctx() ctx: { prefix: string }): stri...
    method sampleObject (line 2586) | sampleObject(): SampleObject {
  class SampleInput (line 1147) | @InputType()
    method isTrue (line 1263) | isTrue() {
  class SampleResolver (line 1153) | @Resolver()
    method emptyQuery (line 171) | emptyQuery(): boolean {
    method implicitStringQuery (line 176) | implicitStringQuery(): string {
    method explicitStringQuery (line 181) | explicitStringQuery(): any {
    method nullableStringQuery (line 186) | nullableStringQuery(): string | null {
    method explicitStringArrayQuery (line 191) | explicitStringArrayQuery(): any {
    method explicitNullableItemArrayQuery (line 196) | explicitNullableItemArrayQuery(): any {
    method explicitNullableArrayWithNullableItemsQuery (line 201) | explicitNullableArrayWithNullableItemsQuery(): any {
    method promiseStringQuery (line 206) | async promiseStringQuery(): Promise<string> {
    method implicitObjectQuery (line 211) | implicitObjectQuery(): SampleObject {
    method asyncObjectQuery (line 216) | async asyncObjectQuery(): Promise<SampleObject> {
    method rootCtxQuery (line 221) | rootCtxQuery(@Root() _root: any, @Ctx() _ctx: any): boolean {
    method argQuery (line 226) | argQuery(@Arg("arg1") _arg1: string, @Arg("arg2") _arg2: boolean): any {
    method argsQuery (line 231) | argsQuery(@Args() _args: SampleArgs): any {
    method argAndArgsQuery (line 236) | argAndArgsQuery(@Arg("arg1") _arg1: string, @Args() _args: SampleArgs)...
    method argsInheritanceQuery (line 241) | argsInheritanceQuery(@Args() _args: SampleArgsChild): any {
    method emptyMutation (line 246) | emptyMutation(): boolean {
    method resolverFieldWithArgs (line 251) | resolverFieldWithArgs(@Arg("arg1") _arg1: string, @Arg("arg2") _arg2: ...
    method independentFieldResolver (line 256) | independentFieldResolver(@Arg("arg1") _arg1: string, @Arg("arg2") _arg...
    method overwrittenFieldResolver (line 261) | overwrittenFieldResolver() {
    method sampleQuery (line 1130) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 1156) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method randomValueGetter (line 1365) | get randomValueGetter() {
    method getRandomValue (line 1369) | getRandomValue() {
    method sampleQuery (line 1374) | sampleQuery(): SampleObject {
    method notInstanceQuery (line 1380) | notInstanceQuery(): SampleObject {
    method queryWithRootContextAndInfo (line 1385) | queryWithRootContextAndInfo(
    method queryWithPartialRootAndContext (line 1397) | queryWithPartialRootAndContext(
    method queryWithCustomDecorators (line 1407) | queryWithCustomDecorators(
    method queryWithCustomDescriptorDecorator (line 1421) | queryWithCustomDescriptorDecorator(): boolean {
    method mutationWithArgs (line 1426) | mutationWithArgs(@Args() args: SampleArgs): number {
    method mutationWithOptionalArgs (line 1435) | mutationWithOptionalArgs(@Args() args: SampleOptionalArgs): boolean {
    method mutationWithInput (line 1441) | mutationWithInput(@Arg("input") input: SampleInput): number {
    method mutationWithNestedInputs (line 1450) | mutationWithNestedInputs(@Arg("input") input: SampleNestedInput): numb...
    method mutationWithTripleNestedInputs (line 1456) | mutationWithTripleNestedInputs(@Arg("input") input: SampleTripleNested...
    method mutationWithNestedArgsInput (line 1462) | mutationWithNestedArgsInput(@Args() { factor, input }: SampleNestedArg...
    method mutationWithInputs (line 1468) | mutationWithInputs(@Arg("inputs", () => [SampleInput]) inputs: SampleI...
    method mutationWithTripleArrayInputs (line 1475) | mutationWithTripleArrayInputs(
    method mutationWithOptionalArg (line 1483) | mutationWithOptionalArg(
    method fieldResolverField (line 1491) | fieldResolverField() {
    method fieldResolverGetter (line 1496) | fieldResolverGetter() {
    method fieldResolverMethod (line 1501) | fieldResolverMethod() {
    method fieldResolverWithRoot (line 1506) | fieldResolverWithRoot(@Root() root: SampleObject) {
    method fieldResolverMethodWithArgs (line 1515) | fieldResolverMethodWithArgs(@Root() _: SampleObject, @Arg("arg") arg: ...
    method sampleQuery (line 1989) | sampleQuery(): SampleObject {
    method sampleQuerySync (line 2034) | sampleQuerySync(): SampleObject {
    method sampleMutation (line 2061) | sampleMutation(): string {
    method sampleQuery (line 2099) | sampleQuery(): SampleObject {
    method sampleQuery (line 2144) | sampleQuery(): SampleObject {
    method sampleQuery (line 2180) | sampleQuery(): SampleObject {
    method greet (line 2213) | greet(@Arg("name") name: string, @Ctx() ctx: { prefix: string }): stri...
    method sampleObject (line 2586) | sampleObject(): SampleObject {
  function DescriptorDecorator (line 1187) | function DescriptorDecorator(): MethodDecorator {
  class SampleArgs (line 1229) | @ArgsType()
    method isTrue (line 1238) | isTrue() {
  class SampleOptionalArgs (line 1244) | @ArgsType()
  class SampleInput (line 1254) | @InputType()
    method isTrue (line 1263) | isTrue() {
  class SampleNestedInput (line 1269) | @InputType()
  class SampleTripleNestedInput (line 1287) | @InputType()
  class SampleNestedArgs (line 1296) | @ArgsType()
  class SampleObject (line 1306) | @ObjectType()
    method getterField (line 123) | get getterField(): string {
    method simpleMethodField (line 128) | simpleMethodField(): string {
    method argMethodField (line 133) | argMethodField(
    method isTrue (line 1310) | isTrue() {
    method constructor (line 1314) | constructor() {
    method getterField (line 1339) | get getterField(): number {
    method methodField (line 1344) | methodField(): number {
    method asyncMethodField (line 1349) | async asyncMethodField() {
    method methodFieldWithArg (line 1354) | methodFieldWithArg(@Arg("factor") factor: number): number {
  class SampleResolver (line 1359) | @Resolver(() => SampleObject)
    method emptyQuery (line 171) | emptyQuery(): boolean {
    method implicitStringQuery (line 176) | implicitStringQuery(): string {
    method explicitStringQuery (line 181) | explicitStringQuery(): any {
    method nullableStringQuery (line 186) | nullableStringQuery(): string | null {
    method explicitStringArrayQuery (line 191) | explicitStringArrayQuery(): any {
    method explicitNullableItemArrayQuery (line 196) | explicitNullableItemArrayQuery(): any {
    method explicitNullableArrayWithNullableItemsQuery (line 201) | explicitNullableArrayWithNullableItemsQuery(): any {
    method promiseStringQuery (line 206) | async promiseStringQuery(): Promise<string> {
    method implicitObjectQuery (line 211) | implicitObjectQuery(): SampleObject {
    method asyncObjectQuery (line 216) | async asyncObjectQuery(): Promise<SampleObject> {
    method rootCtxQuery (line 221) | rootCtxQuery(@Root() _root: any, @Ctx() _ctx: any): boolean {
    method argQuery (line 226) | argQuery(@Arg("arg1") _arg1: string, @Arg("arg2") _arg2: boolean): any {
    method argsQuery (line 231) | argsQuery(@Args() _args: SampleArgs): any {
    method argAndArgsQuery (line 236) | argAndArgsQuery(@Arg("arg1") _arg1: string, @Args() _args: SampleArgs)...
    method argsInheritanceQuery (line 241) | argsInheritanceQuery(@Args() _args: SampleArgsChild): any {
    method emptyMutation (line 246) | emptyMutation(): boolean {
    method resolverFieldWithArgs (line 251) | resolverFieldWithArgs(@Arg("arg1") _arg1: string, @Arg("arg2") _arg2: ...
    method independentFieldResolver (line 256) | independentFieldResolver(@Arg("arg1") _arg1: string, @Arg("arg2") _arg...
    method overwrittenFieldResolver (line 261) | overwrittenFieldResolver() {
    method sampleQuery (line 1130) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 1156) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method randomValueGetter (line 1365) | get randomValueGetter() {
    method getRandomValue (line 1369) | getRandomValue() {
    method sampleQuery (line 1374) | sampleQuery(): SampleObject {
    method notInstanceQuery (line 1380) | notInstanceQuery(): SampleObject {
    method queryWithRootContextAndInfo (line 1385) | queryWithRootContextAndInfo(
    method queryWithPartialRootAndContext (line 1397) | queryWithPartialRootAndContext(
    method queryWithCustomDecorators (line 1407) | queryWithCustomDecorators(
    method queryWithCustomDescriptorDecorator (line 1421) | queryWithCustomDescriptorDecorator(): boolean {
    method mutationWithArgs (line 1426) | mutationWithArgs(@Args() args: SampleArgs): number {
    method mutationWithOptionalArgs (line 1435) | mutationWithOptionalArgs(@Args() args: SampleOptionalArgs): boolean {
    method mutationWithInput (line 1441) | mutationWithInput(@Arg("input") input: SampleInput): number {
    method mutationWithNestedInputs (line 1450) | mutationWithNestedInputs(@Arg("input") input: SampleNestedInput): numb...
    method mutationWithTripleNestedInputs (line 1456) | mutationWithTripleNestedInputs(@Arg("input") input: SampleTripleNested...
    method mutationWithNestedArgsInput (line 1462) | mutationWithNestedArgsInput(@Args() { factor, input }: SampleNestedArg...
    method mutationWithInputs (line 1468) | mutationWithInputs(@Arg("inputs", () => [SampleInput]) inputs: SampleI...
    method mutationWithTripleArrayInputs (line 1475) | mutationWithTripleArrayInputs(
    method mutationWithOptionalArg (line 1483) | mutationWithOptionalArg(
    method fieldResolverField (line 1491) | fieldResolverField() {
    method fieldResolverGetter (line 1496) | fieldResolverGetter() {
    method fieldResolverMethod (line 1501) | fieldResolverMethod() {
    method fieldResolverWithRoot (line 1506) | fieldResolverWithRoot(@Root() root: SampleObject) {
    method fieldResolverMethodWithArgs (line 1515) | fieldResolverMethodWithArgs(@Root() _: SampleObject, @Arg("arg") arg: ...
    method sampleQuery (line 1989) | sampleQuery(): SampleObject {
    method sampleQuerySync (line 2034) | sampleQuerySync(): SampleObject {
    method sampleMutation (line 2061) | sampleMutation(): string {
    method sampleQuery (line 2099) | sampleQuery(): SampleObject {
    method sampleQuery (line 2144) | sampleQuery(): SampleObject {
    method sampleQuery (line 2180) | sampleQuery(): SampleObject {
    method greet (line 2213) | greet(@Arg("name") name: string, @Ctx() ctx: { prefix: string }): stri...
    method sampleObject (line 2586) | sampleObject(): SampleObject {
  class SampleObject (line 1981) | @ObjectType()
    method getterField (line 123) | get getterField(): string {
    method simpleMethodField (line 128) | simpleMethodField(): string {
    method argMethodField (line 133) | argMethodField(
    method isTrue (line 1310) | isTrue() {
    method constructor (line 1314) | constructor() {
    method getterField (line 1339) | get getterField(): number {
    method methodField (line 1344) | methodField(): number {
    method asyncMethodField (line 1349) | async asyncMethodField() {
    method methodFieldWithArg (line 1354) | methodFieldWithArg(@Arg("factor") factor: number): number {
  class SampleResolver (line 1986) | @Resolver()
    method emptyQuery (line 171) | emptyQuery(): boolean {
    method implicitStringQuery (line 176) | implicitStringQuery(): string {
    method explicitStringQuery (line 181) | explicitStringQuery(): any {
    method nullableStringQuery (line 186) | nullableStringQuery(): string | null {
    method explicitStringArrayQuery (line 191) | explicitStringArrayQuery(): any {
    method explicitNullableItemArrayQuery (line 196) | explicitNullableItemArrayQuery(): any {
    method explicitNullableArrayWithNullableItemsQuery (line 201) | explicitNullableArrayWithNullableItemsQuery(): any {
    method promiseStringQuery (line 206) | async promiseStringQuery(): Promise<string> {
    method implicitObjectQuery (line 211) | implicitObjectQuery(): SampleObject {
    method asyncObjectQuery (line 216) | async asyncObjectQuery(): Promise<SampleObject> {
    method rootCtxQuery (line 221) | rootCtxQuery(@Root() _root: any, @Ctx() _ctx: any): boolean {
    method argQuery (line 226) | argQuery(@Arg("arg1") _arg1: string, @Arg("arg2") _arg2: boolean): any {
    method argsQuery (line 231) | argsQuery(@Args() _args: SampleArgs): any {
    method argAndArgsQuery (line 236) | argAndArgsQuery(@Arg("arg1") _arg1: string, @Args() _args: SampleArgs)...
    method argsInheritanceQuery (line 241) | argsInheritanceQuery(@Args() _args: SampleArgsChild): any {
    method emptyMutation (line 246) | emptyMutation(): boolean {
    method resolverFieldWithArgs (line 251) | resolverFieldWithArgs(@Arg("arg1") _arg1: string, @Arg("arg2") _arg2: ...
    method independentFieldResolver (line 256) | independentFieldResolver(@Arg("arg1") _arg1: string, @Arg("arg2") _arg...
    method overwrittenFieldResolver (line 261) | overwrittenFieldResolver() {
    method sampleQuery (line 1130) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 1156) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method randomValueGetter (line 1365) | get randomValueGetter() {
    method getRandomValue (line 1369) | getRandomValue() {
    method sampleQuery (line 1374) | sampleQuery(): SampleObject {
    method notInstanceQuery (line 1380) | notInstanceQuery(): SampleObject {
    method queryWithRootContextAndInfo (line 1385) | queryWithRootContextAndInfo(
    method queryWithPartialRootAndContext (line 1397) | queryWithPartialRootAndContext(
    method queryWithCustomDecorators (line 1407) | queryWithCustomDecorators(
    method queryWithCustomDescriptorDecorator (line 1421) | queryWithCustomDescriptorDecorator(): boolean {
    method mutationWithArgs (line 1426) | mutationWithArgs(@Args() args: SampleArgs): number {
    method mutationWithOptionalArgs (line 1435) | mutationWithOptionalArgs(@Args() args: SampleOptionalArgs): boolean {
    method mutationWithInput (line 1441) | mutationWithInput(@Arg("input") input: SampleInput): number {
    method mutationWithNestedInputs (line 1450) | mutationWithNestedInputs(@Arg("input") input: SampleNestedInput): numb...
    method mutationWithTripleNestedInputs (line 1456) | mutationWithTripleNestedInputs(@Arg("input") input: SampleTripleNested...
    method mutationWithNestedArgsInput (line 1462) | mutationWithNestedArgsInput(@Args() { factor, input }: SampleNestedArg...
    method mutationWithInputs (line 1468) | mutationWithInputs(@Arg("inputs", () => [SampleInput]) inputs: SampleI...
    method mutationWithTripleArrayInputs (line 1475) | mutationWithTripleArrayInputs(
    method mutationWithOptionalArg (line 1483) | mutationWithOptionalArg(
    method fieldResolverField (line 1491) | fieldResolverField() {
    method fieldResolverGetter (line 1496) | fieldResolverGetter() {
    method fieldResolverMethod (line 1501) | fieldResolverMethod() {
    method fieldResolverWithRoot (line 1506) | fieldResolverWithRoot(@Root() root: SampleObject) {
    method fieldResolverMethodWithArgs (line 1515) | fieldResolverMethodWithArgs(@Root() _: SampleObject, @Arg("arg") arg: ...
    method sampleQuery (line 1989) | sampleQuery(): SampleObject {
    method sampleQuerySync (line 2034) | sampleQuerySync(): SampleObject {
    method sampleMutation (line 2061) | sampleMutation(): string {
    method sampleQuery (line 2099) | sampleQuery(): SampleObject {
    method sampleQuery (line 2144) | sampleQuery(): SampleObject {
    method sampleQuery (line 2180) | sampleQuery(): SampleObject {
    method greet (line 2213) | greet(@Arg("name") name: string, @Ctx() ctx: { prefix: string }): stri...
    method sampleObject (line 2586) | sampleObject(): SampleObject {
  class OmittedObject (line 1993) | @ObjectType()
  class OmittedResolver (line 1998) | @Resolver()
    method omittedQuery (line 2002) | omittedQuery(): OmittedObject {
  class SampleObject (line 2026) | @ObjectType()
    method getterField (line 123) | get getterField(): string {
    method simpleMethodField (line 128) | simpleMethodField(): string {
    method argMethodField (line 133) | argMethodField(
    method isTrue (line 1310) | isTrue() {
    method constructor (line 1314) | constructor() {
    method getterField (line 1339) | get getterField(): number {
    method methodField (line 1344) | methodField(): number {
    method asyncMethodField (line 1349) | async asyncMethodField() {
    method methodFieldWithArg (line 1354) | methodFieldWithArg(@Arg("factor") factor: number): number {
  class SampleResolver (line 2031) | @Resolver()
    method emptyQuery (line 171) | emptyQuery(): boolean {
    method implicitStringQuery (line 176) | implicitStringQuery(): string {
    method explicitStringQuery (line 181) | explicitStringQuery(): any {
    method nullableStringQuery (line 186) | nullableStringQuery(): string | null {
    method explicitStringArrayQuery (line 191) | explicitStringArrayQuery(): any {
    method explicitNullableItemArrayQuery (line 196) | explicitNullableItemArrayQuery(): any {
    method explicitNullableArrayWithNullableItemsQuery (line 201) | explicitNullableArrayWithNullableItemsQuery(): any {
    method promiseStringQuery (line 206) | async promiseStringQuery(): Promise<string> {
    method implicitObjectQuery (line 211) | implicitObjectQuery(): SampleObject {
    method asyncObjectQuery (line 216) | async asyncObjectQuery(): Promise<SampleObject> {
    method rootCtxQuery (line 221) | rootCtxQuery(@Root() _root: any, @Ctx() _ctx: any): boolean {
    method argQuery (line 226) | argQuery(@Arg("arg1") _arg1: string, @Arg("arg2") _arg2: boolean): any {
    method argsQuery (line 231) | argsQuery(@Args() _args: SampleArgs): any {
    method argAndArgsQuery (line 236) | argAndArgsQuery(@Arg("arg1") _arg1: string, @Args() _args: SampleArgs)...
    method argsInheritanceQuery (line 241) | argsInheritanceQuery(@Args() _args: SampleArgsChild): any {
    method emptyMutation (line 246) | emptyMutation(): boolean {
    method resolverFieldWithArgs (line 251) | resolverFieldWithArgs(@Arg("arg1") _arg1: string, @Arg("arg2") _arg2: ...
    method independentFieldResolver (line 256) | independentFieldResolver(@Arg("arg1") _arg1: string, @Arg("arg2") _arg...
    method overwrittenFieldResolver (line 261) | overwrittenFieldResolver() {
    method sampleQuery (line 1130) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 1156) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method randomValueGetter (line 1365) | get randomValueGetter() {
    method getRandomValue (line 1369) | getRandomValue() {
    method sampleQuery (line 1374) | sampleQuery(): SampleObject {
    method notInstanceQuery (line 1380) | notInstanceQuery(): SampleObject {
    method queryWithRootContextAndInfo (line 1385) | queryWithRootContextAndInfo(
    method queryWithPartialRootAndContext (line 1397) | queryWithPartialRootAndContext(
    method queryWithCustomDecorators (line 1407) | queryWithCustomDecorators(
    method queryWithCustomDescriptorDecorator (line 1421) | queryWithCustomDescriptorDecorator(): boolean {
    method mutationWithArgs (line 1426) | mutationWithArgs(@Args() args: SampleArgs): number {
    method mutationWithOptionalArgs (line 1435) | mutationWithOptionalArgs(@Args() args: SampleOptionalArgs): boolean {
    method mutationWithInput (line 1441) | mutationWithInput(@Arg("input") input: SampleInput): number {
    method mutationWithNestedInputs (line 1450) | mutationWithNestedInputs(@Arg("input") input: SampleNestedInput): numb...
    method mutationWithTripleNestedInputs (line 1456) | mutationWithTripleNestedInputs(@Arg("input") input: SampleTripleNested...
    method mutationWithNestedArgsInput (line 1462) | mutationWithNestedArgsInput(@Args() { factor, input }: SampleNestedArg...
    method mutationWithInputs (line 1468) | mutationWithInputs(@Arg("inputs", () => [SampleInput]) inputs: SampleI...
    method mutationWithTripleArrayInputs (line 1475) | mutationWithTripleArrayInputs(
    method mutationWithOptionalArg (line 1483) | mutationWithOptionalArg(
    method fieldResolverField (line 1491) | fieldResolverField() {
    method fieldResolverGetter (line 1496) | fieldResolverGetter() {
    method fieldResolverMethod (line 1501) | fieldResolverMethod() {
    method fieldResolverWithRoot (line 1506) | fieldResolverWithRoot(@Root() root: SampleObject) {
    method fieldResolverMethodWithArgs (line 1515) | fieldResolverMethodWithArgs(@Root() _: SampleObject, @Arg("arg") arg: ...
    method sampleQuery (line 1989) | sampleQuery(): SampleObject {
    method sampleQuerySync (line 2034) | sampleQuerySync(): SampleObject {
    method sampleMutation (line 2061) | sampleMutation(): string {
    method sampleQuery (line 2099) | sampleQuery(): SampleObject {
    method sampleQuery (line 2144) | sampleQuery(): SampleObject {
    method sampleQuery (line 2180) | sampleQuery(): SampleObject {
    method greet (line 2213) | greet(@Arg("name") name: string, @Ctx() ctx: { prefix: string }): stri...
    method sampleObject (line 2586) | sampleObject(): SampleObject {
  class SampleResolver (line 2058) | @Resolver()
    method emptyQuery (line 171) | emptyQuery(): boolean {
    method implicitStringQuery (line 176) | implicitStringQuery(): string {
    method explicitStringQuery (line 181) | explicitStringQuery(): any {
    method nullableStringQuery (line 186) | nullableStringQuery(): string | null {
    method explicitStringArrayQuery (line 191) | explicitStringArrayQuery(): any {
    method explicitNullableItemArrayQuery (line 196) | explicitNullableItemArrayQuery(): any {
    method explicitNullableArrayWithNullableItemsQuery (line 201) | explicitNullableArrayWithNullableItemsQuery(): any {
    method promiseStringQuery (line 206) | async promiseStringQuery(): Promise<string> {
    method implicitObjectQuery (line 211) | implicitObjectQuery(): SampleObject {
    method asyncObjectQuery (line 216) | async asyncObjectQuery(): Promise<SampleObject> {
    method rootCtxQuery (line 221) | rootCtxQuery(@Root() _root: any, @Ctx() _ctx: any): boolean {
    method argQuery (line 226) | argQuery(@Arg("arg1") _arg1: string, @Arg("arg2") _arg2: boolean): any {
    method argsQuery (line 231) | argsQuery(@Args() _args: SampleArgs): any {
    method argAndArgsQuery (line 236) | argAndArgsQuery(@Arg("arg1") _arg1: string, @Args() _args: SampleArgs)...
    method argsInheritanceQuery (line 241) | argsInheritanceQuery(@Args() _args: SampleArgsChild): any {
    method emptyMutation (line 246) | emptyMutation(): boolean {
    method resolverFieldWithArgs (line 251) | resolverFieldWithArgs(@Arg("arg1") _arg1: string, @Arg("arg2") _arg2: ...
    method independentFieldResolver (line 256) | independentFieldResolver(@Arg("arg1") _arg1: string, @Arg("arg2") _arg...
    method overwrittenFieldResolver (line 261) | overwrittenFieldResolver() {
    method sampleQuery (line 1130) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 1156) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method randomValueGetter (line 1365) | get randomValueGetter() {
    method getRandomValue (line 1369) | getRandomValue() {
    method sampleQuery (line 1374) | sampleQuery(): SampleObject {
    method notInstanceQuery (line 1380) | notInstanceQuery(): SampleObject {
    method queryWithRootContextAndInfo (line 1385) | queryWithRootContextAndInfo(
    method queryWithPartialRootAndContext (line 1397) | queryWithPartialRootAndContext(
    method queryWithCustomDecorators (line 1407) | queryWithCustomDecorators(
    method queryWithCustomDescriptorDecorator (line 1421) | queryWithCustomDescriptorDecorator(): boolean {
    method mutationWithArgs (line 1426) | mutationWithArgs(@Args() args: SampleArgs): number {
    method mutationWithOptionalArgs (line 1435) | mutationWithOptionalArgs(@Args() args: SampleOptionalArgs): boolean {
    method mutationWithInput (line 1441) | mutationWithInput(@Arg("input") input: SampleInput): number {
    method mutationWithNestedInputs (line 1450) | mutationWithNestedInputs(@Arg("input") input: SampleNestedInput): numb...
    method mutationWithTripleNestedInputs (line 1456) | mutationWithTripleNestedInputs(@Arg("input") input: SampleTripleNested...
    method mutationWithNestedArgsInput (line 1462) | mutationWithNestedArgsInput(@Args() { factor, input }: SampleNestedArg...
    method mutationWithInputs (line 1468) | mutationWithInputs(@Arg("inputs", () => [SampleInput]) inputs: SampleI...
    method mutationWithTripleArrayInputs (line 1475) | mutationWithTripleArrayInputs(
    method mutationWithOptionalArg (line 1483) | mutationWithOptionalArg(
    method fieldResolverField (line 1491) | fieldResolverField() {
    method fieldResolverGetter (line 1496) | fieldResolverGetter() {
    method fieldResolverMethod (line 1501) | fieldResolverMethod() {
    method fieldResolverWithRoot (line 1506) | fieldResolverWithRoot(@Root() root: SampleObject) {
    method fieldResolverMethodWithArgs (line 1515) | fieldResolverMethodWithArgs(@Root() _: SampleObject, @Arg("arg") arg: ...
    method sampleQuery (line 1989) | sampleQuery(): SampleObject {
    method sampleQuerySync (line 2034) | sampleQuerySync(): SampleObject {
    method sampleMutation (line 2061) | sampleMutation(): string {
    method sampleQuery (line 2099) | sampleQuery(): SampleObject {
    method sampleQuery (line 2144) | sampleQuery(): SampleObject {
    method sampleQuery (line 2180) | sampleQuery(): SampleObject {
    method greet (line 2213) | greet(@Arg("name") name: string, @Ctx() ctx: { prefix: string }): stri...
    method sampleObject (line 2586) | sampleObject(): SampleObject {
  class SampleObject (line 2088) | @ObjectType()
    method getterField (line 123) | get getterField(): string {
    method simpleMethodField (line 128) | simpleMethodField(): string {
    method argMethodField (line 133) | argMethodField(
    method isTrue (line 1310) | isTrue() {
    method constructor (line 1314) | constructor() {
    method getterField (line 1339) | get getterField(): number {
    method methodField (line 1344) | methodField(): number {
    method asyncMethodField (line 1349) | async asyncMethodField() {
    method methodFieldWithArg (line 1354) | methodFieldWithArg(@Arg("factor") factor: number): number {
  class SampleResolver (line 2096) | @Resolver()
    method emptyQuery (line 171) | emptyQuery(): boolean {
    method implicitStringQuery (line 176) | implicitStringQuery(): string {
    method explicitStringQuery (line 181) | explicitStringQuery(): any {
    method nullableStringQuery (line 186) | nullableStringQuery(): string | null {
    method explicitStringArrayQuery (line 191) | explicitStringArrayQuery(): any {
    method explicitNullableItemArrayQuery (line 196) | explicitNullableItemArrayQuery(): any {
    method explicitNullableArrayWithNullableItemsQuery (line 201) | explicitNullableArrayWithNullableItemsQuery(): any {
    method promiseStringQuery (line 206) | async promiseStringQuery(): Promise<string> {
    method implicitObjectQuery (line 211) | implicitObjectQuery(): SampleObject {
    method asyncObjectQuery (line 216) | async asyncObjectQuery(): Promise<SampleObject> {
    method rootCtxQuery (line 221) | rootCtxQuery(@Root() _root: any, @Ctx() _ctx: any): boolean {
    method argQuery (line 226) | argQuery(@Arg("arg1") _arg1: string, @Arg("arg2") _arg2: boolean): any {
    method argsQuery (line 231) | argsQuery(@Args() _args: SampleArgs): any {
    method argAndArgsQuery (line 236) | argAndArgsQuery(@Arg("arg1") _arg1: string, @Args() _args: SampleArgs)...
    method argsInheritanceQuery (line 241) | argsInheritanceQuery(@Args() _args: SampleArgsChild): any {
    method emptyMutation (line 246) | emptyMutation(): boolean {
    method resolverFieldWithArgs (line 251) | resolverFieldWithArgs(@Arg("arg1") _arg1: string, @Arg("arg2") _arg2: ...
    method independentFieldResolver (line 256) | independentFieldResolver(@Arg("arg1") _arg1: string, @Arg("arg2") _arg...
    method overwrittenFieldResolver (line 261) | overwrittenFieldResolver() {
    method sampleQuery (line 1130) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 1156) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method randomValueGetter (line 1365) | get randomValueGetter() {
    method getRandomValue (line 1369) | getRandomValue() {
    method sampleQuery (line 1374) | sampleQuery(): SampleObject {
    method notInstanceQuery (line 1380) | notInstanceQuery(): SampleObject {
    method queryWithRootContextAndInfo (line 1385) | queryWithRootContextAndInfo(
    method queryWithPartialRootAndContext (line 1397) | queryWithPartialRootAndContext(
    method queryWithCustomDecorators (line 1407) | queryWithCustomDecorators(
    method queryWithCustomDescriptorDecorator (line 1421) | queryWithCustomDescriptorDecorator(): boolean {
    method mutationWithArgs (line 1426) | mutationWithArgs(@Args() args: SampleArgs): number {
    method mutationWithOptionalArgs (line 1435) | mutationWithOptionalArgs(@Args() args: SampleOptionalArgs): boolean {
    method mutationWithInput (line 1441) | mutationWithInput(@Arg("input") input: SampleInput): number {
    method mutationWithNestedInputs (line 1450) | mutationWithNestedInputs(@Arg("input") input: SampleNestedInput): numb...
    method mutationWithTripleNestedInputs (line 1456) | mutationWithTripleNestedInputs(@Arg("input") input: SampleTripleNested...
    method mutationWithNestedArgsInput (line 1462) | mutationWithNestedArgsInput(@Args() { factor, input }: SampleNestedArg...
    method mutationWithInputs (line 1468) | mutationWithInputs(@Arg("inputs", () => [SampleInput]) inputs: SampleI...
    method mutationWithTripleArrayInputs (line 1475) | mutationWithTripleArrayInputs(
    method mutationWithOptionalArg (line 1483) | mutationWithOptionalArg(
    method fieldResolverField (line 1491) | fieldResolverField() {
    method fieldResolverGetter (line 1496) | fieldResolverGetter() {
    method fieldResolverMethod (line 1501) | fieldResolverMethod() {
    method fieldResolverWithRoot (line 1506) | fieldResolverWithRoot(@Root() root: SampleObject) {
    method fieldResolverMethodWithArgs (line 1515) | fieldResolverMethodWithArgs(@Root() _: SampleObject, @Arg("arg") arg: ...
    method sampleQuery (line 1989) | sampleQuery(): SampleObject {
    method sampleQuerySync (line 2034) | sampleQuerySync(): SampleObject {
    method sampleMutation (line 2061) | sampleMutation(): string {
    method sampleQuery (line 2099) | sampleQuery(): SampleObject {
    method sampleQuery (line 2144) | sampleQuery(): SampleObject {
    method sampleQuery (line 2180) | sampleQuery(): SampleObject {
    method greet (line 2213) | greet(@Arg("name") name: string, @Ctx() ctx: { prefix: string }): stri...
    method sampleObject (line 2586) | sampleObject(): SampleObject {
  class SampleObjectResolver (line 2103) | @Resolver(() => SampleObject)
    method resolvedField (line 2107) | resolvedField(): string {
    method resolvedField (line 2152) | resolvedField(): string {
  class SampleObject (line 2136) | @ObjectType()
    method getterField (line 123) | get getterField(): string {
    method simpleMethodField (line 128) | simpleMethodField(): string {
    method argMethodField (line 133) | argMethodField(
    method isTrue (line 1310) | isTrue() {
    method constructor (line 1314) | constructor() {
    method getterField (line 1339) | get getterField(): number {
    method methodField (line 1344) | methodField(): number {
    method asyncMethodField (line 1349) | async asyncMethodField() {
    method methodFieldWithArg (line 1354) | methodFieldWithArg(@Arg("factor") factor: number): number {
  class SampleResolver (line 2141) | @Resolver()
    method emptyQuery (line 171) | emptyQuery(): boolean {
    method implicitStringQuery (line 176) | implicitStringQuery(): string {
    method explicitStringQuery (line 181) | explicitStringQuery(): any {
    method nullableStringQuery (line 186) | nullableStringQuery(): string | null {
    method explicitStringArrayQuery (line 191) | explicitStringArrayQuery(): any {
    method explicitNullableItemArrayQuery (line 196) | explicitNullableItemArrayQuery(): any {
    method explicitNullableArrayWithNullableItemsQuery (line 201) | explicitNullableArrayWithNullableItemsQuery(): any {
    method promiseStringQuery (line 206) | async promiseStringQuery(): Promise<string> {
    method implicitObjectQuery (line 211) | implicitObjectQuery(): SampleObject {
    method asyncObjectQuery (line 216) | async asyncObjectQuery(): Promise<SampleObject> {
    method rootCtxQuery (line 221) | rootCtxQuery(@Root() _root: any, @Ctx() _ctx: any): boolean {
    method argQuery (line 226) | argQuery(@Arg("arg1") _arg1: string, @Arg("arg2") _arg2: boolean): any {
    method argsQuery (line 231) | argsQuery(@Args() _args: SampleArgs): any {
    method argAndArgsQuery (line 236) | argAndArgsQuery(@Arg("arg1") _arg1: string, @Args() _args: SampleArgs)...
    method argsInheritanceQuery (line 241) | argsInheritanceQuery(@Args() _args: SampleArgsChild): any {
    method emptyMutation (line 246) | emptyMutation(): boolean {
    method resolverFieldWithArgs (line 251) | resolverFieldWithArgs(@Arg("arg1") _arg1: string, @Arg("arg2") _arg2: ...
    method independentFieldResolver (line 256) | independentFieldResolver(@Arg("arg1") _arg1: string, @Arg("arg2") _arg...
    method overwrittenFieldResolver (line 261) | overwrittenFieldResolver() {
    method sampleQuery (line 1130) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 1156) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method randomValueGetter (line 1365) | get randomValueGetter() {
    method getRandomValue (line 1369) | getRandomValue() {
    method sampleQuery (line 1374) | sampleQuery(): SampleObject {
    method notInstanceQuery (line 1380) | notInstanceQuery(): SampleObject {
    method queryWithRootContextAndInfo (line 1385) | queryWithRootContextAndInfo(
    method queryWithPartialRootAndContext (line 1397) | queryWithPartialRootAndContext(
    method queryWithCustomDecorators (line 1407) | queryWithCustomDecorators(
    method queryWithCustomDescriptorDecorator (line 1421) | queryWithCustomDescriptorDecorator(): boolean {
    method mutationWithArgs (line 1426) | mutationWithArgs(@Args() args: SampleArgs): number {
    method mutationWithOptionalArgs (line 1435) | mutationWithOptionalArgs(@Args() args: SampleOptionalArgs): boolean {
    method mutationWithInput (line 1441) | mutationWithInput(@Arg("input") input: SampleInput): number {
    method mutationWithNestedInputs (line 1450) | mutationWithNestedInputs(@Arg("input") input: SampleNestedInput): numb...
    method mutationWithTripleNestedInputs (line 1456) | mutationWithTripleNestedInputs(@Arg("input") input: SampleTripleNested...
    method mutationWithNestedArgsInput (line 1462) | mutationWithNestedArgsInput(@Args() { factor, input }: SampleNestedArg...
    method mutationWithInputs (line 1468) | mutationWithInputs(@Arg("inputs", () => [SampleInput]) inputs: SampleI...
    method mutationWithTripleArrayInputs (line 1475) | mutationWithTripleArrayInputs(
    method mutationWithOptionalArg (line 1483) | mutationWithOptionalArg(
    method fieldResolverField (line 1491) | fieldResolverField() {
    method fieldResolverGetter (line 1496) | fieldResolverGetter() {
    method fieldResolverMethod (line 1501) | fieldResolverMethod() {
    method fieldResolverWithRoot (line 1506) | fieldResolverWithRoot(@Root() root: SampleObject) {
    method fieldResolverMethodWithArgs (line 1515) | fieldResolverMethodWithArgs(@Root() _: SampleObject, @Arg("arg") arg: ...
    method sampleQuery (line 1989) | sampleQuery(): SampleObject {
    method sampleQuerySync (line 2034) | sampleQuerySync(): SampleObject {
    method sampleMutation (line 2061) | sampleMutation(): string {
    method sampleQuery (line 2099) | sampleQuery(): SampleObject {
    method sampleQuery (line 2144) | sampleQuery(): SampleObject {
    method sampleQuery (line 2180) | sampleQuery(): SampleObject {
    method greet (line 2213) | greet(@Arg("name") name: string, @Ctx() ctx: { prefix: string }): stri...
    method sampleObject (line 2586) | sampleObject(): SampleObject {
  class SampleObjectResolver (line 2148) | @Resolver(() => SampleObject)
    method resolvedField (line 2107) | resolvedField(): string {
    method resolvedField (line 2152) | resolvedField(): string {
  class SampleObject (line 2172) | @ObjectType()
    method getterField (line 123) | get getterField(): string {
    method simpleMethodField (line 128) | simpleMethodField(): string {
    method argMethodField (line 133) | argMethodField(
    method isTrue (line 1310) | isTrue() {
    method constructor (line 1314) | constructor() {
    method getterField (line 1339) | get getterField(): number {
    method methodField (line 1344) | methodField(): number {
    method asyncMethodField (line 1349) | async asyncMethodField() {
    method methodFieldWithArg (line 1354) | methodFieldWithArg(@Arg("factor") factor: number): number {
  class SampleResolver (line 2177) | @Resolver()
    method emptyQuery (line 171) | emptyQuery(): boolean {
    method implicitStringQuery (line 176) | implicitStringQuery(): string {
    method explicitStringQuery (line 181) | explicitStringQuery(): any {
    method nullableStringQuery (line 186) | nullableStringQuery(): string | null {
    method explicitStringArrayQuery (line 191) | explicitStringArrayQuery(): any {
    method explicitNullableItemArrayQuery (line 196) | explicitNullableItemArrayQuery(): any {
    method explicitNullableArrayWithNullableItemsQuery (line 201) | explicitNullableArrayWithNullableItemsQuery(): any {
    method promiseStringQuery (line 206) | async promiseStringQuery(): Promise<string> {
    method implicitObjectQuery (line 211) | implicitObjectQuery(): SampleObject {
    method asyncObjectQuery (line 216) | async asyncObjectQuery(): Promise<SampleObject> {
    method rootCtxQuery (line 221) | rootCtxQuery(@Root() _root: any, @Ctx() _ctx: any): boolean {
    method argQuery (line 226) | argQuery(@Arg("arg1") _arg1: string, @Arg("arg2") _arg2: boolean): any {
    method argsQuery (line 231) | argsQuery(@Args() _args: SampleArgs): any {
    method argAndArgsQuery (line 236) | argAndArgsQuery(@Arg("arg1") _arg1: string, @Args() _args: SampleArgs)...
    method argsInheritanceQuery (line 241) | argsInheritanceQuery(@Args() _args: SampleArgsChild): any {
    method emptyMutation (line 246) | emptyMutation(): boolean {
    method resolverFieldWithArgs (line 251) | resolverFieldWithArgs(@Arg("arg1") _arg1: string, @Arg("arg2") _arg2: ...
    method independentFieldResolver (line 256) | independentFieldResolver(@Arg("arg1") _arg1: string, @Arg("arg2") _arg...
    method overwrittenFieldResolver (line 261) | overwrittenFieldResolver() {
    method sampleQuery (line 1130) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 1156) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method randomValueGetter (line 1365) | get randomValueGetter() {
    method getRandomValue (line 1369) | getRandomValue() {
    method sampleQuery (line 1374) | sampleQuery(): SampleObject {
    method notInstanceQuery (line 1380) | notInstanceQuery(): SampleObject {
    method queryWithRootContextAndInfo (line 1385) | queryWithRootContextAndInfo(
    method queryWithPartialRootAndContext (line 1397) | queryWithPartialRootAndContext(
    method queryWithCustomDecorators (line 1407) | queryWithCustomDecorators(
    method queryWithCustomDescriptorDecorator (line 1421) | queryWithCustomDescriptorDecorator(): boolean {
    method mutationWithArgs (line 1426) | mutationWithArgs(@Args() args: SampleArgs): number {
    method mutationWithOptionalArgs (line 1435) | mutationWithOptionalArgs(@Args() args: SampleOptionalArgs): boolean {
    method mutationWithInput (line 1441) | mutationWithInput(@Arg("input") input: SampleInput): number {
    method mutationWithNestedInputs (line 1450) | mutationWithNestedInputs(@Arg("input") input: SampleNestedInput): numb...
    method mutationWithTripleNestedInputs (line 1456) | mutationWithTripleNestedInputs(@Arg("input") input: SampleTripleNested...
    method mutationWithNestedArgsInput (line 1462) | mutationWithNestedArgsInput(@Args() { factor, input }: SampleNestedArg...
    method mutationWithInputs (line 1468) | mutationWithInputs(@Arg("inputs", () => [SampleInput]) inputs: SampleI...
    method mutationWithTripleArrayInputs (line 1475) | mutationWithTripleArrayInputs(
    method mutationWithOptionalArg (line 1483) | mutationWithOptionalArg(
    method fieldResolverField (line 1491) | fieldResolverField() {
    method fieldResolverGetter (line 1496) | fieldResolverGetter() {
    method fieldResolverMethod (line 1501) | fieldResolverMethod() {
    method fieldResolverWithRoot (line 1506) | fieldResolverWithRoot(@Root() root: SampleObject) {
    method fieldResolverMethodWithArgs (line 1515) | fieldResolverMethodWithArgs(@Root() _: SampleObject, @Arg("arg") arg: ...
    method sampleQuery (line 1989) | sampleQuery(): SampleObject {
    method sampleQuerySync (line 2034) | sampleQuerySync(): SampleObject {
    method sampleMutation (line 2061) | sampleMutation(): string {
    method sampleQuery (line 2099) | sampleQuery(): SampleObject {
    method sampleQuery (line 2144) | sampleQuery(): SampleObject {
    method sampleQuery (line 2180) | sampleQuery(): SampleObject {
    method greet (line 2213) | greet(@Arg("name") name: string, @Ctx() ctx: { prefix: string }): stri...
    method sampleObject (line 2586) | sampleObject(): SampleObject {
  function createResolver (line 2184) | function createResolver() {
  class ChildResolver (line 2194) | class ChildResolver extends createResolver() {}
    method childQuery (line 2318) | childQuery(): boolean {
    method objectQuery (line 2324) | objectQuery(): SampleObject {
    method childMutation (line 2329) | childMutation(): boolean {
    method childSubscription (line 2335) | childSubscription(): boolean {
    method childTrigger (line 2341) | async childTrigger(): Promise<boolean> {
  class SampleResolver (line 2210) | @Resolver()
    method emptyQuery (line 171) | emptyQuery(): boolean {
    method implicitStringQuery (line 176) | implicitStringQuery(): string {
    method explicitStringQuery (line 181) | explicitStringQuery(): any {
    method nullableStringQuery (line 186) | nullableStringQuery(): string | null {
    method explicitStringArrayQuery (line 191) | explicitStringArrayQuery(): any {
    method explicitNullableItemArrayQuery (line 196) | explicitNullableItemArrayQuery(): any {
    method explicitNullableArrayWithNullableItemsQuery (line 201) | explicitNullableArrayWithNullableItemsQuery(): any {
    method promiseStringQuery (line 206) | async promiseStringQuery(): Promise<string> {
    method implicitObjectQuery (line 211) | implicitObjectQuery(): SampleObject {
    method asyncObjectQuery (line 216) | async asyncObjectQuery(): Promise<SampleObject> {
    method rootCtxQuery (line 221) | rootCtxQuery(@Root() _root: any, @Ctx() _ctx: any): boolean {
    method argQuery (line 226) | argQuery(@Arg("arg1") _arg1: string, @Arg("arg2") _arg2: boolean): any {
    method argsQuery (line 231) | argsQuery(@Args() _args: SampleArgs): any {
    method argAndArgsQuery (line 236) | argAndArgsQuery(@Arg("arg1") _arg1: string, @Args() _args: SampleArgs)...
    method argsInheritanceQuery (line 241) | argsInheritanceQuery(@Args() _args: SampleArgsChild): any {
    method emptyMutation (line 246) | emptyMutation(): boolean {
    method resolverFieldWithArgs (line 251) | resolverFieldWithArgs(@Arg("arg1") _arg1: string, @Arg("arg2") _arg2: ...
    method independentFieldResolver (line 256) | independentFieldResolver(@Arg("arg1") _arg1: string, @Arg("arg2") _arg...
    method overwrittenFieldResolver (line 261) | overwrittenFieldResolver() {
    method sampleQuery (line 1130) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method sampleQuery (line 1156) | sampleQuery(@Arg("input") _input: SampleInput): string {
    method randomValueGetter (line 1365) | get randomValueGetter() {
    method getRandomValue (line 1369) | getRandomValue() {
    method sampleQuery (line 1374) | sampleQuery(): SampleObject {
    method notInstanceQuery (line 1380) | notInstanceQuery(): SampleObject {
    method queryWithRootContextAndInfo (line 1385) | queryWithRootContextAndInfo(
    method queryWithPartialRootAndContext (line 1397) | queryWithPartialRootAndContext(
    method queryWithCustomDecorators (line 1407) | queryWithCustomDecorators(
    method queryWithCustomDescriptorDecorator (line 1421) | queryWithCustomDescriptorDecorator(): boolean {
    method mutationWithArgs (line 1426) | mutationWithArgs(@Args() args: SampleArgs): number {
    method mutationWithOptionalArgs (line 1435) | mutationWithOptionalArgs(@Args() args: SampleOptionalArgs): boolean {
    method mutationWithInput (line 1441) | mutationWithInput(@Arg("input") input: SampleInput): number {
    method mutationWithNestedInputs (line 1450) | mutationWithNestedInputs(@Arg("input") input: SampleNestedInput): numb...
    method mutationWithTripleNestedInputs (line 1456) | mutationWithTripleNestedInputs(@Arg("input") input: SampleTripleNested...
    method mutationWithNestedArgsInput (line 1462) | mutationWithNestedArgsInput(@Args() { factor, input }: SampleNestedArg...
    method mutationWithInputs (line 1468) | mutationWithInputs(@Arg("inputs", () => [SampleInput]) inputs: SampleI...
    method mutationWithTripleArrayInputs (line 1475) | mutationWithTripleArrayInputs(
    method mutationWithOptionalArg (line 1483) | mutationWithOptionalArg(
    method fieldResolverField (line 1491) | fieldResolverField() {
    method fieldResolverGetter (line 1496) | fieldResolverGetter() {
    method fieldResolverMethod (line 1501) | fieldResolverMethod() {
    method fieldResolverWithRoot (line 1506) | fieldResolverWithRoot(@Root() root: SampleObject) {
    method fieldResolverMethodWithArgs (line 1515) | fieldResolverMethodWithArgs(@Root() _: SampleObject, @Arg("arg") arg: ...
    method sampleQuery (line 1989) | sampleQuery(): SampleObject {
    method sampleQuerySync (line 2034) | sampleQuerySync(): SampleObject {
    method sampleMutation (line 2061) | sampleMutation(): string {
    method sampleQuery (line 2099) | sampleQuery(): SampleObject {
    method sampleQuery (line 2144) | sampleQuery(): SampleObject {
    method sampleQuery (line 2180) | sampleQuery(): SampleObject {
    method greet (line 2213) | greet(@Arg("name") name: string, @Ctx() ctx: { prefix: string }): stri...
    method sampleObject (line 2586) | sampleObject(): SampleObject {
  class SampleObject (line 2264) | @ObjectType()
    method getterField (line 123) | get getterField(): string {
    method simpleMethodField (line 128) | simpleMethodField(): string {
    method argMethodField (line 133) | argMethodField(
    method isTrue (line 1310) | isTrue() {
    method constructor (line 1314) | constructor() {
    method getterField (line 1339) | get getterField(): number {
    method methodField (line 1344) | methodField(): number {
    method asyncMethodField (line 1349) | async asyncMethodField() {
    method methodFieldWithArg (line 1354) | methodFieldWithArg(@Arg("factor") factor: number): number {
  class DummyObject (line 2270) | @ObjectType()
  function createResolver (line 2276) | function createResolver(name: string, objectType: ClassType) {
  class ChildResolver (line 2315) | @Resolver()
    method childQuery (line 2318) | childQuery(): boolean {
    method objectQuery (line 2324) | objectQuery(): SampleObject {
    method childMutation (line 2329) | childMutation(): boolean {
    method childSubscription (line 2335) | childSubscription(): boolean {
    method childTrigger (line 2341) | async childTrigger(): Promise<boolean> {
  class OverrideResolver (line 2348) | @Resolver()
    method overriddenQuery (line 2351) | overriddenQuery(@Arg("overriddenArg") _arg: boolean): string {
    method overriddenMutationHandler (line 2357) | overriddenMutat
Condensed preview — 873 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,772K chars).
[
  {
    "path": ".editorconfig",
    "chars": 210,
    "preview": "root = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ni"
  },
  {
    "path": ".eslintignore",
    "chars": 113,
    "preview": "**/build/\n**/dist/\n**/coverage/\n**/node_modules/\njest.config.cts\nsponsorkit.config.mts\n\n# FIXME: Remove\nwebsite/\n"
  },
  {
    "path": ".eslintrc",
    "chars": 3337,
    "preview": "{\n  \"root\": true,\n  \"env\": {\n    \"node\": true\n  },\n  \"parser\": \"@typescript-eslint/parser\",\n  \"parserOptions\": {\n    \"ec"
  },
  {
    "path": ".gitattributes",
    "chars": 4205,
    "preview": "*                 text=auto eol=lf\n\n# Source code\n*.bash            text eol=lf\n*.bat             text eol=crlf\n*.cmd   "
  },
  {
    "path": ".github/CODEOWNERS",
    "chars": 15,
    "preview": "* @MichalLytek\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 49,
    "preview": "github: typegraphql\nopen_collective: typegraphql\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 883,
    "preview": "---\nname: Bug report\nabout: Something works incorrectly or doesn't work at all\n---\n\n**Describe the Bug**\nA clear and con"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 452,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: Question or help request\n    url: https://github.com/MichalLytek/ty"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/documentation-issue-or-request.md",
    "chars": 591,
    "preview": "---\nname: Documentation issue or request\nabout: There's something wrong in docs or something is missing\n---\n\n**Describe "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 627,
    "preview": "---\nname: Feature request\nabout: You want to suggest an idea for this project\n---\n\n**Is your feature request related to "
  },
  {
    "path": ".github/configs/changelog.json",
    "chars": 507,
    "preview": "{\n  \"categories\": [\n    {\n      \"title\": \"## 🚀 Enhancements\",\n      \"labels\": [\"Enhancement 🆕\"]\n    },\n    {\n      \"titl"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 335,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: \"npm\"\n    directory: \"/\"\n    versioning-strategy: increase\n    schedule:\n    "
  },
  {
    "path": ".github/workflows/check.yml",
    "chars": 4540,
    "preview": "name: check\n\non:\n  push:\n    branches:\n      - master\n    tags:\n      - v*\n  pull_request:\n    branches:\n      - master\n"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "chars": 1004,
    "preview": "name: codeql\n\non:\n  push:\n    branches:\n      - master\n  pull_request:\n    branches:\n      - master\n  schedule:\n    - cr"
  },
  {
    "path": ".github/workflows/license.yml",
    "chars": 400,
    "preview": "name: license\n\non:\n  schedule:\n    - cron: \"0 0 1 1 *\"\n\nconcurrency:\n  group: ${{ github.workflow }}\n  cancel-in-progres"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 2557,
    "preview": "name: release\n\non:\n  workflow_run:\n    workflows:\n      - check\n    types:\n      - completed\n\npermissions:\n  id-token: w"
  },
  {
    "path": ".github/workflows/sponsor.yml",
    "chars": 1160,
    "preview": "name: sponsor\n\non:\n  schedule:\n    - cron: \"0 0 * * *\"\n\nconcurrency:\n  group: ${{ github.workflow }}\n  cancel-in-progres"
  },
  {
    "path": ".github/workflows/website.yml",
    "chars": 1305,
    "preview": "name: website\n\non:\n  workflow_run:\n    workflows:\n      - check\n    types:\n      - completed\n\nconcurrency:\n  group: ${{ "
  },
  {
    "path": ".gitignore",
    "chars": 250,
    "preview": "# Node.js modules\n**/node_modules/\n\n# Builded sources\n**/build/\n**/dist/\n\n# Coverage\n**/coverage/\n\n# IntelliJ stuffs\n.id"
  },
  {
    "path": ".husky/pre-commit",
    "chars": 160,
    "preview": "#!/usr/bin/env sh\n\n# shellcheck disable=SC1007 source=SCRIPTDIR/_/husky.sh\n. \"$(CDPATH= cd -- \"$(dirname -- \"$0\")\" && pw"
  },
  {
    "path": ".lintstagedrc",
    "chars": 167,
    "preview": "{\n  \"**/*.ts\": [\"eslint --fix\", \"prettier --write\"],\n  \"**/*.md\": [\"markdownlint --fix\", \"prettier --write\"],\n  \"!**/*.{"
  },
  {
    "path": ".markdownlint.json",
    "chars": 79,
    "preview": "{\n  \"default\": true,\n  \"line-length\": false,\n  \"no-blanks-blockquote\": false\n}\n"
  },
  {
    "path": ".markdownlintignore",
    "chars": 186,
    "preview": "**/build/\n**/dist/\n**/coverage/\n**/node_modules/\nwebsite/blog/2018-03-25-medium-article.md\nwebsite/blog/2020-08-19-devto"
  },
  {
    "path": ".npmrc",
    "chars": 19,
    "preview": "engine-strict=true\n"
  },
  {
    "path": ".nvmrc",
    "chars": 3,
    "preview": "25\n"
  },
  {
    "path": ".prettierignore",
    "chars": 126,
    "preview": "**/build/\n**/dist/\n**/coverage/\n**/node_modules/\n/.husky/_/\n/.gitattributes\nwebsite/versioned_docs\nwebsite/versioned_sid"
  },
  {
    "path": ".prettierrc",
    "chars": 200,
    "preview": "{\n  \"endOfLine\": \"lf\",\n  \"trailingComma\": \"all\",\n  \"tabWidth\": 2,\n  \"printWidth\": 100,\n  \"bracketSpacing\": true,\n  \"semi"
  },
  {
    "path": ".shellcheckrc",
    "chars": 22,
    "preview": "external-sources=true\n"
  },
  {
    "path": ".vscode/extensions.json",
    "chars": 419,
    "preview": "{\n  \"recommendations\": [\n    \"bierner.comment-tagged-templates\",\n    \"DavidAnson.vscode-markdownlint\",\n    \"dbaeumer.vsc"
  },
  {
    "path": ".vscode/launch.json",
    "chars": 1479,
    "preview": "{\n  // Use IntelliSense to learn about possible attributes.\n  // Hover to view descriptions of existing attributes.\n  //"
  },
  {
    "path": ".vscode/settings.json",
    "chars": 312,
    "preview": "{\n  \"typescript.tsdk\": \"${workspaceFolder}/node_modules/typescript/lib\",\n  \"editor.formatOnSave\": true,\n  \"editor.defaul"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 21860,
    "preview": "# Changelog and release notes\n\n## Unreleased\n\n### Fixes\n\n- support resolver inheritance with dynamic field resolvers nam"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 5471,
    "preview": "<!-- markdownlint-disable MD033 -->\n\n# Contributing to TypeGraphQL\n\nWe would love for you to contribute to TypeGraphQL a"
  },
  {
    "path": "LICENSE",
    "chars": 1074,
    "preview": "MIT License\n\nCopyright (c) 2018-2026 Michał Lytek\n\nPermission is hereby granted, free of charge, to any person obtaining"
  },
  {
    "path": "README.md",
    "chars": 16072,
    "preview": "<!-- prettier-ignore-start -->\n<!-- markdownlint-disable-next-line MD041 -->\n![logo](./images/logo.png)\n<!-- prettier-ig"
  },
  {
    "path": "benchmarks/.eslintrc",
    "chars": 230,
    "preview": "{\n  \"rules\": {\n    \"no-console\": \"off\",\n    \"max-classes-per-file\": \"off\",\n    \"class-methods-use-this\": \"off\",\n    \"imp"
  },
  {
    "path": "benchmarks/array/graphql-js/async.ts",
    "chars": 1449,
    "preview": "import {\n  GraphQLBoolean,\n  GraphQLInt,\n  GraphQLList,\n  GraphQLNonNull,\n  GraphQLObjectType,\n  GraphQLSchema,\n  GraphQ"
  },
  {
    "path": "benchmarks/array/graphql-js/standard.ts",
    "chars": 1244,
    "preview": "import {\n  GraphQLBoolean,\n  GraphQLInt,\n  GraphQLList,\n  GraphQLNonNull,\n  GraphQLObjectType,\n  GraphQLSchema,\n  GraphQ"
  },
  {
    "path": "benchmarks/array/results.txt",
    "chars": 384,
    "preview": "Core i7 2700K @ 3.5GHz\nWindows 10 x64\n25 000 array items | 50 iterations\nNode.js v13.5\n\n-----\nTypeGraphQL\n\nstandard\n- 15"
  },
  {
    "path": "benchmarks/array/run.ts",
    "chars": 1142,
    "preview": "import { type GraphQLSchema, execute } from \"graphql\";\nimport { gql } from \"graphql-tag\";\n\nconst BENCHMARK_ITERATIONS = "
  },
  {
    "path": "benchmarks/array/type-graphql/async-field-resolvers.ts",
    "chars": 1473,
    "preview": "import \"reflect-metadata\";\nimport {\n  Field,\n  FieldResolver,\n  Int,\n  ObjectType,\n  Query,\n  Resolver,\n  Root,\n  buildS"
  },
  {
    "path": "benchmarks/array/type-graphql/simple-resolvers.ts",
    "chars": 1293,
    "preview": "import \"reflect-metadata\";\nimport {\n  Field,\n  Int,\n  type MiddlewareFn,\n  ObjectType,\n  Query,\n  Resolver,\n  buildSchem"
  },
  {
    "path": "benchmarks/array/type-graphql/standard.ts",
    "chars": 993,
    "preview": "import \"reflect-metadata\";\nimport { Field, Int, ObjectType, Query, Resolver, buildSchema } from \"type-graphql\";\nimport {"
  },
  {
    "path": "benchmarks/array/type-graphql/sync-field-resolvers.ts",
    "chars": 1449,
    "preview": "import \"reflect-metadata\";\nimport {\n  Field,\n  FieldResolver,\n  Int,\n  ObjectType,\n  Query,\n  Resolver,\n  Root,\n  buildS"
  },
  {
    "path": "benchmarks/array/type-graphql/sync-getters.ts",
    "chars": 1465,
    "preview": "import \"reflect-metadata\";\nimport { Field, Int, ObjectType, Query, Resolver, buildSchema } from \"type-graphql\";\nimport {"
  },
  {
    "path": "benchmarks/array/type-graphql/with-global-middleware.ts",
    "chars": 1268,
    "preview": "import \"reflect-metadata\";\nimport {\n  Field,\n  Int,\n  type MiddlewareFn,\n  ObjectType,\n  Query,\n  Resolver,\n  buildSchem"
  },
  {
    "path": "benchmarks/simple/graphql-js.ts",
    "chars": 1098,
    "preview": "import { GraphQLObjectType, GraphQLSchema, GraphQLString } from \"graphql\";\nimport { runBenchmark } from \"./run\";\n\nconst "
  },
  {
    "path": "benchmarks/simple/results.txt",
    "chars": 522,
    "preview": "Core i7 2700K @ 3.5GHz\nWindows 10 x64\n100 000 iterations\n\n-----\nNode.js v10.17\n\nES2016 build\n-  singleObject: 4831.113ms"
  },
  {
    "path": "benchmarks/simple/run.ts",
    "chars": 1644,
    "preview": "import { type ExecutionResult, type GraphQLSchema, execute } from \"graphql\";\nimport { gql } from \"graphql-tag\";\n\nconst B"
  },
  {
    "path": "benchmarks/simple/type-graphql.ts",
    "chars": 956,
    "preview": "import \"reflect-metadata\";\nimport { Field, ObjectType, Query, Resolver, buildSchema } from \"type-graphql\";\nimport { runB"
  },
  {
    "path": "benchmarks/tsconfig.json",
    "chars": 118,
    "preview": "{\n  \"extends\": \"../tsconfig.json\",\n  \"compilerOptions\": {\n    \"outDir\": \"./build\"\n  },\n  \"include\": [\".\", \"../src\"]\n}\n"
  },
  {
    "path": "cspell.json",
    "chars": 1723,
    "preview": "{\n  \"version\": \"0.2\",\n  \"language\": \"en\",\n  \"useGitignore\": true,\n  \"import\": [\n    \"@cspell/dict-node/cspell-ext.json\","
  },
  {
    "path": "docs/README.md",
    "chars": 143,
    "preview": "# Documentation\n\n**The documentation has been prepared to be viewed on [TypeGraphQL website](https://typegraphql.com), p"
  },
  {
    "path": "docs/authorization.md",
    "chars": 6838,
    "preview": "---\ntitle: Authorization\n---\n\nAuthorization is a core feature used in almost all APIs. Sometimes we want to restrict dat"
  },
  {
    "path": "docs/aws-lambda.md",
    "chars": 1284,
    "preview": "---\ntitle: AWS Lambda integration\n---\n\n## Using TypeGraphQL in AWS Lambda environment\n\nAWS Lambda environment is a bit d"
  },
  {
    "path": "docs/azure-functions.md",
    "chars": 3047,
    "preview": "---\ntitle: Azure Functions Integration\n---\n\n## Using TypeGraphQL in Microsoft Azure Functions\n\nIntegrating TypeGraphQL w"
  },
  {
    "path": "docs/bootstrap.md",
    "chars": 5116,
    "preview": "---\ntitle: Bootstrapping\n---\n\nAfter creating our resolvers, type classes, and other business-related code, we need to ma"
  },
  {
    "path": "docs/browser-usage.md",
    "chars": 2870,
    "preview": "---\ntitle: Browser usage\n---\n\n## Using classes in a client app\n\nSometimes we might want to use the classes we've created"
  },
  {
    "path": "docs/complexity.md",
    "chars": 4783,
    "preview": "---\ntitle: Query complexity\n---\n\nA single GraphQL query can potentially generate a huge workload for a server, like thou"
  },
  {
    "path": "docs/custom-decorators.md",
    "chars": 6688,
    "preview": "---\ntitle: Custom decorators\n---\n\nCustom decorators are a great way to reduce the boilerplate and reuse some common logi"
  },
  {
    "path": "docs/dependency-injection.md",
    "chars": 7052,
    "preview": "---\ntitle: Dependency injection\n---\n\nDependency injection is a really useful pattern that helps in decoupling parts of t"
  },
  {
    "path": "docs/directives.md",
    "chars": 5750,
    "preview": "---\ntitle: Directives\n---\n\n> A directive is an identifier preceded by a `@` character, optionally followed by a list of "
  },
  {
    "path": "docs/emit-schema.md",
    "chars": 3699,
    "preview": "---\ntitle: Emitting the schema SDL\n---\n\nTypeGraphQL's main feature is creating the schema using only TypeScript classes "
  },
  {
    "path": "docs/enums.md",
    "chars": 3921,
    "preview": "---\ntitle: Enums\n---\n\nNowadays almost all typed languages have support for enumerated types, including TypeScript. Enums"
  },
  {
    "path": "docs/esm.md",
    "chars": 1061,
    "preview": "---\ntitle: ECMAScript Modules\n---\n\nSince `v2.0.0` release, TypeGraphQL is compatible with ECMAScript modules.\n\nThanks to"
  },
  {
    "path": "docs/examples.md",
    "chars": 3856,
    "preview": "---\ntitle: Examples\nsidebar_label: List of examples\n---\n\nOn the [GitHub repository](https://github.com/MichalLytek/type-"
  },
  {
    "path": "docs/extensions.md",
    "chars": 3693,
    "preview": "---\ntitle: Extensions\n---\n\nThe `graphql-js` library allows for putting arbitrary data into GraphQL types config inside t"
  },
  {
    "path": "docs/faq.md",
    "chars": 4427,
    "preview": "---\ntitle: Frequently Asked Questions\n---\n\n## Resolvers\n\n### Should I implement a field resolver as an object type gette"
  },
  {
    "path": "docs/generic-types.md",
    "chars": 5239,
    "preview": "---\ntitle: Generic Types\n---\n\n[Type Inheritance](./inheritance.md) is a great way to reduce code duplication by extracti"
  },
  {
    "path": "docs/getting-started.md",
    "chars": 4725,
    "preview": "---\ntitle: Getting started\n---\n\n> Make sure you've completed all the steps described in the [installation instructions]("
  },
  {
    "path": "docs/inheritance.md",
    "chars": 5011,
    "preview": "---\ntitle: Inheritance\n---\n\nThe main idea of TypeGraphQL is to create GraphQL types based on TypeScript classes.\n\nIn obj"
  },
  {
    "path": "docs/installation.md",
    "chars": 1631,
    "preview": "---\ntitle: Installation\n---\n\nBefore getting started with TypeGraphQL we need to install some additional dependencies and"
  },
  {
    "path": "docs/interfaces.md",
    "chars": 8479,
    "preview": "---\ntitle: Interfaces\n---\n\nThe main idea of TypeGraphQL is to create GraphQL types based on TypeScript classes.\n\nIn obje"
  },
  {
    "path": "docs/introduction.md",
    "chars": 2727,
    "preview": "---\ntitle: Introduction\nsidebar_label: What & Why\n---\n\nWe all love GraphQL! It's really great and solves many problems t"
  },
  {
    "path": "docs/middlewares.md",
    "chars": 7977,
    "preview": "---\ntitle: Middleware and guards\n---\n\nMiddleware are pieces of reusable code that can be easily attached to resolvers an"
  },
  {
    "path": "docs/migration-guide.md",
    "chars": 5111,
    "preview": "---\ntitle: Migration Guide\nsidebar_label: v1.x -> v2.0\n---\n\n> This chapter contains migration guide, that will help you "
  },
  {
    "path": "docs/nestjs.md",
    "chars": 1506,
    "preview": "---\ntitle: NestJS Integration\nsidebar_label: NestJS\n---\n\nTypeGraphQL provides some basic integration with NestJS by the "
  },
  {
    "path": "docs/performance.md",
    "chars": 5060,
    "preview": "---\ntitle: Performance\n---\n\n**TypeGraphQL** is basically an abstraction layer built on top of the reference GraphQL impl"
  },
  {
    "path": "docs/prisma.md",
    "chars": 1642,
    "preview": "---\ntitle: Prisma Integration\nsidebar_label: Prisma\n---\n\nTypeGraphQL provides an integration with Prisma by the [`typegr"
  },
  {
    "path": "docs/resolvers.md",
    "chars": 11985,
    "preview": "---\ntitle: Resolvers\n---\n\nBesides [declaring GraphQL's object types](./types-and-fields.md), TypeGraphQL allows us to ea"
  },
  {
    "path": "docs/scalars.md",
    "chars": 4509,
    "preview": "---\ntitle: Scalars\n---\n\n## Aliases\n\nTypeGraphQL provides aliases for 3 basic scalars:\n\n- Int --> GraphQLInt;\n- Float -->"
  },
  {
    "path": "docs/subscriptions.md",
    "chars": 8210,
    "preview": "---\ntitle: Subscriptions\n---\n\nGraphQL can be used to perform reads with queries and writes with mutations.\nHowever, ofte"
  },
  {
    "path": "docs/types-and-fields.md",
    "chars": 6023,
    "preview": "---\ntitle: Types and Fields\n---\n\nThe main idea of TypeGraphQL is to automatically create GraphQL schema definitions from"
  },
  {
    "path": "docs/unions.md",
    "chars": 3341,
    "preview": "---\ntitle: Unions\n---\n\nSometimes our API has to be flexible and return a type that is not specific but one from a range "
  },
  {
    "path": "docs/validation.md",
    "chars": 9108,
    "preview": "---\ntitle: Argument and Input validation\nsidebar_label: Validation\n---\n\n## Scalars\n\nThe standard way to ensure that inpu"
  },
  {
    "path": "examples/.eslintrc",
    "chars": 193,
    "preview": "{\n  \"rules\": {\n    \"no-console\": \"off\",\n    \"class-methods-use-this\": \"off\",\n    \"import/no-cycle\": \"off\",\n    \"import/n"
  },
  {
    "path": "examples/README.md",
    "chars": 2406,
    "preview": "# Examples\n\nThis folder consists of simple examples showing how to use different `TypeGraphQL` features and how well it "
  },
  {
    "path": "examples/apollo-cache/cache-control.ts",
    "chars": 573,
    "preview": "import { type CacheHint } from \"@apollo/cache-control-types\";\nimport { Directive } from \"type-graphql\";\nimport { type Re"
  },
  {
    "path": "examples/apollo-cache/examples.graphql",
    "chars": 216,
    "preview": "query CachedQuery {\n  cachedRecipe(title: \"Recipe 1\") {\n    title\n    description\n    cachedAverageRating\n  }\n}\n\nquery N"
  },
  {
    "path": "examples/apollo-cache/helpers/RequireAtLeastOne.d.ts",
    "chars": 243,
    "preview": "// https://stackoverflow.com/a/49725198/6676781\n\nexport type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Pick"
  },
  {
    "path": "examples/apollo-cache/helpers/getTime.ts",
    "chars": 95,
    "preview": "export function getTime(date: Date = new Date()) {\n  return date.toTimeString().slice(0, 8);\n}\n"
  },
  {
    "path": "examples/apollo-cache/index.ts",
    "chars": 1149,
    "preview": "import \"reflect-metadata\";\nimport path from \"node:path\";\nimport { ApolloServer } from \"@apollo/server\";\nimport { ApolloS"
  },
  {
    "path": "examples/apollo-cache/recipe.data.ts",
    "chars": 646,
    "preview": "import { Recipe } from \"./recipe.type\";\n\nfunction createRecipe(recipeData: Partial<Recipe>) {\n  return Object.assign(new"
  },
  {
    "path": "examples/apollo-cache/recipe.resolver.ts",
    "chars": 1054,
    "preview": "import { Arg, Query, Resolver } from \"type-graphql\";\nimport { CacheControl } from \"./cache-control\";\nimport { getTime } "
  },
  {
    "path": "examples/apollo-cache/recipe.type.ts",
    "chars": 1050,
    "preview": "import { Field, Float, Int, ObjectType } from \"type-graphql\";\nimport { CacheControl } from \"./cache-control\";\nimport { g"
  },
  {
    "path": "examples/apollo-cache/schema.graphql",
    "chars": 831,
    "preview": "# -----------------------------------------------\n# !!! THIS FILE WAS GENERATED BY TYPE-GRAPHQL !!!\n# !!!   DO NOT MODIF"
  },
  {
    "path": "examples/apollo-federation/accounts/data.ts",
    "chars": 388,
    "preview": "import { User } from \"./user\";\n\nfunction createUser(userData: Partial<User>) {\n  return Object.assign(new User(), userDa"
  },
  {
    "path": "examples/apollo-federation/accounts/index.ts",
    "chars": 843,
    "preview": "import { ApolloServer } from \"@apollo/server\";\nimport { startStandaloneServer } from \"@apollo/server/standalone\";\nimport"
  },
  {
    "path": "examples/apollo-federation/accounts/resolver.ts",
    "chars": 236,
    "preview": "import { Query, Resolver } from \"type-graphql\";\nimport { users } from \"./data\";\nimport { User } from \"./user\";\n\n@Resolve"
  },
  {
    "path": "examples/apollo-federation/accounts/user.reference.ts",
    "chars": 210,
    "preview": "import { users } from \"./data\";\nimport { type User } from \"./user\";\n\nexport async function resolveUserReference(referenc"
  },
  {
    "path": "examples/apollo-federation/accounts/user.ts",
    "chars": 268,
    "preview": "import { Directive, Field, ID, ObjectType } from \"type-graphql\";\n\n@Directive(`@key(fields: \"id\")`)\n@ObjectType()\nexport "
  },
  {
    "path": "examples/apollo-federation/examples.graphql",
    "chars": 259,
    "preview": "query {\n  topProducts {\n    name\n    price\n    shippingEstimate\n    inStock\n    reviews {\n      body\n      author {\n    "
  },
  {
    "path": "examples/apollo-federation/helpers/buildFederatedSchema.ts",
    "chars": 922,
    "preview": "import { buildSubgraphSchema } from \"@apollo/subgraph\";\nimport { type IResolvers, printSchemaWithDirectives } from \"@gra"
  },
  {
    "path": "examples/apollo-federation/helpers/index.ts",
    "chars": 40,
    "preview": "export * from \"./buildFederatedSchema\";\n"
  },
  {
    "path": "examples/apollo-federation/index.ts",
    "chars": 1308,
    "preview": "import \"reflect-metadata\";\nimport path from \"node:path\";\nimport { ApolloGateway, IntrospectAndCompose } from \"@apollo/ga"
  },
  {
    "path": "examples/apollo-federation/inventory/data.ts",
    "chars": 204,
    "preview": "export interface Inventory {\n  upc: string;\n  inStock: boolean;\n}\n\nexport const inventory: Inventory[] = [\n  { upc: \"1\","
  },
  {
    "path": "examples/apollo-federation/inventory/index.ts",
    "chars": 867,
    "preview": "import { ApolloServer } from \"@apollo/server\";\nimport { startStandaloneServer } from \"@apollo/server/standalone\";\nimport"
  },
  {
    "path": "examples/apollo-federation/inventory/product.reference.ts",
    "chars": 414,
    "preview": "import { inventory } from \"./data\";\nimport { Product } from \"./product\";\n\nexport async function resolveProductReference("
  },
  {
    "path": "examples/apollo-federation/inventory/product.ts",
    "chars": 357,
    "preview": "import { Directive, Field, ObjectType } from \"type-graphql\";\n\n@ObjectType()\n@Directive(\"@extends\")\n@Directive(`@key(fiel"
  },
  {
    "path": "examples/apollo-federation/inventory/resolver.ts",
    "chars": 488,
    "preview": "import { Directive, FieldResolver, Resolver, Root } from \"type-graphql\";\nimport { Product } from \"./product\";\n\n@Resolver"
  },
  {
    "path": "examples/apollo-federation/products/data.ts",
    "chars": 459,
    "preview": "import { Product } from \"./product\";\n\nfunction createProduct(productData: Partial<Product>) {\n  return Object.assign(new"
  },
  {
    "path": "examples/apollo-federation/products/index.ts",
    "chars": 864,
    "preview": "import { ApolloServer } from \"@apollo/server\";\nimport { startStandaloneServer } from \"@apollo/server/standalone\";\nimport"
  },
  {
    "path": "examples/apollo-federation/products/product.reference.ts",
    "chars": 250,
    "preview": "import { products } from \"./data\";\nimport { type Product } from \"./product\";\n\nexport async function resolveProductRefere"
  },
  {
    "path": "examples/apollo-federation/products/product.ts",
    "chars": 252,
    "preview": "import { Directive, Field, ObjectType } from \"type-graphql\";\n\n@Directive(`@key(fields: \"upc\")`)\n@ObjectType()\nexport cla"
  },
  {
    "path": "examples/apollo-federation/products/resolver.ts",
    "chars": 364,
    "preview": "import { Arg, Query, Resolver } from \"type-graphql\";\nimport { products } from \"./data\";\nimport { Product } from \"./produ"
  },
  {
    "path": "examples/apollo-federation/reviews/index.ts",
    "chars": 847,
    "preview": "import { ApolloServer } from \"@apollo/server\";\nimport { startStandaloneServer } from \"@apollo/server/standalone\";\nimport"
  },
  {
    "path": "examples/apollo-federation/reviews/product/index.ts",
    "chars": 56,
    "preview": "export * from \"./product\";\n\nexport * from \"./resolver\";\n"
  },
  {
    "path": "examples/apollo-federation/reviews/product/product.ts",
    "chars": 211,
    "preview": "import { Directive, Field, ObjectType } from \"type-graphql\";\n\n@Directive(\"@extends\")\n@Directive(`@key(fields: \"upc\")`)\n@"
  },
  {
    "path": "examples/apollo-federation/reviews/product/resolver.ts",
    "chars": 384,
    "preview": "import { FieldResolver, Resolver, Root } from \"type-graphql\";\nimport { Product } from \"./product\";\nimport { Review, revi"
  },
  {
    "path": "examples/apollo-federation/reviews/review/data.ts",
    "chars": 1227,
    "preview": "import { Review } from \"./review\";\nimport { Product } from \"../product\";\nimport { User } from \"../user\";\n\nfunction creat"
  },
  {
    "path": "examples/apollo-federation/reviews/review/index.ts",
    "chars": 78,
    "preview": "export * from \"./data\";\nexport * from \"./resolver\";\nexport * from \"./review\";\n"
  },
  {
    "path": "examples/apollo-federation/reviews/review/resolver.ts",
    "chars": 286,
    "preview": "import { FieldResolver, Resolver } from \"type-graphql\";\nimport { reviews } from \"./data\";\nimport { Review } from \"./revi"
  },
  {
    "path": "examples/apollo-federation/reviews/review/review.ts",
    "chars": 381,
    "preview": "import { Directive, Field, ID, ObjectType } from \"type-graphql\";\nimport { Product } from \"../product\";\nimport { User } f"
  },
  {
    "path": "examples/apollo-federation/reviews/user/index.ts",
    "chars": 52,
    "preview": "export * from \"./resolver\";\nexport * from \"./user\";\n"
  },
  {
    "path": "examples/apollo-federation/reviews/user/resolver.ts",
    "chars": 366,
    "preview": "import { FieldResolver, Resolver, Root } from \"type-graphql\";\nimport { User } from \"./user\";\nimport { Review, reviews } "
  },
  {
    "path": "examples/apollo-federation/reviews/user/user.ts",
    "chars": 280,
    "preview": "import { Directive, Field, ID, ObjectType } from \"type-graphql\";\n\n@Directive(\"@extends\")\n@Directive(`@key(fields: \"id\")`"
  },
  {
    "path": "examples/apollo-federation/schema.graphql",
    "chars": 630,
    "preview": "# -----------------------------------------------\n# !!! THIS FILE WAS GENERATED BY TYPE-GRAPHQL !!!\n# !!!   DO NOT MODIF"
  },
  {
    "path": "examples/apollo-federation-2/accounts/data.ts",
    "chars": 388,
    "preview": "import { User } from \"./user\";\n\nfunction createUser(userData: Partial<User>) {\n  return Object.assign(new User(), userDa"
  },
  {
    "path": "examples/apollo-federation-2/accounts/index.ts",
    "chars": 778,
    "preview": "import { ApolloServer } from \"@apollo/server\";\nimport { startStandaloneServer } from \"@apollo/server/standalone\";\nimport"
  },
  {
    "path": "examples/apollo-federation-2/accounts/resolver.ts",
    "chars": 236,
    "preview": "import { Query, Resolver } from \"type-graphql\";\nimport { users } from \"./data\";\nimport { User } from \"./user\";\n\n@Resolve"
  },
  {
    "path": "examples/apollo-federation-2/accounts/user.reference.ts",
    "chars": 210,
    "preview": "import { users } from \"./data\";\nimport { type User } from \"./user\";\n\nexport async function resolveUserReference(referenc"
  },
  {
    "path": "examples/apollo-federation-2/accounts/user.ts",
    "chars": 295,
    "preview": "import { Directive, Field, ID, ObjectType } from \"type-graphql\";\n\n@Directive(`@key(fields: \"id\")`)\n@ObjectType()\nexport "
  },
  {
    "path": "examples/apollo-federation-2/examples.graphql",
    "chars": 297,
    "preview": "query {\n  topProducts {\n    __typename\n    name\n    price\n    shippingEstimate\n    inStock\n    reviews {\n      body\n    "
  },
  {
    "path": "examples/apollo-federation-2/helpers/buildFederatedSchema.ts",
    "chars": 1225,
    "preview": "import { buildSubgraphSchema } from \"@apollo/subgraph\";\nimport { type IResolvers, printSchemaWithDirectives } from \"@gra"
  },
  {
    "path": "examples/apollo-federation-2/index.ts",
    "chars": 1502,
    "preview": "import \"reflect-metadata\";\nimport path from \"path\";\nimport { ApolloGateway, IntrospectAndCompose } from \"@apollo/gateway"
  },
  {
    "path": "examples/apollo-federation-2/inventory/data.ts",
    "chars": 204,
    "preview": "export interface Inventory {\n  upc: string;\n  inStock: boolean;\n}\n\nexport const inventory: Inventory[] = [\n  { upc: \"1\","
  },
  {
    "path": "examples/apollo-federation-2/inventory/index.ts",
    "chars": 802,
    "preview": "import { ApolloServer } from \"@apollo/server\";\nimport { startStandaloneServer } from \"@apollo/server/standalone\";\nimport"
  },
  {
    "path": "examples/apollo-federation-2/inventory/product.reference.ts",
    "chars": 376,
    "preview": "import { inventory } from \"./data\";\nimport { Product } from \"./product\";\n\nexport async function resolveProductReference("
  },
  {
    "path": "examples/apollo-federation-2/inventory/product.ts",
    "chars": 388,
    "preview": "import { Directive, Field, ObjectType } from \"type-graphql\";\n\n@ObjectType()\n@Directive(\"@extends\")\n@Directive(\"@interfac"
  },
  {
    "path": "examples/apollo-federation-2/inventory/resolver.ts",
    "chars": 488,
    "preview": "import { Directive, FieldResolver, Resolver, Root } from \"type-graphql\";\nimport { Product } from \"./product\";\n\n@Resolver"
  },
  {
    "path": "examples/apollo-federation-2/products/data.ts",
    "chars": 516,
    "preview": "import { Dining } from \"./dining\";\nimport { type Product } from \"./product\";\nimport { Seating } from \"./seating\";\n\nexpor"
  },
  {
    "path": "examples/apollo-federation-2/products/dining.ts",
    "chars": 240,
    "preview": "import { Directive, Field, ObjectType } from \"type-graphql\";\nimport { Product } from \"./product\";\n\n@Directive(`@key(fiel"
  },
  {
    "path": "examples/apollo-federation-2/products/index.ts",
    "chars": 799,
    "preview": "import { ApolloServer } from \"@apollo/server\";\nimport { startStandaloneServer } from \"@apollo/server/standalone\";\nimport"
  },
  {
    "path": "examples/apollo-federation-2/products/product.reference.ts",
    "chars": 250,
    "preview": "import { products } from \"./data\";\nimport { type Product } from \"./product\";\n\nexport async function resolveProductRefere"
  },
  {
    "path": "examples/apollo-federation-2/products/product.ts",
    "chars": 267,
    "preview": "import { Directive, Field, InterfaceType } from \"type-graphql\";\n\n@Directive(`@key(fields: \"upc\")`)\n@InterfaceType()\nexpo"
  },
  {
    "path": "examples/apollo-federation-2/products/resolver.ts",
    "chars": 364,
    "preview": "import { Arg, Query, Resolver } from \"type-graphql\";\nimport { products } from \"./data\";\nimport { Product } from \"./produ"
  },
  {
    "path": "examples/apollo-federation-2/products/seating.ts",
    "chars": 240,
    "preview": "import { Directive, Field, ObjectType } from \"type-graphql\";\nimport { Product } from \"./product\";\n\n@Directive(`@key(fiel"
  },
  {
    "path": "examples/apollo-federation-2/reviews/index.ts",
    "chars": 909,
    "preview": "import { ApolloServer } from \"@apollo/server\";\nimport { startStandaloneServer } from \"@apollo/server/standalone\";\nimport"
  },
  {
    "path": "examples/apollo-federation-2/reviews/product/product.ts",
    "chars": 242,
    "preview": "import { Directive, Field, ObjectType } from \"type-graphql\";\n\n@Directive(\"@extends\")\n@Directive(`@key(fields: \"upc\")`)\n@"
  },
  {
    "path": "examples/apollo-federation-2/reviews/product/resolver.ts",
    "chars": 424,
    "preview": "import { FieldResolver, Resolver, Root } from \"type-graphql\";\nimport { Product } from \"./product\";\nimport { reviews } fr"
  },
  {
    "path": "examples/apollo-federation-2/reviews/review/data.ts",
    "chars": 1240,
    "preview": "import { Review } from \"./review\";\nimport { Product } from \"../product/product\";\nimport { User } from \"../user/user\";\n\nf"
  },
  {
    "path": "examples/apollo-federation-2/reviews/review/resolver.ts",
    "chars": 286,
    "preview": "import { FieldResolver, Resolver } from \"type-graphql\";\nimport { reviews } from \"./data\";\nimport { Review } from \"./revi"
  },
  {
    "path": "examples/apollo-federation-2/reviews/review/review.ts",
    "chars": 394,
    "preview": "import { Directive, Field, ID, ObjectType } from \"type-graphql\";\nimport { Product } from \"../product/product\";\nimport { "
  },
  {
    "path": "examples/apollo-federation-2/reviews/user/resolver.ts",
    "chars": 406,
    "preview": "import { FieldResolver, Resolver, Root } from \"type-graphql\";\nimport { User } from \"./user\";\nimport { reviews } from \".."
  },
  {
    "path": "examples/apollo-federation-2/reviews/user/user.ts",
    "chars": 231,
    "preview": "import { Directive, Field, ID, ObjectType } from \"type-graphql\";\n\n@Directive(`@key(fields: \"id\")`)\n@ObjectType()\nexport "
  },
  {
    "path": "examples/apollo-federation-2/schema.graphql",
    "chars": 1008,
    "preview": "# -----------------------------------------------\n# !!! THIS FILE WAS GENERATED BY TYPE-GRAPHQL !!!\n# !!!   DO NOT MODIF"
  },
  {
    "path": "examples/authorization/auth-checker.ts",
    "chars": 509,
    "preview": "import { type AuthChecker } from \"type-graphql\";\nimport { type Context } from \"./context.type\";\n\n// Auth checker functio"
  },
  {
    "path": "examples/authorization/context.type.ts",
    "chars": 86,
    "preview": "import { type User } from \"./user.type\";\n\nexport interface Context {\n  user?: User;\n}\n"
  },
  {
    "path": "examples/authorization/examples.graphql",
    "chars": 488,
    "preview": "query GetPublicRecipes {\n  recipes {\n    title\n    description\n    averageRating\n  }\n}\n\nquery GetRecipesForAuthorizedUse"
  },
  {
    "path": "examples/authorization/index.ts",
    "chars": 1290,
    "preview": "import \"reflect-metadata\";\nimport path from \"node:path\";\nimport { ApolloServer } from \"@apollo/server\";\nimport { startSt"
  },
  {
    "path": "examples/authorization/recipe.data.ts",
    "chars": 600,
    "preview": "import { Recipe } from \"./recipe.type\";\n\nfunction createRecipe(recipeData: Partial<Recipe>): Recipe {\n  return Object.as"
  },
  {
    "path": "examples/authorization/recipe.resolver.ts",
    "chars": 1141,
    "preview": "import { Arg, Authorized, Mutation, Query, Resolver } from \"type-graphql\";\nimport { sampleRecipes } from \"./recipe.data\""
  },
  {
    "path": "examples/authorization/recipe.type.ts",
    "chars": 648,
    "preview": "import { Authorized, Field, Float, Int, ObjectType } from \"type-graphql\";\n\n@ObjectType()\nexport class Recipe {\n  @Field("
  },
  {
    "path": "examples/authorization/schema.graphql",
    "chars": 480,
    "preview": "# -----------------------------------------------\n# !!! THIS FILE WAS GENERATED BY TYPE-GRAPHQL !!!\n# !!!   DO NOT MODIF"
  },
  {
    "path": "examples/authorization/user.type.ts",
    "chars": 75,
    "preview": "export interface User {\n  id: number;\n  name: string;\n  roles: string[];\n}\n"
  },
  {
    "path": "examples/automatic-validation/examples.graphql",
    "chars": 523,
    "preview": "query GetRecipes {\n  recipes {\n    title\n    description\n    creationDate\n  }\n}\n\nmutation CorrectAddRecipe {\n  addRecipe"
  },
  {
    "path": "examples/automatic-validation/helpers.ts",
    "chars": 296,
    "preview": "import { type Recipe } from \"./recipe.type\";\n\nexport function generateRecipes(count: number): Recipe[] {\n  return new Ar"
  },
  {
    "path": "examples/automatic-validation/index.ts",
    "chars": 905,
    "preview": "import \"reflect-metadata\";\nimport path from \"node:path\";\nimport { ApolloServer } from \"@apollo/server\";\nimport { startSt"
  },
  {
    "path": "examples/automatic-validation/recipe.input.ts",
    "chars": 336,
    "preview": "import { Length, MaxLength } from \"class-validator\";\nimport { Field, InputType } from \"type-graphql\";\nimport { type Reci"
  },
  {
    "path": "examples/automatic-validation/recipe.resolver.ts",
    "chars": 943,
    "preview": "import { Arg, Args, Mutation, Query, Resolver } from \"type-graphql\";\nimport { generateRecipes } from \"./helpers\";\nimport"
  },
  {
    "path": "examples/automatic-validation/recipe.type.ts",
    "chars": 207,
    "preview": "import { Field, ObjectType } from \"type-graphql\";\n\n@ObjectType()\nexport class Recipe {\n  @Field()\n  title!: string;\n\n  @"
  },
  {
    "path": "examples/automatic-validation/recipes.arguments.ts",
    "chars": 247,
    "preview": "import { Max, Min } from \"class-validator\";\nimport { ArgsType, Field, Int } from \"type-graphql\";\n\n@ArgsType()\nexport cla"
  },
  {
    "path": "examples/automatic-validation/schema.graphql",
    "chars": 844,
    "preview": "# -----------------------------------------------\n# !!! THIS FILE WAS GENERATED BY TYPE-GRAPHQL !!!\n# !!!   DO NOT MODIF"
  },
  {
    "path": "examples/custom-validation/examples.graphql",
    "chars": 523,
    "preview": "query GetRecipes {\n  recipes {\n    title\n    description\n    creationDate\n  }\n}\n\nmutation CorrectAddRecipe {\n  addRecipe"
  },
  {
    "path": "examples/custom-validation/helpers.ts",
    "chars": 296,
    "preview": "import { type Recipe } from \"./recipe.type\";\n\nexport function generateRecipes(count: number): Recipe[] {\n  return new Ar"
  },
  {
    "path": "examples/custom-validation/index.ts",
    "chars": 1129,
    "preview": "import \"reflect-metadata\";\nimport path from \"node:path\";\nimport { ApolloServer } from \"@apollo/server\";\nimport { startSt"
  },
  {
    "path": "examples/custom-validation/recipe.input.ts",
    "chars": 392,
    "preview": "import Joiful from \"joiful\";\nimport { Field, InputType } from \"type-graphql\";\nimport { type Recipe } from \"./recipe.type"
  },
  {
    "path": "examples/custom-validation/recipe.resolver.ts",
    "chars": 943,
    "preview": "import { Arg, Args, Mutation, Query, Resolver } from \"type-graphql\";\nimport { generateRecipes } from \"./helpers\";\nimport"
  },
  {
    "path": "examples/custom-validation/recipe.type.ts",
    "chars": 207,
    "preview": "import { Field, ObjectType } from \"type-graphql\";\n\n@ObjectType()\nexport class Recipe {\n  @Field()\n  title!: string;\n\n  @"
  },
  {
    "path": "examples/custom-validation/recipes.arguments.ts",
    "chars": 321,
    "preview": "import Joiful from \"joiful\";\nimport { ArgsType, Field, Int } from \"type-graphql\";\n\n@ArgsType()\nexport class RecipesArgum"
  },
  {
    "path": "examples/custom-validation/schema.graphql",
    "chars": 588,
    "preview": "# -----------------------------------------------\n# !!! THIS FILE WAS GENERATED BY TYPE-GRAPHQL !!!\n# !!!   DO NOT MODIF"
  },
  {
    "path": "examples/enums-and-unions/cook.data.ts",
    "chars": 321,
    "preview": "import { Cook } from \"./cook.type\";\n\nfunction createCook(cookData: Partial<Cook>): Cook {\n  return Object.assign(new Coo"
  },
  {
    "path": "examples/enums-and-unions/cook.type.ts",
    "chars": 174,
    "preview": "import { Field, Int, ObjectType } from \"type-graphql\";\n\n@ObjectType()\nexport class Cook {\n  @Field()\n  name!: string;\n\n "
  },
  {
    "path": "examples/enums-and-unions/difficulty.enum.ts",
    "chars": 248,
    "preview": "import { registerEnumType } from \"type-graphql\";\n\nexport enum Difficulty {\n  Beginner,\n  Easy,\n  Medium,\n  Hard,\n  Maste"
  },
  {
    "path": "examples/enums-and-unions/examples.graphql",
    "chars": 481,
    "preview": "query AllRecipes {\n  recipes {\n    title\n    description\n    preparationDifficulty\n    cook {\n      name\n    }\n  }\n}\n\nqu"
  },
  {
    "path": "examples/enums-and-unions/index.ts",
    "chars": 841,
    "preview": "import \"reflect-metadata\";\nimport path from \"node:path\";\nimport { ApolloServer } from \"@apollo/server\";\nimport { startSt"
  },
  {
    "path": "examples/enums-and-unions/recipe.data.ts",
    "chars": 1180,
    "preview": "import { sampleCooks } from \"./cook.data\";\nimport { Difficulty } from \"./difficulty.enum\";\nimport { Recipe } from \"./rec"
  },
  {
    "path": "examples/enums-and-unions/recipe.type.ts",
    "chars": 407,
    "preview": "import { Field, ObjectType } from \"type-graphql\";\nimport { Cook } from \"./cook.type\";\nimport { Difficulty } from \"./diff"
  },
  {
    "path": "examples/enums-and-unions/resolver.ts",
    "chars": 1108,
    "preview": "import { Arg, Query, Resolver } from \"type-graphql\";\nimport { sampleCooks } from \"./cook.data\";\nimport { type Cook } fro"
  },
  {
    "path": "examples/enums-and-unions/schema.graphql",
    "chars": 653,
    "preview": "# -----------------------------------------------\n# !!! THIS FILE WAS GENERATED BY TYPE-GRAPHQL !!!\n# !!!   DO NOT MODIF"
  },
  {
    "path": "examples/enums-and-unions/search-result.union.ts",
    "chars": 239,
    "preview": "import { createUnionType } from \"type-graphql\";\nimport { Cook } from \"./cook.type\";\nimport { Recipe } from \"./recipe.typ"
  },
  {
    "path": "examples/extensions/context.type.ts",
    "chars": 86,
    "preview": "import { type User } from \"./user.type\";\n\nexport interface Context {\n  user?: User;\n}\n"
  },
  {
    "path": "examples/extensions/examples.graphql",
    "chars": 254,
    "preview": "query GetRecipes {\n  recipes {\n    title\n    description\n    ingredients\n    averageRating\n    ratings\n  }\n}\n\nmutation A"
  },
  {
    "path": "examples/extensions/helpers/config.extractors.ts",
    "chars": 546,
    "preview": "import {\n  type GraphQLFieldConfig,\n  type GraphQLObjectTypeConfig,\n  type GraphQLResolveInfo,\n} from \"graphql\";\n\nexport"
  },
  {
    "path": "examples/extensions/index.ts",
    "chars": 1266,
    "preview": "import \"reflect-metadata\";\nimport path from \"node:path\";\nimport { ApolloServer } from \"@apollo/server\";\nimport { startSt"
  },
  {
    "path": "examples/extensions/log-message.decorator.ts",
    "chars": 493,
    "preview": "import { Extensions } from \"type-graphql\";\n\ninterface LogOptions {\n  message: string;\n  level?: number;\n}\n\nexport functi"
  },
  {
    "path": "examples/extensions/logger.middleware.ts",
    "chars": 1502,
    "preview": "import {\n  type GraphQLFieldConfig,\n  type GraphQLObjectTypeConfig,\n  type GraphQLResolveInfo,\n} from \"graphql\";\nimport "
  },
  {
    "path": "examples/extensions/logger.service.ts",
    "chars": 128,
    "preview": "import { Service } from \"typedi\";\n\n@Service()\nexport class Logger {\n  log(...args: unknown[]) {\n    console.log(...args)"
  },
  {
    "path": "examples/extensions/recipe.data.ts",
    "chars": 600,
    "preview": "import { Recipe } from \"./recipe.type\";\n\nfunction createRecipe(recipeData: Partial<Recipe>): Recipe {\n  return Object.as"
  },
  {
    "path": "examples/extensions/recipe.type.ts",
    "chars": 849,
    "preview": "import { Extensions, Field, Float, Int, ObjectType } from \"type-graphql\";\nimport { LogMessage } from \"./log-message.deco"
  }
]

// ... and 673 more files (download for full content)

About this extraction

This page contains the full source code of the MichalLytek/type-graphql GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 873 files (2.5 MB), approximately 696.8k tokens, and a symbol index with 1520 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!