RobinCK / typeorm-fixtures

:pill: Fixtures loader for typeorm 🇺🇦
https://robinck.github.io/typeorm-fixtures/
MIT License
566 stars 45 forks source link

class-transformer decorators are ignored #87

Open qmphan opened 4 years ago

qmphan commented 4 years ago

Hello,

Thank you for this nice and handy library!

I have entity with decorators (I use DateTime type from luxon) and had problem because attribute of type DateTime cannot be created with new DateTime(). In luxon, you have to use DateTime.local() or DateTime.utc() to create new instances.

So I have write some decorators to get around this. However, my decorators are ignored when fixtures are transformed due to the parameter ignoreDecorators set to true in the call to plainToClassFromExist in Builder.js

if (typeof processorInstance.preProcess === 'function') {
                    data = yield processorInstance.preProcess(fixture.name, data);
                }
                entity = class_transformer_1.plainToClassFromExist(entity, data, { ignoreDecorators: false });
                yield callExecutors();
                /* istanbul ignore else */
                if (typeof processorInstance.postProcess === 'function') {
                    yield processorInstance.postProcess(fixture.name, entity);
                }

What are the reasons for setting ignoreDecorators to true? Could you make it optional?

RobinCK commented 4 years ago

thanks. added to Roadmap

RobinCK commented 3 years ago

fixed in 1.9.0 version

aleksandryackovlev commented 3 years ago

This fix breaks the behavior that I use in my code.

I've got user.entity with the Exclude decorator for passwords:

@Entity()
export class User {
  @Column({
    type: 'varchar',
    length: 150,
    update: false,
    unique: true,
  })
  username: string;

  @Exclude()
  @Column()
  password: string;

  @BeforeInsert()
  async hashPassword() {
    this.password = await bcrypt.hash(this.password, 10);
  }
}

And my fixture looks like this:

entity: User
parameters: {}
items:
  user1:
    username: '{{internet.userName}}'
    password: 'test'
    __call:
      hashPassword:
  user2:
    username: '{{internet.userName}}'
    password: 'test'
    __call:
      hashPassword:

Before the fix everything worked just fine. But now this.passwordis undefinded inside the hashPassword, and it causes an error during the creation of fixtures.

Considering the fact that decorators are not ignored anymore, I removed the __call params from my fixtures, but it doesn't work either.

@RobinCK Isn't it going to be a better solution to allow users to ignore decorators by some command-line option?

RobinCK commented 3 years ago

@aleksandryackovlev Yes, you are right, I need to move this into the entity configuration

phillamarmotte commented 3 years ago

Hi, first of all, thank you for this lib. Is it possible to do something like this, so everyone (inculded me) will be happy

in he yaml file

entity: User
ignoreDecorators: true
items:
  user1:
    username: foo
    password: test

then add the key in jFixturesSchema.js

ignoreDecorators: Joi.boolean(),

add it to in Resolver.js

l15  for (const { entity, items, parameters, processor, resolvedFields, ignoreDecorators } of fixtureConfigs) {
l29  for (const name of referenceNames) {
                    const data = Object.assign({}, propertyList);
                    this.stack.push({
                        parameters: parameters || {},
                        processor,
                        entity: entity,
                        name: name,
                        resolvedFields,
                        data,
                        dependencies: this.resolveDependencies(name, data),
                        ignoreDecorators
                    });

and finaly in Builder.js

add method

function isIgnoreDecorators(fixture) {
    return !!fixture.ignoreDecorators
}

then use it to configure the ignoreDecorators parameter

entity = class_transformer_1.plainToClassFromExist(entity, data, { ignoreDecorators: isIgnoreDecorators(fixture) });

This way it doesn't break anything and you can disable decorator for specific entities

@RobinCK I find this way more convenient than a cli option.

wodka commented 2 years ago

we are having the problem that they are not ignored - even though setting ignoreDecorators to true. It will not add any field to an object that has the @Exclude() annotation on the class