@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.
Files changed (193) hide show
  1. package/cjs/ast/document.js +40 -0
  2. package/cjs/coverage/index.js +128 -0
  3. package/cjs/coverage/output/json.js +7 -0
  4. package/cjs/diff/argument.js +25 -0
  5. package/cjs/diff/changes/argument.js +48 -0
  6. package/cjs/diff/changes/change.js +75 -0
  7. package/cjs/diff/changes/directive.js +124 -0
  8. package/cjs/diff/changes/enum.js +75 -0
  9. package/cjs/diff/changes/field.js +166 -0
  10. package/cjs/diff/changes/input.js +98 -0
  11. package/cjs/diff/changes/object.js +28 -0
  12. package/cjs/diff/changes/schema.js +40 -0
  13. package/cjs/diff/changes/type.js +72 -0
  14. package/cjs/diff/changes/union.js +28 -0
  15. package/cjs/diff/directive.js +41 -0
  16. package/cjs/diff/enum.js +34 -0
  17. package/cjs/diff/field.js +54 -0
  18. package/cjs/diff/index.js +22 -0
  19. package/cjs/diff/input.js +47 -0
  20. package/cjs/diff/interface.js +20 -0
  21. package/cjs/diff/object.js +33 -0
  22. package/cjs/diff/onComplete/types.js +0 -0
  23. package/cjs/diff/rules/config.js +0 -0
  24. package/cjs/diff/rules/consider-usage.js +39 -0
  25. package/cjs/diff/rules/dangerous-breaking.js +13 -0
  26. package/cjs/diff/rules/ignore-description-changes.js +21 -0
  27. package/cjs/diff/rules/index.js +8 -0
  28. package/cjs/diff/rules/safe-unreachable.js +19 -0
  29. package/cjs/diff/rules/suppress-removal-of-deprecated-field.js +58 -0
  30. package/cjs/diff/rules/types.js +0 -0
  31. package/cjs/diff/schema.js +107 -0
  32. package/cjs/diff/union.js +18 -0
  33. package/cjs/index.js +27 -0
  34. package/cjs/package.json +1 -0
  35. package/cjs/similar/index.js +57 -0
  36. package/cjs/utils/apollo.js +21 -0
  37. package/cjs/utils/compare.js +91 -0
  38. package/cjs/utils/graphql.js +194 -0
  39. package/cjs/utils/is-deprecated.js +17 -0
  40. package/cjs/utils/path.js +7 -0
  41. package/cjs/utils/string.js +70 -0
  42. package/cjs/validate/alias-count.js +37 -0
  43. package/cjs/validate/complexity.js +39 -0
  44. package/cjs/validate/directive-count.js +37 -0
  45. package/cjs/validate/index.js +143 -0
  46. package/cjs/validate/query-depth.js +103 -0
  47. package/cjs/validate/token-count.js +55 -0
  48. package/esm/ast/document.js +36 -0
  49. package/esm/coverage/index.js +124 -0
  50. package/esm/coverage/output/json.js +3 -0
  51. package/esm/diff/argument.js +21 -0
  52. package/esm/diff/changes/argument.js +42 -0
  53. package/esm/diff/changes/change.js +72 -0
  54. package/esm/diff/changes/directive.js +111 -0
  55. package/esm/diff/changes/enum.js +66 -0
  56. package/esm/diff/changes/field.js +150 -0
  57. package/esm/diff/changes/input.js +88 -0
  58. package/esm/diff/changes/object.js +23 -0
  59. package/esm/diff/changes/schema.js +34 -0
  60. package/esm/diff/changes/type.js +63 -0
  61. package/esm/diff/changes/union.js +23 -0
  62. package/esm/diff/directive.js +37 -0
  63. package/esm/diff/enum.js +30 -0
  64. package/esm/diff/field.js +50 -0
  65. package/esm/diff/index.js +18 -0
  66. package/esm/diff/input.js +43 -0
  67. package/esm/diff/interface.js +16 -0
  68. package/esm/diff/object.js +29 -0
  69. package/esm/diff/onComplete/types.js +0 -0
  70. package/esm/diff/rules/config.js +0 -0
  71. package/esm/diff/rules/consider-usage.js +35 -0
  72. package/esm/diff/rules/dangerous-breaking.js +9 -0
  73. package/esm/diff/rules/ignore-description-changes.js +17 -0
  74. package/esm/diff/rules/index.js +5 -0
  75. package/esm/diff/rules/safe-unreachable.js +15 -0
  76. package/esm/diff/rules/suppress-removal-of-deprecated-field.js +54 -0
  77. package/esm/diff/rules/types.js +0 -0
  78. package/esm/diff/schema.js +103 -0
  79. package/esm/diff/union.js +14 -0
  80. package/esm/index.js +11 -0
  81. package/esm/similar/index.js +53 -0
  82. package/esm/utils/apollo.js +16 -0
  83. package/esm/utils/compare.js +82 -0
  84. package/esm/utils/graphql.js +181 -0
  85. package/esm/utils/is-deprecated.js +13 -0
  86. package/esm/utils/path.js +3 -0
  87. package/esm/utils/string.js +64 -0
  88. package/esm/validate/alias-count.js +32 -0
  89. package/esm/validate/complexity.js +34 -0
  90. package/esm/validate/directive-count.js +32 -0
  91. package/esm/validate/index.js +139 -0
  92. package/esm/validate/query-depth.js +97 -0
  93. package/esm/validate/token-count.js +50 -0
  94. package/package.json +30 -9
  95. package/typings/ast/document.d.ts +15 -0
  96. package/typings/coverage/index.d.ts +51 -0
  97. package/typings/coverage/output/json.d.cts +2 -0
  98. package/{coverage → typings/coverage}/output/json.d.ts +1 -1
  99. package/typings/diff/argument.d.cts +3 -0
  100. package/{diff → typings/diff}/argument.d.ts +1 -1
  101. package/typings/diff/changes/argument.d.cts +5 -0
  102. package/{diff → typings/diff}/changes/argument.d.ts +1 -1
  103. package/typings/diff/changes/change.d.ts +69 -0
  104. package/typings/diff/changes/directive.d.cts +12 -0
  105. package/{diff → typings/diff}/changes/directive.d.ts +1 -1
  106. package/typings/diff/changes/enum.d.cts +8 -0
  107. package/{diff → typings/diff}/changes/enum.d.ts +1 -1
  108. package/typings/diff/changes/field.d.cts +15 -0
  109. package/{diff → typings/diff}/changes/field.d.ts +1 -1
  110. package/typings/diff/changes/input.d.cts +9 -0
  111. package/{diff → typings/diff}/changes/input.d.ts +1 -1
  112. package/typings/diff/changes/object.d.cts +4 -0
  113. package/{diff → typings/diff}/changes/object.d.ts +1 -1
  114. package/typings/diff/changes/schema.d.cts +5 -0
  115. package/{diff → typings/diff}/changes/schema.d.ts +1 -1
  116. package/typings/diff/changes/type.d.cts +8 -0
  117. package/{diff → typings/diff}/changes/type.d.ts +1 -1
  118. package/typings/diff/changes/union.d.cts +4 -0
  119. package/{diff → typings/diff}/changes/union.d.ts +1 -1
  120. package/typings/diff/directive.d.cts +3 -0
  121. package/{diff → typings/diff}/directive.d.ts +1 -1
  122. package/typings/diff/enum.d.cts +3 -0
  123. package/{diff → typings/diff}/enum.d.ts +1 -1
  124. package/typings/diff/field.d.cts +3 -0
  125. package/{diff → typings/diff}/field.d.ts +1 -1
  126. package/typings/diff/index.d.cts +9 -0
  127. package/typings/diff/index.d.ts +9 -0
  128. package/typings/diff/input.d.cts +3 -0
  129. package/{diff → typings/diff}/input.d.ts +1 -1
  130. package/typings/diff/interface.d.cts +3 -0
  131. package/{diff → typings/diff}/interface.d.ts +1 -1
  132. package/typings/diff/object.d.cts +3 -0
  133. package/{diff → typings/diff}/object.d.ts +1 -1
  134. package/typings/diff/onComplete/types.d.cts +7 -0
  135. package/typings/diff/onComplete/types.d.ts +7 -0
  136. package/typings/diff/rules/config.d.cts +2 -0
  137. package/typings/diff/rules/config.d.ts +2 -0
  138. package/typings/diff/rules/consider-usage.d.cts +29 -0
  139. package/{diff → typings/diff}/rules/consider-usage.d.ts +2 -2
  140. package/typings/diff/rules/dangerous-breaking.d.cts +2 -0
  141. package/{diff → typings/diff}/rules/dangerous-breaking.d.ts +1 -1
  142. package/typings/diff/rules/ignore-description-changes.d.cts +2 -0
  143. package/{diff → typings/diff}/rules/ignore-description-changes.d.ts +1 -1
  144. package/typings/diff/rules/index.d.cts +5 -0
  145. package/typings/diff/rules/index.d.ts +5 -0
  146. package/typings/diff/rules/safe-unreachable.d.cts +2 -0
  147. package/{diff → typings/diff}/rules/safe-unreachable.d.ts +1 -1
  148. package/typings/diff/rules/suppress-removal-of-deprecated-field.d.cts +2 -0
  149. package/{diff → typings/diff}/rules/suppress-removal-of-deprecated-field.d.ts +1 -1
  150. package/typings/diff/rules/types.d.cts +8 -0
  151. package/{diff → typings/diff}/rules/types.d.ts +2 -2
  152. package/typings/diff/schema.d.cts +4 -0
  153. package/{diff → typings/diff}/schema.d.ts +2 -2
  154. package/typings/diff/union.d.cts +3 -0
  155. package/{diff → typings/diff}/union.d.ts +1 -1
  156. package/typings/index.d.cts +12 -0
  157. package/typings/index.d.ts +12 -0
  158. package/typings/similar/index.d.cts +6 -0
  159. package/{similar → typings/similar}/index.d.ts +1 -1
  160. package/typings/utils/apollo.d.ts +5 -0
  161. package/typings/utils/compare.d.ts +22 -0
  162. package/typings/utils/graphql.d.ts +11 -0
  163. package/typings/utils/is-deprecated.d.cts +2 -0
  164. package/{utils → typings/utils}/is-deprecated.d.ts +1 -1
  165. package/typings/utils/path.d.ts +1 -0
  166. package/typings/utils/string.d.ts +14 -0
  167. package/typings/validate/alias-count.d.ts +10 -0
  168. package/typings/validate/complexity.d.cts +16 -0
  169. package/{validate → typings/validate}/complexity.d.ts +1 -1
  170. package/typings/validate/directive-count.d.ts +10 -0
  171. package/typings/validate/index.d.ts +49 -0
  172. package/typings/validate/query-depth.d.ts +15 -0
  173. package/typings/validate/token-count.d.ts +12 -0
  174. package/diff/index.d.ts +0 -9
  175. package/diff/onComplete/types.d.ts +0 -7
  176. package/diff/rules/config.d.ts +0 -2
  177. package/diff/rules/index.d.ts +0 -5
  178. package/index.d.ts +0 -12
  179. package/index.js +0 -2075
  180. package/index.mjs +0 -2061
  181. /package/{ast/document.d.ts → typings/ast/document.d.cts} +0 -0
  182. /package/{coverage/index.d.ts → typings/coverage/index.d.cts} +0 -0
  183. /package/{diff/changes/change.d.ts → typings/diff/changes/change.d.cts} +0 -0
  184. /package/{utils/apollo.d.ts → typings/utils/apollo.d.cts} +0 -0
  185. /package/{utils/compare.d.ts → typings/utils/compare.d.cts} +0 -0
  186. /package/{utils/graphql.d.ts → typings/utils/graphql.d.cts} +0 -0
  187. /package/{utils/path.d.ts → typings/utils/path.d.cts} +0 -0
  188. /package/{utils/string.d.ts → typings/utils/string.d.cts} +0 -0
  189. /package/{validate/alias-count.d.ts → typings/validate/alias-count.d.cts} +0 -0
  190. /package/{validate/directive-count.d.ts → typings/validate/directive-count.d.cts} +0 -0
  191. /package/{validate/index.d.ts → typings/validate/index.d.cts} +0 -0
  192. /package/{validate/query-depth.d.ts → typings/validate/query-depth.d.cts} +0 -0
  193. /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,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.outputJSON = void 0;
4
+ function outputJSON(coverage) {
5
+ return JSON.stringify(coverage, null, 2);
6
+ }
7
+ exports.outputJSON = outputJSON;
@@ -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;