Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

export function printFilteredSchema #2145

Closed
wants to merge 2 commits into from
Closed

Conversation

Zemnmez
Copy link

@Zemnmez Zemnmez commented Aug 31, 2019

It is useful to be able to print directives that are part of graphql's representation of the schema. Previous discussions on this have noted that printing directives as part of a schema doesn't make sense for a publicly accessible schema as they're not true parts of the 'graph' graphql represents.

However, I'm currently working with code generation tools, and not being able to print the full in-memory schema into canonical form is a deal breaker. printFilteredSchema already exposes the ability to adjust the way the schema is printed so this PR simply exposes it.

@IvanGoncharov
Copy link
Member

@Zemnmez Issue that you referenced is about printing directive usage, not directive definitions.
The only thing that printFilteredSchema can do is to additionally print is definitions of @skip, @include and @deprecate:

"""
Directs the executor to include this field or fragment only when the \`if\` argument is true.
"""
directive @include(
"""Included when true."""
if: Boolean!
) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
"""
Directs the executor to skip this field or fragment when the \`if\` argument is true.
"""
directive @skip(
"""Skipped when true."""
if: Boolean!
) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
"""Marks an element of a GraphQL schema as no longer supported."""
directive @deprecated(
"""
Explains why this element was deprecated, usually also including a suggestion
for how to access supported similar data. Formatted using the Markdown syntax
(as specified by [CommonMark](https://commonmark.org/).
"""
reason: String = "No longer supported"
) on FIELD_DEFINITION | ENUM_VALUE

So are you sure that you want directive definitions and not directive usage?

@Zemnmez
Copy link
Author

Zemnmez commented Aug 31, 2019

@IvanGoncharov oh... you're right. Is there a better way of doing what I'm trying to do? What I'm observing is that printSchema is not printing directives on my fields.

@Zemnmez Zemnmez closed this Aug 31, 2019
@IvanGoncharov
Copy link
Member

IvanGoncharov commented Aug 31, 2019

@Zemnmez Proper solution is discussed in #2020
Currently, we are working on porting this library to TypeScript so we in a feature freeze until it's done.

As a temporary workaround you can do (NOT TESTED):

const sdl = printSchema(schema);
let currentType;
const modifiedAST = visit(parse(sdl), {
  ObjectDefinition(node) {
    currentType = schema.getType(node.name.value);
  },
  Field(node) {
    const fieldDef = currentType.getFields()[node.name.value];
    return {
      ...node,
      directives: fieldDef.astNode.directives,
    };
  },
});
const sdlWithDirectives = print(modifiedAST);

@Zemnmez
Copy link
Author

Zemnmez commented Sep 4, 2019

thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants