graphql-codegen-factories icon indicating copy to clipboard operation
graphql-codegen-factories copied to clipboard

Accept nested partials

Open ertrzyiks opened this issue 2 years ago • 1 comments

Another DX improvement idea, what I have in the code now is similar to this:

createBlogListQueryQueryMock_node({
  parsedHeadline: createBlogListQueryQueryMock_parsedHeadline({
    childMarkdownRemark: createBlogListQueryQueryMock_parsedHeadline_childMarkdownRemark({
      html: 'This is pizza',
    })
  })
})

What would be more convenient and much less verbose is if the factory function accepted a nested partial param, like

createBlogListQueryQueryMock_node({
  parsedHeadline: {
    childMarkdownRemark: {
      html: 'This is pizza',
    }
  }
})

but currently it requires me to pass all the data necessary for the operation mock. I would need to add missing __typename and all other fields that are selected even if the example/story/test doesn't care about them.

The factories are already kinda recursive, it shouldn't require drastic changes.

Tricky cases that I anticipate:

  • arrays, could be ignore and keep them full-speced
  • unions, __typename would need to be required

ertrzyiks avatar May 03 '22 13:05 ertrzyiks

That makes a lot of sense and would also make our code simpler. To add to your observations, we also need to introduce a helper type DeepPartial:

- export function createUserMock(props: Partial<User>): User {
+ export function createUserMock(props: DeepPartial<User>): User {
}

We can probably take the implementation from ts-essentials/ts-essentials or sindresorhus/type-fest. The simpler the better I guess.

zhouzi avatar May 03 '22 17:05 zhouzi