@depup/graphql-middleware 6.1.35-depup.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +32 -0
- package/changes.json +14 -0
- package/dist/LICENSE +21 -0
- package/dist/README.md +355 -0
- package/dist/applicator.d.ts +3 -0
- package/dist/applicator.js +101 -0
- package/dist/applicator.mjs +97 -0
- package/dist/constructors.d.ts +2 -0
- package/dist/constructors.js +11 -0
- package/dist/constructors.mjs +7 -0
- package/dist/fragments.d.ts +2 -0
- package/dist/fragments.js +82 -0
- package/dist/fragments.mjs +78 -0
- package/dist/generator.d.ts +7 -0
- package/dist/generator.js +14 -0
- package/dist/generator.mjs +10 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +14 -0
- package/dist/index.mjs +3 -0
- package/dist/middleware.d.ts +34 -0
- package/dist/middleware.js +63 -0
- package/dist/middleware.mjs +57 -0
- package/dist/package.json +41 -0
- package/dist/types.d.ts +54 -0
- package/dist/types.js +2 -0
- package/dist/types.mjs +1 -0
- package/dist/utils.d.ts +7 -0
- package/dist/utils.js +28 -0
- package/dist/utils.mjs +20 -0
- package/dist/validation.d.ts +5 -0
- package/dist/validation.js +34 -0
- package/dist/validation.mjs +29 -0
- package/package.json +106 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
const graphql = require('graphql');
|
|
6
|
+
|
|
7
|
+
function extractFragmentReplacements(resolvers) {
|
|
8
|
+
const allFragmentReplacements = [];
|
|
9
|
+
for (const typeName in resolvers) {
|
|
10
|
+
const fieldResolvers = resolvers[typeName];
|
|
11
|
+
for (const fieldName in fieldResolvers) {
|
|
12
|
+
const fieldResolver = fieldResolvers[fieldName];
|
|
13
|
+
if (typeof fieldResolver === "object" && fieldResolver.fragment) {
|
|
14
|
+
allFragmentReplacements.push({
|
|
15
|
+
field: fieldName,
|
|
16
|
+
fragment: fieldResolver.fragment
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
if (typeof fieldResolver === "object" && fieldResolver.fragments) {
|
|
20
|
+
for (const fragment of fieldResolver.fragments) {
|
|
21
|
+
allFragmentReplacements.push({
|
|
22
|
+
field: fieldName,
|
|
23
|
+
fragment
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const fragmentReplacements = allFragmentReplacements.filter((fragment) => Boolean(fragment)).map((fragmentReplacement) => {
|
|
30
|
+
const fragment = parseFragmentToInlineFragment(fragmentReplacement.fragment);
|
|
31
|
+
const newSelections = fragment.selectionSet.selections.filter((node) => {
|
|
32
|
+
switch (node.kind) {
|
|
33
|
+
case graphql.Kind.FIELD: {
|
|
34
|
+
return node.name.value !== fragmentReplacement.field;
|
|
35
|
+
}
|
|
36
|
+
default: {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
if (newSelections.length === 0) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
const newFragment = {
|
|
45
|
+
...fragment,
|
|
46
|
+
selectionSet: {
|
|
47
|
+
kind: fragment.selectionSet.kind,
|
|
48
|
+
loc: fragment.selectionSet.loc,
|
|
49
|
+
selections: newSelections
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const parsedFragment = graphql.print(newFragment);
|
|
53
|
+
return {
|
|
54
|
+
field: fragmentReplacement.field,
|
|
55
|
+
fragment: parsedFragment
|
|
56
|
+
};
|
|
57
|
+
}).filter((fr) => fr !== null);
|
|
58
|
+
return fragmentReplacements;
|
|
59
|
+
function parseFragmentToInlineFragment(definitions) {
|
|
60
|
+
if (definitions.trim().startsWith("fragment")) {
|
|
61
|
+
const document = graphql.parse(definitions);
|
|
62
|
+
for (const definition of document.definitions) {
|
|
63
|
+
if (definition.kind === graphql.Kind.FRAGMENT_DEFINITION) {
|
|
64
|
+
return {
|
|
65
|
+
kind: graphql.Kind.INLINE_FRAGMENT,
|
|
66
|
+
typeCondition: definition.typeCondition,
|
|
67
|
+
selectionSet: definition.selectionSet
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const query = graphql.parse(`{${definitions}}`).definitions[0];
|
|
73
|
+
for (const selection of query.selectionSet.selections) {
|
|
74
|
+
if (selection.kind === graphql.Kind.INLINE_FRAGMENT) {
|
|
75
|
+
return selection;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
throw new Error("Could not parse fragment");
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
exports.extractFragmentReplacements = extractFragmentReplacements;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { Kind, print, parse } from 'graphql';
|
|
2
|
+
|
|
3
|
+
function extractFragmentReplacements(resolvers) {
|
|
4
|
+
const allFragmentReplacements = [];
|
|
5
|
+
for (const typeName in resolvers) {
|
|
6
|
+
const fieldResolvers = resolvers[typeName];
|
|
7
|
+
for (const fieldName in fieldResolvers) {
|
|
8
|
+
const fieldResolver = fieldResolvers[fieldName];
|
|
9
|
+
if (typeof fieldResolver === "object" && fieldResolver.fragment) {
|
|
10
|
+
allFragmentReplacements.push({
|
|
11
|
+
field: fieldName,
|
|
12
|
+
fragment: fieldResolver.fragment
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
if (typeof fieldResolver === "object" && fieldResolver.fragments) {
|
|
16
|
+
for (const fragment of fieldResolver.fragments) {
|
|
17
|
+
allFragmentReplacements.push({
|
|
18
|
+
field: fieldName,
|
|
19
|
+
fragment
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const fragmentReplacements = allFragmentReplacements.filter((fragment) => Boolean(fragment)).map((fragmentReplacement) => {
|
|
26
|
+
const fragment = parseFragmentToInlineFragment(fragmentReplacement.fragment);
|
|
27
|
+
const newSelections = fragment.selectionSet.selections.filter((node) => {
|
|
28
|
+
switch (node.kind) {
|
|
29
|
+
case Kind.FIELD: {
|
|
30
|
+
return node.name.value !== fragmentReplacement.field;
|
|
31
|
+
}
|
|
32
|
+
default: {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
if (newSelections.length === 0) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
const newFragment = {
|
|
41
|
+
...fragment,
|
|
42
|
+
selectionSet: {
|
|
43
|
+
kind: fragment.selectionSet.kind,
|
|
44
|
+
loc: fragment.selectionSet.loc,
|
|
45
|
+
selections: newSelections
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const parsedFragment = print(newFragment);
|
|
49
|
+
return {
|
|
50
|
+
field: fragmentReplacement.field,
|
|
51
|
+
fragment: parsedFragment
|
|
52
|
+
};
|
|
53
|
+
}).filter((fr) => fr !== null);
|
|
54
|
+
return fragmentReplacements;
|
|
55
|
+
function parseFragmentToInlineFragment(definitions) {
|
|
56
|
+
if (definitions.trim().startsWith("fragment")) {
|
|
57
|
+
const document = parse(definitions);
|
|
58
|
+
for (const definition of document.definitions) {
|
|
59
|
+
if (definition.kind === Kind.FRAGMENT_DEFINITION) {
|
|
60
|
+
return {
|
|
61
|
+
kind: Kind.INLINE_FRAGMENT,
|
|
62
|
+
typeCondition: definition.typeCondition,
|
|
63
|
+
selectionSet: definition.selectionSet
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const query = parse(`{${definitions}}`).definitions[0];
|
|
69
|
+
for (const selection of query.selectionSet.selections) {
|
|
70
|
+
if (selection.kind === Kind.INLINE_FRAGMENT) {
|
|
71
|
+
return selection;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
throw new Error("Could not parse fragment");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export { extractFragmentReplacements };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { IMiddlewareGeneratorConstructor, IMiddleware, IMiddlewareGenerator } from './types';
|
|
2
|
+
import { GraphQLSchema } from 'graphql';
|
|
3
|
+
export declare class MiddlewareGenerator<TSource, TContext, TArgs> implements IMiddlewareGenerator<TSource, TContext, TArgs> {
|
|
4
|
+
private generator;
|
|
5
|
+
constructor(generator: IMiddlewareGeneratorConstructor<TSource, TContext, TArgs>);
|
|
6
|
+
generate(schema: GraphQLSchema): IMiddleware<TSource, TContext, TArgs>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
class MiddlewareGenerator {
|
|
6
|
+
constructor(generator) {
|
|
7
|
+
this.generator = generator;
|
|
8
|
+
}
|
|
9
|
+
generate(schema) {
|
|
10
|
+
return this.generator(schema);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
exports.MiddlewareGenerator = MiddlewareGenerator;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type { FragmentReplacement, IMiddleware, IMiddlewareTypeMap, IMiddlewareFieldMap, IMiddlewareFunction, IMiddlewareGenerator, IMiddlewareGeneratorConstructor, } from './types';
|
|
2
|
+
export { applyMiddleware, applyMiddlewareToDeclaredResolvers, } from './middleware';
|
|
3
|
+
export { middleware } from './constructors';
|
|
4
|
+
export { MiddlewareError } from './validation';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
const middleware = require('./middleware.js');
|
|
6
|
+
const constructors = require('./constructors.js');
|
|
7
|
+
const validation = require('./validation.js');
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
exports.applyMiddleware = middleware.applyMiddleware;
|
|
12
|
+
exports.applyMiddlewareToDeclaredResolvers = middleware.applyMiddlewareToDeclaredResolvers;
|
|
13
|
+
exports.middleware = constructors.middleware;
|
|
14
|
+
exports.MiddlewareError = validation.MiddlewareError;
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { GraphQLSchema } from 'graphql';
|
|
2
|
+
import { IApplyOptions, IMiddleware, FragmentReplacement, IMiddlewareGenerator, GraphQLSchemaWithFragmentReplacements } from './types';
|
|
3
|
+
/**
|
|
4
|
+
*
|
|
5
|
+
* @param schema
|
|
6
|
+
* @param options
|
|
7
|
+
* @param middleware
|
|
8
|
+
*
|
|
9
|
+
* Validates middleware and generates resolvers map for provided middleware.
|
|
10
|
+
* Applies middleware to the current schema and returns the modified one.
|
|
11
|
+
*
|
|
12
|
+
*/
|
|
13
|
+
export declare function addMiddlewareToSchema<TSource, TContext, TArgs>(schema: GraphQLSchema, options: IApplyOptions, middleware: IMiddleware<TSource, TContext, TArgs>): {
|
|
14
|
+
schema: GraphQLSchema;
|
|
15
|
+
fragmentReplacements: FragmentReplacement[];
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
*
|
|
19
|
+
* @param schema
|
|
20
|
+
* @param middlewares
|
|
21
|
+
*
|
|
22
|
+
* Apply middleware to resolvers and return generated schema.
|
|
23
|
+
*
|
|
24
|
+
*/
|
|
25
|
+
export declare function applyMiddleware<TSource = any, TContext = any, TArgs = any>(schema: GraphQLSchema, ...middlewares: (IMiddleware<TSource, TContext, TArgs> | IMiddlewareGenerator<TSource, TContext, TArgs>)[]): GraphQLSchemaWithFragmentReplacements;
|
|
26
|
+
/**
|
|
27
|
+
*
|
|
28
|
+
* @param schema
|
|
29
|
+
* @param middlewares
|
|
30
|
+
*
|
|
31
|
+
* Apply middleware to declared resolvers and return new schema.
|
|
32
|
+
*
|
|
33
|
+
*/
|
|
34
|
+
export declare function applyMiddlewareToDeclaredResolvers<TSource = any, TContext = any, TArgs = any>(schema: GraphQLSchema, ...middlewares: (IMiddleware<TSource, TContext, TArgs> | IMiddlewareGenerator<TSource, TContext, TArgs>)[]): GraphQLSchemaWithFragmentReplacements;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
const schema = require('@graphql-tools/schema');
|
|
6
|
+
const applicator = require('./applicator.js');
|
|
7
|
+
const validation = require('./validation.js');
|
|
8
|
+
const fragments = require('./fragments.js');
|
|
9
|
+
const utils = require('./utils.js');
|
|
10
|
+
|
|
11
|
+
function addMiddlewareToSchema(schema$1, options, middleware) {
|
|
12
|
+
const validMiddleware = validation.validateMiddleware(schema$1, middleware);
|
|
13
|
+
const resolvers = applicator.generateResolverFromSchemaAndMiddleware(schema$1, options, validMiddleware);
|
|
14
|
+
const fragmentReplacements = fragments.extractFragmentReplacements(resolvers);
|
|
15
|
+
const newSchema = schema.addResolversToSchema({
|
|
16
|
+
schema: schema$1,
|
|
17
|
+
resolvers,
|
|
18
|
+
updateResolversInPlace: false,
|
|
19
|
+
resolverValidationOptions: {
|
|
20
|
+
requireResolversForResolveType: "ignore"
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
return { schema: newSchema, fragmentReplacements };
|
|
24
|
+
}
|
|
25
|
+
function applyMiddlewareWithOptions(schema, options, ...middlewares) {
|
|
26
|
+
const normalisedMiddlewares = middlewares.map((middleware) => {
|
|
27
|
+
if (utils.isMiddlewareGenerator(middleware)) {
|
|
28
|
+
return middleware.generate(schema);
|
|
29
|
+
} else {
|
|
30
|
+
return middleware;
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
const schemaWithMiddlewareAndFragmentReplacements = normalisedMiddlewares.reduceRight(({
|
|
34
|
+
schema: currentSchema,
|
|
35
|
+
fragmentReplacements: currentFragmentReplacements
|
|
36
|
+
}, middleware) => {
|
|
37
|
+
const {
|
|
38
|
+
schema: newSchema,
|
|
39
|
+
fragmentReplacements: newFragmentReplacements
|
|
40
|
+
} = addMiddlewareToSchema(currentSchema, options, middleware);
|
|
41
|
+
return {
|
|
42
|
+
schema: newSchema,
|
|
43
|
+
fragmentReplacements: [
|
|
44
|
+
...currentFragmentReplacements,
|
|
45
|
+
...newFragmentReplacements
|
|
46
|
+
]
|
|
47
|
+
};
|
|
48
|
+
}, { schema, fragmentReplacements: [] });
|
|
49
|
+
const schemaWithMiddleware = schemaWithMiddlewareAndFragmentReplacements.schema;
|
|
50
|
+
schemaWithMiddleware.schema = schemaWithMiddlewareAndFragmentReplacements.schema;
|
|
51
|
+
schemaWithMiddleware.fragmentReplacements = schemaWithMiddlewareAndFragmentReplacements.fragmentReplacements;
|
|
52
|
+
return schemaWithMiddleware;
|
|
53
|
+
}
|
|
54
|
+
function applyMiddleware(schema, ...middlewares) {
|
|
55
|
+
return applyMiddlewareWithOptions(schema, { onlyDeclaredResolvers: false }, ...middlewares);
|
|
56
|
+
}
|
|
57
|
+
function applyMiddlewareToDeclaredResolvers(schema, ...middlewares) {
|
|
58
|
+
return applyMiddlewareWithOptions(schema, { onlyDeclaredResolvers: true }, ...middlewares);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
exports.addMiddlewareToSchema = addMiddlewareToSchema;
|
|
62
|
+
exports.applyMiddleware = applyMiddleware;
|
|
63
|
+
exports.applyMiddlewareToDeclaredResolvers = applyMiddlewareToDeclaredResolvers;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { addResolversToSchema } from '@graphql-tools/schema';
|
|
2
|
+
import { generateResolverFromSchemaAndMiddleware } from './applicator.mjs';
|
|
3
|
+
import { validateMiddleware } from './validation.mjs';
|
|
4
|
+
import { extractFragmentReplacements } from './fragments.mjs';
|
|
5
|
+
import { isMiddlewareGenerator } from './utils.mjs';
|
|
6
|
+
|
|
7
|
+
function addMiddlewareToSchema(schema, options, middleware) {
|
|
8
|
+
const validMiddleware = validateMiddleware(schema, middleware);
|
|
9
|
+
const resolvers = generateResolverFromSchemaAndMiddleware(schema, options, validMiddleware);
|
|
10
|
+
const fragmentReplacements = extractFragmentReplacements(resolvers);
|
|
11
|
+
const newSchema = addResolversToSchema({
|
|
12
|
+
schema,
|
|
13
|
+
resolvers,
|
|
14
|
+
updateResolversInPlace: false,
|
|
15
|
+
resolverValidationOptions: {
|
|
16
|
+
requireResolversForResolveType: "ignore"
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
return { schema: newSchema, fragmentReplacements };
|
|
20
|
+
}
|
|
21
|
+
function applyMiddlewareWithOptions(schema, options, ...middlewares) {
|
|
22
|
+
const normalisedMiddlewares = middlewares.map((middleware) => {
|
|
23
|
+
if (isMiddlewareGenerator(middleware)) {
|
|
24
|
+
return middleware.generate(schema);
|
|
25
|
+
} else {
|
|
26
|
+
return middleware;
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
const schemaWithMiddlewareAndFragmentReplacements = normalisedMiddlewares.reduceRight(({
|
|
30
|
+
schema: currentSchema,
|
|
31
|
+
fragmentReplacements: currentFragmentReplacements
|
|
32
|
+
}, middleware) => {
|
|
33
|
+
const {
|
|
34
|
+
schema: newSchema,
|
|
35
|
+
fragmentReplacements: newFragmentReplacements
|
|
36
|
+
} = addMiddlewareToSchema(currentSchema, options, middleware);
|
|
37
|
+
return {
|
|
38
|
+
schema: newSchema,
|
|
39
|
+
fragmentReplacements: [
|
|
40
|
+
...currentFragmentReplacements,
|
|
41
|
+
...newFragmentReplacements
|
|
42
|
+
]
|
|
43
|
+
};
|
|
44
|
+
}, { schema, fragmentReplacements: [] });
|
|
45
|
+
const schemaWithMiddleware = schemaWithMiddlewareAndFragmentReplacements.schema;
|
|
46
|
+
schemaWithMiddleware.schema = schemaWithMiddlewareAndFragmentReplacements.schema;
|
|
47
|
+
schemaWithMiddleware.fragmentReplacements = schemaWithMiddlewareAndFragmentReplacements.fragmentReplacements;
|
|
48
|
+
return schemaWithMiddleware;
|
|
49
|
+
}
|
|
50
|
+
function applyMiddleware(schema, ...middlewares) {
|
|
51
|
+
return applyMiddlewareWithOptions(schema, { onlyDeclaredResolvers: false }, ...middlewares);
|
|
52
|
+
}
|
|
53
|
+
function applyMiddlewareToDeclaredResolvers(schema, ...middlewares) {
|
|
54
|
+
return applyMiddlewareWithOptions(schema, { onlyDeclaredResolvers: true }, ...middlewares);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export { addMiddlewareToSchema, applyMiddleware, applyMiddlewareToDeclaredResolvers };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "graphql-middleware",
|
|
3
|
+
"version": "6.1.35",
|
|
4
|
+
"description": "GraphQL Middleware done right!",
|
|
5
|
+
"peerDependencies": {
|
|
6
|
+
"graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0"
|
|
7
|
+
},
|
|
8
|
+
"dependencies": {
|
|
9
|
+
"@graphql-tools/delegate": "^8.8.1",
|
|
10
|
+
"@graphql-tools/schema": "^8.5.1"
|
|
11
|
+
},
|
|
12
|
+
"repository": {
|
|
13
|
+
"type": "git",
|
|
14
|
+
"url": "https://github.com/maticzav/graphql-middleware.git"
|
|
15
|
+
},
|
|
16
|
+
"homepage": "https://github.com/maticzav/graphql-middleware",
|
|
17
|
+
"keywords": [
|
|
18
|
+
"graphql",
|
|
19
|
+
"middleware",
|
|
20
|
+
"schema",
|
|
21
|
+
"resolvers",
|
|
22
|
+
"server",
|
|
23
|
+
"yoga"
|
|
24
|
+
],
|
|
25
|
+
"author": "Matic Zavadlal <matic.zavadlal@gmail.com>",
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"main": "index.js",
|
|
28
|
+
"module": "index.mjs",
|
|
29
|
+
"types": "index.d.ts",
|
|
30
|
+
"exports": {
|
|
31
|
+
".": {
|
|
32
|
+
"require": "./index.js",
|
|
33
|
+
"import": "./index.mjs"
|
|
34
|
+
},
|
|
35
|
+
"./*": {
|
|
36
|
+
"require": "./*.js",
|
|
37
|
+
"import": "./*.mjs"
|
|
38
|
+
},
|
|
39
|
+
"./package.json": "./package.json"
|
|
40
|
+
}
|
|
41
|
+
}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { GraphQLResolveInfo, GraphQLSchema, GraphQLTypeResolver, GraphQLIsTypeOfFn } from 'graphql';
|
|
2
|
+
import { StitchingInfo } from '@graphql-tools/delegate';
|
|
3
|
+
export declare type IMiddlewareFragment = string;
|
|
4
|
+
export declare type IMiddlewareResolver<TSource = any, TContext = any, TArgs = any> = (resolve: (source?: TSource, args?: TArgs, context?: TContext, info?: GraphQLResolveInfo & {
|
|
5
|
+
stitchingInfo?: StitchingInfo;
|
|
6
|
+
}) => any, parent: TSource, args: TArgs, context: TContext, info: GraphQLResolveInfo) => Promise<any>;
|
|
7
|
+
export interface IMiddlewareWithOptions<TSource = any, TContext = any, TArgs = any> {
|
|
8
|
+
fragment?: IMiddlewareFragment;
|
|
9
|
+
fragments?: IMiddlewareFragment[];
|
|
10
|
+
resolve?: IMiddlewareResolver<TSource, TContext, TArgs>;
|
|
11
|
+
}
|
|
12
|
+
export declare type IMiddlewareFunction<TSource = any, TContext = any, TArgs = any> = IMiddlewareWithOptions<TSource, TContext, TArgs> | IMiddlewareResolver<TSource, TContext, TArgs>;
|
|
13
|
+
export interface IMiddlewareTypeMap<TSource = any, TContext = any, TArgs = any> {
|
|
14
|
+
[key: string]: IMiddlewareFunction<TSource, TContext, TArgs> | IMiddlewareFieldMap<TSource, TContext, TArgs>;
|
|
15
|
+
}
|
|
16
|
+
export interface IMiddlewareFieldMap<TSource = any, TContext = any, TArgs = any> {
|
|
17
|
+
[key: string]: IMiddlewareFunction<TSource, TContext, TArgs>;
|
|
18
|
+
}
|
|
19
|
+
export declare class IMiddlewareGenerator<TSource, TContext, TArgs> {
|
|
20
|
+
constructor(generator: IMiddlewareGeneratorConstructor<TSource, TContext, TArgs>);
|
|
21
|
+
generate(schema: GraphQLSchema): IMiddleware<TSource, TContext, TArgs>;
|
|
22
|
+
}
|
|
23
|
+
export declare type IMiddlewareGeneratorConstructor<TSource = any, TContext = any, TArgs = any> = (schema: GraphQLSchema) => IMiddleware<TSource, TContext, TArgs>;
|
|
24
|
+
export declare type IMiddleware<TSource = any, TContext = any, TArgs = any> = IMiddlewareFunction<TSource, TContext, TArgs> | IMiddlewareTypeMap<TSource, TContext, TArgs>;
|
|
25
|
+
export declare type IApplyOptions = {
|
|
26
|
+
onlyDeclaredResolvers: boolean;
|
|
27
|
+
};
|
|
28
|
+
export declare type GraphQLSchemaWithFragmentReplacements = GraphQLSchema & {
|
|
29
|
+
schema?: GraphQLSchema;
|
|
30
|
+
fragmentReplacements?: FragmentReplacement[];
|
|
31
|
+
};
|
|
32
|
+
export interface FragmentReplacement {
|
|
33
|
+
field: string;
|
|
34
|
+
fragment: string;
|
|
35
|
+
}
|
|
36
|
+
export interface IResolvers<TSource = any, TContext = any> {
|
|
37
|
+
[key: string]: IResolverObject<TSource, TContext>;
|
|
38
|
+
}
|
|
39
|
+
export interface IResolverObject<TSource = any, TContext = any> {
|
|
40
|
+
[key: string]: IFieldResolver<TSource, TContext> | IResolverOptions<TSource, TContext>;
|
|
41
|
+
}
|
|
42
|
+
export interface IResolverOptions<TSource = any, TContext = any> {
|
|
43
|
+
fragment?: string;
|
|
44
|
+
fragments?: string[];
|
|
45
|
+
resolve?: IFieldResolver<TSource, TContext>;
|
|
46
|
+
subscribe?: IFieldResolver<TSource, TContext>;
|
|
47
|
+
__resolveType?: GraphQLTypeResolver<TSource, TContext>;
|
|
48
|
+
__isTypeOf?: GraphQLIsTypeOfFn<TSource, TContext>;
|
|
49
|
+
}
|
|
50
|
+
export declare type IFieldResolver<TSource, TContext> = (source: TSource, args: {
|
|
51
|
+
[argument: string]: any;
|
|
52
|
+
}, context: TContext, info: GraphQLResolveInfo & {
|
|
53
|
+
stitchingInfo?: StitchingInfo;
|
|
54
|
+
}) => any;
|
package/dist/types.js
ADDED
package/dist/types.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { GraphQLObjectType, GraphQLInterfaceType } from 'graphql';
|
|
2
|
+
import { IMiddlewareResolver, IMiddlewareWithOptions, IMiddlewareFunction, IMiddlewareGenerator } from './types';
|
|
3
|
+
export declare function isMiddlewareResolver<TSource, TContext, TArgs>(obj: any): obj is IMiddlewareResolver<TSource, TContext, TArgs>;
|
|
4
|
+
export declare function isMiddlewareWithFragment<TSource, TContext, TArgs>(obj: any): obj is IMiddlewareWithOptions<TSource, TContext, TArgs>;
|
|
5
|
+
export declare function isMiddlewareFunction<TSource, TContext, TArgs>(obj: any): obj is IMiddlewareFunction<TSource, TContext, TArgs>;
|
|
6
|
+
export declare function isMiddlewareGenerator<TSource, TContext, TArgs>(x: any): x is IMiddlewareGenerator<TSource, TContext, TArgs>;
|
|
7
|
+
export declare function isGraphQLObjectType(obj: any): obj is GraphQLObjectType | GraphQLInterfaceType;
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
const graphql = require('graphql');
|
|
6
|
+
const generator = require('./generator.js');
|
|
7
|
+
|
|
8
|
+
function isMiddlewareResolver(obj) {
|
|
9
|
+
return typeof obj === "function" || typeof obj === "object" && obj.then !== void 0;
|
|
10
|
+
}
|
|
11
|
+
function isMiddlewareWithFragment(obj) {
|
|
12
|
+
return (typeof obj.fragment === "string" || typeof obj.fragments === "object") && isMiddlewareResolver(obj.resolve);
|
|
13
|
+
}
|
|
14
|
+
function isMiddlewareFunction(obj) {
|
|
15
|
+
return isMiddlewareWithFragment(obj) || isMiddlewareResolver(obj);
|
|
16
|
+
}
|
|
17
|
+
function isMiddlewareGenerator(x) {
|
|
18
|
+
return x instanceof generator.MiddlewareGenerator;
|
|
19
|
+
}
|
|
20
|
+
function isGraphQLObjectType(obj) {
|
|
21
|
+
return obj instanceof graphql.GraphQLObjectType || obj instanceof graphql.GraphQLInterfaceType;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
exports.isGraphQLObjectType = isGraphQLObjectType;
|
|
25
|
+
exports.isMiddlewareFunction = isMiddlewareFunction;
|
|
26
|
+
exports.isMiddlewareGenerator = isMiddlewareGenerator;
|
|
27
|
+
exports.isMiddlewareResolver = isMiddlewareResolver;
|
|
28
|
+
exports.isMiddlewareWithFragment = isMiddlewareWithFragment;
|
package/dist/utils.mjs
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { GraphQLObjectType, GraphQLInterfaceType } from 'graphql';
|
|
2
|
+
import { MiddlewareGenerator } from './generator.mjs';
|
|
3
|
+
|
|
4
|
+
function isMiddlewareResolver(obj) {
|
|
5
|
+
return typeof obj === "function" || typeof obj === "object" && obj.then !== void 0;
|
|
6
|
+
}
|
|
7
|
+
function isMiddlewareWithFragment(obj) {
|
|
8
|
+
return (typeof obj.fragment === "string" || typeof obj.fragments === "object") && isMiddlewareResolver(obj.resolve);
|
|
9
|
+
}
|
|
10
|
+
function isMiddlewareFunction(obj) {
|
|
11
|
+
return isMiddlewareWithFragment(obj) || isMiddlewareResolver(obj);
|
|
12
|
+
}
|
|
13
|
+
function isMiddlewareGenerator(x) {
|
|
14
|
+
return x instanceof MiddlewareGenerator;
|
|
15
|
+
}
|
|
16
|
+
function isGraphQLObjectType(obj) {
|
|
17
|
+
return obj instanceof GraphQLObjectType || obj instanceof GraphQLInterfaceType;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export { isGraphQLObjectType, isMiddlewareFunction, isMiddlewareGenerator, isMiddlewareResolver, isMiddlewareWithFragment };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { GraphQLSchema } from 'graphql';
|
|
2
|
+
import { IMiddleware } from './types';
|
|
3
|
+
export declare function validateMiddleware<TSource, TContext, TArgs>(schema: GraphQLSchema, middleware: IMiddleware<TSource, TContext, TArgs>): IMiddleware<TSource, TContext, TArgs>;
|
|
4
|
+
export declare class MiddlewareError extends Error {
|
|
5
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
const utils = require('./utils.js');
|
|
6
|
+
|
|
7
|
+
function validateMiddleware(schema, middleware) {
|
|
8
|
+
if (utils.isMiddlewareFunction(middleware)) {
|
|
9
|
+
return middleware;
|
|
10
|
+
}
|
|
11
|
+
const types = schema.getTypeMap();
|
|
12
|
+
Object.keys(middleware).forEach((type) => {
|
|
13
|
+
if (!Object.keys(types).includes(type)) {
|
|
14
|
+
throw new MiddlewareError(`Type ${type} exists in middleware but is missing in Schema.`);
|
|
15
|
+
}
|
|
16
|
+
if (!utils.isMiddlewareFunction(middleware[type])) {
|
|
17
|
+
const fields = types[type].getFields();
|
|
18
|
+
Object.keys(middleware[type]).forEach((field) => {
|
|
19
|
+
if (!Object.keys(fields).includes(field)) {
|
|
20
|
+
throw new MiddlewareError(`Field ${type}.${field} exists in middleware but is missing in Schema.`);
|
|
21
|
+
}
|
|
22
|
+
if (!utils.isMiddlewareFunction(middleware[type][field])) {
|
|
23
|
+
throw new MiddlewareError(`Expected ${type}.${field} to be a function but found ` + typeof middleware[type][field]);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
return middleware;
|
|
29
|
+
}
|
|
30
|
+
class MiddlewareError extends Error {
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
exports.MiddlewareError = MiddlewareError;
|
|
34
|
+
exports.validateMiddleware = validateMiddleware;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { isMiddlewareFunction } from './utils.mjs';
|
|
2
|
+
|
|
3
|
+
function validateMiddleware(schema, middleware) {
|
|
4
|
+
if (isMiddlewareFunction(middleware)) {
|
|
5
|
+
return middleware;
|
|
6
|
+
}
|
|
7
|
+
const types = schema.getTypeMap();
|
|
8
|
+
Object.keys(middleware).forEach((type) => {
|
|
9
|
+
if (!Object.keys(types).includes(type)) {
|
|
10
|
+
throw new MiddlewareError(`Type ${type} exists in middleware but is missing in Schema.`);
|
|
11
|
+
}
|
|
12
|
+
if (!isMiddlewareFunction(middleware[type])) {
|
|
13
|
+
const fields = types[type].getFields();
|
|
14
|
+
Object.keys(middleware[type]).forEach((field) => {
|
|
15
|
+
if (!Object.keys(fields).includes(field)) {
|
|
16
|
+
throw new MiddlewareError(`Field ${type}.${field} exists in middleware but is missing in Schema.`);
|
|
17
|
+
}
|
|
18
|
+
if (!isMiddlewareFunction(middleware[type][field])) {
|
|
19
|
+
throw new MiddlewareError(`Expected ${type}.${field} to be a function but found ` + typeof middleware[type][field]);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
return middleware;
|
|
25
|
+
}
|
|
26
|
+
class MiddlewareError extends Error {
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export { MiddlewareError, validateMiddleware };
|