Как добавить расширение локальной схемы @client в apollo-codegen
Я использую apollo-link-состояние для добавления локального состояния, которое добавляет некоторые поля в корень запроса, и я предоставляю 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 ответ
Хорошо, так что в соответствии с этой проблемой еще нет встроенного способа. Вдохновленный сущностью 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
директива, которая была бы огромной привилегией первоклассной поддержки. Однако это, по крайней мере, сохранит сгенерированные типы работающими!