morpheus-graphql icon indicating copy to clipboard operation
morpheus-graphql copied to clipboard

Problematic `makeRelativeToProject` use in `importGQLDocument`

Open goertzenator opened this issue 2 years ago • 1 comments

Summary: The makeRelativeToProject call in importQGLDocument should be removed.

Detail:

importQGLDocument is using the function makeRelativeToProject internally which implies that the parameter to importQGLDocument should be a relative path. However in at least one of the examples the path passed is implied to be an absolute path due to the explicit makeRelativeToProject call:

makeRelativeToProject "src/Server/API/simple.gql" >>= importGQLDocument

In the case above, makeRelativeToProject ends up getting called twice; this works by coincidence because the project root usually resolves to "./".

But in multi-component projects this is not the case and the extra makeRelativeToProject will cause problems. In my case this was compounded by a bug in Haskell Language Server which is returning an incorrect root for multi-component projects; the internal call to makeRelativeToProject made the HLS bug even harder to work around.

So, that's why I think makeRelativeToProject should be removed from importQGLDocument. The exact call I'm talking about is here. I also see a usage in readWith; that should probably go too.

goertzenator avatar Aug 18 '23 14:08 goertzenator

Additional thought: For maximum flexibility the QGL document could be accepted as a string instead of as a filename. The HLS issue linked above suggests the use of the embed-file package for more robust file imports. With this package you could do something like this:

embedStringFile "myschema.gql" >>= importGQLString

Where importGQLString accepts the doc as a string. One also gains more flexibility to generate it in other ways such as using external tools or downloading direct from a URL.

goertzenator avatar Aug 22 '23 14:08 goertzenator