Skip to content

Commit

Permalink
Introduce Webpack Loader and Node Require Extension (#1579)
Browse files Browse the repository at this point in the history
  • Loading branch information
ardatan committed Jun 2, 2020
1 parent e2d0034 commit 102ee5a
Show file tree
Hide file tree
Showing 55 changed files with 514 additions and 216 deletions.
4 changes: 3 additions & 1 deletion CHANGELOG.md
Expand Up @@ -2,8 +2,10 @@

### Next

- Fix visitEnumValue to allow modifying the enum value <br/>
- Fix visitEnumValue to allow modifying the enum value <br/>
[@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

Expand Down
6 changes: 3 additions & 3 deletions 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": {
Expand Down Expand Up @@ -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",
Expand Down
6 changes: 3 additions & 3 deletions 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",
Expand All @@ -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": {
Expand Down
4 changes: 2 additions & 2 deletions 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<GraphQLError>) {
if (errors.length) {
Expand All @@ -10,7 +10,7 @@ export function handleNull(errors: ReadonlyArray<GraphQLError>) {
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);

Expand Down
6 changes: 3 additions & 3 deletions 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",
Expand All @@ -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": {
Expand Down
44 changes: 22 additions & 22 deletions 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",
Expand All @@ -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"
}
}
2 changes: 1 addition & 1 deletion 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 <dotansimha@gmail.com>",
Expand Down
68 changes: 43 additions & 25 deletions packages/import/src/index.ts
Expand Up @@ -31,6 +31,8 @@ import {
SchemaDefinitionNode,
OperationTypeDefinitionNode,
DocumentNode,
ScalarTypeDefinitionNode,
ScalarTypeExtensionNode,
} from 'graphql';
import { readFileSync, realpathSync } from 'fs-extra';
import { dirname, join, isAbsolute } from 'path';
Expand Down Expand Up @@ -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;
Expand All @@ -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) {
Expand Down Expand Up @@ -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
Expand All @@ -392,10 +400,10 @@ function visitFieldDefinitionNode(
dependencySet: Set<string>,
dependenciesByDefinitionName: Map<string, Set<string>>
) {
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);
}

Expand Down Expand Up @@ -445,7 +453,7 @@ function visitInputValueDefinitionNode(
dependencySet: Set<string>,
dependenciesByDefinitionName: Map<string, Set<string>>
) {
node.directives.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
node.directives?.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
visitTypeNode(node.type, dependencySet, dependenciesByDefinitionName);
}

Expand All @@ -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) => {
Expand All @@ -473,13 +481,13 @@ function visitInterfaceTypeDefinitionNode(

function visitUnionTypeDefinitionNode(node: UnionTypeDefinitionNode, dependencySet: Set<string>) {
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<string>) {
dependencySet.add(node.name.value);
node.directives.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
node.directives?.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
}

function visitInputObjectTypeDefinitionNode(
Expand All @@ -488,8 +496,8 @@ function visitInputObjectTypeDefinitionNode(
dependenciesByDefinitionName: Map<string, Set<string>>
) {
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)
);
}
Expand All @@ -500,7 +508,7 @@ function visitDirectiveDefinitionNode(
dependenciesByDefinitionName: Map<string, Set<string>>
) {
dependencySet.add(node.name.value);
node.arguments.forEach(inputValueDefinitionNode =>
node.arguments?.forEach(inputValueDefinitionNode =>
visitInputValueDefinitionNode(inputValueDefinitionNode, dependencySet, dependenciesByDefinitionName)
);
}
Expand All @@ -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
Expand All @@ -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) => {
Expand All @@ -551,13 +559,13 @@ function visitInterfaceTypeExtensionNode(

function visitUnionTypeExtensionNode(node: UnionTypeExtensionNode, dependencySet: Set<string>) {
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<string>) {
dependencySet.add(node.name.value);
node.directives.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
node.directives?.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
}

function visitInputObjectTypeExtensionNode(
Expand All @@ -566,20 +574,30 @@ function visitInputObjectTypeExtensionNode(
dependenciesByDefinitionName: Map<string, Set<string>>
) {
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<string>) {
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<string>) {
dependencySet.add(node.name.value);
node.directives?.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
}

function visitScalarExtensionNode(node: ScalarTypeExtensionNode, dependencySet: Set<string>) {
dependencySet.add(node.name.value);
node.directives?.forEach(directiveNode => visitDirectiveNode(directiveNode, dependencySet));
}

function visitOperationTypeDefinitionNode(node: OperationTypeDefinitionNode, dependencySet: Set<string>) {
visitNamedTypeNode(node.type, dependencySet);
}
Expand Up @@ -4,4 +4,5 @@ type A {
first: String
second: Float
b: B
date: Date
}
@@ -1,4 +1,5 @@
# import C1, C2 from '../import-all/c.graphql'
scalar Date
type B {
hello: String!
c1: C1
Expand Down
5 changes: 4 additions & 1 deletion packages/import/tests/schema/import-schema.spec.ts
Expand Up @@ -6,7 +6,7 @@ import { Kind, print } from 'graphql';

const importSchema = (schema: string, schemas?: Record<string, string>) => {
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,
}))
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit 102ee5a

Please sign in to comment.