Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Move 'mergeSchemas' from 'merge' to 'schema'
  • Loading branch information
ardatan committed Aug 12, 2021
1 parent 4247b02 commit 67691b7
Show file tree
Hide file tree
Showing 20 changed files with 102 additions and 146 deletions.
9 changes: 9 additions & 0 deletions .changeset/short-ladybugs-develop.md
@@ -0,0 +1,9 @@
---
'@graphql-tools/merge': major
'@graphql-tools/schema': minor
---

Breaking Change;

Move `mergeSchemas` from `@graphql-tools/merge` to `@graphql-tools/schema` package to prevent circular dependency between them.

4 changes: 2 additions & 2 deletions packages/load/package.json
Expand Up @@ -35,8 +35,8 @@
},
"dependencies": {
"@graphql-tools/utils": "8.0.2",
"@graphql-tools/merge": "^7.0.0",
"import-from": "4.0.0",
"@graphql-tools/merge": "7.0.0",
"@graphql-tools/schema": "8.0.3",
"p-limit": "3.1.0",
"tslib": "~2.3.0"
},
Expand Down
3 changes: 1 addition & 2 deletions packages/load/src/load-typedefs.ts
Expand Up @@ -76,8 +76,7 @@ export function loadTypedefsSync<AdditionalConfig = Record<string, unknown>>(
): Source[] {
const { ignore, pointerOptionMap } = normalizePointers(pointerOrPointers);

options.ignore = asArray(options.ignore || []);
options.ignore.push(...ignore);
options.ignore = asArray(options.ignore || []).concat(ignore);

applyDefaultOptions<AdditionalConfig>(options);

Expand Down
13 changes: 6 additions & 7 deletions packages/load/src/schema.ts
@@ -1,7 +1,7 @@
import { loadTypedefs, LoadTypedefsOptions, UnnormalizedTypeDefPointer, loadTypedefsSync } from './load-typedefs';
import { GraphQLSchema, BuildSchemaOptions, DocumentNode, Source as GraphQLSource, print } from 'graphql';
import { OPERATION_KINDS } from './documents';
import { mergeSchemasAsync, mergeSchemas, MergeSchemasConfig } from '@graphql-tools/merge';
import { mergeSchemasAsync, mergeSchemas, MergeSchemasConfig } from '@graphql-tools/schema';
import { Source } from '@graphql-tools/utils';

export type LoadSchemaOptions = BuildSchemaOptions &
Expand All @@ -25,15 +25,15 @@ export async function loadSchema(
options: LoadSchemaOptions
): Promise<GraphQLSchema> {
const sources = await loadTypedefs(schemaPointers, {
filterKinds: OPERATION_KINDS,
...options,
filterKinds: OPERATION_KINDS,
});

const { schemas, typeDefs } = collectSchemasAndTypeDefs(sources);
const mergeSchemasOptions: MergeSchemasConfig = {
...options,
schemas,
typeDefs,
...options,
};

const schema = await mergeSchemasAsync(mergeSchemasOptions);
Expand All @@ -60,13 +60,12 @@ export function loadSchemaSync(
});

const { schemas, typeDefs } = collectSchemasAndTypeDefs(sources);
const mergeSchemasOptions: MergeSchemasConfig = {

const schema = mergeSchemas({
schemas,
typeDefs,
...options,
};

const schema = mergeSchemas(mergeSchemasOptions);
});

if (options?.includeSources) {
includeSources(schema, sources);
Expand Down
5 changes: 3 additions & 2 deletions packages/load/src/utils/custom-loader.ts
@@ -1,8 +1,9 @@
import importFrom from 'import-from';
import { createRequire } from 'module';

export function getCustomLoaderByPath(path: string, cwd: string) {
try {
const requiredModule: any = importFrom(cwd, path);
const requireFn = createRequire(cwd);
const requiredModule = requireFn(path);

if (requiredModule) {
if (requiredModule.default && typeof requiredModule.default === 'function') {
Expand Down
Expand Up @@ -3,14 +3,15 @@ import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader';
import { CodeFileLoader } from '@graphql-tools/code-file-loader';
import { runTests, useMonorepo } from '../../../../testing/utils';
import path from 'path';
import { inspect } from 'util';

const monorepo = useMonorepo({
dirname: __dirname
});

function assertNonMaybe<T>(input: T): asserts input is Exclude<T, null | undefined>{
if (input == null) {
throw new Error("Value should be neither null nor undefined.")
throw new Error(`Value should be neither null nor undefined. But received: ${inspect(input)}`)
}
}

Expand Down
4 changes: 0 additions & 4 deletions packages/loaders/code-file/package.json
Expand Up @@ -26,17 +26,13 @@
"typescript": {
"definition": "dist/index.d.ts"
},
"devDependencies": {
"@types/is-glob": "4.0.2"
},
"peerDependencies": {
"graphql": "^14.0.0 || ^15.0.0"
},
"dependencies": {
"@graphql-tools/utils": "8.0.2",
"@graphql-tools/graphql-tag-pluck": "^7.0.2",
"globby": "^11.0.3",
"is-glob": "^4.0.1",
"tslib": "~2.3.0",
"unixify": "^1.0.0"
},
Expand Down
1 change: 1 addition & 0 deletions packages/loaders/git/package.json
Expand Up @@ -38,6 +38,7 @@
"unixify": "^1.0.0"
},
"devDependencies": {
"@types/is-glob": "4.0.2",
"@types/micromatch": "4.0.1"
},
"publishConfig": {
Expand Down
4 changes: 0 additions & 4 deletions packages/loaders/graphql-file/package.json
Expand Up @@ -32,14 +32,10 @@
"buildOptions": {
"input": "./src/index.ts"
},
"devDependencies": {
"@types/is-glob": "4.0.2"
},
"dependencies": {
"@graphql-tools/import": "^6.2.6",
"@graphql-tools/utils": "8.0.2",
"globby": "^11.0.3",
"is-glob": "^4.0.1",
"unixify": "^1.0.0",
"tslib": "~2.3.0"
},
Expand Down
2 changes: 2 additions & 0 deletions packages/loaders/json-file/package.json
Expand Up @@ -31,6 +31,8 @@
},
"dependencies": {
"@graphql-tools/utils": "8.0.2",
"globby": "^11.0.3",
"unixify": "^1.0.0",
"tslib": "~2.3.0"
},
"publishConfig": {
Expand Down
1 change: 0 additions & 1 deletion packages/merge/package.json
Expand Up @@ -33,7 +33,6 @@
"input": "./src/index.ts"
},
"dependencies": {
"@graphql-tools/schema": "^8.0.3",
"@graphql-tools/utils": "8.0.2",
"tslib": "~2.3.0"
},
Expand Down
1 change: 0 additions & 1 deletion packages/merge/src/index.ts
@@ -1,4 +1,3 @@
export * from './merge-resolvers';
export * from './typedefs-mergers';
export * from './merge-schemas';
export * from './extensions';
112 changes: 0 additions & 112 deletions packages/merge/src/merge-schemas.ts

This file was deleted.

1 change: 1 addition & 0 deletions packages/schema/src/index.ts
Expand Up @@ -5,3 +5,4 @@ export { checkForResolveTypeResolver } from './checkForResolveTypeResolver';
export { extendResolversFromInterfaces } from './extendResolversFromInterfaces';
export * from './makeExecutableSchema';
export * from './types';
export * from './merge-schemas';
10 changes: 8 additions & 2 deletions packages/schema/src/makeExecutableSchema.ts
@@ -1,11 +1,11 @@
import { buildASTSchema, buildSchema, GraphQLSchema } from 'graphql';

import { pruneSchema } from '@graphql-tools/utils';
import { asArray, pruneSchema } from '@graphql-tools/utils';
import { addResolversToSchema } from './addResolversToSchema';

import { assertResolversPresent } from './assertResolversPresent';
import { IExecutableSchemaDefinition } from './types';
import { mergeResolvers, mergeTypeDefs } from '@graphql-tools/merge';
import { applyExtensions, mergeExtensions, mergeResolvers, mergeTypeDefs } from '@graphql-tools/merge';

/**
* Builds a schema from the provided type definitions and resolvers.
Expand Down Expand Up @@ -59,6 +59,7 @@ export function makeExecutableSchema<TContext = any>({
inheritResolversFromInterfaces = false,
pruningOptions,
updateResolversInPlace = false,
extensions,
}: IExecutableSchemaDefinition<TContext>) {
// Validate and clean up arguments
if (typeof resolverValidationOptions !== 'object') {
Expand Down Expand Up @@ -100,5 +101,10 @@ export function makeExecutableSchema<TContext = any>({
assertResolversPresent(schema, resolverValidationOptions);
}

if (extensions) {
extensions = mergeExtensions(asArray(extensions));
applyExtensions(schema, extensions);
}

return schema;
}
58 changes: 58 additions & 0 deletions packages/schema/src/merge-schemas.ts
@@ -0,0 +1,58 @@
import { GraphQLSchema } from 'graphql';
import { extractExtensionsFromSchema, SchemaExtensions } from '@graphql-tools/merge';
import { IResolvers, asArray, getResolversFromSchema } from '@graphql-tools/utils';
import { makeExecutableSchema } from './makeExecutableSchema';
import { IExecutableSchemaDefinition } from './types';

/**
* Configuration object for schema merging
*/
export type MergeSchemasConfig<T = any> = Partial<IExecutableSchemaDefinition<T>> &
IExecutableSchemaDefinition<T>['parseOptions'] & {
/**
* The schemas to be merged
*/
schemas?: GraphQLSchema[];
};

/**
* Synchronously merges multiple schemas, typeDefinitions and/or resolvers into a single schema.
* @param config Configuration object
*/
export function mergeSchemas(config: MergeSchemasConfig) {
const extractedResolvers: IResolvers<any, any>[] = [];
const extractedExtensions: SchemaExtensions[] = asArray(config.extensions || []);

const schemas = config.schemas || [];
for (const schema of config.schemas || []) {
extractedResolvers.push(getResolversFromSchema(schema));
extractedExtensions.push(extractExtensionsFromSchema(schema));
}

return makeExecutableSchema({
parseOptions: config,
...config,
typeDefs: asArray(config.typeDefs || []).concat(schemas),
resolvers: asArray(config.resolvers || []).concat(extractedResolvers),
extensions: asArray(config.extensions || []).concat(extractedExtensions),
});
}

/**
* Asynchronously merges multiple schemas, typeDefinitions and/or resolvers into a single schema.
* @param config Configuration object
*/
export async function mergeSchemasAsync(config: MergeSchemasConfig) {
const schemas = config.schemas || [];
const [extractedResolvers, extractedExtensions] = await Promise.all([
Promise.all(schemas.map(async schema => getResolversFromSchema(schema))),
Promise.all(schemas.map(async schema => extractExtensionsFromSchema(schema))),
]);

return makeExecutableSchema({
...config,
typeDefs: asArray(config.typeDefs || []).concat(config.schemas || []),
resolvers: asArray(config.resolvers || []).concat(extractedResolvers),
extensions: asArray(config.extensions || []).concat(extractedExtensions),
});
}

0 comments on commit 67691b7

Please sign in to comment.