longshotlabs / simpl-schema

A JavaScript schema validation package that supports direct validation of MongoDB update modifier objects
https://www.npmjs.com/package/simpl-schema
MIT License
560 stars 114 forks source link

autoValue: this.field() not working inside a subSchema #422

Open loichu opened 3 years ago

loichu commented 3 years ago

Hello,

Firstly, thank you very much for this awesome package that makes me save a lot of time.

As I already mentioned here: https://github.com/aldeed/simpl-schema/issues/412#issuecomment-750221814, I noticed that during the cleaning process, I cannot get any field outside of the subschema. However, it works in the opposite direction: I can get a subSchema field value from the parent schema. I tried to read your code to fix it myself but it was too complex and unfortunately I cannot invest more time in it yet.

Here are the tests you can run to reproduce this behavior:

  // This test is passing
  it('is possible to get a first level field value from inside a nested object', function () {
    const test = {
      firstLevel: '1st level',
      nestedObject: {
        secondLevel: false
      }
    }
    const schema = new SimpleSchema({
      firstLevel: String,
      nestedObject: Object,
      'nestedObject.secondLevel': {
        type: Boolean,
        autoValue() {
          return this.field('firstLevel').value === test.firstLevel
        }
      }
    })
    const cleaned = schema.clean(test)
    expect(cleaned.nestedObject.secondLevel).toBe(true)
  })

  // This one is not
  it('is possible to get a first level field value from inside a subSchema', function () {
    const test = {
      firstLevel: '1st level',
      nestedObject: {
        secondLevel: false
      }
    }
    const subSchema = new SimpleSchema({
      secondLevel: {
        type: Boolean,
        autoValue() {
          return this.field('firstLevel').value === test.firstLevel
        }
      }
    })
    const schema = new SimpleSchema({
      firstLevel: String,
      nestedObject: subSchema
    })
    const cleaned = schema.clean(test)
    expect(cleaned.nestedObject.secondLevel).toBe(true)
  })

  // But this one is
  it('is possible to get a subSchema field value from a first level field', function () {
    const test = {
      firstLevel: false,
      nestedObject: {
        secondLevel: '2nd level'
      }
    }
    const subSchema = new SimpleSchema({
      secondLevel: String
    })
    const schema = new SimpleSchema({
      nestedObject: subSchema,
      firstLevel: {
        type: Boolean,
        autoValue() {
          return this.field('nestedObject.secondLevel').value === test.nestedObject.secondLevel
        }
      },
    })
    const cleaned = schema.clean(test)
    expect(cleaned.firstLevel).toBe(true)
  })

It works as expected inside validation functions like custom().

Thank you for your investment in OSS, you made a lot of good stuff for the javascript ecosystem.

github-actions[bot] commented 3 years ago

Thank you for submitting an issue!

If this is a bug report, please be sure to include, at minimum, example code showing a small schema and any necessary calls with all their arguments, which will reproduce the issue. Even better, you can link to a saved online code editor example, where anyone can immediately run the code and see the issue.

If you are requesting a feature, include a code example of how you imagine it working if it were implemented.

If you need to edit your issue description, click the [...] and choose Edit.

Be patient. This is a free and freely licensed package that I maintain in my spare time. You may get a response in a day, but it could also take a month. If you benefit from this package and would like to see more of my time devoted to it, you can help by sponsoring.