diff --git a/CHANGELOG.md b/CHANGELOG.md index 758e62425d7..7698f45bd12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,10 @@ ### Next -- Fix visitEnumValue to allow modifying the enum value
+- Fix visitEnumValue to allow modifying the enum value
[@danielrearden](https://github.com/danielrearden) in [#1003](https://github.com/ardatan/graphql-tools/pull/1391) +- Export `generateProxyingResolvers` from `@graphql-tools/wrap`. +- Fix `stitchSchemas` from `@graphql-tools/stitch` from the case there the typeDefs array is empty. [#1575](https://github.com/ardatan/graphql-tools/pull/1575) ### 5.0.0 diff --git a/package.json b/package.json index a0c3def7551..8e79da79e68 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "graphql-tools-monorepo", - "version": "6.0.5", + "version": "6.0.6", "description": "Useful tools to create and manipulate GraphQL schemas.", "private": true, "scripts": { @@ -43,8 +43,8 @@ "jest": "26.0.1", "ts-jest": "26.1.0", "typescript": "3.9.3", - "@typescript-eslint/eslint-plugin": "3.0.2", - "@typescript-eslint/parser": "3.0.2", + "@typescript-eslint/eslint-plugin": "3.1.0", + "@typescript-eslint/parser": "3.1.0", "bob-the-bundler": "1.0.2", "eslint": "7.1.0", "eslint-config-prettier": "6.11.0", diff --git a/packages/delegate/package.json b/packages/delegate/package.json index fa7605f294e..51682edadd0 100644 --- a/packages/delegate/package.json +++ b/packages/delegate/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/delegate", - "version": "6.0.5", + "version": "6.0.6", "description": "A set of utils for faster development of GraphQL tools", "repository": "git@github.com:ardatan/graphql-tools.git", "license": "MIT", @@ -18,8 +18,8 @@ "input": "./src/index.ts" }, "dependencies": { - "@graphql-tools/schema": "6.0.5", - "@graphql-tools/utils": "6.0.5", + "@graphql-tools/schema": "6.0.6", + "@graphql-tools/utils": "6.0.6", "tslib": "~2.0.0" }, "publishConfig": { diff --git a/packages/delegate/src/results/handleNull.ts b/packages/delegate/src/results/handleNull.ts index cfea57daf00..791682fc674 100644 --- a/packages/delegate/src/results/handleNull.ts +++ b/packages/delegate/src/results/handleNull.ts @@ -1,6 +1,6 @@ import { GraphQLError } from 'graphql'; -import { getErrorsByPathSegment, CombinedError } from '@graphql-tools/utils'; +import { getErrorsByPathSegment, CombinedError, relocatedError } from '@graphql-tools/utils'; export function handleNull(errors: ReadonlyArray) { if (errors.length) { @@ -10,7 +10,7 @@ export function handleNull(errors: ReadonlyArray) { return combinedError; } const error = errors[0]; - return error.originalError || error; + return error.originalError || relocatedError(error, null); } else if (errors.some(error => typeof error.path[1] === 'string')) { const childErrors = getErrorsByPathSegment(errors); diff --git a/packages/graphql-tag-pluck/package.json b/packages/graphql-tag-pluck/package.json index a888caf981c..d4144c51848 100644 --- a/packages/graphql-tag-pluck/package.json +++ b/packages/graphql-tag-pluck/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/graphql-tag-pluck", - "version": "6.0.5", + "version": "6.0.6", "description": "Pluck graphql-tag template literals", "license": "MIT", "repository": "git@github.com:ardatan/graphql-tools.git", @@ -18,13 +18,13 @@ "@babel/parser": "7.10.2", "@babel/traverse": "7.10.1", "@babel/types": "7.10.2", - "@graphql-tools/utils": "6.0.5" + "@graphql-tools/utils": "6.0.6" }, "optionalDependencies": { "vue-template-compiler": "^2.6.11" }, "devDependencies": { - "@types/babel__traverse": "7.0.11", + "@types/babel__traverse": "7.0.12", "vue-template-compiler": "2.6.11" }, "publishConfig": { diff --git a/packages/graphql-tools/package.json b/packages/graphql-tools/package.json index 86bdcbf1e55..2815842a9d7 100644 --- a/packages/graphql-tools/package.json +++ b/packages/graphql-tools/package.json @@ -1,6 +1,6 @@ { "name": "graphql-tools", - "version": "6.0.5", + "version": "6.0.6", "description": "Useful tools to create and manipulate GraphQL schemas.", "repository": "git@github.com:ardatan/graphql-tools.git", "license": "MIT", @@ -19,26 +19,26 @@ "directory": "dist" }, "dependencies": { - "@graphql-tools/delegate": "6.0.5", - "@graphql-tools/graphql-tag-pluck": "6.0.5", - "@graphql-tools/import": "6.0.5", - "@graphql-tools/links": "6.0.5", - "@graphql-tools/load": "6.0.5", - "@graphql-tools/code-file-loader": "6.0.5", - "@graphql-tools/git-loader": "6.0.5", - "@graphql-tools/github-loader": "6.0.5", - "@graphql-tools/graphql-file-loader": "6.0.5", - "@graphql-tools/json-file-loader": "6.0.5", - "@graphql-tools/module-loader": "6.0.5", - "@graphql-tools/url-loader": "6.0.5", - "@graphql-tools/load-files": "6.0.5", - "@graphql-tools/merge": "6.0.5", - "@graphql-tools/mock": "6.0.5", - "@graphql-tools/relay-operation-optimizer": "6.0.5", - "@graphql-tools/resolvers-composition": "6.0.5", - "@graphql-tools/schema": "6.0.5", - "@graphql-tools/stitch": "6.0.5", - "@graphql-tools/utils": "6.0.5", - "@graphql-tools/wrap": "6.0.5" + "@graphql-tools/delegate": "6.0.6", + "@graphql-tools/graphql-tag-pluck": "6.0.6", + "@graphql-tools/import": "6.0.6", + "@graphql-tools/links": "6.0.6", + "@graphql-tools/load": "6.0.6", + "@graphql-tools/code-file-loader": "6.0.6", + "@graphql-tools/git-loader": "6.0.6", + "@graphql-tools/github-loader": "6.0.6", + "@graphql-tools/graphql-file-loader": "6.0.6", + "@graphql-tools/json-file-loader": "6.0.6", + "@graphql-tools/module-loader": "6.0.6", + "@graphql-tools/url-loader": "6.0.6", + "@graphql-tools/load-files": "6.0.6", + "@graphql-tools/merge": "6.0.6", + "@graphql-tools/mock": "6.0.6", + "@graphql-tools/relay-operation-optimizer": "6.0.6", + "@graphql-tools/resolvers-composition": "6.0.6", + "@graphql-tools/schema": "6.0.6", + "@graphql-tools/stitch": "6.0.6", + "@graphql-tools/utils": "6.0.6", + "@graphql-tools/wrap": "6.0.6" } } \ No newline at end of file diff --git a/packages/import/package.json b/packages/import/package.json index 3b2ab46f77b..e78aff952e5 100644 --- a/packages/import/package.json +++ b/packages/import/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/import", - "version": "6.0.5", + "version": "6.0.6", "description": "A set of utils for faster development of GraphQL tools", "repository": "git@github.com:ardatan/graphql-tools.git", "author": "Dotan Simha ", diff --git a/packages/import/src/index.ts b/packages/import/src/index.ts index 892c5e55ccc..bcf814c3dd4 100644 --- a/packages/import/src/index.ts +++ b/packages/import/src/index.ts @@ -31,6 +31,8 @@ import { SchemaDefinitionNode, OperationTypeDefinitionNode, DocumentNode, + ScalarTypeDefinitionNode, + ScalarTypeExtensionNode, } from 'graphql'; import { readFileSync, realpathSync } from 'fs-extra'; import { dirname, join, isAbsolute } from 'path'; @@ -138,6 +140,12 @@ function visitFile( case Kind.DIRECTIVE_DEFINITION: visitDirectiveDefinitionNode(definition, dependencySet, dependenciesByDefinitionName); break; + case Kind.SCALAR_TYPE_DEFINITION: + visitScalarDefinitionNode(definition, dependencySet); + break; + case Kind.SCHEMA_DEFINITION: + visitSchemaDefinitionNode(definition, dependencySet); + break; case Kind.OBJECT_TYPE_EXTENSION: visitObjectTypeExtensionNode(definition, dependencySet, dependenciesByDefinitionName); break; @@ -153,8 +161,8 @@ function visitFile( case Kind.INPUT_OBJECT_TYPE_EXTENSION: visitInputObjectTypeExtensionNode(definition, dependencySet, dependenciesByDefinitionName); break; - case Kind.SCHEMA_DEFINITION: - visitSchemaDefinitionNode(definition, dependencySet); + case Kind.SCALAR_TYPE_EXTENSION: + visitScalarExtensionNode(definition, dependencySet); break; } if ('fields' in definition) { @@ -365,11 +373,11 @@ function visitObjectTypeDefinitionNode( ) { const typeName = node.name.value; dependencySet.add(typeName); - node.directives.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); - node.fields.forEach(fieldDefinitionNode => + node.directives?.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); + node.fields?.forEach(fieldDefinitionNode => visitFieldDefinitionNode(fieldDefinitionNode, dependencySet, dependenciesByDefinitionName) ); - node.interfaces.forEach(namedTypeNode => { + node.interfaces?.forEach(namedTypeNode => { visitNamedTypeNode(namedTypeNode, dependencySet); const interfaceName = namedTypeNode.name.value; // interface should be dependent to the type as well @@ -392,10 +400,10 @@ function visitFieldDefinitionNode( dependencySet: Set, dependenciesByDefinitionName: Map> ) { - node.arguments.forEach(inputValueDefinitionNode => + node.arguments?.forEach(inputValueDefinitionNode => visitInputValueDefinitionNode(inputValueDefinitionNode, dependencySet, dependenciesByDefinitionName) ); - node.directives.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); + node.directives?.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); visitTypeNode(node.type, dependencySet, dependenciesByDefinitionName); } @@ -445,7 +453,7 @@ function visitInputValueDefinitionNode( dependencySet: Set, dependenciesByDefinitionName: Map> ) { - node.directives.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); + node.directives?.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); visitTypeNode(node.type, dependencySet, dependenciesByDefinitionName); } @@ -456,8 +464,8 @@ function visitInterfaceTypeDefinitionNode( ) { const typeName = node.name.value; dependencySet.add(typeName); - node.directives.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); - node.fields.forEach(fieldDefinitionNode => + node.directives?.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); + node.fields?.forEach(fieldDefinitionNode => visitFieldDefinitionNode(fieldDefinitionNode, dependencySet, dependenciesByDefinitionName) ); (node as any).interfaces?.forEach((namedTypeNode: NamedTypeNode) => { @@ -473,13 +481,13 @@ function visitInterfaceTypeDefinitionNode( function visitUnionTypeDefinitionNode(node: UnionTypeDefinitionNode, dependencySet: Set) { dependencySet.add(node.name.value); - node.directives.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); + node.directives?.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); node.types.forEach(namedTypeNode => visitNamedTypeNode(namedTypeNode, dependencySet)); } function visitEnumTypeDefinitionNode(node: EnumTypeDefinitionNode, dependencySet: Set) { dependencySet.add(node.name.value); - node.directives.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); + node.directives?.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); } function visitInputObjectTypeDefinitionNode( @@ -488,8 +496,8 @@ function visitInputObjectTypeDefinitionNode( dependenciesByDefinitionName: Map> ) { dependencySet.add(node.name.value); - node.directives.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); - node.fields.forEach(inputValueDefinitionNode => + node.directives?.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); + node.fields?.forEach(inputValueDefinitionNode => visitInputValueDefinitionNode(inputValueDefinitionNode, dependencySet, dependenciesByDefinitionName) ); } @@ -500,7 +508,7 @@ function visitDirectiveDefinitionNode( dependenciesByDefinitionName: Map> ) { dependencySet.add(node.name.value); - node.arguments.forEach(inputValueDefinitionNode => + node.arguments?.forEach(inputValueDefinitionNode => visitInputValueDefinitionNode(inputValueDefinitionNode, dependencySet, dependenciesByDefinitionName) ); } @@ -512,11 +520,11 @@ function visitObjectTypeExtensionNode( ) { const typeName = node.name.value; dependencySet.add(typeName); - node.directives.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); - node.fields.forEach(fieldDefinitionNode => + node.directives?.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); + node.fields?.forEach(fieldDefinitionNode => visitFieldDefinitionNode(fieldDefinitionNode, dependencySet, dependenciesByDefinitionName) ); - node.interfaces.forEach(namedTypeNode => { + node.interfaces?.forEach(namedTypeNode => { visitNamedTypeNode(namedTypeNode, dependencySet); const interfaceName = namedTypeNode.name.value; // interface should be dependent to the type as well @@ -534,8 +542,8 @@ function visitInterfaceTypeExtensionNode( ) { const typeName = node.name.value; dependencySet.add(typeName); - node.directives.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); - node.fields.forEach(fieldDefinitionNode => + node.directives?.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); + node.fields?.forEach(fieldDefinitionNode => visitFieldDefinitionNode(fieldDefinitionNode, dependencySet, dependenciesByDefinitionName) ); (node as any).interfaces?.forEach((namedTypeNode: NamedTypeNode) => { @@ -551,13 +559,13 @@ function visitInterfaceTypeExtensionNode( function visitUnionTypeExtensionNode(node: UnionTypeExtensionNode, dependencySet: Set) { dependencySet.add(node.name.value); - node.directives.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); + node.directives?.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); node.types.forEach(namedTypeNode => visitNamedTypeNode(namedTypeNode, dependencySet)); } function visitEnumTypeExtensionNode(node: EnumTypeExtensionNode, dependencySet: Set) { dependencySet.add(node.name.value); - node.directives.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); + node.directives?.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); } function visitInputObjectTypeExtensionNode( @@ -566,20 +574,30 @@ function visitInputObjectTypeExtensionNode( dependenciesByDefinitionName: Map> ) { dependencySet.add(node.name.value); - node.directives.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); - node.fields.forEach(inputValueDefinitionNode => + node.directives?.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); + node.fields?.forEach(inputValueDefinitionNode => visitInputValueDefinitionNode(inputValueDefinitionNode, dependencySet, dependenciesByDefinitionName) ); } function visitSchemaDefinitionNode(node: SchemaDefinitionNode, dependencySet: Set) { dependencySet.add('schema'); - node.directives.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); + node.directives?.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); node.operationTypes.forEach(operationTypeDefinitionNode => visitOperationTypeDefinitionNode(operationTypeDefinitionNode, dependencySet) ); } +function visitScalarDefinitionNode(node: ScalarTypeDefinitionNode, dependencySet: Set) { + dependencySet.add(node.name.value); + node.directives?.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); +} + +function visitScalarExtensionNode(node: ScalarTypeExtensionNode, dependencySet: Set) { + dependencySet.add(node.name.value); + node.directives?.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet)); +} + function visitOperationTypeDefinitionNode(node: OperationTypeDefinitionNode, dependencySet: Set) { visitNamedTypeNode(node.type, dependencySet); } diff --git a/packages/import/tests/schema/fixtures/mix-n-match/a.graphql b/packages/import/tests/schema/fixtures/mix-n-match/a.graphql index 9cec6fbf524..a296d31f608 100644 --- a/packages/import/tests/schema/fixtures/mix-n-match/a.graphql +++ b/packages/import/tests/schema/fixtures/mix-n-match/a.graphql @@ -4,4 +4,5 @@ type A { first: String second: Float b: B + date: Date } diff --git a/packages/import/tests/schema/fixtures/mix-n-match/b.graphql b/packages/import/tests/schema/fixtures/mix-n-match/b.graphql index d1072a528eb..d167a24e90f 100644 --- a/packages/import/tests/schema/fixtures/mix-n-match/b.graphql +++ b/packages/import/tests/schema/fixtures/mix-n-match/b.graphql @@ -1,4 +1,5 @@ # import C1, C2 from '../import-all/c.graphql' +scalar Date type B { hello: String! c1: C1 diff --git a/packages/import/tests/schema/import-schema.spec.ts b/packages/import/tests/schema/import-schema.spec.ts index 4ed3ac5aaef..bbddb4141d0 100644 --- a/packages/import/tests/schema/import-schema.spec.ts +++ b/packages/import/tests/schema/import-schema.spec.ts @@ -6,7 +6,7 @@ import { Kind, print } from 'graphql'; const importSchema = (schema: string, schemas?: Record) => { const document = processImport(schema, __dirname, schemas); - return print(mergeTypeDefs(document.definitions.map(definition => ({ kind: Kind.DOCUMENT, definitions: [definition]})), { + return print(mergeTypeDefs(document.definitions.map(definition => ({ kind: Kind.DOCUMENT, definitions: [definition] })), { sort: true, useSchemaDefinition: false, })) @@ -290,10 +290,13 @@ describe('importSchema', () => { test(`importSchema: import all mix 'n match`, () => { const expectedSDL = /* GraphQL */`\ + scalar Date + type A { first: String second: Float b: B + date: Date } type C1 { diff --git a/packages/links/package.json b/packages/links/package.json index 9354c4e28de..33e54f9b0c4 100644 --- a/packages/links/package.json +++ b/packages/links/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/links", - "version": "6.0.5", + "version": "6.0.6", "description": "A set of utils for faster development of GraphQL tools", "repository": "git@github.com:ardatan/graphql-tools.git", "license": "MIT", @@ -23,7 +23,7 @@ "graphql-upload": "11.0.0" }, "dependencies": { - "@graphql-tools/utils": "6.0.5", + "@graphql-tools/utils": "6.0.6", "apollo-link": "1.2.14", "apollo-upload-client": "13.0.0", "form-data": "3.0.0", diff --git a/packages/load-files/package.json b/packages/load-files/package.json index 3776480a490..dd16436e8bc 100644 --- a/packages/load-files/package.json +++ b/packages/load-files/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/load-files", - "version": "6.0.5", + "version": "6.0.6", "description": "A set of utils for faster development of GraphQL tools", "repository": "git@github.com:ardatan/graphql-tools.git", "author": "Dotan Simha ", @@ -16,7 +16,7 @@ "graphql": "^14.0.0 || ^15.0.0" }, "dependencies": { - "globby": "11.0.0", + "globby": "11.0.1", "unixify": "1.0.0", "fs-extra": "9.0.0" }, diff --git a/packages/load/package.json b/packages/load/package.json index 64d567428b3..92d52f0e1b5 100644 --- a/packages/load/package.json +++ b/packages/load/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/load", - "version": "6.0.5", + "version": "6.0.6", "description": "A set of utils for faster development of GraphQL tools", "repository": "git@github.com:ardatan/graphql-tools.git", "author": "Dotan Simha ", @@ -22,9 +22,9 @@ "graphql-type-json": "0.3.1" }, "dependencies": { - "@graphql-tools/utils": "6.0.5", - "@graphql-tools/merge": "6.0.5", - "globby": "11.0.0", + "@graphql-tools/utils": "6.0.6", + "@graphql-tools/merge": "6.0.6", + "globby": "11.0.1", "import-from": "3.0.0", "is-glob": "4.0.1", "p-limit": "2.3.0", diff --git a/packages/load/src/load-typedefs.ts b/packages/load/src/load-typedefs.ts index f7e1cba63ce..17c1a004770 100644 --- a/packages/load/src/load-typedefs.ts +++ b/packages/load/src/load-typedefs.ts @@ -14,8 +14,6 @@ export type LoadTypedefsOptions = SingleFi filterKinds?: string[]; ignore?: string | string[]; sort?: boolean; - skipGraphQLImport?: boolean; - forceGraphQLImport?: boolean; }; export type UnnormalizedTypeDefPointer = { [key: string]: any } | string; diff --git a/packages/loaders/apollo-engine/package.json b/packages/loaders/apollo-engine/package.json index b733e171bd4..f5891cfc8d9 100644 --- a/packages/loaders/apollo-engine/package.json +++ b/packages/loaders/apollo-engine/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/apollo-engine-loader", - "version": "6.0.5", + "version": "6.0.6", "description": "A set of utils for faster development of GraphQL tools", "repository": "git@github.com:ardatan/graphql-tools.git", "author": "Dotan Simha ", @@ -16,7 +16,7 @@ "graphql": "^14.0.0 || ^15.0.0" }, "dependencies": { - "@graphql-tools/utils": "6.0.5", + "@graphql-tools/utils": "6.0.6", "cross-fetch": "3.0.4", "tslib": "~2.0.0" }, diff --git a/packages/loaders/code-file/package.json b/packages/loaders/code-file/package.json index c74b9fdcb12..9113ad83660 100644 --- a/packages/loaders/code-file/package.json +++ b/packages/loaders/code-file/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/code-file-loader", - "version": "6.0.5", + "version": "6.0.6", "description": "A set of utils for faster development of GraphQL tools", "repository": "git@github.com:ardatan/graphql-tools.git", "author": "Dotan Simha ", @@ -16,8 +16,8 @@ "graphql": "^14.0.0 || ^15.0.0" }, "dependencies": { - "@graphql-tools/utils": "6.0.5", - "@graphql-tools/graphql-tag-pluck": "6.0.5", + "@graphql-tools/utils": "6.0.6", + "@graphql-tools/graphql-tag-pluck": "6.0.6", "fs-extra": "9.0.0", "tslib": "~2.0.0" }, diff --git a/packages/loaders/code-file/src/index.ts b/packages/loaders/code-file/src/index.ts index 65125a5e658..8e9f6557d27 100644 --- a/packages/loaders/code-file/src/index.ts +++ b/packages/loaders/code-file/src/index.ts @@ -18,13 +18,14 @@ import { } from '@graphql-tools/graphql-tag-pluck'; import { tryToLoadFromExport, tryToLoadFromExportSync } from './load-from-module'; import { isAbsolute, resolve } from 'path'; -import { exists, existsSync, readFileSync, readFile } from 'fs-extra'; +import { readFileSync, readFile, pathExists, pathExistsSync } from 'fs-extra'; import { cwd } from 'process'; export type CodeFileLoaderOptions = { require?: string | string[]; pluckConfig?: GraphQLTagPluckOptions; noPluck?: boolean; + noRequire?: boolean; } & SingleFileOptions; const FILE_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.vue']; @@ -41,7 +42,7 @@ export class CodeFileLoader implements UniversalLoader { if (isValidPath(pointer)) { if (FILE_EXTENSIONS.find(extension => pointer.endsWith(extension))) { const normalizedFilePath = isAbsolute(pointer) ? pointer : resolve(options.cwd || cwd(), pointer); - return new Promise(resolve => exists(normalizedFilePath, resolve)); + return pathExists(normalizedFilePath); } } @@ -52,9 +53,7 @@ export class CodeFileLoader implements UniversalLoader { if (isValidPath(pointer)) { if (FILE_EXTENSIONS.find(extension => pointer.endsWith(extension))) { const normalizedFilePath = isAbsolute(pointer) ? pointer : resolve(options.cwd || cwd(), pointer); - if (existsSync(normalizedFilePath)) { - return true; - } + return pathExistsSync(normalizedFilePath); } } diff --git a/packages/loaders/git/package.json b/packages/loaders/git/package.json index 9a799f1a2d6..6c9c413a918 100644 --- a/packages/loaders/git/package.json +++ b/packages/loaders/git/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/git-loader", - "version": "6.0.5", + "version": "6.0.6", "description": "A set of utils for faster development of GraphQL tools", "repository": "git@github.com:ardatan/graphql-tools.git", "author": "Dotan Simha ", @@ -16,8 +16,8 @@ "graphql": "^14.0.0 || ^15.0.0" }, "dependencies": { - "@graphql-tools/utils": "6.0.5", - "@graphql-tools/graphql-tag-pluck": "6.0.5", + "@graphql-tools/utils": "6.0.6", + "@graphql-tools/graphql-tag-pluck": "6.0.6", "simple-git": "2.5.0" }, "buildOptions": { diff --git a/packages/loaders/github/package.json b/packages/loaders/github/package.json index 6a44cf9b877..ae3a61ac004 100644 --- a/packages/loaders/github/package.json +++ b/packages/loaders/github/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/github-loader", - "version": "6.0.5", + "version": "6.0.6", "description": "A set of utils for faster development of GraphQL tools", "repository": "git@github.com:ardatan/graphql-tools.git", "author": "Dotan Simha ", @@ -16,8 +16,8 @@ "graphql": "^14.0.0 || ^15.0.0" }, "dependencies": { - "@graphql-tools/utils": "6.0.5", - "@graphql-tools/graphql-tag-pluck": "6.0.5", + "@graphql-tools/utils": "6.0.6", + "@graphql-tools/graphql-tag-pluck": "6.0.6", "cross-fetch": "3.0.4" }, "publishConfig": { diff --git a/packages/loaders/graphql-file/package.json b/packages/loaders/graphql-file/package.json index 9d3f821e9aa..9a08b125c12 100644 --- a/packages/loaders/graphql-file/package.json +++ b/packages/loaders/graphql-file/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/graphql-file-loader", - "version": "6.0.5", + "version": "6.0.6", "description": "A set of utils for faster development of GraphQL tools", "repository": "git@github.com:ardatan/graphql-tools.git", "author": "Dotan Simha ", @@ -19,8 +19,8 @@ "input": "./src/index.ts" }, "dependencies": { - "@graphql-tools/import": "6.0.5", - "@graphql-tools/utils": "6.0.5", + "@graphql-tools/import": "6.0.6", + "@graphql-tools/utils": "6.0.6", "fs-extra": "9.0.0", "tslib": "~2.0.0" }, diff --git a/packages/loaders/graphql-file/src/index.ts b/packages/loaders/graphql-file/src/index.ts index f574b0f7df1..d2ce34312ec 100644 --- a/packages/loaders/graphql-file/src/index.ts +++ b/packages/loaders/graphql-file/src/index.ts @@ -8,13 +8,15 @@ import { SingleFileOptions, } from '@graphql-tools/utils'; import { isAbsolute, resolve } from 'path'; -import { exists, existsSync, readFile, readFileSync } from 'fs-extra'; +import { readFile, readFileSync, pathExists, pathExistsSync } from 'fs-extra'; import { cwd as processCwd } from 'process'; import { processImport } from '@graphql-tools/import'; const FILE_EXTENSIONS = ['.gql', '.gqls', '.graphql', '.graphqls']; -export interface GraphQLFileLoaderOptions extends SingleFileOptions {} +export interface GraphQLFileLoaderOptions extends SingleFileOptions { + skipGraphQLImport?: boolean; +} function isGraphQLImportFile(rawSDL: string) { const trimmedRawSDL = rawSDL.trim(); @@ -33,7 +35,7 @@ export class GraphQLFileLoader implements UniversalLoader pointer.endsWith(extension))) { const normalizedFilePath = isAbsolute(pointer) ? pointer : resolve(options.cwd, pointer); - return new Promise(resolve => exists(normalizedFilePath, resolve)); + return pathExists(normalizedFilePath); } } @@ -44,7 +46,7 @@ export class GraphQLFileLoader implements UniversalLoader pointer.endsWith(extension))) { const normalizedFilePath = isAbsolute(pointer) ? pointer : resolve(options.cwd, pointer); - return existsSync(normalizedFilePath); + return pathExistsSync(normalizedFilePath); } } @@ -55,21 +57,18 @@ export class GraphQLFileLoader implements UniversalLoader", @@ -16,7 +16,7 @@ "graphql": "^14.0.0 || ^15.0.0" }, "dependencies": { - "@graphql-tools/utils": "6.0.5", + "@graphql-tools/utils": "6.0.6", "fs-extra": "9.0.0", "tslib": "~2.0.0" }, diff --git a/packages/loaders/json-file/src/index.ts b/packages/loaders/json-file/src/index.ts index 94253a5f768..f9adb7562fb 100644 --- a/packages/loaders/json-file/src/index.ts +++ b/packages/loaders/json-file/src/index.ts @@ -7,7 +7,7 @@ import { SingleFileOptions, } from '@graphql-tools/utils'; import { isAbsolute, resolve } from 'path'; -import { exists, existsSync, readFile, readFileSync } from 'fs-extra'; +import { readFile, readFileSync, pathExists, pathExistsSync } from 'fs-extra'; import { cwd } from 'process'; const FILE_EXTENSIONS = ['.json']; @@ -23,7 +23,7 @@ export class JsonFileLoader implements DocumentLoader { if (isValidPath(pointer)) { if (FILE_EXTENSIONS.find(extension => pointer.endsWith(extension))) { const normalizedFilePath = isAbsolute(pointer) ? pointer : resolve(options.cwd || cwd(), pointer); - return new Promise(resolve => exists(normalizedFilePath, resolve)); + return pathExists(normalizedFilePath); } } @@ -35,9 +35,7 @@ export class JsonFileLoader implements DocumentLoader { if (FILE_EXTENSIONS.find(extension => pointer.endsWith(extension))) { const normalizedFilePath = isAbsolute(pointer) ? pointer : resolve(options.cwd || cwd(), pointer); - if (existsSync(normalizedFilePath)) { - return true; - } + return pathExistsSync(normalizedFilePath); } } diff --git a/packages/loaders/module/package.json b/packages/loaders/module/package.json index f5708426201..b077892ad76 100644 --- a/packages/loaders/module/package.json +++ b/packages/loaders/module/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/module-loader", - "version": "6.0.5", + "version": "6.0.6", "description": "A set of utils for faster development of GraphQL tools", "repository": "git@github.com:ardatan/graphql-tools.git", "author": "Dotan Simha ", @@ -16,7 +16,7 @@ "graphql": "^14.0.0 || ^15.0.0" }, "dependencies": { - "@graphql-tools/utils": "6.0.5", + "@graphql-tools/utils": "6.0.6", "tslib": "~2.0.0" }, "publishConfig": { diff --git a/packages/loaders/prisma/package.json b/packages/loaders/prisma/package.json index ac5ad7ef6c5..6cc5f9e2e0b 100644 --- a/packages/loaders/prisma/package.json +++ b/packages/loaders/prisma/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/prisma-loader", - "version": "6.0.5", + "version": "6.0.6", "description": "A set of utils for faster development of GraphQL tools", "repository": "git@github.com:ardatan/graphql-tools.git", "author": "Dotan Simha ", @@ -16,8 +16,8 @@ "graphql": "^14.0.0 || ^15.0.0" }, "dependencies": { - "@graphql-tools/utils": "6.0.5", - "@graphql-tools/url-loader": "6.0.5", + "@graphql-tools/utils": "6.0.6", + "@graphql-tools/url-loader": "6.0.6", "fs-extra": "9.0.0", "prisma-yml": "1.34.10", "tslib": "~2.0.0" diff --git a/packages/loaders/prisma/src/index.ts b/packages/loaders/prisma/src/index.ts index 005db105b4c..862079d8248 100644 --- a/packages/loaders/prisma/src/index.ts +++ b/packages/loaders/prisma/src/index.ts @@ -1,7 +1,7 @@ import { UrlLoader, LoadFromUrlOptions } from '@graphql-tools/url-loader'; import { PrismaDefinitionClass, Environment } from 'prisma-yml'; import { join } from 'path'; -import { exists } from 'fs-extra'; +import { pathExists } from 'fs-extra'; import { homedir } from 'os'; import { cwd } from 'process'; @@ -19,7 +19,7 @@ export class PrismaLoader extends UrlLoader { async canLoad(prismaConfigFilePath: string, options: PrismaLoaderOptions): Promise { if (typeof prismaConfigFilePath === 'string' && prismaConfigFilePath.endsWith('prisma.yml')) { const joinedYmlPath = join(options.cwd || cwd(), prismaConfigFilePath); - return new Promise(resolve => exists(joinedYmlPath, resolve)); + return pathExists(joinedYmlPath); } return false; } diff --git a/packages/loaders/url/package.json b/packages/loaders/url/package.json index 69dc466c9ca..8010046ebe6 100644 --- a/packages/loaders/url/package.json +++ b/packages/loaders/url/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/url-loader", - "version": "6.0.5", + "version": "6.0.6", "description": "A set of utils for faster development of GraphQL tools", "repository": "git@github.com:ardatan/graphql-tools.git", "author": "Dotan Simha ", @@ -23,8 +23,8 @@ "supertest": "4.0.2" }, "dependencies": { - "@graphql-tools/wrap": "6.0.5", - "@graphql-tools/utils": "6.0.5", + "@graphql-tools/wrap": "6.0.6", + "@graphql-tools/utils": "6.0.6", "@types/websocket": "1.0.0", "cross-fetch": "3.0.4", "tslib": "~2.0.0", diff --git a/packages/merge/package.json b/packages/merge/package.json index 3226a5945f1..a63f359b6eb 100644 --- a/packages/merge/package.json +++ b/packages/merge/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/merge", - "version": "6.0.5", + "version": "6.0.6", "description": "A set of utils for faster development of GraphQL tools", "repository": "git@github.com:ardatan/graphql-tools.git", "author": "Dotan Simha ", @@ -19,8 +19,8 @@ "input": "./src/index.ts" }, "dependencies": { - "@graphql-tools/schema": "6.0.5", - "@graphql-tools/utils": "6.0.5", + "@graphql-tools/schema": "6.0.6", + "@graphql-tools/utils": "6.0.6", "tslib": "~2.0.0" }, "publishConfig": { diff --git a/packages/mock/package.json b/packages/mock/package.json index 585df51c99a..e270e66bacd 100644 --- a/packages/mock/package.json +++ b/packages/mock/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/mock", - "version": "6.0.5", + "version": "6.0.6", "description": "A set of utils for faster development of GraphQL tools", "repository": "git@github.com:ardatan/graphql-tools.git", "license": "MIT", @@ -18,8 +18,8 @@ "input": "./src/index.ts" }, "dependencies": { - "@graphql-tools/schema": "6.0.5", - "@graphql-tools/utils": "6.0.5", + "@graphql-tools/schema": "6.0.6", + "@graphql-tools/utils": "6.0.6", "tslib": "~2.0.0" }, "devDependencies": { diff --git a/packages/node-require/package.json b/packages/node-require/package.json new file mode 100644 index 00000000000..55e288a40fc --- /dev/null +++ b/packages/node-require/package.json @@ -0,0 +1,29 @@ +{ + "name": "@graphql-tools/node-require", + "version": "6.0.5", + "description": "A set of utils for faster development of GraphQL tools", + "repository": "git@github.com:ardatan/graphql-tools.git", + "license": "MIT", + "sideEffects": false, + "main": "dist/index.cjs.js", + "module": "dist/index.esm.js", + "typings": "dist/index.d.ts", + "typescript": { + "definition": "dist/index.d.ts" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0" + }, + "buildOptions": { + "input": "./src/index.ts" + }, + "dependencies": { + "@graphql-tools/load": "6.0.5", + "@graphql-tools/graphql-file-loader": "6.0.5", + "tslib": "~2.0.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist" + } +} diff --git a/packages/node-require/src/declarations.d.ts b/packages/node-require/src/declarations.d.ts new file mode 100644 index 00000000000..5e21ef929d0 --- /dev/null +++ b/packages/node-require/src/declarations.d.ts @@ -0,0 +1,28 @@ +/* eslint-disable import/no-duplicates */ +declare module '*.graphql' { + import { DocumentNode } from 'graphql'; + + const value: DocumentNode; + export = value; +} + +declare module '*.gql' { + import { DocumentNode } from 'graphql'; + + const value: DocumentNode; + export = value; +} + +declare module '*.gqls' { + import { DocumentNode } from 'graphql'; + + const value: DocumentNode; + export = value; +} + +declare module '*.graphqls' { + import { DocumentNode } from 'graphql'; + + const value: DocumentNode; + export = value; +} diff --git a/packages/node-require/src/index.ts b/packages/node-require/src/index.ts new file mode 100644 index 00000000000..3b7ee84a928 --- /dev/null +++ b/packages/node-require/src/index.ts @@ -0,0 +1,30 @@ +/* eslint-disable @typescript-eslint/triple-slash-reference */ +/* eslint-disable spaced-comment */ +/* eslint-disable node/no-deprecated-api */ + +/// + +import { loadTypedefsSync } from '@graphql-tools/load'; +import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader'; +import { concatAST } from 'graphql'; + +const VALID_EXTENSIONS = ['graphql', 'graphqls', 'gql', 'gqls']; + +function handleModule(m: NodeModule, filename: string) { + console.log(m, filename); + const sources = loadTypedefsSync(filename, { + loaders: [new GraphQLFileLoader()], + }); + + const documents = sources.map(source => source.document); + const mergedDoc = concatAST(documents); + m.exports = mergedDoc; +} + +export function registerGraphQLExtensions(require: NodeRequire) { + VALID_EXTENSIONS.forEach(ext => { + require.extensions[`.${ext}`] = handleModule; + }); +} + +registerGraphQLExtensions(require); diff --git a/packages/node-require/test/fixtures/test.graphql b/packages/node-require/test/fixtures/test.graphql new file mode 100644 index 00000000000..6a59a3af225 --- /dev/null +++ b/packages/node-require/test/fixtures/test.graphql @@ -0,0 +1,3 @@ +type Query { + foo: String +} diff --git a/packages/node-require/test/node-require.spec.ts b/packages/node-require/test/node-require.spec.ts new file mode 100644 index 00000000000..febaac67b37 --- /dev/null +++ b/packages/node-require/test/node-require.spec.ts @@ -0,0 +1,14 @@ +import '../src'; +import { print } from 'graphql'; +import { readFileSync } from 'fs'; + +describe('GraphQL Node Import', () => { + it.skip('should import correct definitions', () => { + console.log(require.main); + const filePath = './fixtures/test.graphql'; + const typeDefs = require(filePath); + expect(print(typeDefs).replace(/\s\s+/g, ' ')).toBe( + readFileSync(require.resolve(filePath), 'utf8').replace(/\s\s+/g, ' ') + ); + }); +}); diff --git a/packages/relay-operation-optimizer/package.json b/packages/relay-operation-optimizer/package.json index 99a1a618abf..e6fb0986245 100644 --- a/packages/relay-operation-optimizer/package.json +++ b/packages/relay-operation-optimizer/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/relay-operation-optimizer", - "version": "6.0.5", + "version": "6.0.6", "description": "Package for optimizing your GraphQL operations relay style.", "author": { "name": "Laurin Quast", @@ -27,7 +27,7 @@ "graphql": "^14.0.0 || ^15.0.0" }, "dependencies": { - "@graphql-tools/utils": "6.0.5", + "@graphql-tools/utils": "6.0.6", "relay-compiler": "9.1.0" }, "devDependencies": { diff --git a/packages/resolvers-composition/package.json b/packages/resolvers-composition/package.json index eca89962906..aa802f62032 100644 --- a/packages/resolvers-composition/package.json +++ b/packages/resolvers-composition/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/resolvers-composition", - "version": "6.0.5", + "version": "6.0.6", "description": "Common package containting utils and types for GraphQL tools", "repository": "git@github.com:ardatan/graphql-tools.git", "author": "Dotan Simha ", @@ -19,7 +19,7 @@ "@types/lodash": "4.14.154" }, "dependencies": { - "@graphql-tools/utils": "6.0.5", + "@graphql-tools/utils": "6.0.6", "lodash": "4.17.15" }, "publishConfig": { diff --git a/packages/schema/package.json b/packages/schema/package.json index 4e802e70577..dfa1385e24d 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/schema", - "version": "6.0.5", + "version": "6.0.6", "description": "A set of utils for faster development of GraphQL tools", "repository": "git@github.com:ardatan/graphql-tools.git", "license": "MIT", @@ -21,7 +21,7 @@ "input": "./src/index.ts" }, "dependencies": { - "@graphql-tools/utils": "6.0.5", + "@graphql-tools/utils": "6.0.6", "tslib": "~2.0.0" }, "publishConfig": { diff --git a/packages/stitch/package.json b/packages/stitch/package.json index f62f9c3b7e7..7ac56e653cb 100644 --- a/packages/stitch/package.json +++ b/packages/stitch/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/stitch", - "version": "6.0.5", + "version": "6.0.6", "description": "A set of utils for faster development of GraphQL tools", "repository": "git@github.com:ardatan/graphql-tools.git", "license": "MIT", @@ -21,10 +21,10 @@ "dataloader": "2.0.0" }, "dependencies": { - "@graphql-tools/delegate": "6.0.5", - "@graphql-tools/schema": "6.0.5", - "@graphql-tools/wrap": "6.0.5", - "@graphql-tools/utils": "6.0.5", + "@graphql-tools/delegate": "6.0.6", + "@graphql-tools/schema": "6.0.6", + "@graphql-tools/wrap": "6.0.6", + "@graphql-tools/utils": "6.0.6", "tslib": "~2.0.0" }, "publishConfig": { diff --git a/packages/stitch/src/stitchSchemas.ts b/packages/stitch/src/stitchSchemas.ts index 27ad05f31a3..da547adc9b1 100644 --- a/packages/stitch/src/stitchSchemas.ts +++ b/packages/stitch/src/stitchSchemas.ts @@ -51,7 +51,7 @@ export function stitchSchemas({ } let schemaLikeObjects: Array = [...subschemas]; - if (typeDefs) { + if ((typeDefs && !Array.isArray(typeDefs)) || (Array.isArray(typeDefs) && typeDefs.length)) { schemaLikeObjects.push(buildDocumentFromTypeDefinitions(typeDefs, parseOptions)); } if (types != null) { diff --git a/packages/stitch/tests/errors.test.ts b/packages/stitch/tests/errors.test.ts index b690b253881..c0caf77f734 100644 --- a/packages/stitch/tests/errors.test.ts +++ b/packages/stitch/tests/errors.test.ts @@ -1,8 +1,9 @@ -import { graphql } from 'graphql'; +import { graphql, GraphQLError, buildSchema } from 'graphql'; +import { Executor } from '@graphql-tools/delegate'; import { makeExecutableSchema } from '@graphql-tools/schema'; - -import { stitchSchemas } from '../src/stitchSchemas'; +import { stitchSchemas } from '@graphql-tools/stitch'; +import { ExecutionResult } from '@graphql-tools/utils'; describe('passes along errors for missing fields on list', () => { test('if non-null', async () => { @@ -143,3 +144,60 @@ describe('passes along errors when list field errors', () => { expect(stitchedResult).toEqual(originalResult); }); }); + +describe('passes along errors for remote schemas', () => { + it('it works', async () => { + const typeDefs = ` + type Test { + field: String! + } + + type Query { + test: Test! + } + `; + + const schema = buildSchema(typeDefs) + + const executor: Executor = () => ({ + data: { + test: null + }, + errors: [ + { + message: 'INVALID_CREDENTIALS', + path: ['test'], + } as unknown as GraphQLError + ], + }) as ExecutionResult; + + const stitchedSchema = stitchSchemas({ + schemas: [{ + schema, + executor, + }] + }); + + const expectedResult: ExecutionResult = { + data: null, + errors: [ + new GraphQLError( + 'INVALID_CREDENTIALS', + undefined, + undefined, + undefined, + ['test'], + ) + ], + }; + + const query = `{ + test { + field + } + }` + + const result = await graphql(stitchedSchema, query); + expect(result).toEqual(expectedResult); + }); +}); diff --git a/packages/stitch/tests/fixtures/schemas.ts b/packages/stitch/tests/fixtures/schemas.ts index 35dda15dc99..09a5365d3e0 100644 --- a/packages/stitch/tests/fixtures/schemas.ts +++ b/packages/stitch/tests/fixtures/schemas.ts @@ -16,6 +16,7 @@ import { introspectSchema } from '@graphql-tools/wrap'; import { IResolvers, ExecutionResult, + mapAsyncIterator, } from '@graphql-tools/utils'; import { makeExecutableSchema } from '@graphql-tools/schema'; import { PromiseOrValue } from 'graphql/jsutils/PromiseOrValue'; @@ -680,23 +681,36 @@ export const subscriptionSchema: GraphQLSchema = makeExecutableSchema({ }); function makeExecutorFromSchema(schema: GraphQLSchema) { - return async ({ document, variables, context }: ExecutionParams) => graphql( - schema, - print(document), - null, - context, - variables, - ) as PromiseOrValue>; + return async ({ document, variables, context }: ExecutionParams) => { + const result = graphql( + schema, + print(document), + null, + context, + variables, + ) as PromiseOrValue>; + if (result instanceof Promise) { + return result.then(originalResult => JSON.parse(JSON.stringify(originalResult))); + } + return JSON.parse(JSON.stringify(result)); + }; } function makeSubscriberFromSchema(schema: GraphQLSchema) { - return async ({ document, variables, context }: ExecutionParams) => subscribe( - schema, - document, - null, - context, - variables, - ) as Promise> | ExecutionResult> + return async ({ document, variables, context }: ExecutionParams) => { + const result = subscribe( + schema, + document, + null, + context, + variables, + ) as Promise> | ExecutionResult>; + if (result instanceof Promise) { + return result.then(asyncIterator => + mapAsyncIterator(asyncIterator as AsyncIterator, (originalResult: ExecutionResult) => JSON.parse(JSON.stringify(originalResult)))); + } + return JSON.parse(JSON.stringify(result)); + }; } export async function makeSchemaRemote( diff --git a/packages/stitch/tests/stitchSchemas.test.ts b/packages/stitch/tests/stitchSchemas.test.ts index 65e53038d2d..928682c3c3f 100644 --- a/packages/stitch/tests/stitchSchemas.test.ts +++ b/packages/stitch/tests/stitchSchemas.test.ts @@ -2982,6 +2982,36 @@ fragment BookingFragment on Booking { }); }); + describe('empty typeDefs array', () => { + test('works', async () => { + const typeDefs = ` + type Query { + book: Book + } + type Book { + category: String! + } + `; + let schema = makeExecutableSchema({ typeDefs }); + + const resolvers = { + Query: { + book: () => ({ category: 'Test' }), + }, + }; + + schema = stitchSchemas({ + schemas: [schema], + resolvers, + typeDefs: [], + }); + + const result = await graphql(schema, '{ book { cat: category } }'); + + expect(result.data.book.cat).toBe('Test'); + }); + }); + describe('new root type name', () => { test('works', async () => { let bookSchema = makeExecutableSchema({ diff --git a/packages/utils/package.json b/packages/utils/package.json index 6f1b6e47ab4..399b84eb08f 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/utils", - "version": "6.0.5", + "version": "6.0.6", "description": "Common package containting utils and types for GraphQL tools", "repository": "git@github.com:ardatan/graphql-tools.git", "author": "Dotan Simha ", diff --git a/packages/utils/src/errors.ts b/packages/utils/src/errors.ts index 330c4099b89..b3562d94b40 100644 --- a/packages/utils/src/errors.ts +++ b/packages/utils/src/errors.ts @@ -2,13 +2,13 @@ import { GraphQLError } from 'graphql'; export const ERROR_SYMBOL = Symbol('subschemaErrors'); -export function relocatedError(originalError: GraphQLError, path: ReadonlyArray): GraphQLError { +export function relocatedError(originalError: GraphQLError, path?: ReadonlyArray): GraphQLError { return new GraphQLError( originalError.message, originalError.nodes, originalError.source, originalError.positions, - path != null ? path : originalError.path, + path === null ? undefined : path === undefined ? originalError.path : path, originalError.originalError, originalError.extensions ); diff --git a/packages/utils/src/loaders.ts b/packages/utils/src/loaders.ts index 6ab43eb3b2b..24ba845a6d1 100644 --- a/packages/utils/src/loaders.ts +++ b/packages/utils/src/loaders.ts @@ -11,7 +11,6 @@ export interface Source { export type SingleFileOptions = ParseOptions & GraphQLSchemaValidationOptions & BuildSchemaOptions & { - noRequire?: boolean; cwd?: string; }; diff --git a/packages/webpack-loader/package.json b/packages/webpack-loader/package.json new file mode 100644 index 00000000000..3b263c61e4a --- /dev/null +++ b/packages/webpack-loader/package.json @@ -0,0 +1,29 @@ +{ + "name": "@graphql-tools/webpack-loader", + "version": "6.0.5", + "description": "A set of utils for faster development of GraphQL tools", + "repository": "git@github.com:ardatan/graphql-tools.git", + "license": "MIT", + "sideEffects": false, + "main": "dist/index.cjs.js", + "module": "dist/index.esm.js", + "typings": "dist/index.d.ts", + "typescript": { + "definition": "dist/index.d.ts" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0" + }, + "buildOptions": { + "input": "./src/index.ts" + }, + "dependencies": { + "@graphql-tools/load": "6.0.5", + "@graphql-tools/graphql-file-loader": "6.0.5", + "tslib": "~2.0.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist" + } +} diff --git a/packages/webpack-loader/src/index.ts b/packages/webpack-loader/src/index.ts new file mode 100644 index 00000000000..d5ce628001a --- /dev/null +++ b/packages/webpack-loader/src/index.ts @@ -0,0 +1,17 @@ +import { loadTypedefs } from '@graphql-tools/load'; +import { GraphQLFileLoader } from 'packages/graphql-tools/src'; +import { concatAST } from 'graphql'; + +export default function (this: any, path: string) { + const callback = this.async(); + + this.cacheable(); + + loadTypedefs(path, { + loaders: [new GraphQLFileLoader()], + }).then(sources => { + const documents = sources.map(source => source.document); + const mergedDoc = concatAST(documents); + return callback(null, `module.exports = ${JSON.stringify(mergedDoc)}`); + }); +} diff --git a/packages/wrap/package.json b/packages/wrap/package.json index 7022a88c724..e5ed00ff70f 100644 --- a/packages/wrap/package.json +++ b/packages/wrap/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/wrap", - "version": "6.0.5", + "version": "6.0.6", "description": "A set of utils for faster development of GraphQL tools", "repository": "git@github.com:ardatan/graphql-tools.git", "license": "MIT", @@ -18,9 +18,9 @@ "input": "./src/index.ts" }, "dependencies": { - "@graphql-tools/delegate": "6.0.5", - "@graphql-tools/schema": "6.0.5", - "@graphql-tools/utils": "6.0.5", + "@graphql-tools/delegate": "6.0.6", + "@graphql-tools/schema": "6.0.6", + "@graphql-tools/utils": "6.0.6", "tslib": "~2.0.0" }, "publishConfig": { diff --git a/packages/wrap/src/index.ts b/packages/wrap/src/index.ts index bf5d0ecf8c1..7be4ebcc7bf 100644 --- a/packages/wrap/src/index.ts +++ b/packages/wrap/src/index.ts @@ -1,5 +1,5 @@ export { wrapSchema } from './wrapSchema'; -export { defaultCreateProxyingResolver } from './generateProxyingResolvers'; +export { defaultCreateProxyingResolver, generateProxyingResolvers } from './generateProxyingResolvers'; export * from './transforms/index'; diff --git a/packages/wrap/tests/fixtures/schemas.ts b/packages/wrap/tests/fixtures/schemas.ts index d134a35e904..bf2fe7df7e0 100644 --- a/packages/wrap/tests/fixtures/schemas.ts +++ b/packages/wrap/tests/fixtures/schemas.ts @@ -16,6 +16,7 @@ import { introspectSchema } from '../../src/introspect'; import { IResolvers, ExecutionResult, + mapAsyncIterator, } from '@graphql-tools/utils'; import { makeExecutableSchema } from '@graphql-tools/schema'; import { SubschemaConfig, ExecutionParams } from '@graphql-tools/delegate'; @@ -680,23 +681,36 @@ export const subscriptionSchema: GraphQLSchema = makeExecutableSchema({ }); function makeExecutorFromSchema(schema: GraphQLSchema) { - return async ({ document, variables, context }: ExecutionParams) => graphql( - schema, - print(document), - null, - context, - variables, - ) as PromiseOrValue>; + return async ({ document, variables, context }: ExecutionParams) => { + const result = graphql( + schema, + print(document), + null, + context, + variables, + ) as PromiseOrValue>; + if (result instanceof Promise) { + return result.then(originalResult => JSON.parse(JSON.stringify(originalResult))); + } + return JSON.parse(JSON.stringify(result)); + }; } function makeSubscriberFromSchema(schema: GraphQLSchema) { - return async ({ document, variables, context }: ExecutionParams) => subscribe( - schema, - document, - null, - context, - variables, - ) as Promise> | ExecutionResult> + return async ({ document, variables, context }: ExecutionParams) => { + const result = subscribe( + schema, + document, + null, + context, + variables, + ) as Promise> | ExecutionResult>; + if (result instanceof Promise) { + return result.then(asyncIterator => + mapAsyncIterator(asyncIterator as AsyncIterator, (originalResult: ExecutionResult) => JSON.parse(JSON.stringify(originalResult)))); + } + return JSON.parse(JSON.stringify(result)); + }; } export async function makeSchemaRemote( diff --git a/website/docs/merge-typedefs.md b/website/docs/merge-typedefs.md index e5b59502f51..6870cf9ca2f 100644 --- a/website/docs/merge-typedefs.md +++ b/website/docs/merge-typedefs.md @@ -102,21 +102,21 @@ module.exports = mergeTypeDefs(types, { all: true }); ### Import everything from a specified folder -In this way we use the `loadFiles` function from `@graphql-tools/load-files` to import all files from the specified folder. +In this way we use the `loadFilesSync` function from `@graphql-tools/load-files` to import all files from the specified folder. ```js // ./graphql/typeDefs.js const path = require('path'); -const { loadFiles } = require('@graphql-tools/load-files'); +const { loadFilesSync } = require('@graphql-tools/load-files'); const { mergeTypeDefs } = require('@graphql-tools/merge'); -const typesArray = loadFiles(path.join(__dirname, './types')); +const typesArray = loadFilesSync(path.join(__dirname, './types')); module.exports = mergeTypeDefs(typesArray, { all: true }); ``` -When using the `loadFiles` function you can also implement your type definitions using `.graphql` or `.gql` or `.graphqls` files. +When using the `loadFilesSync` function you can also implement your type definitions using `.graphql` or `.gql` or `.graphqls` files. -> The `loadFiles` function will by default ignore files named `index.js` or `index.ts` (use `{ignoreIndex: false}` option to change this behavior). This allows you to create your index file inside the actual types folder if desired. +> The `loadFilesSync` function will by default ignore files named `index.js` or `index.ts` (use `{ignoreIndex: false}` option to change this behavior). This allows you to create your index file inside the actual types folder if desired. ```graphql # ./graphql/types/clientType.graphql @@ -170,15 +170,15 @@ Here's how your `index` file could look like: ```js const path = require('path'); -const { loadFiles } = require('@graphql-tools/load-files'); +const { loadFilesSync } = require('@graphql-tools/load-files'); const { mergeTypeDefs } = require('@graphql-tools/merge'); -const typesArray = loadFiles(path.join(__dirname, '.'), { recursive: true }) +const typesArray = loadFilesSync(path.join(__dirname, '.'), { recursive: true }) module.exports = mergeTypeDefs(typesArray, { all: true }) ``` -You can also load files in different folders by passing a glob pattern in `loadFiles`. +You can also load files in different folders by passing a glob pattern in `loadFilesSync`. Given the file structure below: ``` @@ -196,10 +196,10 @@ Here's how your `index` file could look like: ```js const path = require('path'); -const { loadFiles } = require('@graphql-tools/load-files'); +const { loadFilesSync } = require('@graphql-tools/load-files'); const { mergeTypeDefs } = require('@graphql-tools/merge'); -const typesArray = loadFiles(path.join(__dirname, 'graphql/**/*.graphql')) +const typesArray = loadFilesSync(path.join(__dirname, 'graphql/**/*.graphql')) module.exports = mergeTypeDefs(typesArray, { all: true }) ``` @@ -209,12 +209,12 @@ module.exports = mergeTypeDefs(typesArray, { all: true }) Since the output of `mergeTypeDefs` is `DocumentNode`, after you merge your types, you can save it to a file to be passed around to other systems. Here is an example using ES6 modules: ```js -const { loadFiles } = require('@graphql-tools/load-files'); +const { loadFilesSync } = require('@graphql-tools/load-files'); const { mergeTypeDefs } = require('@graphql-tools/merge'); const { print } = require('graphql'); const fs = require('fs'); -const loadedFiles = loadFiles(`${__dirname}/schema/**/*.graphql`); +const loadedFiles = loadFilesSync(`${__dirname}/schema/**/*.graphql`); const typeDefs = mergeTypeDefs(loadedFiles, { all: true }); const printedTypeDefs = print(typeDefs); fs.writeFileSync('joined.graphql', printedTypeDefs); diff --git a/website/docs/migration-from-merge-graphql-schemas.md b/website/docs/migration-from-merge-graphql-schemas.md index 92dbe8e6e99..e6ac71ccbd7 100644 --- a/website/docs/migration-from-merge-graphql-schemas.md +++ b/website/docs/migration-from-merge-graphql-schemas.md @@ -35,12 +35,14 @@ export const mergeTypes = (types: any[], options?: { schemaDefinition?: boolean, So if you want to have exact behavior, you can use the options above. Other than that, the API and behavior are almost same. ```ts -import { mergeTypes, mergeResolvers, loadFiles } from 'merge-graphql-schemas'; +import { mergeTypes, mergeResolvers, fileLoader } from 'merge-graphql-schemas'; ``` should become ```ts import { mergeTypeDefs, mergeResolvers } from '@graphql-tools/merge'; -import { loadFiles } from '@graphql-tools/load-files'; +import { loadFilesSync } from '@graphql-tools/load-files'; ``` + +So you can replace `mergeTypes` with `mergeTypeDefs` and `fileLoader` with `loadFilesSync`. diff --git a/website/package.json b/website/package.json index c29ec351001..2c8003ec3b6 100644 --- a/website/package.json +++ b/website/package.json @@ -1,6 +1,6 @@ { "name": "@graphql-tools/website", - "version": "6.0.5", + "version": "6.0.6", "private": true, "scripts": { "start": "docusaurus start", diff --git a/yarn.lock b/yarn.lock index e7d934c8f4f..138a2d02e51 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1946,10 +1946,10 @@ dependencies: "@babel/types" "^7.3.0" -"@types/babel__traverse@7.0.11": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.11.tgz#1ae3010e8bf8851d324878b42acec71986486d18" - integrity sha512-ddHK5icION5U6q11+tV2f9Mo6CZVuT8GJKld2q9LqHSZbvLbH34Kcu2yFGckZut453+eQU6btIA3RihmnRgI+Q== +"@types/babel__traverse@7.0.12": + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.12.tgz#22f49a028e69465390f87bb103ebd61bd086b8f5" + integrity sha512-t4CoEokHTfcyfb4hUaF9oOHu9RmmNWnm1CP0YmMqOOfClKascOmvlEM736vlqeScuGvBDsHkf8R2INd4DWreQA== dependencies: "@babel/types" "^7.3.0" @@ -2357,41 +2357,41 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.0.2.tgz#4a114a066e2f9659b25682ee59d4866e15a17ec3" - integrity sha512-ER3bSS/A/pKQT/hjMGCK8UQzlL0yLjuCZ/G8CDFJFVTfl3X65fvq2lNYqOG8JPTfrPa2RULCdwfOyFjZEMNExQ== +"@typescript-eslint/eslint-plugin@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.1.0.tgz#4ac00ecca3bbea740c577f1843bc54fa69c3def2" + integrity sha512-D52KwdgkjYc+fmTZKW7CZpH5ZBJREJKZXRrveMiRCmlzZ+Rw9wRVJ1JAmHQ9b/+Ehy1ZeaylofDB9wwXUt83wg== dependencies: - "@typescript-eslint/experimental-utils" "3.0.2" + "@typescript-eslint/experimental-utils" "3.1.0" functional-red-black-tree "^1.0.1" regexpp "^3.0.0" semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.0.2.tgz#bb2131baede8df28ec5eacfa540308ca895e5fee" - integrity sha512-4Wc4EczvoY183SSEnKgqAfkj1eLtRgBQ04AAeG+m4RhTVyaazxc1uI8IHf0qLmu7xXe9j1nn+UoDJjbmGmuqXQ== +"@typescript-eslint/experimental-utils@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.1.0.tgz#2d5dba7c2ac2a3da3bfa3f461ff64de38587a872" + integrity sha512-Zf8JVC2K1svqPIk1CB/ehCiWPaERJBBokbMfNTNRczCbQSlQXaXtO/7OfYz9wZaecNvdSvVADt6/XQuIxhC79w== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "3.0.2" + "@typescript-eslint/typescript-estree" "3.1.0" eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/parser@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.0.2.tgz#a92ef339added9bf7fb92605ac99c93ef243e834" - integrity sha512-80Z7s83e8QXHNUspqVlWwb4t5gdz/1bBBmafElbK1wwAwiD/yvJsFyHRxlEpNrt4rdK6eB3p+2WEFkEDHAKk9w== +"@typescript-eslint/parser@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.1.0.tgz#9c02ba5d88ad2355672f39e6cd4176f172dd47f8" + integrity sha512-NcDSJK8qTA2tPfyGiPes9HtVKLbksmuYjlgGAUs7Ld2K0swdWibnCq9IJx9kJN8JJdgUJSorFiGaPHBgH81F/Q== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "3.0.2" - "@typescript-eslint/typescript-estree" "3.0.2" + "@typescript-eslint/experimental-utils" "3.1.0" + "@typescript-eslint/typescript-estree" "3.1.0" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/typescript-estree@3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.0.2.tgz#67a1ce4307ebaea43443fbf3f3be7e2627157293" - integrity sha512-cs84mxgC9zQ6viV8MEcigfIKQmKtBkZNDYf8Gru2M+MhnA6z9q0NFMZm2IEzKqAwN8lY5mFVd1Z8DiHj6zQ3Tw== +"@typescript-eslint/typescript-estree@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.1.0.tgz#eaff52d31e615e05b894f8b9d2c3d8af152a5dd2" + integrity sha512-+4nfYauqeQvK55PgFrmBWFVYb6IskLyOosYEmhH3mSVhfBp9AIJnjExdgDmKWoOBHRcPM8Ihfm2BFpZf0euUZQ== dependencies: debug "^4.1.1" eslint-visitor-keys "^1.1.0" @@ -6363,6 +6363,18 @@ globby@11.0.0: merge2 "^1.3.0" slash "^3.0.0" +globby@11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + globby@8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d"