typestack / class-transformer

Decorator-based transformation, serialization, and deserialization between objects and classes.
MIT License
6.64k stars 486 forks source link

fix: Unable to use "name" as a property in class-validator #1700

Closed fdorantesm closed 1 month ago

fdorantesm commented 1 month ago

Description

Property name is overwritten to "anonymous" if you define a property called "named" in a DTO class.

Minimal code-snippet showcasing the problem

export class UpdateChallengeDto {
  @ApiPropertyOptional({ example: 'April 2024' })
  @IsString()
  @IsDefined()
  public readonly name: string;

  @ApiPropertyOptional({ example: 450 })
  @Min(0)
  @IsOptional()
  @Type(() => Number)
  public readonly price?: number;

  @ApiPropertyOptional({ example: 'f7e7b1e4-9b0b-4b4b-8d2c-6e1f4d4c3d3d' })
  @IsString()
  @IsUUID()
  @IsOptional()
  public readonly playlistId?: string;

  @ApiPropertyOptional({ example: true })
  @IsBoolean()
  @IsOptional()
  @Type(() => Boolean)
  public readonly isActive?: boolean;

  @ApiPropertyOptional({ example: '2024-04-01T00:00:00.000Z' })
  @IsDate()
  @Type(() => Date)
  @IsOptional()
  public readonly startsAt?: Date;

  @ApiPropertyOptional({ example: '2024-04-30T23:59:59.999Z' })
  @IsDate()
  @Type(() => Date)
  @IsOptional()
  public readonly endsAt?: Date;
}

Expected behavior

The classToPlain method will return an object with the original "name" value.

Actual behavior

The classToPlain method is returning the constructor name "anonymous".

image

image

Context

I'm using nestjs Versions from package.json

{
    "class-transformer": "^0.5.1",
    "class-validator": "^0.14.1"
}
{
   "name": "chanchito",
   "version": "1.0.0",
   "description": "An API using NestJS",
   "dependencies": {
    "@codegenie/serverless-express": "^4.14.1",
    "@nestjs/axios": "^3.0.0",
    "@nestjs/common": "^10.1.3",
    "@nestjs/config": "^3.0.0",
    "@nestjs/core": "^10.1.3",
    "@nestjs/cqrs": "^10.2.5",
    "@nestjs/jwt": "^10.1.0",
    "@nestjs/mongoose": "^10.0.1",
    "@nestjs/passport": "^10.0.0",
    "@nestjs/platform-express": "^10.1.3",
    "@nestjs/swagger": "^7.1.8",
    "@pluzchat/nestjs-ses": "^1.0.2",
    "@supercharge/promise-pool": "^2.4.0",
    "aws-lambda": "^1.0.7",
    "aws-sdk": "^2.1614.0",
    "axios": "^1.4.0",
    "bcryptjs": "^2.4.3",
    "class-transformer": "^0.5.1",
    "class-validator": "^0.14.1",
    "connection-string": "^4.3.5",
    "cookie-parser": "^1.4.6",
    "express-rate-limit": "^6.5.2",
    "helmet": "^5.1.1",
    "http-status-codes": "^2.2.0",
    "joi": "^17.6.0",
    "json-logger-service": "^9.0.1",
    "jsonwebtoken": "^8.5.1",
    "lodash": "^4.17.21",
    "luxon": "^3.0.4",
    "moment": "^2.29.4",
    "moment-timezone": "^0.5.37",
    "mongoose": "^6.5.2",
    "mongoose-anonymoose": "^1.0.0",
    "mongoose-paginate": "^5.0.3",
    "mongoose-query-parser-fork": "^1.3.4",
    "nedb-promises": "^6.2.3",
    "nestjs-s3": "^1.0.1",
    "nestjs-stripe": "^1.0.0",
    "nestjs-uuid": "^0.1.4",
    "passport": "^0.6.0",
    "passport-cookie": "^1.0.9",
    "passport-custom": "^1.1.1",
    "passport-jwt": "^4.0.0",
    "pug": "^3.0.2",
    "ramda": "^0.28.0",
    "reflect-metadata": "^0.1.13",
    "rimraf": "^3.0.2",
    "rxjs": "^7.5.6",
    "serverless": "^3.38.0",
    "serverless-offline": "^13.5.0",
    "slug": "^6.0.0",
    "stripe": "^11.12.0",
    "utility": "^1.17.0",
    "uuid": "^9.0.1"
  },
  "devDependencies": {
    "@nestjs/cli": "^10.1.12",
    "@nestjs/schematics": "^10.0.2",
    "@nestjs/testing": "^10.1.3",
    "@types/aws-sdk": "^2.7.0",
    "@types/cookie-parser": "^1.4.3",
    "@types/express": "^4.17.13",
    "@types/jest": "27.0.2",
    "@types/luxon": "^3.0.1",
    "@types/mongoose-paginate": "^5.0.12",
    "@types/multer": "^1.4.7",
    "@types/node": "18.17.0",
    "@types/pug": "^2.0.6",
    "@types/ramda": "^0.28.23",
    "@types/slug": "^5.0.3",
    "@types/supertest": "^2.0.11",
    "@typescript-eslint/eslint-plugin": "^5.0.0",
    "@typescript-eslint/parser": "^5.0.0",
    "cross-var": "^1.1.0",
    "dotenv": "^16.0.3",
    "eslint": "^8.0.1",
    "eslint-config-prettier": "^8.3.0",
    "eslint-plugin-prettier": "^4.0.0",
    "husky": "^7.0.4",
    "jest": "^27.2.5",
    "npm-run-all": "^4.1.5",
    "prettier": "^2.3.2",
    "serverless-dotenv-plugin": "^6.0.0",
    "source-map-support": "^0.5.20",
    "supertest": "^6.1.3",
    "ts-jest": "^27.0.3",
    "ts-loader": "^9.2.3",
    "ts-node": "^10.0.0",
    "ts-unused-exports": "^9.0.4",
    "tsconfig-paths": "^3.10.1",
    "typescript": "^4.3.5"
  }
}
fdorantesm commented 1 month ago

I was using a transformation flag in the ValidationPipe.

github-actions[bot] commented 3 weeks ago

This issue has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs.