neo4j-graphql / neo4j-graphql-js

NOTE: This project is no longer actively maintained. Please consider using the official Neo4j GraphQL Library (linked in README).
Other
608 stars 148 forks source link

how to get relation/cypher directives accepted by codegen? #442

Open AdrienLemaire opened 4 years ago

AdrienLemaire commented 4 years ago

Looking at #290, it seems like apollo client:codegen should work with grandstack , but I'm getting the following error whenever I try to generate my types:

$ npm run codegen

> project-client@2.0.1 codegen /home/dori/Projects/Work/project-v2/platform_v2/client
> apollo client:codegen --target typescript --watch

CLIError: Error in "Loading schema for project": GraphQLSchemaValidationError: Unknown directive "relation".

Unknown directive "cypher".

Unknown directive "cypher".
    at Object.error (/home/dori/Projects/Work/project-v2/platform_v2/client/node_modules/@oclif/errors/lib/index.js:22:17)
    at Generate.error (/home/dori/Projects/Work/project-v2/platform_v2/client/node_modules/@oclif/command/lib/command.js:60:23)
    at OclifLoadingHandler.showError (/home/dori/Projects/Work/project-v2/platform_v2/client/node_modules/apollo/lib/OclifLoadingHandler.js:28:22)
    at OclifLoadingHandler.handle (/home/dori/Projects/Work/project-v2/platform_v2/client/node_modules/apollo/lib/OclifLoadingHandler.js:13:18)
    at async GraphQLClientProject.loadServiceSchema (/home/dori/Projects/Work/project-v2/platform_v2/client/node_modules/apollo-language-server/lib/project/client.js:94:9)
    at async Promise.all (index 1) {
  oclif: { exit: 2 },
  code: undefined
}
  ✖ Loading Apollo Project
    → Unknown directive "cypher".
    Generating query files
Press any key to stop.
[GraphQL error]: 406: Not Acceptable
Error: 406: Not Acceptable
    at ApolloEngineClient.loadSchemaTagsAndFieldStats (/home/dori/Projects/Work/project-v2/platform_v2/client/node_modules/apollo-language-server/lib/engine/index.js:181:19)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
    at async /home/dori/Projects/Work/project-v2/platform_v2/client/node_modules/apollo-language-server/lib/project/client.js:200:52
    at async OclifLoadingHandler.handle (/home/dori/Projects/Work/project-v2/platform_v2/client/node_modules/apollo/lib/OclifLoadingHandler.js:9:25)
    at async GraphQLClientProject.loadEngineData (/home/dori/Projects/Work/project-v2/platform_v2/client/node_modules/apollo-language-server/lib/project/client.js:198:9)

Here is the schema.graphql used by my apollo server:

type User {
  id: ID!
  name: String
  avatar_url: String
  friends: [User] @relation(name: "FRIENDS", direction: "BOTH")
}

type Query {
  usersBySubstring(substring: String): [User]
    @cypher(
      statement: "MATCH (u:User) WHERE u.name CONTAINS $substring RETURN u"
    )
  currentUser: User @cypher(statement: """
    MATCH (u:User {id: $cypherParams.currentUserId})
    RETURN u
  """)
}

type Subscription {
  userOnline: User
}

related code in API server:

import { makeAugmentedSchema } from "neo4j-graphql-js";
import neo4j from "neo4j-driver";
import { typeDefs } from "./graphql-schema";

const schema = makeAugmentedSchema({
  typeDefs,
  //schemaDirectives: {
  //  isAuthenticated: IsAuthenticatedDirective,
  //  hasRole: HasRoleDirective,
  //  hasScope: HasScopeDirective,
  //},
});

const driver = neo4j.driver(
  process.env.NEO4J_URI || "bolt://localhost:7687",
  neo4j.auth.basic(
    process.env.NEO4J_USER || "neo4j",
    process.env.NEO4J_PASSWORD || "neo4j"
  )
);

const server = new ApolloServer({
  //mocks: true, // Dev only when not running neo4j
  context: ({ req }) => ({
    driver,
    cypherParams: {
      /* Inject the current user id in the context
      currentUserId: req.user ? req.user.id : null,
    },
  }),
  schema,
  introspection: true,
  playground: true,
  formatError: (err) => {
    console.log(err.stack);
    return err;
  },

apollo.config.js on server

module.exports = {
  service: {
    localSchemaFile: "./src/schema.graphql",
  },
};

apollo.config.js on client

module.exports = {
  client: {
    name: "Project [web]",
    service: {
      name: "project",
      localSchemaFile: "../api_server/src/schema.graphql",
    },
    excludes: ["**/__tests__/**/*"],
  },
};

Version apollo client

$ npx apollo --version
apollo/2.27.4 linux-x64 node-v14.3.0

Also using "@apollo/client": "3.0.0-beta.39", for the client app, but I guess it doesn't matter for this issue. API server apollo version: "apollo-server": "2.12.0",

AdrienLemaire commented 4 years ago

Following this apollo-tooling comment, I copied the following snippet found in test/helpers/configTestHelpers.js into my schema.graphql file:

directive @cypher(statement: String) on FIELD_DEFINITION
directive @relation(name: String, direction: _RelationDirections, from: String, to: String) on FIELD_DEFINITION | OBJECT
enum _RelationDirections {
  IN
  OUT
}

Now, I get types generated in __generated__ directories

$ npm run codegen

> project-client@2.0.1 codegen /home/dori/Projects/Work/project-v2/platform_v2/client
> apollo client:codegen --target typescript --watch

  ✔ Loading Apollo Project
  ✔ Generating query files with 'typescript' target - wrote 3 files
Press any key to stop.
[GraphQL error]: 406: Not Acceptable
Error: 406: Not Acceptable
    at ApolloEngineClient.loadSchemaTagsAndFieldStats (/home/dori/Projects/Work/project-v2/platform_v2/client/node_modules/apollo-language-server/lib/engine/index.js:181:19)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
    at async /home/dori/Projects/Work/project-v2/platform_v2/client/node_modules/apollo-language-server/lib/project/client.js:200:52
    at async OclifLoadingHandler.handle (/home/dori/Projects/Work/project-v2/platform_v2/client/node_modules/apollo/lib/OclifLoadingHandler.js:9:25)
    at async GraphQLClientProject.loadEngineData (/home/dori/Projects/Work/project-v2/platform_v2/client/node_modules/apollo-language-server/lib/project/client.js:198:9)
$ git status
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   ../api_server/src/schema.graphql

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        __generated__/
        src/__generated__/
        src/components/__generated__/

I don't understand what that last error is about though.

xavier-taylor commented 3 years ago

For anyone trying to autogenerate typescript types with neo4j-graphql, check out https://graphql-code-generator.com rather than apollo codegen. I just followed the below guide and was able to generate types for my neo4j-graphql project.

https://www.ouestware.com/2020/09/08/GRAND-stack-one-schema-to-rule-them-all/

michaeldgraham commented 3 years ago

https://github.com/neo4j-graphql/neo4j-graphql-js/issues/608