Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cannot deprecate GraphQL field in auto generated schema (code first) #13060

Closed
3 of 15 tasks
oleshkooo opened this issue Jan 16, 2024 · 4 comments
Closed
3 of 15 tasks

Cannot deprecate GraphQL field in auto generated schema (code first) #13060

oleshkooo opened this issue Jan 16, 2024 · 4 comments

Comments

@oleshkooo
Copy link

oleshkooo commented Jan 16, 2024

Is there an existing issue for this?

  • I have searched the existing issues

Current behavior

deprecationReason property in InputType decodarot does not deprecate field in GraphQL schema

Minimum reproduction code

https://github.com/Oleshkooo/nestjs-field-deprecation-issue

Steps to reproduce

Create new nest project

nest new .

Install packages

npm i @nestjs/graphql @nestjs/apollo @apollo/server graphql

Edit app.module.ts

import { ApolloServerPluginLandingPageLocalDefault } from '@apollo/server/plugin/landingPage/default';
import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo';
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
import { join } from 'path';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ExampleModule } from './example/example.module';

@Module({
  imports: [
    GraphQLModule.forRoot<ApolloDriverConfig>({
      driver: ApolloDriver,
      path: '/graphql',
      autoSchemaFile: join(process.cwd(), 'src/schema.gql'),
      sortSchema: true,
      playground: false,
      plugins: [ApolloServerPluginLandingPageLocalDefault()],
    }),
    ExampleModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

Generate new module

nest g res
example
GraphQL (code first)
y

Edit src/example/dto/create-example.input.ts

import { InputType, Int, Field } from '@nestjs/graphql';

@InputType()
export class CreateExampleInput {
  @Field(() => Int, {
    description: 'Example field (placeholder)',
    deprecationReason: 'This field is deprecated',
  })
  exampleField: number;
}

Run app

npm run start:dev

Check src/schema.gql file (no deprecated directive)

input CreateExampleInput {
  """Example field (placeholder)"""
  exampleField: Int!
}

Expected behavior

exampleField is deprecated in GraphQL schema

input CreateExampleInput {
  """Example field (placeholder)"""
  exampleField: Int! @deprecated(reason: "This field is deprecated")
}

Package

  • I don't know. Or some 3rd-party package
  • @nestjs/common
  • @nestjs/core
  • @nestjs/microservices
  • @nestjs/platform-express
  • @nestjs/platform-fastify
  • @nestjs/platform-socket.io
  • @nestjs/platform-ws
  • @nestjs/testing
  • @nestjs/websockets
  • Other (see below)

Other package

@nestjs/graphql

NestJS version

10.1.18 (nest -v)

Packages versions

{
  "name": "nest-issue",
  "version": "0.0.1",
  "description": "",
  "author": "",
  "private": true,
  "license": "UNLICENSED",
  "scripts": {
    "build": "nest build",
    "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
    "start": "nest start",
    "start:dev": "nest start --watch",
    "start:debug": "nest start --debug --watch",
    "start:prod": "node dist/main",
    "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
    "test": "jest",
    "test:watch": "jest --watch",
    "test:cov": "jest --coverage",
    "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
    "test:e2e": "jest --config ./test/jest-e2e.json"
  },
  "dependencies": {
    "@apollo/server": "^4.10.0",
    "@nestjs/apollo": "^12.0.11",
    "@nestjs/common": "^10.0.0",
    "@nestjs/core": "^10.0.0",
    "@nestjs/graphql": "^12.0.11",
    "@nestjs/platform-express": "^10.0.0",
    "graphql": "^16.8.1",
    "reflect-metadata": "^0.1.13",
    "rxjs": "^7.8.1"
  },
  "devDependencies": {
    "@nestjs/cli": "^10.0.0",
    "@nestjs/schematics": "^10.0.0",
    "@nestjs/testing": "^10.0.0",
    "@types/express": "^4.17.17",
    "@types/jest": "^29.5.2",
    "@types/node": "^20.3.1",
    "@types/supertest": "^2.0.12",
    "@typescript-eslint/eslint-plugin": "^6.0.0",
    "@typescript-eslint/parser": "^6.0.0",
    "eslint": "^8.42.0",
    "eslint-config-prettier": "^9.0.0",
    "eslint-plugin-prettier": "^5.0.0",
    "jest": "^29.5.0",
    "prettier": "^3.0.0",
    "source-map-support": "^0.5.21",
    "supertest": "^6.3.3",
    "ts-jest": "^29.1.0",
    "ts-loader": "^9.4.3",
    "ts-node": "^10.9.1",
    "tsconfig-paths": "^4.2.0",
    "typescript": "^5.1.3"
  },
  "jest": {
    "moduleFileExtensions": [
      "js",
      "json",
      "ts"
    ],
    "rootDir": "src",
    "testRegex": ".*\\.spec\\.ts$",
    "transform": {
      "^.+\\.(t|j)s$": "ts-jest"
    },
    "collectCoverageFrom": [
      "**/*.(t|j)s"
    ],
    "coverageDirectory": "../coverage",
    "testEnvironment": "node"
  }
}

Node.js version

20.11.0

In which operating systems have you tested?

  • macOS
  • Windows
  • Linux

Other

From the docs:

WARNING
Directives applied through the @directive() decorator will not be reflected in the generated schema definition file.

So I didn't use @directive()

OS: MacOS
Version: Sonoma 14.1.1
Node.js version: 20.11.0
npm version: 10.2.4
NestJS version: 10.1.18 (nest -v)

@oleshkooo oleshkooo added the needs triage This issue has not been looked into label Jan 16, 2024
@kamilmysliwiec
Copy link
Member

Would you like to create a PR for this issue?

@oleshkooo
Copy link
Author

Not sure

@micalevisk micalevisk removed the needs triage This issue has not been looked into label Jan 19, 2024
@Deniks
Copy link
Contributor

Deniks commented Jan 22, 2024

According to this, you cannot deprecate Input fields - graphql/graphql-spec#197

@PlayAnyData
Copy link

@kamilmysliwiec @Deniks Could you state for my understanding why this has been closed? As far as I understand the linked thread, this PR has been merged: graphql/graphql-spec#525 Therefore, deprecation of input types should be possible. Otherwise, I am getting something totally wrong.

I have checked today against the latest version in conjunction with this fix: nestjs/graphql#3157 (Adding deprecation to Args). However, the code-first approach (using InputType as shown above as well), still does not support this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants