@graphql-inspector/core 4.0.2 → 4.0.3
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/ast/document.js +40 -0
- package/cjs/coverage/index.js +128 -0
- package/cjs/coverage/output/json.js +7 -0
- package/cjs/diff/argument.js +25 -0
- package/cjs/diff/changes/argument.js +48 -0
- package/cjs/diff/changes/change.js +75 -0
- package/cjs/diff/changes/directive.js +124 -0
- package/cjs/diff/changes/enum.js +75 -0
- package/cjs/diff/changes/field.js +166 -0
- package/cjs/diff/changes/input.js +98 -0
- package/cjs/diff/changes/object.js +28 -0
- package/cjs/diff/changes/schema.js +40 -0
- package/cjs/diff/changes/type.js +72 -0
- package/cjs/diff/changes/union.js +28 -0
- package/cjs/diff/directive.js +41 -0
- package/cjs/diff/enum.js +34 -0
- package/cjs/diff/field.js +54 -0
- package/cjs/diff/index.js +22 -0
- package/cjs/diff/input.js +47 -0
- package/cjs/diff/interface.js +20 -0
- package/cjs/diff/object.js +33 -0
- package/cjs/diff/onComplete/types.js +0 -0
- package/cjs/diff/rules/config.js +0 -0
- package/cjs/diff/rules/consider-usage.js +39 -0
- package/cjs/diff/rules/dangerous-breaking.js +13 -0
- package/cjs/diff/rules/ignore-description-changes.js +21 -0
- package/cjs/diff/rules/index.js +8 -0
- package/cjs/diff/rules/safe-unreachable.js +19 -0
- package/cjs/diff/rules/suppress-removal-of-deprecated-field.js +58 -0
- package/cjs/diff/rules/types.js +0 -0
- package/cjs/diff/schema.js +107 -0
- package/cjs/diff/union.js +18 -0
- package/cjs/index.js +27 -0
- package/cjs/package.json +1 -0
- package/cjs/similar/index.js +57 -0
- package/cjs/utils/apollo.js +21 -0
- package/cjs/utils/compare.js +91 -0
- package/cjs/utils/graphql.js +194 -0
- package/cjs/utils/is-deprecated.js +17 -0
- package/cjs/utils/path.js +7 -0
- package/cjs/utils/string.js +70 -0
- package/cjs/validate/alias-count.js +37 -0
- package/cjs/validate/complexity.js +39 -0
- package/cjs/validate/directive-count.js +37 -0
- package/cjs/validate/index.js +143 -0
- package/cjs/validate/query-depth.js +103 -0
- package/cjs/validate/token-count.js +55 -0
- package/esm/ast/document.js +36 -0
- package/esm/coverage/index.js +124 -0
- package/esm/coverage/output/json.js +3 -0
- package/esm/diff/argument.js +21 -0
- package/esm/diff/changes/argument.js +42 -0
- package/esm/diff/changes/change.js +72 -0
- package/esm/diff/changes/directive.js +111 -0
- package/esm/diff/changes/enum.js +66 -0
- package/esm/diff/changes/field.js +150 -0
- package/esm/diff/changes/input.js +88 -0
- package/esm/diff/changes/object.js +23 -0
- package/esm/diff/changes/schema.js +34 -0
- package/esm/diff/changes/type.js +63 -0
- package/esm/diff/changes/union.js +23 -0
- package/esm/diff/directive.js +37 -0
- package/esm/diff/enum.js +30 -0
- package/esm/diff/field.js +50 -0
- package/esm/diff/index.js +18 -0
- package/esm/diff/input.js +43 -0
- package/esm/diff/interface.js +16 -0
- package/esm/diff/object.js +29 -0
- package/esm/diff/onComplete/types.js +0 -0
- package/esm/diff/rules/config.js +0 -0
- package/esm/diff/rules/consider-usage.js +35 -0
- package/esm/diff/rules/dangerous-breaking.js +9 -0
- package/esm/diff/rules/ignore-description-changes.js +17 -0
- package/esm/diff/rules/index.js +5 -0
- package/esm/diff/rules/safe-unreachable.js +15 -0
- package/esm/diff/rules/suppress-removal-of-deprecated-field.js +54 -0
- package/esm/diff/rules/types.js +0 -0
- package/esm/diff/schema.js +103 -0
- package/esm/diff/union.js +14 -0
- package/esm/index.js +11 -0
- package/esm/similar/index.js +53 -0
- package/esm/utils/apollo.js +16 -0
- package/esm/utils/compare.js +82 -0
- package/esm/utils/graphql.js +181 -0
- package/esm/utils/is-deprecated.js +13 -0
- package/esm/utils/path.js +3 -0
- package/esm/utils/string.js +64 -0
- package/esm/validate/alias-count.js +32 -0
- package/esm/validate/complexity.js +34 -0
- package/esm/validate/directive-count.js +32 -0
- package/esm/validate/index.js +139 -0
- package/esm/validate/query-depth.js +97 -0
- package/esm/validate/token-count.js +50 -0
- package/package.json +30 -9
- package/typings/ast/document.d.ts +15 -0
- package/typings/coverage/index.d.ts +51 -0
- package/typings/coverage/output/json.d.cts +2 -0
- package/{coverage → typings/coverage}/output/json.d.ts +1 -1
- package/typings/diff/argument.d.cts +3 -0
- package/{diff → typings/diff}/argument.d.ts +1 -1
- package/typings/diff/changes/argument.d.cts +5 -0
- package/{diff → typings/diff}/changes/argument.d.ts +1 -1
- package/typings/diff/changes/change.d.ts +69 -0
- package/typings/diff/changes/directive.d.cts +12 -0
- package/{diff → typings/diff}/changes/directive.d.ts +1 -1
- package/typings/diff/changes/enum.d.cts +8 -0
- package/{diff → typings/diff}/changes/enum.d.ts +1 -1
- package/typings/diff/changes/field.d.cts +15 -0
- package/{diff → typings/diff}/changes/field.d.ts +1 -1
- package/typings/diff/changes/input.d.cts +9 -0
- package/{diff → typings/diff}/changes/input.d.ts +1 -1
- package/typings/diff/changes/object.d.cts +4 -0
- package/{diff → typings/diff}/changes/object.d.ts +1 -1
- package/typings/diff/changes/schema.d.cts +5 -0
- package/{diff → typings/diff}/changes/schema.d.ts +1 -1
- package/typings/diff/changes/type.d.cts +8 -0
- package/{diff → typings/diff}/changes/type.d.ts +1 -1
- package/typings/diff/changes/union.d.cts +4 -0
- package/{diff → typings/diff}/changes/union.d.ts +1 -1
- package/typings/diff/directive.d.cts +3 -0
- package/{diff → typings/diff}/directive.d.ts +1 -1
- package/typings/diff/enum.d.cts +3 -0
- package/{diff → typings/diff}/enum.d.ts +1 -1
- package/typings/diff/field.d.cts +3 -0
- package/{diff → typings/diff}/field.d.ts +1 -1
- package/typings/diff/index.d.cts +9 -0
- package/typings/diff/index.d.ts +9 -0
- package/typings/diff/input.d.cts +3 -0
- package/{diff → typings/diff}/input.d.ts +1 -1
- package/typings/diff/interface.d.cts +3 -0
- package/{diff → typings/diff}/interface.d.ts +1 -1
- package/typings/diff/object.d.cts +3 -0
- package/{diff → typings/diff}/object.d.ts +1 -1
- package/typings/diff/onComplete/types.d.cts +7 -0
- package/typings/diff/onComplete/types.d.ts +7 -0
- package/typings/diff/rules/config.d.cts +2 -0
- package/typings/diff/rules/config.d.ts +2 -0
- package/typings/diff/rules/consider-usage.d.cts +29 -0
- package/{diff → typings/diff}/rules/consider-usage.d.ts +2 -2
- package/typings/diff/rules/dangerous-breaking.d.cts +2 -0
- package/{diff → typings/diff}/rules/dangerous-breaking.d.ts +1 -1
- package/typings/diff/rules/ignore-description-changes.d.cts +2 -0
- package/{diff → typings/diff}/rules/ignore-description-changes.d.ts +1 -1
- package/typings/diff/rules/index.d.cts +5 -0
- package/typings/diff/rules/index.d.ts +5 -0
- package/typings/diff/rules/safe-unreachable.d.cts +2 -0
- package/{diff → typings/diff}/rules/safe-unreachable.d.ts +1 -1
- package/typings/diff/rules/suppress-removal-of-deprecated-field.d.cts +2 -0
- package/{diff → typings/diff}/rules/suppress-removal-of-deprecated-field.d.ts +1 -1
- package/typings/diff/rules/types.d.cts +8 -0
- package/{diff → typings/diff}/rules/types.d.ts +2 -2
- package/typings/diff/schema.d.cts +4 -0
- package/{diff → typings/diff}/schema.d.ts +2 -2
- package/typings/diff/union.d.cts +3 -0
- package/{diff → typings/diff}/union.d.ts +1 -1
- package/typings/index.d.cts +12 -0
- package/typings/index.d.ts +12 -0
- package/typings/similar/index.d.cts +6 -0
- package/{similar → typings/similar}/index.d.ts +1 -1
- package/typings/utils/apollo.d.ts +5 -0
- package/typings/utils/compare.d.ts +22 -0
- package/typings/utils/graphql.d.ts +11 -0
- package/typings/utils/is-deprecated.d.cts +2 -0
- package/{utils → typings/utils}/is-deprecated.d.ts +1 -1
- package/typings/utils/path.d.ts +1 -0
- package/typings/utils/string.d.ts +14 -0
- package/typings/validate/alias-count.d.ts +10 -0
- package/typings/validate/complexity.d.cts +16 -0
- package/{validate → typings/validate}/complexity.d.ts +1 -1
- package/typings/validate/directive-count.d.ts +10 -0
- package/typings/validate/index.d.ts +49 -0
- package/typings/validate/query-depth.d.ts +15 -0
- package/typings/validate/token-count.d.ts +12 -0
- package/diff/index.d.ts +0 -9
- package/diff/onComplete/types.d.ts +0 -7
- package/diff/rules/config.d.ts +0 -2
- package/diff/rules/index.d.ts +0 -5
- package/index.d.ts +0 -12
- package/index.js +0 -2075
- package/index.mjs +0 -2061
- /package/{ast/document.d.ts → typings/ast/document.d.cts} +0 -0
- /package/{coverage/index.d.ts → typings/coverage/index.d.cts} +0 -0
- /package/{diff/changes/change.d.ts → typings/diff/changes/change.d.cts} +0 -0
- /package/{utils/apollo.d.ts → typings/utils/apollo.d.cts} +0 -0
- /package/{utils/compare.d.ts → typings/utils/compare.d.cts} +0 -0
- /package/{utils/graphql.d.ts → typings/utils/graphql.d.cts} +0 -0
- /package/{utils/path.d.ts → typings/utils/path.d.cts} +0 -0
- /package/{utils/string.d.ts → typings/utils/string.d.cts} +0 -0
- /package/{validate/alias-count.d.ts → typings/validate/alias-count.d.cts} +0 -0
- /package/{validate/directive-count.d.ts → typings/validate/directive-count.d.cts} +0 -0
- /package/{validate/index.d.ts → typings/validate/index.d.cts} +0 -0
- /package/{validate/query-depth.d.ts → typings/validate/query-depth.d.cts} +0 -0
- /package/{validate/token-count.d.ts → typings/validate/token-count.d.cts} +0 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readDocument = void 0;
|
|
4
|
+
const graphql_1 = require("graphql");
|
|
5
|
+
function readDocument(source) {
|
|
6
|
+
const result = {
|
|
7
|
+
source,
|
|
8
|
+
fragments: [],
|
|
9
|
+
operations: [],
|
|
10
|
+
hasFragments: false,
|
|
11
|
+
hasOperations: false,
|
|
12
|
+
};
|
|
13
|
+
const documentNode = (0, graphql_1.parse)(source.body);
|
|
14
|
+
const filepath = source.name;
|
|
15
|
+
const definitions = documentNode.definitions || [];
|
|
16
|
+
definitions.forEach((node) => {
|
|
17
|
+
if (isOperation(node)) {
|
|
18
|
+
result.operations.push({
|
|
19
|
+
node,
|
|
20
|
+
source: filepath,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
else if (isFragment(node)) {
|
|
24
|
+
result.fragments.push({
|
|
25
|
+
node,
|
|
26
|
+
source: filepath,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
result.hasFragments = result.fragments.length > 0;
|
|
31
|
+
result.hasOperations = result.operations.length > 0;
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
exports.readDocument = readDocument;
|
|
35
|
+
function isOperation(node) {
|
|
36
|
+
return node.kind === graphql_1.Kind.OPERATION_DEFINITION;
|
|
37
|
+
}
|
|
38
|
+
function isFragment(node) {
|
|
39
|
+
return node.kind === graphql_1.Kind.FRAGMENT_DEFINITION;
|
|
40
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.coverage = void 0;
|
|
4
|
+
const graphql_1 = require("graphql");
|
|
5
|
+
const document_js_1 = require("../ast/document.js");
|
|
6
|
+
const graphql_js_1 = require("../utils/graphql.js");
|
|
7
|
+
function coverage(schema, sources) {
|
|
8
|
+
const coverage = {
|
|
9
|
+
sources,
|
|
10
|
+
types: {},
|
|
11
|
+
stats: {
|
|
12
|
+
numTypes: 0,
|
|
13
|
+
numTypesCoveredFully: 0,
|
|
14
|
+
numTypesCovered: 0,
|
|
15
|
+
numFields: 0,
|
|
16
|
+
numFiledsCovered: 0,
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
const typeMap = schema.getTypeMap();
|
|
20
|
+
const typeInfo = new graphql_1.TypeInfo(schema);
|
|
21
|
+
const visitor = source => ({
|
|
22
|
+
Field(node) {
|
|
23
|
+
const fieldDef = typeInfo.getFieldDef();
|
|
24
|
+
const parent = typeInfo.getParentType();
|
|
25
|
+
if ((parent === null || parent === void 0 ? void 0 : parent.name) &&
|
|
26
|
+
!(0, graphql_js_1.isForIntrospection)(parent.name) &&
|
|
27
|
+
(fieldDef === null || fieldDef === void 0 ? void 0 : fieldDef.name) &&
|
|
28
|
+
fieldDef.name !== '__typename' &&
|
|
29
|
+
fieldDef.name !== '__schema') {
|
|
30
|
+
const sourceName = source.name;
|
|
31
|
+
const typeCoverage = coverage.types[parent.name];
|
|
32
|
+
const fieldCoverage = typeCoverage.children[fieldDef.name];
|
|
33
|
+
const locations = fieldCoverage.locations[sourceName];
|
|
34
|
+
typeCoverage.hits++;
|
|
35
|
+
fieldCoverage.hits++;
|
|
36
|
+
if (node.loc) {
|
|
37
|
+
fieldCoverage.locations[sourceName] = [node.loc, ...(locations || [])];
|
|
38
|
+
}
|
|
39
|
+
if (node.arguments) {
|
|
40
|
+
for (const argNode of node.arguments) {
|
|
41
|
+
const argCoverage = fieldCoverage.children[argNode.name.value];
|
|
42
|
+
argCoverage.hits++;
|
|
43
|
+
if (argNode.loc) {
|
|
44
|
+
argCoverage.locations[sourceName] = [
|
|
45
|
+
argNode.loc,
|
|
46
|
+
...(argCoverage.locations[sourceName] || []),
|
|
47
|
+
];
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
for (const typename in typeMap) {
|
|
55
|
+
if (!(0, graphql_js_1.isForIntrospection)(typename) && !(0, graphql_js_1.isPrimitive)(typename)) {
|
|
56
|
+
const type = typeMap[typename];
|
|
57
|
+
if ((0, graphql_1.isObjectType)(type) || (0, graphql_1.isInterfaceType)(type)) {
|
|
58
|
+
const typeCoverage = {
|
|
59
|
+
hits: 0,
|
|
60
|
+
fieldsCount: 0,
|
|
61
|
+
fieldsCountCovered: 0,
|
|
62
|
+
type,
|
|
63
|
+
children: {},
|
|
64
|
+
};
|
|
65
|
+
const fieldMap = type.getFields();
|
|
66
|
+
for (const fieldname in fieldMap) {
|
|
67
|
+
const field = fieldMap[fieldname];
|
|
68
|
+
typeCoverage.children[field.name] = {
|
|
69
|
+
hits: 0,
|
|
70
|
+
fieldsCount: 0,
|
|
71
|
+
fieldsCountCovered: 0,
|
|
72
|
+
locations: {},
|
|
73
|
+
children: {},
|
|
74
|
+
};
|
|
75
|
+
for (const arg of field.args) {
|
|
76
|
+
typeCoverage.children[field.name].children[arg.name] = {
|
|
77
|
+
hits: 0,
|
|
78
|
+
fieldsCount: 0,
|
|
79
|
+
fieldsCountCovered: 0,
|
|
80
|
+
locations: {},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
coverage.types[type.name] = typeCoverage;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const documents = coverage.sources.map(document_js_1.readDocument);
|
|
89
|
+
documents.forEach((doc, i) => {
|
|
90
|
+
const source = coverage.sources[i];
|
|
91
|
+
doc.operations.forEach(op => {
|
|
92
|
+
(0, graphql_1.visit)(op.node, (0, graphql_1.visitWithTypeInfo)(typeInfo, visitor(source)));
|
|
93
|
+
});
|
|
94
|
+
doc.fragments.forEach(fr => {
|
|
95
|
+
(0, graphql_1.visit)(fr.node, (0, graphql_1.visitWithTypeInfo)(typeInfo, visitor(source)));
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
for (const key in coverage.types) {
|
|
99
|
+
const me = coverage.types[key];
|
|
100
|
+
processStats(me);
|
|
101
|
+
coverage.stats.numTypes++;
|
|
102
|
+
if (me.fieldsCountCovered > 0)
|
|
103
|
+
coverage.stats.numTypesCovered++;
|
|
104
|
+
if (me.fieldsCount == me.fieldsCountCovered)
|
|
105
|
+
coverage.stats.numTypesCoveredFully++;
|
|
106
|
+
coverage.stats.numFields += me.fieldsCount;
|
|
107
|
+
coverage.stats.numFiledsCovered += me.fieldsCountCovered;
|
|
108
|
+
}
|
|
109
|
+
return coverage;
|
|
110
|
+
}
|
|
111
|
+
exports.coverage = coverage;
|
|
112
|
+
function processStats(me) {
|
|
113
|
+
const children = me.children;
|
|
114
|
+
if (children) {
|
|
115
|
+
for (const k in children) {
|
|
116
|
+
const ch = children[k];
|
|
117
|
+
if (ch.children !== undefined) {
|
|
118
|
+
processStats(ch);
|
|
119
|
+
me.fieldsCount += ch.fieldsCount;
|
|
120
|
+
me.fieldsCountCovered += ch.fieldsCountCovered;
|
|
121
|
+
}
|
|
122
|
+
me.fieldsCount++;
|
|
123
|
+
if (ch.hits > 0) {
|
|
124
|
+
me.fieldsCountCovered++;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.changesInArgument = void 0;
|
|
4
|
+
const compare_js_1 = require("../utils/compare.js");
|
|
5
|
+
const argument_js_1 = require("./changes/argument.js");
|
|
6
|
+
function changesInArgument(type, field, oldArg, newArg, addChange) {
|
|
7
|
+
if ((0, compare_js_1.isNotEqual)(oldArg.description, newArg.description)) {
|
|
8
|
+
addChange((0, argument_js_1.fieldArgumentDescriptionChanged)(type, field, oldArg, newArg));
|
|
9
|
+
}
|
|
10
|
+
if ((0, compare_js_1.isNotEqual)(oldArg.defaultValue, newArg.defaultValue)) {
|
|
11
|
+
if (Array.isArray(oldArg.defaultValue) && Array.isArray(newArg.defaultValue)) {
|
|
12
|
+
const diff = (0, compare_js_1.diffArrays)(oldArg.defaultValue, newArg.defaultValue);
|
|
13
|
+
if (diff.length > 0) {
|
|
14
|
+
addChange((0, argument_js_1.fieldArgumentDefaultChanged)(type, field, oldArg, newArg));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
else if (JSON.stringify(oldArg.defaultValue) !== JSON.stringify(newArg.defaultValue)) {
|
|
18
|
+
addChange((0, argument_js_1.fieldArgumentDefaultChanged)(type, field, oldArg, newArg));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if ((0, compare_js_1.isNotEqual)(oldArg.type.toString(), newArg.type.toString())) {
|
|
22
|
+
addChange((0, argument_js_1.fieldArgumentTypeChanged)(type, field, oldArg, newArg));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.changesInArgument = changesInArgument;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fieldArgumentTypeChanged = exports.fieldArgumentDefaultChanged = exports.fieldArgumentDescriptionChanged = void 0;
|
|
4
|
+
const graphql_js_1 = require("../../utils/graphql.js");
|
|
5
|
+
const string_js_1 = require("../../utils/string.js");
|
|
6
|
+
const change_js_1 = require("./change.js");
|
|
7
|
+
function fieldArgumentDescriptionChanged(type, field, oldArg, newArg) {
|
|
8
|
+
return {
|
|
9
|
+
criticality: {
|
|
10
|
+
level: change_js_1.CriticalityLevel.NonBreaking,
|
|
11
|
+
},
|
|
12
|
+
type: change_js_1.ChangeType.FieldArgumentDescriptionChanged,
|
|
13
|
+
message: `Description for argument '${newArg.name}' on field '${type.name}.${field.name}' changed from '${oldArg.description}' to '${newArg.description}'`,
|
|
14
|
+
path: [type.name, field.name, oldArg.name].join('.'),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
exports.fieldArgumentDescriptionChanged = fieldArgumentDescriptionChanged;
|
|
18
|
+
function fieldArgumentDefaultChanged(type, field, oldArg, newArg) {
|
|
19
|
+
return {
|
|
20
|
+
criticality: {
|
|
21
|
+
level: change_js_1.CriticalityLevel.Dangerous,
|
|
22
|
+
reason: 'Changing the default value for an argument may change the runtime behaviour of a field if it was never provided.',
|
|
23
|
+
},
|
|
24
|
+
type: change_js_1.ChangeType.FieldArgumentDefaultChanged,
|
|
25
|
+
message: typeof oldArg.defaultValue === 'undefined'
|
|
26
|
+
? `Default value '${(0, string_js_1.safeString)(newArg.defaultValue)}' was added to argument '${newArg.name}' on field '${type.name}.${field.name}'`
|
|
27
|
+
: `Default value for argument '${newArg.name}' on field '${type.name}.${field.name}' changed from '${(0, string_js_1.safeString)(oldArg.defaultValue)}' to '${(0, string_js_1.safeString)(newArg.defaultValue)}'`,
|
|
28
|
+
path: [type.name, field.name, oldArg.name].join('.'),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
exports.fieldArgumentDefaultChanged = fieldArgumentDefaultChanged;
|
|
32
|
+
function fieldArgumentTypeChanged(type, field, oldArg, newArg) {
|
|
33
|
+
return {
|
|
34
|
+
criticality: (0, graphql_js_1.safeChangeForInputValue)(oldArg.type, newArg.type)
|
|
35
|
+
? {
|
|
36
|
+
level: change_js_1.CriticalityLevel.NonBreaking,
|
|
37
|
+
reason: `Changing an input field from non-null to null is considered non-breaking.`,
|
|
38
|
+
}
|
|
39
|
+
: {
|
|
40
|
+
level: change_js_1.CriticalityLevel.Breaking,
|
|
41
|
+
reason: `Changing the type of a field's argument can cause existing queries that use this argument to error.`,
|
|
42
|
+
},
|
|
43
|
+
type: change_js_1.ChangeType.FieldArgumentTypeChanged,
|
|
44
|
+
message: `Type for argument '${newArg.name}' on field '${type.name}.${field.name}' changed from '${oldArg.type}' to '${newArg.type}'`,
|
|
45
|
+
path: [type.name, field.name, oldArg.name].join('.'),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
exports.fieldArgumentTypeChanged = fieldArgumentTypeChanged;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CriticalityLevel = exports.ChangeType = void 0;
|
|
4
|
+
var ChangeType;
|
|
5
|
+
(function (ChangeType) {
|
|
6
|
+
// Argument
|
|
7
|
+
ChangeType["FieldArgumentDescriptionChanged"] = "FIELD_ARGUMENT_DESCRIPTION_CHANGED";
|
|
8
|
+
ChangeType["FieldArgumentDefaultChanged"] = "FIELD_ARGUMENT_DEFAULT_CHANGED";
|
|
9
|
+
ChangeType["FieldArgumentTypeChanged"] = "FIELD_ARGUMENT_TYPE_CHANGED";
|
|
10
|
+
// Directive
|
|
11
|
+
ChangeType["DirectiveRemoved"] = "DIRECTIVE_REMOVED";
|
|
12
|
+
ChangeType["DirectiveAdded"] = "DIRECTIVE_ADDED";
|
|
13
|
+
ChangeType["DirectiveDescriptionChanged"] = "DIRECTIVE_DESCRIPTION_CHANGED";
|
|
14
|
+
ChangeType["DirectiveLocationAdded"] = "DIRECTIVE_LOCATION_ADDED";
|
|
15
|
+
ChangeType["DirectiveLocationRemoved"] = "DIRECTIVE_LOCATION_REMOVED";
|
|
16
|
+
ChangeType["DirectiveArgumentAdded"] = "DIRECTIVE_ARGUMENT_ADDED";
|
|
17
|
+
ChangeType["DirectiveArgumentRemoved"] = "DIRECTIVE_ARGUMENT_REMOVED";
|
|
18
|
+
ChangeType["DirectiveArgumentDescriptionChanged"] = "DIRECTIVE_ARGUMENT_DESCRIPTION_CHANGED";
|
|
19
|
+
ChangeType["DirectiveArgumentDefaultValueChanged"] = "DIRECTIVE_ARGUMENT_DEFAULT_VALUE_CHANGED";
|
|
20
|
+
ChangeType["DirectiveArgumentTypeChanged"] = "DIRECTIVE_ARGUMENT_TYPE_CHANGED";
|
|
21
|
+
// Enum
|
|
22
|
+
ChangeType["EnumValueRemoved"] = "ENUM_VALUE_REMOVED";
|
|
23
|
+
ChangeType["EnumValueAdded"] = "ENUM_VALUE_ADDED";
|
|
24
|
+
ChangeType["EnumValueDescriptionChanged"] = "ENUM_VALUE_DESCRIPTION_CHANGED";
|
|
25
|
+
ChangeType["EnumValueDeprecationReasonChanged"] = "ENUM_VALUE_DEPRECATION_REASON_CHANGED";
|
|
26
|
+
ChangeType["EnumValueDeprecationReasonAdded"] = "ENUM_VALUE_DEPRECATION_REASON_ADDED";
|
|
27
|
+
ChangeType["EnumValueDeprecationReasonRemoved"] = "ENUM_VALUE_DEPRECATION_REASON_REMOVED";
|
|
28
|
+
// Field
|
|
29
|
+
ChangeType["FieldRemoved"] = "FIELD_REMOVED";
|
|
30
|
+
ChangeType["FieldAdded"] = "FIELD_ADDED";
|
|
31
|
+
ChangeType["FieldDescriptionChanged"] = "FIELD_DESCRIPTION_CHANGED";
|
|
32
|
+
ChangeType["FieldDescriptionAdded"] = "FIELD_DESCRIPTION_ADDED";
|
|
33
|
+
ChangeType["FieldDescriptionRemoved"] = "FIELD_DESCRIPTION_REMOVED";
|
|
34
|
+
ChangeType["FieldDeprecationAdded"] = "FIELD_DEPRECATION_ADDED";
|
|
35
|
+
ChangeType["FieldDeprecationRemoved"] = "FIELD_DEPRECATION_REMOVED";
|
|
36
|
+
ChangeType["FieldDeprecationReasonChanged"] = "FIELD_DEPRECATION_REASON_CHANGED";
|
|
37
|
+
ChangeType["FieldDeprecationReasonAdded"] = "FIELD_DEPRECATION_REASON_ADDED";
|
|
38
|
+
ChangeType["FieldDeprecationReasonRemoved"] = "FIELD_DEPRECATION_REASON_REMOVED";
|
|
39
|
+
ChangeType["FieldTypeChanged"] = "FIELD_TYPE_CHANGED";
|
|
40
|
+
ChangeType["FieldArgumentAdded"] = "FIELD_ARGUMENT_ADDED";
|
|
41
|
+
ChangeType["FieldArgumentRemoved"] = "FIELD_ARGUMENT_REMOVED";
|
|
42
|
+
// Input
|
|
43
|
+
ChangeType["InputFieldRemoved"] = "INPUT_FIELD_REMOVED";
|
|
44
|
+
ChangeType["InputFieldAdded"] = "INPUT_FIELD_ADDED";
|
|
45
|
+
ChangeType["InputFieldDescriptionAdded"] = "INPUT_FIELD_DESCRIPTION_ADDED";
|
|
46
|
+
ChangeType["InputFieldDescriptionRemoved"] = "INPUT_FIELD_DESCRIPTION_REMOVED";
|
|
47
|
+
ChangeType["InputFieldDescriptionChanged"] = "INPUT_FIELD_DESCRIPTION_CHANGED";
|
|
48
|
+
ChangeType["InputFieldDefaultValueChanged"] = "INPUT_FIELD_DEFAULT_VALUE_CHANGED";
|
|
49
|
+
ChangeType["InputFieldTypeChanged"] = "INPUT_FIELD_TYPE_CHANGED";
|
|
50
|
+
// Type
|
|
51
|
+
ChangeType["ObjectTypeInterfaceAdded"] = "OBJECT_TYPE_INTERFACE_ADDED";
|
|
52
|
+
ChangeType["ObjectTypeInterfaceRemoved"] = "OBJECT_TYPE_INTERFACE_REMOVED";
|
|
53
|
+
// Schema
|
|
54
|
+
ChangeType["SchemaQueryTypeChanged"] = "SCHEMA_QUERY_TYPE_CHANGED";
|
|
55
|
+
ChangeType["SchemaMutationTypeChanged"] = "SCHEMA_MUTATION_TYPE_CHANGED";
|
|
56
|
+
ChangeType["SchemaSubscriptionTypeChanged"] = "SCHEMA_SUBSCRIPTION_TYPE_CHANGED";
|
|
57
|
+
// Type
|
|
58
|
+
ChangeType["TypeRemoved"] = "TYPE_REMOVED";
|
|
59
|
+
ChangeType["TypeAdded"] = "TYPE_ADDED";
|
|
60
|
+
ChangeType["TypeKindChanged"] = "TYPE_KIND_CHANGED";
|
|
61
|
+
ChangeType["TypeDescriptionChanged"] = "TYPE_DESCRIPTION_CHANGED";
|
|
62
|
+
// TODO
|
|
63
|
+
ChangeType["TypeDescriptionRemoved"] = "TYPE_DESCRIPTION_REMOVED";
|
|
64
|
+
// TODO
|
|
65
|
+
ChangeType["TypeDescriptionAdded"] = "TYPE_DESCRIPTION_ADDED";
|
|
66
|
+
// Union
|
|
67
|
+
ChangeType["UnionMemberRemoved"] = "UNION_MEMBER_REMOVED";
|
|
68
|
+
ChangeType["UnionMemberAdded"] = "UNION_MEMBER_ADDED";
|
|
69
|
+
})(ChangeType = exports.ChangeType || (exports.ChangeType = {}));
|
|
70
|
+
var CriticalityLevel;
|
|
71
|
+
(function (CriticalityLevel) {
|
|
72
|
+
CriticalityLevel["Breaking"] = "BREAKING";
|
|
73
|
+
CriticalityLevel["NonBreaking"] = "NON_BREAKING";
|
|
74
|
+
CriticalityLevel["Dangerous"] = "DANGEROUS";
|
|
75
|
+
})(CriticalityLevel = exports.CriticalityLevel || (exports.CriticalityLevel = {}));
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.directiveArgumentTypeChanged = exports.directiveArgumentDefaultValueChanged = exports.directiveArgumentDescriptionChanged = exports.directiveArgumentRemoved = exports.directiveArgumentAdded = exports.directiveLocationRemoved = exports.directiveLocationAdded = exports.directiveDescriptionChanged = exports.directiveAdded = exports.directiveRemoved = void 0;
|
|
4
|
+
const graphql_1 = require("graphql");
|
|
5
|
+
const graphql_js_1 = require("../../utils/graphql.js");
|
|
6
|
+
const change_js_1 = require("./change.js");
|
|
7
|
+
function directiveRemoved(directive) {
|
|
8
|
+
return {
|
|
9
|
+
criticality: {
|
|
10
|
+
level: change_js_1.CriticalityLevel.Breaking,
|
|
11
|
+
},
|
|
12
|
+
type: change_js_1.ChangeType.DirectiveRemoved,
|
|
13
|
+
message: `Directive '${directive.name}' was removed`,
|
|
14
|
+
path: `@${directive.name}`,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
exports.directiveRemoved = directiveRemoved;
|
|
18
|
+
function directiveAdded(directive) {
|
|
19
|
+
return {
|
|
20
|
+
criticality: {
|
|
21
|
+
level: change_js_1.CriticalityLevel.NonBreaking,
|
|
22
|
+
},
|
|
23
|
+
type: change_js_1.ChangeType.DirectiveAdded,
|
|
24
|
+
message: `Directive '${directive.name}' was added`,
|
|
25
|
+
path: `@${directive.name}`,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
exports.directiveAdded = directiveAdded;
|
|
29
|
+
function directiveDescriptionChanged(oldDirective, newDirective) {
|
|
30
|
+
return {
|
|
31
|
+
criticality: {
|
|
32
|
+
level: change_js_1.CriticalityLevel.NonBreaking,
|
|
33
|
+
},
|
|
34
|
+
type: change_js_1.ChangeType.DirectiveDescriptionChanged,
|
|
35
|
+
message: `Directive '${oldDirective.name}' description changed from '${oldDirective.description}' to '${newDirective.description}'`,
|
|
36
|
+
path: `@${oldDirective.name}`,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
exports.directiveDescriptionChanged = directiveDescriptionChanged;
|
|
40
|
+
function directiveLocationAdded(directive, location) {
|
|
41
|
+
return {
|
|
42
|
+
criticality: {
|
|
43
|
+
level: change_js_1.CriticalityLevel.NonBreaking,
|
|
44
|
+
},
|
|
45
|
+
type: change_js_1.ChangeType.DirectiveLocationAdded,
|
|
46
|
+
message: `Location '${location}' was added to directive '${directive.name}'`,
|
|
47
|
+
path: `@${directive.name}`,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
exports.directiveLocationAdded = directiveLocationAdded;
|
|
51
|
+
function directiveLocationRemoved(directive, location) {
|
|
52
|
+
return {
|
|
53
|
+
criticality: {
|
|
54
|
+
level: change_js_1.CriticalityLevel.Breaking,
|
|
55
|
+
},
|
|
56
|
+
type: change_js_1.ChangeType.DirectiveLocationRemoved,
|
|
57
|
+
message: `Location '${location}' was removed from directive '${directive.name}'`,
|
|
58
|
+
path: `@${directive.name}`,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
exports.directiveLocationRemoved = directiveLocationRemoved;
|
|
62
|
+
function directiveArgumentAdded(directive, arg) {
|
|
63
|
+
return {
|
|
64
|
+
criticality: {
|
|
65
|
+
level: (0, graphql_1.isNonNullType)(arg.type) ? change_js_1.CriticalityLevel.Breaking : change_js_1.CriticalityLevel.NonBreaking,
|
|
66
|
+
},
|
|
67
|
+
type: change_js_1.ChangeType.DirectiveArgumentAdded,
|
|
68
|
+
message: `Argument '${arg.name}' was added to directive '${directive.name}'`,
|
|
69
|
+
path: `@${directive.name}`,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
exports.directiveArgumentAdded = directiveArgumentAdded;
|
|
73
|
+
function directiveArgumentRemoved(directive, arg) {
|
|
74
|
+
return {
|
|
75
|
+
criticality: {
|
|
76
|
+
level: change_js_1.CriticalityLevel.Breaking,
|
|
77
|
+
},
|
|
78
|
+
type: change_js_1.ChangeType.DirectiveArgumentRemoved,
|
|
79
|
+
message: `Argument '${arg.name}' was removed from directive '${directive.name}'`,
|
|
80
|
+
path: `@${directive.name}.${arg.name}`,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
exports.directiveArgumentRemoved = directiveArgumentRemoved;
|
|
84
|
+
function directiveArgumentDescriptionChanged(directive, oldArg, newArg) {
|
|
85
|
+
return {
|
|
86
|
+
criticality: {
|
|
87
|
+
level: change_js_1.CriticalityLevel.NonBreaking,
|
|
88
|
+
},
|
|
89
|
+
type: change_js_1.ChangeType.DirectiveArgumentDescriptionChanged,
|
|
90
|
+
message: `Description for argument '${oldArg.name}' on directive '${directive.name}' changed from '${oldArg.description}' to '${newArg.description}'`,
|
|
91
|
+
path: `@${directive.name}.${oldArg.name}`,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
exports.directiveArgumentDescriptionChanged = directiveArgumentDescriptionChanged;
|
|
95
|
+
function directiveArgumentDefaultValueChanged(directive, oldArg, newArg) {
|
|
96
|
+
return {
|
|
97
|
+
criticality: {
|
|
98
|
+
level: change_js_1.CriticalityLevel.Dangerous,
|
|
99
|
+
reason: 'Changing the default value for an argument may change the runtime behaviour of a field if it was never provided.',
|
|
100
|
+
},
|
|
101
|
+
type: change_js_1.ChangeType.DirectiveArgumentDefaultValueChanged,
|
|
102
|
+
message: typeof oldArg.defaultValue === 'undefined'
|
|
103
|
+
? `Default value '${newArg.defaultValue}' was added to argument '${newArg.name}' on directive '${directive.name}'`
|
|
104
|
+
: `Default value for argument '${oldArg.name}' on directive '${directive.name}' changed from '${oldArg.defaultValue}' to '${newArg.defaultValue}'`,
|
|
105
|
+
path: `@${directive.name}.${oldArg.name}`,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
exports.directiveArgumentDefaultValueChanged = directiveArgumentDefaultValueChanged;
|
|
109
|
+
function directiveArgumentTypeChanged(directive, oldArg, newArg) {
|
|
110
|
+
return {
|
|
111
|
+
criticality: (0, graphql_js_1.safeChangeForInputValue)(oldArg.type, newArg.type)
|
|
112
|
+
? {
|
|
113
|
+
level: change_js_1.CriticalityLevel.NonBreaking,
|
|
114
|
+
reason: 'Changing an input field from non-null to null is considered non-breaking.',
|
|
115
|
+
}
|
|
116
|
+
: {
|
|
117
|
+
level: change_js_1.CriticalityLevel.Breaking,
|
|
118
|
+
},
|
|
119
|
+
type: change_js_1.ChangeType.DirectiveArgumentTypeChanged,
|
|
120
|
+
message: `Type for argument '${oldArg.name}' on directive '${directive.name}' changed from '${oldArg.type}' to '${newArg.type}'`,
|
|
121
|
+
path: `@${directive.name}.${oldArg.name}`,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
exports.directiveArgumentTypeChanged = directiveArgumentTypeChanged;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.enumValueDeprecationReasonRemoved = exports.enumValueDeprecationReasonAdded = exports.enumValueDeprecationReasonChanged = exports.enumValueDescriptionChanged = exports.enumValueAdded = exports.enumValueRemoved = void 0;
|
|
4
|
+
const is_deprecated_js_1 = require("../../utils/is-deprecated.js");
|
|
5
|
+
const change_js_1 = require("./change.js");
|
|
6
|
+
function enumValueRemoved(oldEnum, value) {
|
|
7
|
+
return {
|
|
8
|
+
criticality: {
|
|
9
|
+
level: change_js_1.CriticalityLevel.Breaking,
|
|
10
|
+
reason: `Removing an enum value will cause existing queries that use this enum value to error.`,
|
|
11
|
+
},
|
|
12
|
+
type: change_js_1.ChangeType.EnumValueRemoved,
|
|
13
|
+
message: `Enum value '${value.name}' ${(0, is_deprecated_js_1.isDeprecated)(value) ? '(deprecated) ' : ''}was removed from enum '${oldEnum.name}'`,
|
|
14
|
+
path: [oldEnum.name, value.name].join('.'),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
exports.enumValueRemoved = enumValueRemoved;
|
|
18
|
+
function enumValueAdded(newEnum, value) {
|
|
19
|
+
return {
|
|
20
|
+
criticality: {
|
|
21
|
+
level: change_js_1.CriticalityLevel.Dangerous,
|
|
22
|
+
reason: `Adding an enum value may break existing clients that were not programming defensively against an added case when querying an enum.`,
|
|
23
|
+
},
|
|
24
|
+
type: change_js_1.ChangeType.EnumValueAdded,
|
|
25
|
+
message: `Enum value '${value.name}' was added to enum '${newEnum.name}'`,
|
|
26
|
+
path: [newEnum.name, value.name].join('.'),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
exports.enumValueAdded = enumValueAdded;
|
|
30
|
+
function enumValueDescriptionChanged(newEnum, oldValue, newValue) {
|
|
31
|
+
return {
|
|
32
|
+
criticality: {
|
|
33
|
+
level: change_js_1.CriticalityLevel.NonBreaking,
|
|
34
|
+
},
|
|
35
|
+
type: change_js_1.ChangeType.EnumValueDescriptionChanged,
|
|
36
|
+
message: typeof oldValue.description === 'undefined'
|
|
37
|
+
? `Description '${newValue.description}' was added to enum value '${newEnum.name}.${newValue.name}'`
|
|
38
|
+
: `Description for enum value '${newEnum.name}.${newValue.name}' changed from '${oldValue.description}' to '${newValue.description}'`,
|
|
39
|
+
path: [newEnum.name, oldValue.name].join('.'),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
exports.enumValueDescriptionChanged = enumValueDescriptionChanged;
|
|
43
|
+
function enumValueDeprecationReasonChanged(newEnum, oldValue, newValue) {
|
|
44
|
+
return {
|
|
45
|
+
criticality: {
|
|
46
|
+
level: change_js_1.CriticalityLevel.NonBreaking,
|
|
47
|
+
},
|
|
48
|
+
type: change_js_1.ChangeType.EnumValueDeprecationReasonChanged,
|
|
49
|
+
message: `Enum value '${newEnum.name}.${newValue.name}' deprecation reason changed from '${oldValue.deprecationReason}' to '${newValue.deprecationReason}'`,
|
|
50
|
+
path: [newEnum.name, oldValue.name].join('.'),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
exports.enumValueDeprecationReasonChanged = enumValueDeprecationReasonChanged;
|
|
54
|
+
function enumValueDeprecationReasonAdded(newEnum, oldValue, newValue) {
|
|
55
|
+
return {
|
|
56
|
+
criticality: {
|
|
57
|
+
level: change_js_1.CriticalityLevel.NonBreaking,
|
|
58
|
+
},
|
|
59
|
+
type: change_js_1.ChangeType.EnumValueDeprecationReasonAdded,
|
|
60
|
+
message: `Enum value '${newEnum.name}.${newValue.name}' was deprecated with reason '${newValue.deprecationReason}'`,
|
|
61
|
+
path: [newEnum.name, oldValue.name].join('.'),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
exports.enumValueDeprecationReasonAdded = enumValueDeprecationReasonAdded;
|
|
65
|
+
function enumValueDeprecationReasonRemoved(newEnum, oldValue, newValue) {
|
|
66
|
+
return {
|
|
67
|
+
criticality: {
|
|
68
|
+
level: change_js_1.CriticalityLevel.NonBreaking,
|
|
69
|
+
},
|
|
70
|
+
type: change_js_1.ChangeType.EnumValueDeprecationReasonRemoved,
|
|
71
|
+
message: `Deprecation reason was removed from enum value '${newEnum.name}.${newValue.name}'`,
|
|
72
|
+
path: [newEnum.name, oldValue.name].join('.'),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
exports.enumValueDeprecationReasonRemoved = enumValueDeprecationReasonRemoved;
|