Как добавить расширение локальной схемы @client в apollo-codegen - PullRequest
0 голосов
/ 12 мая 2018

Я использую apollo-link-state для добавления локального состояния , которое добавляет некоторые поля в корень запроса, и я предоставляю typeDef, который выглядит примерно так:

extend type Query {
    foo: String
}

Я также использую apollo-codegen для добавления аннотаций потока . Однако это расширение не применяется и возвращает ошибку:

.../src/components/Foo/Foo.js: Cannot query field "foo" on type "Query".

когда встречается запрос к расширенному полю:

query FooQuery {
    foo @client
}

Итак, мой вопрос: как мне сообщить apollo-codegen о клиентских расширениях?

1 Ответ

0 голосов
/ 13 мая 2018

ОК, поэтому в соответствии с эта проблема там еще не является встроенным способом. Вдохновленный сущностью zhenwenc , я написал быстрый скрипт для объединения схем сервера и клиента:

#!/usr/bin/env node

const fs = require("fs");
const path = require("path");

const { introspectionFromSchema } = require("graphql/utilities");
const { makeExecutableSchema } = require("graphql-tools");
const { fileLoader, mergeTypes } = require("merge-graphql-schemas");

// Make sure unhandled errors in async code are propagated correctly
process.on("uncaughtException", error => {
  console.error(error);
  process.exit(1);
});

process.on("unhandledRejection", error => {
  throw error;
});

async function introspectSchema(input, output) {
  const schemas = [].concat(...input.map(i => fileLoader(i)));
  const typeDefs = mergeTypes(schemas, {
    all: true
  });

  const schema = await makeExecutableSchema({
    typeDefs,
    resolverValidationOptions: { requireResolversForResolveType: false }
  });
  const introspection = await introspectionFromSchema(schema);
  const json = JSON.stringify(introspection, null, 2);
  fs.writeFileSync(output, json);
}

const input = [
  path.join(__dirname, "../data/*.graphql"),
  path.join(__dirname, "../src/*.graphql")
];

const output = path.join(__dirname, "../src/__generated__/schema.json");

// Generate an introspection JSON format from remote GraphQL server merging
// with any local GraphQL schemas
introspectSchema(input, output, true);

и вызовите его перед запуском codegen:

node scripts/merge.js && \
apollo-codegen generate src/components/**/*.js \
  --schema src/__generated__/schema.json \
  --target flow-modern \
  --add-typename \
  --use-flow-exact-objects false \
  --use-flow-read-only-types true

Обратите внимание, что это НЕ проверяет, что запросы к клиентской схеме используют директиву @client, которая была бы огромной привилегией первоклассной поддержки. Однако это, по крайней мере, сохранит работоспособность сгенерированных типов!

...