morpheus-graphql
morpheus-graphql copied to clipboard
Problematic `makeRelativeToProject` use in `importGQLDocument`
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.
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.