@graphql-tools/optimize 1.1.1 → 1.3.0-alpha-b76ec274.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/cjs/index.js +8 -0
- package/cjs/optimize.js +29 -0
- package/cjs/optimizers/remove-description.js +28 -0
- package/cjs/optimizers/remove-empty-nodes.js +59 -0
- package/cjs/optimizers/remove-loc.js +19 -0
- package/cjs/package.json +1 -0
- package/cjs/types.js +2 -0
- package/esm/index.js +5 -0
- package/esm/optimize.js +25 -0
- package/esm/optimizers/remove-description.js +24 -0
- package/{index.mjs → esm/optimizers/remove-empty-nodes.js} +21 -66
- package/esm/optimizers/remove-loc.js +15 -0
- package/esm/types.js +1 -0
- package/package.json +35 -13
- package/typings/index.d.ts +5 -0
- package/{optimize.d.ts → typings/optimize.d.ts} +1 -1
- package/{optimizers → typings/optimizers}/remove-description.d.ts +1 -1
- package/{optimizers → typings/optimizers}/remove-empty-nodes.d.ts +1 -1
- package/{optimizers → typings/optimizers}/remove-loc.d.ts +1 -1
- package/{types.d.ts → typings/types.d.ts} +0 -0
- package/README.md +0 -45
- package/index.d.ts +0 -5
- package/index.js +0 -107
package/cjs/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./optimize.js"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./types.js"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./optimizers/remove-description.js"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./optimizers/remove-empty-nodes.js"), exports);
|
|
8
|
+
tslib_1.__exportStar(require("./optimizers/remove-loc.js"), exports);
|
package/cjs/optimize.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.optimizeDocumentNode = void 0;
|
|
4
|
+
const remove_description_js_1 = require("./optimizers/remove-description.js");
|
|
5
|
+
const remove_empty_nodes_js_1 = require("./optimizers/remove-empty-nodes.js");
|
|
6
|
+
const remove_loc_js_1 = require("./optimizers/remove-loc.js");
|
|
7
|
+
const DEFAULT_OPTIMIZERS = [remove_description_js_1.removeDescriptions, remove_empty_nodes_js_1.removeEmptyNodes, remove_loc_js_1.removeLoc];
|
|
8
|
+
/**
|
|
9
|
+
* This method accept a DocumentNode and applies the optimizations you wish to use.
|
|
10
|
+
* You can override the default ones or provide you own optimizers if you wish.
|
|
11
|
+
*
|
|
12
|
+
* @param node document to optimize
|
|
13
|
+
* @param optimizers optional, list of optimizer to use
|
|
14
|
+
*/
|
|
15
|
+
function optimizeDocumentNode(node, optimizers = DEFAULT_OPTIMIZERS) {
|
|
16
|
+
let resultNode = node;
|
|
17
|
+
for (const optimizer of optimizers) {
|
|
18
|
+
if (typeof optimizer !== 'function') {
|
|
19
|
+
throw new Error(`Optimizer provided for "optimizeDocumentNode" must be a function!`);
|
|
20
|
+
}
|
|
21
|
+
const result = optimizer(resultNode);
|
|
22
|
+
if (!result) {
|
|
23
|
+
throw new Error(`Optimizer provided for "optimizeDocumentNode" returned empty value instead of modified "DocumentNode"!`);
|
|
24
|
+
}
|
|
25
|
+
resultNode = result;
|
|
26
|
+
}
|
|
27
|
+
return resultNode;
|
|
28
|
+
}
|
|
29
|
+
exports.optimizeDocumentNode = optimizeDocumentNode;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.removeDescriptions = void 0;
|
|
4
|
+
const graphql_1 = require("graphql");
|
|
5
|
+
/**
|
|
6
|
+
* This optimizer removes "description" field from schema AST definitions.
|
|
7
|
+
* @param input
|
|
8
|
+
*/
|
|
9
|
+
const removeDescriptions = input => {
|
|
10
|
+
function transformNode(node) {
|
|
11
|
+
if (node.description) {
|
|
12
|
+
node.description = undefined;
|
|
13
|
+
}
|
|
14
|
+
return node;
|
|
15
|
+
}
|
|
16
|
+
return (0, graphql_1.visit)(input, {
|
|
17
|
+
ScalarTypeDefinition: transformNode,
|
|
18
|
+
ObjectTypeDefinition: transformNode,
|
|
19
|
+
InterfaceTypeDefinition: transformNode,
|
|
20
|
+
UnionTypeDefinition: transformNode,
|
|
21
|
+
EnumTypeDefinition: transformNode,
|
|
22
|
+
EnumValueDefinition: transformNode,
|
|
23
|
+
InputObjectTypeDefinition: transformNode,
|
|
24
|
+
InputValueDefinition: transformNode,
|
|
25
|
+
FieldDefinition: transformNode,
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
exports.removeDescriptions = removeDescriptions;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.removeEmptyNodes = void 0;
|
|
4
|
+
const graphql_1 = require("graphql");
|
|
5
|
+
/**
|
|
6
|
+
* This optimizer removes empty nodes/arrays (directives/argument/variableDefinitions) from a given DocumentNode of operation/fragment.
|
|
7
|
+
* @param input
|
|
8
|
+
*/
|
|
9
|
+
const removeEmptyNodes = input => {
|
|
10
|
+
function transformNode(node) {
|
|
11
|
+
let resultNode = node;
|
|
12
|
+
if (resultNode.directives && Array.isArray(resultNode.directives) && resultNode.directives.length === 0) {
|
|
13
|
+
const { directives, ...rest } = resultNode;
|
|
14
|
+
resultNode = rest;
|
|
15
|
+
}
|
|
16
|
+
if (resultNode.arguments && Array.isArray(resultNode.arguments) && resultNode.arguments.length === 0) {
|
|
17
|
+
const { arguments: args, ...rest } = resultNode;
|
|
18
|
+
resultNode = rest;
|
|
19
|
+
}
|
|
20
|
+
if (resultNode.variableDefinitions &&
|
|
21
|
+
Array.isArray(resultNode.variableDefinitions) &&
|
|
22
|
+
resultNode.variableDefinitions.length === 0) {
|
|
23
|
+
const { variableDefinitions, ...rest } = resultNode;
|
|
24
|
+
resultNode = rest;
|
|
25
|
+
}
|
|
26
|
+
return resultNode;
|
|
27
|
+
}
|
|
28
|
+
return (0, graphql_1.visit)(input, {
|
|
29
|
+
// Request/Operation:
|
|
30
|
+
FragmentDefinition: transformNode,
|
|
31
|
+
OperationDefinition: transformNode,
|
|
32
|
+
VariableDefinition: transformNode,
|
|
33
|
+
Field: transformNode,
|
|
34
|
+
FragmentSpread: transformNode,
|
|
35
|
+
InlineFragment: transformNode,
|
|
36
|
+
Name: transformNode,
|
|
37
|
+
Directive: transformNode,
|
|
38
|
+
// Schema Definition:
|
|
39
|
+
SchemaDefinition: transformNode,
|
|
40
|
+
ScalarTypeDefinition: transformNode,
|
|
41
|
+
ObjectTypeDefinition: transformNode,
|
|
42
|
+
InterfaceTypeDefinition: transformNode,
|
|
43
|
+
UnionTypeDefinition: transformNode,
|
|
44
|
+
EnumTypeDefinition: transformNode,
|
|
45
|
+
EnumValueDefinition: transformNode,
|
|
46
|
+
InputObjectTypeDefinition: transformNode,
|
|
47
|
+
FieldDefinition: transformNode,
|
|
48
|
+
InputValueDefinition: transformNode,
|
|
49
|
+
// Schema Extension:
|
|
50
|
+
SchemaExtension: transformNode,
|
|
51
|
+
ScalarTypeExtension: transformNode,
|
|
52
|
+
ObjectTypeExtension: transformNode,
|
|
53
|
+
InterfaceTypeExtension: transformNode,
|
|
54
|
+
UnionTypeExtension: transformNode,
|
|
55
|
+
EnumTypeExtension: transformNode,
|
|
56
|
+
InputObjectTypeExtension: transformNode,
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
exports.removeEmptyNodes = removeEmptyNodes;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.removeLoc = void 0;
|
|
4
|
+
const graphql_1 = require("graphql");
|
|
5
|
+
/**
|
|
6
|
+
* This optimizer removes "loc" fields
|
|
7
|
+
* @param input
|
|
8
|
+
*/
|
|
9
|
+
const removeLoc = input => {
|
|
10
|
+
function transformNode(node) {
|
|
11
|
+
if (node.loc && typeof node.loc === 'object') {
|
|
12
|
+
const { loc, ...rest } = node;
|
|
13
|
+
return rest;
|
|
14
|
+
}
|
|
15
|
+
return node;
|
|
16
|
+
}
|
|
17
|
+
return (0, graphql_1.visit)(input, { enter: transformNode });
|
|
18
|
+
};
|
|
19
|
+
exports.removeLoc = removeLoc;
|
package/cjs/package.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|
package/cjs/types.js
ADDED
package/esm/index.js
ADDED
package/esm/optimize.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { removeDescriptions } from './optimizers/remove-description.js';
|
|
2
|
+
import { removeEmptyNodes } from './optimizers/remove-empty-nodes.js';
|
|
3
|
+
import { removeLoc } from './optimizers/remove-loc.js';
|
|
4
|
+
const DEFAULT_OPTIMIZERS = [removeDescriptions, removeEmptyNodes, removeLoc];
|
|
5
|
+
/**
|
|
6
|
+
* This method accept a DocumentNode and applies the optimizations you wish to use.
|
|
7
|
+
* You can override the default ones or provide you own optimizers if you wish.
|
|
8
|
+
*
|
|
9
|
+
* @param node document to optimize
|
|
10
|
+
* @param optimizers optional, list of optimizer to use
|
|
11
|
+
*/
|
|
12
|
+
export function optimizeDocumentNode(node, optimizers = DEFAULT_OPTIMIZERS) {
|
|
13
|
+
let resultNode = node;
|
|
14
|
+
for (const optimizer of optimizers) {
|
|
15
|
+
if (typeof optimizer !== 'function') {
|
|
16
|
+
throw new Error(`Optimizer provided for "optimizeDocumentNode" must be a function!`);
|
|
17
|
+
}
|
|
18
|
+
const result = optimizer(resultNode);
|
|
19
|
+
if (!result) {
|
|
20
|
+
throw new Error(`Optimizer provided for "optimizeDocumentNode" returned empty value instead of modified "DocumentNode"!`);
|
|
21
|
+
}
|
|
22
|
+
resultNode = result;
|
|
23
|
+
}
|
|
24
|
+
return resultNode;
|
|
25
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { visit } from 'graphql';
|
|
2
|
+
/**
|
|
3
|
+
* This optimizer removes "description" field from schema AST definitions.
|
|
4
|
+
* @param input
|
|
5
|
+
*/
|
|
6
|
+
export const removeDescriptions = input => {
|
|
7
|
+
function transformNode(node) {
|
|
8
|
+
if (node.description) {
|
|
9
|
+
node.description = undefined;
|
|
10
|
+
}
|
|
11
|
+
return node;
|
|
12
|
+
}
|
|
13
|
+
return visit(input, {
|
|
14
|
+
ScalarTypeDefinition: transformNode,
|
|
15
|
+
ObjectTypeDefinition: transformNode,
|
|
16
|
+
InterfaceTypeDefinition: transformNode,
|
|
17
|
+
UnionTypeDefinition: transformNode,
|
|
18
|
+
EnumTypeDefinition: transformNode,
|
|
19
|
+
EnumValueDefinition: transformNode,
|
|
20
|
+
InputObjectTypeDefinition: transformNode,
|
|
21
|
+
InputValueDefinition: transformNode,
|
|
22
|
+
FieldDefinition: transformNode,
|
|
23
|
+
});
|
|
24
|
+
};
|
|
@@ -1,34 +1,9 @@
|
|
|
1
1
|
import { visit } from 'graphql';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* This optimizer removes "description" field from schema AST definitions.
|
|
5
|
-
* @param input
|
|
6
|
-
*/
|
|
7
|
-
const removeDescriptions = input => {
|
|
8
|
-
function transformNode(node) {
|
|
9
|
-
if (node.description) {
|
|
10
|
-
node.description = undefined;
|
|
11
|
-
}
|
|
12
|
-
return node;
|
|
13
|
-
}
|
|
14
|
-
return visit(input, {
|
|
15
|
-
ScalarTypeDefinition: transformNode,
|
|
16
|
-
ObjectTypeDefinition: transformNode,
|
|
17
|
-
InterfaceTypeDefinition: transformNode,
|
|
18
|
-
UnionTypeDefinition: transformNode,
|
|
19
|
-
EnumTypeDefinition: transformNode,
|
|
20
|
-
EnumValueDefinition: transformNode,
|
|
21
|
-
InputObjectTypeDefinition: transformNode,
|
|
22
|
-
InputValueDefinition: transformNode,
|
|
23
|
-
FieldDefinition: transformNode,
|
|
24
|
-
});
|
|
25
|
-
};
|
|
26
|
-
|
|
27
2
|
/**
|
|
28
3
|
* This optimizer removes empty nodes/arrays (directives/argument/variableDefinitions) from a given DocumentNode of operation/fragment.
|
|
29
4
|
* @param input
|
|
30
5
|
*/
|
|
31
|
-
const removeEmptyNodes = input => {
|
|
6
|
+
export const removeEmptyNodes = input => {
|
|
32
7
|
function transformNode(node) {
|
|
33
8
|
let resultNode = node;
|
|
34
9
|
if (resultNode.directives && Array.isArray(resultNode.directives) && resultNode.directives.length === 0) {
|
|
@@ -48,6 +23,7 @@ const removeEmptyNodes = input => {
|
|
|
48
23
|
return resultNode;
|
|
49
24
|
}
|
|
50
25
|
return visit(input, {
|
|
26
|
+
// Request/Operation:
|
|
51
27
|
FragmentDefinition: transformNode,
|
|
52
28
|
OperationDefinition: transformNode,
|
|
53
29
|
VariableDefinition: transformNode,
|
|
@@ -56,45 +32,24 @@ const removeEmptyNodes = input => {
|
|
|
56
32
|
InlineFragment: transformNode,
|
|
57
33
|
Name: transformNode,
|
|
58
34
|
Directive: transformNode,
|
|
35
|
+
// Schema Definition:
|
|
36
|
+
SchemaDefinition: transformNode,
|
|
37
|
+
ScalarTypeDefinition: transformNode,
|
|
38
|
+
ObjectTypeDefinition: transformNode,
|
|
39
|
+
InterfaceTypeDefinition: transformNode,
|
|
40
|
+
UnionTypeDefinition: transformNode,
|
|
41
|
+
EnumTypeDefinition: transformNode,
|
|
42
|
+
EnumValueDefinition: transformNode,
|
|
43
|
+
InputObjectTypeDefinition: transformNode,
|
|
44
|
+
FieldDefinition: transformNode,
|
|
45
|
+
InputValueDefinition: transformNode,
|
|
46
|
+
// Schema Extension:
|
|
47
|
+
SchemaExtension: transformNode,
|
|
48
|
+
ScalarTypeExtension: transformNode,
|
|
49
|
+
ObjectTypeExtension: transformNode,
|
|
50
|
+
InterfaceTypeExtension: transformNode,
|
|
51
|
+
UnionTypeExtension: transformNode,
|
|
52
|
+
EnumTypeExtension: transformNode,
|
|
53
|
+
InputObjectTypeExtension: transformNode,
|
|
59
54
|
});
|
|
60
55
|
};
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* This optimizer removes "loc" fields
|
|
64
|
-
* @param input
|
|
65
|
-
*/
|
|
66
|
-
const removeLoc = input => {
|
|
67
|
-
function transformNode(node) {
|
|
68
|
-
if (node.loc && typeof node.loc === 'object') {
|
|
69
|
-
const { loc, ...rest } = node;
|
|
70
|
-
return rest;
|
|
71
|
-
}
|
|
72
|
-
return node;
|
|
73
|
-
}
|
|
74
|
-
return visit(input, { enter: transformNode });
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
const DEFAULT_OPTIMIZERS = [removeDescriptions, removeEmptyNodes, removeLoc];
|
|
78
|
-
/**
|
|
79
|
-
* This method accept a DocumentNode and applies the optimizations you wish to use.
|
|
80
|
-
* You can override the default ones or provide you own optimizers if you wish.
|
|
81
|
-
*
|
|
82
|
-
* @param node document to optimize
|
|
83
|
-
* @param optimizers optional, list of optimizer to use
|
|
84
|
-
*/
|
|
85
|
-
function optimizeDocumentNode(node, optimizers = DEFAULT_OPTIMIZERS) {
|
|
86
|
-
let resultNode = node;
|
|
87
|
-
for (const optimizer of optimizers) {
|
|
88
|
-
if (typeof optimizer !== 'function') {
|
|
89
|
-
throw new Error(`Optimizer provided for "optimizeDocumentNode" must be a function!`);
|
|
90
|
-
}
|
|
91
|
-
const result = optimizer(resultNode);
|
|
92
|
-
if (!result) {
|
|
93
|
-
throw new Error(`Optimizer provided for "optimizeDocumentNode" returned empty value instead of modified "DocumentNode"!`);
|
|
94
|
-
}
|
|
95
|
-
resultNode = result;
|
|
96
|
-
}
|
|
97
|
-
return resultNode;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
export { optimizeDocumentNode, removeDescriptions, removeEmptyNodes, removeLoc };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { visit } from 'graphql';
|
|
2
|
+
/**
|
|
3
|
+
* This optimizer removes "loc" fields
|
|
4
|
+
* @param input
|
|
5
|
+
*/
|
|
6
|
+
export const removeLoc = input => {
|
|
7
|
+
function transformNode(node) {
|
|
8
|
+
if (node.loc && typeof node.loc === 'object') {
|
|
9
|
+
const { loc, ...rest } = node;
|
|
10
|
+
return rest;
|
|
11
|
+
}
|
|
12
|
+
return node;
|
|
13
|
+
}
|
|
14
|
+
return visit(input, { enter: transformNode });
|
|
15
|
+
};
|
package/esm/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@graphql-tools/optimize",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0-alpha-b76ec274.0",
|
|
4
4
|
"description": "A set of utils for faster development of GraphQL tools",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"peerDependencies": {
|
|
7
|
-
"graphql": "^14.0.0 || ^15.0.0 || ^16.0.0"
|
|
7
|
+
"graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"tslib": "
|
|
10
|
+
"tslib": "^2.4.0"
|
|
11
11
|
},
|
|
12
12
|
"repository": {
|
|
13
13
|
"type": "git",
|
|
@@ -15,20 +15,42 @@
|
|
|
15
15
|
"directory": "packages/optimize"
|
|
16
16
|
},
|
|
17
17
|
"license": "MIT",
|
|
18
|
-
"main": "index.js",
|
|
19
|
-
"module": "index.
|
|
20
|
-
"typings": "index.d.ts",
|
|
18
|
+
"main": "cjs/index.js",
|
|
19
|
+
"module": "esm/index.js",
|
|
20
|
+
"typings": "typings/index.d.ts",
|
|
21
21
|
"typescript": {
|
|
22
|
-
"definition": "index.d.ts"
|
|
22
|
+
"definition": "typings/index.d.ts"
|
|
23
23
|
},
|
|
24
|
+
"type": "module",
|
|
24
25
|
"exports": {
|
|
25
26
|
".": {
|
|
26
|
-
"require":
|
|
27
|
-
|
|
27
|
+
"require": {
|
|
28
|
+
"types": "./typings/index.d.ts",
|
|
29
|
+
"default": "./cjs/index.js"
|
|
30
|
+
},
|
|
31
|
+
"import": {
|
|
32
|
+
"types": "./typings/index.d.ts",
|
|
33
|
+
"default": "./esm/index.js"
|
|
34
|
+
},
|
|
35
|
+
"default": {
|
|
36
|
+
"types": "./typings/index.d.ts",
|
|
37
|
+
"default": "./esm/index.js"
|
|
38
|
+
}
|
|
28
39
|
},
|
|
29
40
|
"./*": {
|
|
30
|
-
"require":
|
|
31
|
-
|
|
32
|
-
|
|
41
|
+
"require": {
|
|
42
|
+
"types": "./typings/*.d.ts",
|
|
43
|
+
"default": "./cjs/*.js"
|
|
44
|
+
},
|
|
45
|
+
"import": {
|
|
46
|
+
"types": "./typings/*.d.ts",
|
|
47
|
+
"default": "./esm/*.js"
|
|
48
|
+
},
|
|
49
|
+
"default": {
|
|
50
|
+
"types": "./typings/*.d.ts",
|
|
51
|
+
"default": "./esm/*.js"
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"./package.json": "./package.json"
|
|
33
55
|
}
|
|
34
|
-
}
|
|
56
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DocumentNode } from 'graphql';
|
|
2
|
-
import { DocumentOptimizer } from './types';
|
|
2
|
+
import { DocumentOptimizer } from './types.js';
|
|
3
3
|
/**
|
|
4
4
|
* This method accept a DocumentNode and applies the optimizations you wish to use.
|
|
5
5
|
* You can override the default ones or provide you own optimizers if you wish.
|
|
File without changes
|
package/README.md
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# GraphQL Tools: `DocumentNode` Optimizer
|
|
2
|
-
|
|
3
|
-
This package is intended to allow developers to optimize `DocumentNode` objects created by `graphql` library.
|
|
4
|
-
|
|
5
|
-
It's built as a set of small optimizers you can compose to get the most out of your GraphQL setup.
|
|
6
|
-
|
|
7
|
-
The goal of this package is mostly around making optimizations for the way the data is stored in `DocumentNode`, and not to the essence of the `DocumentNode`.
|
|
8
|
-
|
|
9
|
-
## Getting Started
|
|
10
|
-
|
|
11
|
-
yarn add -D @graphql-tools/optimize
|
|
12
|
-
|
|
13
|
-
## API
|
|
14
|
-
|
|
15
|
-
To get started with this tool, import it and run it over your `DocumentNode`.
|
|
16
|
-
|
|
17
|
-
```ts
|
|
18
|
-
import { optimizeDocumentNode } from '@graphql-tools/optimize';
|
|
19
|
-
|
|
20
|
-
const myDocument: DocumentNode = { ... }
|
|
21
|
-
const optimizedDocument = optimizeDocumentNode(myDocument);
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
### Customizing Optimizers
|
|
25
|
-
|
|
26
|
-
By default, we apply all optimizers available in this repo over your document. It shouldn't effect any runtime since we just remove dead or unused areas.
|
|
27
|
-
|
|
28
|
-
You can modify the list of optimizers this way:
|
|
29
|
-
|
|
30
|
-
```ts
|
|
31
|
-
import { optimizeDocumentNode, removeDescriptions } from '@graphql-tools/optimize';
|
|
32
|
-
|
|
33
|
-
const myDocument: DocumentNode = { ... }
|
|
34
|
-
const optimizedDocument = optimizeDocumentNode(myDocument, [removeDescriptions]);
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
### Writing your own optimizer
|
|
38
|
-
|
|
39
|
-
You can create your own optimizer to manipulate `DocumentNode`, the API signature is pretty simple:
|
|
40
|
-
|
|
41
|
-
```ts
|
|
42
|
-
export type DocumentOptimizer = (input: DocumentNode) => DocumentNode;
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
Take a look at [./optimizers](this directory for inspiration and implementation reference).
|
package/index.d.ts
DELETED
package/index.js
DELETED
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
const graphql = require('graphql');
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* This optimizer removes "description" field from schema AST definitions.
|
|
9
|
-
* @param input
|
|
10
|
-
*/
|
|
11
|
-
const removeDescriptions = input => {
|
|
12
|
-
function transformNode(node) {
|
|
13
|
-
if (node.description) {
|
|
14
|
-
node.description = undefined;
|
|
15
|
-
}
|
|
16
|
-
return node;
|
|
17
|
-
}
|
|
18
|
-
return graphql.visit(input, {
|
|
19
|
-
ScalarTypeDefinition: transformNode,
|
|
20
|
-
ObjectTypeDefinition: transformNode,
|
|
21
|
-
InterfaceTypeDefinition: transformNode,
|
|
22
|
-
UnionTypeDefinition: transformNode,
|
|
23
|
-
EnumTypeDefinition: transformNode,
|
|
24
|
-
EnumValueDefinition: transformNode,
|
|
25
|
-
InputObjectTypeDefinition: transformNode,
|
|
26
|
-
InputValueDefinition: transformNode,
|
|
27
|
-
FieldDefinition: transformNode,
|
|
28
|
-
});
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* This optimizer removes empty nodes/arrays (directives/argument/variableDefinitions) from a given DocumentNode of operation/fragment.
|
|
33
|
-
* @param input
|
|
34
|
-
*/
|
|
35
|
-
const removeEmptyNodes = input => {
|
|
36
|
-
function transformNode(node) {
|
|
37
|
-
let resultNode = node;
|
|
38
|
-
if (resultNode.directives && Array.isArray(resultNode.directives) && resultNode.directives.length === 0) {
|
|
39
|
-
const { directives, ...rest } = resultNode;
|
|
40
|
-
resultNode = rest;
|
|
41
|
-
}
|
|
42
|
-
if (resultNode.arguments && Array.isArray(resultNode.arguments) && resultNode.arguments.length === 0) {
|
|
43
|
-
const { arguments: args, ...rest } = resultNode;
|
|
44
|
-
resultNode = rest;
|
|
45
|
-
}
|
|
46
|
-
if (resultNode.variableDefinitions &&
|
|
47
|
-
Array.isArray(resultNode.variableDefinitions) &&
|
|
48
|
-
resultNode.variableDefinitions.length === 0) {
|
|
49
|
-
const { variableDefinitions, ...rest } = resultNode;
|
|
50
|
-
resultNode = rest;
|
|
51
|
-
}
|
|
52
|
-
return resultNode;
|
|
53
|
-
}
|
|
54
|
-
return graphql.visit(input, {
|
|
55
|
-
FragmentDefinition: transformNode,
|
|
56
|
-
OperationDefinition: transformNode,
|
|
57
|
-
VariableDefinition: transformNode,
|
|
58
|
-
Field: transformNode,
|
|
59
|
-
FragmentSpread: transformNode,
|
|
60
|
-
InlineFragment: transformNode,
|
|
61
|
-
Name: transformNode,
|
|
62
|
-
Directive: transformNode,
|
|
63
|
-
});
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* This optimizer removes "loc" fields
|
|
68
|
-
* @param input
|
|
69
|
-
*/
|
|
70
|
-
const removeLoc = input => {
|
|
71
|
-
function transformNode(node) {
|
|
72
|
-
if (node.loc && typeof node.loc === 'object') {
|
|
73
|
-
const { loc, ...rest } = node;
|
|
74
|
-
return rest;
|
|
75
|
-
}
|
|
76
|
-
return node;
|
|
77
|
-
}
|
|
78
|
-
return graphql.visit(input, { enter: transformNode });
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
const DEFAULT_OPTIMIZERS = [removeDescriptions, removeEmptyNodes, removeLoc];
|
|
82
|
-
/**
|
|
83
|
-
* This method accept a DocumentNode and applies the optimizations you wish to use.
|
|
84
|
-
* You can override the default ones or provide you own optimizers if you wish.
|
|
85
|
-
*
|
|
86
|
-
* @param node document to optimize
|
|
87
|
-
* @param optimizers optional, list of optimizer to use
|
|
88
|
-
*/
|
|
89
|
-
function optimizeDocumentNode(node, optimizers = DEFAULT_OPTIMIZERS) {
|
|
90
|
-
let resultNode = node;
|
|
91
|
-
for (const optimizer of optimizers) {
|
|
92
|
-
if (typeof optimizer !== 'function') {
|
|
93
|
-
throw new Error(`Optimizer provided for "optimizeDocumentNode" must be a function!`);
|
|
94
|
-
}
|
|
95
|
-
const result = optimizer(resultNode);
|
|
96
|
-
if (!result) {
|
|
97
|
-
throw new Error(`Optimizer provided for "optimizeDocumentNode" returned empty value instead of modified "DocumentNode"!`);
|
|
98
|
-
}
|
|
99
|
-
resultNode = result;
|
|
100
|
-
}
|
|
101
|
-
return resultNode;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
exports.optimizeDocumentNode = optimizeDocumentNode;
|
|
105
|
-
exports.removeDescriptions = removeDescriptions;
|
|
106
|
-
exports.removeEmptyNodes = removeEmptyNodes;
|
|
107
|
-
exports.removeLoc = removeLoc;
|