Skip to content

RFC: Merge types/ and fuse/ folders #101

@mxstbr

Description

@mxstbr

Summary

Right now, users interact with a types/ folder that contains ~a file per node, and then Fuse generates a fuse/ folder that people use from their client(s). (import { useQuery } from '@/fuse/client')

Proposed Solution

I propose we centralize all of it into the fuse/ folders. Users write their types in their, and then we also generate the files in there and they import from there from the client.

First idea for a potential folder structure:

.
└── fuse/
    ├── User.ts
    ├── Product.ts
    ├── _context.ts
    └── _generated/
        ├── client.ts
        ├── fragment-masking.ts
        ├── gql.ts
        ├── graphql.ts
        ├── index.ts
        ├── pages.ts
        └── server.ts

The big question is what happens to the client imports. With this structure, they'd look like import { useQuery } from '@/fuse/_generated/client', which isn't great.

Since client.ts, index.ts, pages.ts, and server.ts are simple re-exports of the underlying libraries and the really truly generated custom files are fragment-masking.ts, gql.ts, and graphql.ts, we could try this folder structure instead:

.
└── fuse/
    ├── User.ts
    ├── Product.ts
    ├── client.ts
    ├── index.ts
    ├── pages.ts
    ├── server.ts
    ├── context.ts
    └── generated/
        ├── fragment-masking.ts
        ├── gql.ts
        └── graphql.ts

This would fully preserve the client imports while centralizing everything else. The downside of this is that the index/pages/server/client.ts files get muddled with the types/nodes, and it's a bit of an odd semantics because users are meant to touch context.ts but not server.ts — that's not intuitive.

Another option that clearly marks index/pages/server/client.ts distinct from the types files would be to prefix them with a _, just like we do with _generated and _context in the original example:

.
└── fuse/
    ├── User.ts
    ├── Product.ts
    ├── context.ts
    ├── _client.ts
    ├── _index.ts
    ├── _pages.ts
    ├── _server.ts
    └── _generated/
        ├── fragment-masking.ts
        ├── gql.ts
        └── graphql.ts

But that makes client-side imports ugly. import from '@/fuse/_client 😕 Also, _index.ts obviously doesn't work for import from '@/fuse' so we'd need a different name for those exports.

Any other ideas?

Metadata

Metadata

Assignees

No one assigned

    Labels

    RFCA discussion about a future feature

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions