@graphql-inspector/cli 3.4.12 → 3.4.13-alpha-20230413084834-8074e32d

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 (61) hide show
  1. package/cjs/core/src/diff/changes/argument.js +80 -19
  2. package/cjs/core/src/diff/changes/directive.js +208 -39
  3. package/cjs/core/src/diff/changes/enum.js +123 -25
  4. package/cjs/core/src/diff/changes/field.js +260 -69
  5. package/cjs/core/src/diff/changes/input.js +153 -34
  6. package/cjs/core/src/diff/changes/object.js +37 -9
  7. package/cjs/core/src/diff/changes/schema.js +55 -13
  8. package/cjs/core/src/diff/changes/type.js +106 -19
  9. package/cjs/core/src/diff/changes/union.js +35 -7
  10. package/cjs/core/src/diff/rules/consider-usage.js +1 -1
  11. package/cjs/core/src/index.js +63 -1
  12. package/cjs/core/src/utils/is-deprecated.js +1 -1
  13. package/cjs/core/src/utils/string.js +3 -0
  14. package/cjs/github/src/helpers/config.js +6 -2
  15. package/cjs/github/src/helpers/utils.js +1 -1
  16. package/esm/core/src/diff/changes/argument.js +77 -19
  17. package/esm/core/src/diff/changes/directive.js +198 -39
  18. package/esm/core/src/diff/changes/enum.js +117 -25
  19. package/esm/core/src/diff/changes/field.js +240 -62
  20. package/esm/core/src/diff/changes/input.js +145 -34
  21. package/esm/core/src/diff/changes/object.js +35 -9
  22. package/esm/core/src/diff/changes/schema.js +50 -11
  23. package/esm/core/src/diff/changes/type.js +100 -19
  24. package/esm/core/src/diff/changes/union.js +33 -7
  25. package/esm/core/src/diff/rules/consider-usage.js +1 -1
  26. package/esm/core/src/index.js +9 -0
  27. package/esm/core/src/utils/is-deprecated.js +1 -1
  28. package/esm/core/src/utils/string.js +3 -0
  29. package/esm/github/src/helpers/config.js +6 -2
  30. package/esm/github/src/helpers/utils.js +1 -1
  31. package/package.json +7 -7
  32. package/typings/core/src/diff/changes/argument.d.cts +52 -4
  33. package/typings/core/src/diff/changes/argument.d.ts +52 -4
  34. package/typings/core/src/diff/changes/change.d.cts +500 -2
  35. package/typings/core/src/diff/changes/change.d.ts +500 -2
  36. package/typings/core/src/diff/changes/directive.d.cts +147 -11
  37. package/typings/core/src/diff/changes/directive.d.ts +147 -11
  38. package/typings/core/src/diff/changes/enum.d.cts +75 -7
  39. package/typings/core/src/diff/changes/enum.d.ts +75 -7
  40. package/typings/core/src/diff/changes/field.d.cts +189 -14
  41. package/typings/core/src/diff/changes/field.d.ts +189 -14
  42. package/typings/core/src/diff/changes/input.d.cts +112 -8
  43. package/typings/core/src/diff/changes/input.d.ts +112 -8
  44. package/typings/core/src/diff/changes/object.d.cts +29 -3
  45. package/typings/core/src/diff/changes/object.d.ts +29 -3
  46. package/typings/core/src/diff/changes/schema.d.cts +37 -4
  47. package/typings/core/src/diff/changes/schema.d.ts +37 -4
  48. package/typings/core/src/diff/changes/type.d.cts +80 -7
  49. package/typings/core/src/diff/changes/type.d.ts +80 -7
  50. package/typings/core/src/diff/changes/union.d.cts +29 -3
  51. package/typings/core/src/diff/changes/union.d.ts +29 -3
  52. package/typings/core/src/index.d.cts +10 -0
  53. package/typings/core/src/index.d.ts +10 -0
  54. package/typings/core/src/utils/is-deprecated.d.cts +1 -1
  55. package/typings/core/src/utils/is-deprecated.d.ts +1 -1
  56. package/typings/core/src/utils/string.d.cts +1 -1
  57. package/typings/core/src/utils/string.d.ts +1 -1
  58. package/typings/core/utils/testing.d.cts +2 -2
  59. package/typings/core/utils/testing.d.ts +2 -2
  60. package/typings/github/src/helpers/utils.d.cts +1 -1
  61. package/typings/github/src/helpers/utils.d.ts +1 -1
@@ -31,7 +31,7 @@ const considerUsage = ({ changes, config }) => tslib_1.__awaiter(void 0, void 0,
31
31
  if (change.criticality.level === change_js_1.CriticalityLevel.Breaking &&
32
32
  change.path &&
33
33
  suppressedPaths.some(p => change.path.startsWith(p))) {
34
- return Object.assign(Object.assign({}, change), { criticality: Object.assign(Object.assign({}, change.criticality), { level: change_js_1.CriticalityLevel.Dangerous }), message: `${change.message} (non-breaking based on usage)` });
34
+ return Object.assign(Object.assign({}, change), { criticality: Object.assign(Object.assign({}, change.criticality), { level: change_js_1.CriticalityLevel.Dangerous, isSafeBasedOnUsage: true }), message: `${change.message} (non-breaking based on usage)` });
35
35
  }
36
36
  return change;
37
37
  });
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.calculateTokenCount = exports.countDepth = exports.countDirectives = exports.calculateOperationComplexity = exports.countAliases = exports.validate = exports.getTypePrefix = exports.similar = exports.CriticalityLevel = exports.ChangeType = exports.DiffRule = exports.diff = void 0;
3
+ exports.inputFieldDefaultValueChangedFromMeta = exports.inputFieldDescriptionChangedFromMeta = exports.inputFieldDescriptionRemovedFromMeta = exports.inputFieldDescriptionAddedFromMeta = exports.inputFieldAddedFromMeta = exports.inputFieldRemovedFromMeta = exports.fieldArgumentRemovedFromMeta = exports.fieldArgumentAddedFromMeta = exports.fieldTypeChangedFromMeta = exports.fieldDeprecationReasonRemovedFromMeta = exports.fieldDeprecationReasonAddedFromMeta = exports.fieldDeprecationReasonChangedFromMeta = exports.fieldDeprecationRemovedFromMeta = exports.fieldDeprecationAddedFromMeta = exports.fieldDescriptionRemovedFromMeta = exports.fieldDescriptionAddedFromMeta = exports.fieldDescriptionChangedFromMeta = exports.fieldAddedFromMeta = exports.fieldRemovedFromMeta = exports.enumValueDeprecationReasonRemovedFromMeta = exports.enumValueDeprecationReasonAddedFromMeta = exports.enumValueDeprecationReasonChangedFromMeta = exports.enumValueDescriptionChangedFromMeta = exports.enumValueAddedFromMeta = exports.enumValueRemovedFromMeta = exports.directiveArgumentTypeChangedFromMeta = exports.directiveArgumentDefaultValueChangedFromMeta = exports.directiveArgumentDescriptionChangedFromMeta = exports.directiveArgumentRemovedFromMeta = exports.directiveArgumentAddedFromMeta = exports.directiveLocationRemovedFromMeta = exports.directiveLocationAddedFromMeta = exports.directiveDescriptionChangedFromMeta = exports.directiveAddedFromMeta = exports.directiveRemovedFromMeta = exports.fieldArgumentTypeChangedFromMeta = exports.fieldArgumentDefaultChangedFromMeta = exports.fieldArgumentDescriptionChangedFromMeta = exports.calculateTokenCount = exports.countDepth = exports.countDirectives = exports.calculateOperationComplexity = exports.countAliases = exports.validate = exports.getTypePrefix = exports.similar = exports.CriticalityLevel = exports.ChangeType = exports.DiffRule = exports.diff = void 0;
4
+ exports.buildUnionMemberAddedMessageFromMeta = exports.unionMemberRemovedFromMeta = exports.typeDescriptionAddedFromMeta = exports.typeDescriptionRemovedFromMeta = exports.typeDescriptionChangedFromMeta = exports.typeKindChangedFromMeta = exports.typeAddedFromMeta = exports.typeRemovedFromMeta = exports.schemaSubscriptionTypeChangedFromMeta = exports.schemaMutationTypeChangedFromMeta = exports.schemaQueryTypeChangedFromMeta = exports.objectTypeInterfaceRemovedFromMeta = exports.objectTypeInterfaceAddedFromMeta = exports.inputFieldTypeChangedFromMeta = void 0;
4
5
  const tslib_1 = require("tslib");
5
6
  tslib_1.__exportStar(require("./coverage/index.js"), exports);
6
7
  var index_js_1 = require("./diff/index.js");
@@ -25,3 +26,64 @@ var query_depth_js_1 = require("./validate/query-depth.js");
25
26
  Object.defineProperty(exports, "countDepth", { enumerable: true, get: function () { return query_depth_js_1.countDepth; } });
26
27
  var token_count_js_1 = require("./validate/token-count.js");
27
28
  Object.defineProperty(exports, "calculateTokenCount", { enumerable: true, get: function () { return token_count_js_1.calculateTokenCount; } });
29
+ var argument_js_1 = require("./diff/changes/argument.js");
30
+ Object.defineProperty(exports, "fieldArgumentDescriptionChangedFromMeta", { enumerable: true, get: function () { return argument_js_1.fieldArgumentDescriptionChangedFromMeta; } });
31
+ Object.defineProperty(exports, "fieldArgumentDefaultChangedFromMeta", { enumerable: true, get: function () { return argument_js_1.fieldArgumentDefaultChangedFromMeta; } });
32
+ Object.defineProperty(exports, "fieldArgumentTypeChangedFromMeta", { enumerable: true, get: function () { return argument_js_1.fieldArgumentTypeChangedFromMeta; } });
33
+ var directive_js_1 = require("./diff/changes/directive.js");
34
+ Object.defineProperty(exports, "directiveRemovedFromMeta", { enumerable: true, get: function () { return directive_js_1.directiveRemovedFromMeta; } });
35
+ Object.defineProperty(exports, "directiveAddedFromMeta", { enumerable: true, get: function () { return directive_js_1.directiveAddedFromMeta; } });
36
+ Object.defineProperty(exports, "directiveDescriptionChangedFromMeta", { enumerable: true, get: function () { return directive_js_1.directiveDescriptionChangedFromMeta; } });
37
+ Object.defineProperty(exports, "directiveLocationAddedFromMeta", { enumerable: true, get: function () { return directive_js_1.directiveLocationAddedFromMeta; } });
38
+ Object.defineProperty(exports, "directiveLocationRemovedFromMeta", { enumerable: true, get: function () { return directive_js_1.directiveLocationRemovedFromMeta; } });
39
+ Object.defineProperty(exports, "directiveArgumentAddedFromMeta", { enumerable: true, get: function () { return directive_js_1.directiveArgumentAddedFromMeta; } });
40
+ Object.defineProperty(exports, "directiveArgumentRemovedFromMeta", { enumerable: true, get: function () { return directive_js_1.directiveArgumentRemovedFromMeta; } });
41
+ Object.defineProperty(exports, "directiveArgumentDescriptionChangedFromMeta", { enumerable: true, get: function () { return directive_js_1.directiveArgumentDescriptionChangedFromMeta; } });
42
+ Object.defineProperty(exports, "directiveArgumentDefaultValueChangedFromMeta", { enumerable: true, get: function () { return directive_js_1.directiveArgumentDefaultValueChangedFromMeta; } });
43
+ Object.defineProperty(exports, "directiveArgumentTypeChangedFromMeta", { enumerable: true, get: function () { return directive_js_1.directiveArgumentTypeChangedFromMeta; } });
44
+ var enum_js_1 = require("./diff/changes/enum.js");
45
+ Object.defineProperty(exports, "enumValueRemovedFromMeta", { enumerable: true, get: function () { return enum_js_1.enumValueRemovedFromMeta; } });
46
+ Object.defineProperty(exports, "enumValueAddedFromMeta", { enumerable: true, get: function () { return enum_js_1.enumValueAddedFromMeta; } });
47
+ Object.defineProperty(exports, "enumValueDescriptionChangedFromMeta", { enumerable: true, get: function () { return enum_js_1.enumValueDescriptionChangedFromMeta; } });
48
+ Object.defineProperty(exports, "enumValueDeprecationReasonChangedFromMeta", { enumerable: true, get: function () { return enum_js_1.enumValueDeprecationReasonChangedFromMeta; } });
49
+ Object.defineProperty(exports, "enumValueDeprecationReasonAddedFromMeta", { enumerable: true, get: function () { return enum_js_1.enumValueDeprecationReasonAddedFromMeta; } });
50
+ Object.defineProperty(exports, "enumValueDeprecationReasonRemovedFromMeta", { enumerable: true, get: function () { return enum_js_1.enumValueDeprecationReasonRemovedFromMeta; } });
51
+ var field_js_1 = require("./diff/changes/field.js");
52
+ Object.defineProperty(exports, "fieldRemovedFromMeta", { enumerable: true, get: function () { return field_js_1.fieldRemovedFromMeta; } });
53
+ Object.defineProperty(exports, "fieldAddedFromMeta", { enumerable: true, get: function () { return field_js_1.fieldAddedFromMeta; } });
54
+ Object.defineProperty(exports, "fieldDescriptionChangedFromMeta", { enumerable: true, get: function () { return field_js_1.fieldDescriptionChangedFromMeta; } });
55
+ Object.defineProperty(exports, "fieldDescriptionAddedFromMeta", { enumerable: true, get: function () { return field_js_1.fieldDescriptionAddedFromMeta; } });
56
+ Object.defineProperty(exports, "fieldDescriptionRemovedFromMeta", { enumerable: true, get: function () { return field_js_1.fieldDescriptionRemovedFromMeta; } });
57
+ Object.defineProperty(exports, "fieldDeprecationAddedFromMeta", { enumerable: true, get: function () { return field_js_1.fieldDeprecationAddedFromMeta; } });
58
+ Object.defineProperty(exports, "fieldDeprecationRemovedFromMeta", { enumerable: true, get: function () { return field_js_1.fieldDeprecationRemovedFromMeta; } });
59
+ Object.defineProperty(exports, "fieldDeprecationReasonChangedFromMeta", { enumerable: true, get: function () { return field_js_1.fieldDeprecationReasonChangedFromMeta; } });
60
+ Object.defineProperty(exports, "fieldDeprecationReasonAddedFromMeta", { enumerable: true, get: function () { return field_js_1.fieldDeprecationReasonAddedFromMeta; } });
61
+ Object.defineProperty(exports, "fieldDeprecationReasonRemovedFromMeta", { enumerable: true, get: function () { return field_js_1.fieldDeprecationReasonRemovedFromMeta; } });
62
+ Object.defineProperty(exports, "fieldTypeChangedFromMeta", { enumerable: true, get: function () { return field_js_1.fieldTypeChangedFromMeta; } });
63
+ Object.defineProperty(exports, "fieldArgumentAddedFromMeta", { enumerable: true, get: function () { return field_js_1.fieldArgumentAddedFromMeta; } });
64
+ Object.defineProperty(exports, "fieldArgumentRemovedFromMeta", { enumerable: true, get: function () { return field_js_1.fieldArgumentRemovedFromMeta; } });
65
+ var input_js_1 = require("./diff/changes/input.js");
66
+ Object.defineProperty(exports, "inputFieldRemovedFromMeta", { enumerable: true, get: function () { return input_js_1.inputFieldRemovedFromMeta; } });
67
+ Object.defineProperty(exports, "inputFieldAddedFromMeta", { enumerable: true, get: function () { return input_js_1.inputFieldAddedFromMeta; } });
68
+ Object.defineProperty(exports, "inputFieldDescriptionAddedFromMeta", { enumerable: true, get: function () { return input_js_1.inputFieldDescriptionAddedFromMeta; } });
69
+ Object.defineProperty(exports, "inputFieldDescriptionRemovedFromMeta", { enumerable: true, get: function () { return input_js_1.inputFieldDescriptionRemovedFromMeta; } });
70
+ Object.defineProperty(exports, "inputFieldDescriptionChangedFromMeta", { enumerable: true, get: function () { return input_js_1.inputFieldDescriptionChangedFromMeta; } });
71
+ Object.defineProperty(exports, "inputFieldDefaultValueChangedFromMeta", { enumerable: true, get: function () { return input_js_1.inputFieldDefaultValueChangedFromMeta; } });
72
+ Object.defineProperty(exports, "inputFieldTypeChangedFromMeta", { enumerable: true, get: function () { return input_js_1.inputFieldTypeChangedFromMeta; } });
73
+ var object_js_1 = require("./diff/changes/object.js");
74
+ Object.defineProperty(exports, "objectTypeInterfaceAddedFromMeta", { enumerable: true, get: function () { return object_js_1.objectTypeInterfaceAddedFromMeta; } });
75
+ Object.defineProperty(exports, "objectTypeInterfaceRemovedFromMeta", { enumerable: true, get: function () { return object_js_1.objectTypeInterfaceRemovedFromMeta; } });
76
+ var schema_js_1 = require("./diff/changes/schema.js");
77
+ Object.defineProperty(exports, "schemaQueryTypeChangedFromMeta", { enumerable: true, get: function () { return schema_js_1.schemaQueryTypeChangedFromMeta; } });
78
+ Object.defineProperty(exports, "schemaMutationTypeChangedFromMeta", { enumerable: true, get: function () { return schema_js_1.schemaMutationTypeChangedFromMeta; } });
79
+ Object.defineProperty(exports, "schemaSubscriptionTypeChangedFromMeta", { enumerable: true, get: function () { return schema_js_1.schemaSubscriptionTypeChangedFromMeta; } });
80
+ var type_js_1 = require("./diff/changes/type.js");
81
+ Object.defineProperty(exports, "typeRemovedFromMeta", { enumerable: true, get: function () { return type_js_1.typeRemovedFromMeta; } });
82
+ Object.defineProperty(exports, "typeAddedFromMeta", { enumerable: true, get: function () { return type_js_1.typeAddedFromMeta; } });
83
+ Object.defineProperty(exports, "typeKindChangedFromMeta", { enumerable: true, get: function () { return type_js_1.typeKindChangedFromMeta; } });
84
+ Object.defineProperty(exports, "typeDescriptionChangedFromMeta", { enumerable: true, get: function () { return type_js_1.typeDescriptionChangedFromMeta; } });
85
+ Object.defineProperty(exports, "typeDescriptionRemovedFromMeta", { enumerable: true, get: function () { return type_js_1.typeDescriptionRemovedFromMeta; } });
86
+ Object.defineProperty(exports, "typeDescriptionAddedFromMeta", { enumerable: true, get: function () { return type_js_1.typeDescriptionAddedFromMeta; } });
87
+ var union_js_1 = require("./diff/changes/union.js");
88
+ Object.defineProperty(exports, "unionMemberRemovedFromMeta", { enumerable: true, get: function () { return union_js_1.unionMemberRemovedFromMeta; } });
89
+ Object.defineProperty(exports, "buildUnionMemberAddedMessageFromMeta", { enumerable: true, get: function () { return union_js_1.buildUnionMemberAddedMessageFromMeta; } });
@@ -4,7 +4,7 @@ exports.isDeprecated = void 0;
4
4
  function isDeprecated(fieldOrEnumValue) {
5
5
  var _a, _b;
6
6
  if ('isDeprecated' in fieldOrEnumValue) {
7
- return fieldOrEnumValue['isDeprecated'];
7
+ return !!fieldOrEnumValue['isDeprecated'];
8
8
  }
9
9
  if (fieldOrEnumValue.deprecationReason != null) {
10
10
  return true;
@@ -63,6 +63,9 @@ function wordLetterPairs(str) {
63
63
  return flattenDeep(pairs);
64
64
  }
65
65
  function safeString(obj) {
66
+ if (typeof obj === 'string') {
67
+ return JSON.stringify(obj);
68
+ }
66
69
  return (0, object_inspect_1.default)(obj)
67
70
  .replace(/\[Object: null prototype\] /g, '')
68
71
  .replace(/(^')|('$)/g, '');
@@ -87,12 +87,16 @@ function createConfig(rawConfig, setConfigKind, branches = [], fallbackBranch =
87
87
  return config;
88
88
  }
89
89
  for (const branch of branches) {
90
- config = config || findConfigByBranch(branch, normalizedConfig, false);
90
+ if (config == null) {
91
+ config = findConfigByBranch(branch, normalizedConfig, false);
92
+ }
91
93
  if (config) {
92
94
  break;
93
95
  }
94
96
  }
95
- config = config || getGlobalConfig(rawConfig, fallbackBranch);
97
+ if (config == null) {
98
+ config = getGlobalConfig(rawConfig, fallbackBranch);
99
+ }
96
100
  return config;
97
101
  }
98
102
  exports.createConfig = createConfig;
@@ -27,7 +27,7 @@ function filterChangesByLevel(level) {
27
27
  return (change) => change.criticality.level === level;
28
28
  }
29
29
  exports.filterChangesByLevel = filterChangesByLevel;
30
- function createSummary(changes, summaryLimit, isLegacyConfig) {
30
+ function createSummary(changes, summaryLimit, isLegacyConfig = false) {
31
31
  const breakingChanges = changes.filter(filterChangesByLevel(core_1.CriticalityLevel.Breaking));
32
32
  const dangerousChanges = changes.filter(filterChangesByLevel(core_1.CriticalityLevel.Dangerous));
33
33
  const safeChanges = changes.filter(filterChangesByLevel(core_1.CriticalityLevel.NonBreaking));
@@ -1,42 +1,100 @@
1
1
  import { safeChangeForInputValue } from '../../utils/graphql.js';
2
2
  import { safeString } from '../../utils/string.js';
3
- import { ChangeType, CriticalityLevel } from './change.js';
4
- export function fieldArgumentDescriptionChanged(type, field, oldArg, newArg) {
3
+ import { ChangeType, CriticalityLevel, } from './change.js';
4
+ function buildFieldArgumentDescriptionChangedMessage(args) {
5
+ return `Description for argument '${args.argumentName}' on field '${args.typeName}.${args.fieldName}' changed from '${args.oldDescription}' to '${args.newDescription}'`;
6
+ }
7
+ export function fieldArgumentDescriptionChangedFromMeta(args) {
5
8
  return {
9
+ type: ChangeType.FieldArgumentDescriptionChanged,
6
10
  criticality: {
7
11
  level: CriticalityLevel.NonBreaking,
8
12
  },
9
- type: ChangeType.FieldArgumentDescriptionChanged,
10
- message: `Description for argument '${newArg.name}' on field '${type.name}.${field.name}' changed from '${oldArg.description}' to '${newArg.description}'`,
11
- path: [type.name, field.name, oldArg.name].join('.'),
13
+ message: buildFieldArgumentDescriptionChangedMessage(args.meta),
14
+ meta: args.meta,
15
+ path: [args.meta.typeName, args.meta.fieldName, args.meta.argumentName].join('.'),
12
16
  };
13
17
  }
14
- export function fieldArgumentDefaultChanged(type, field, oldArg, newArg) {
18
+ export function fieldArgumentDescriptionChanged(type, field, oldArg, newArg) {
19
+ var _a, _b;
20
+ return fieldArgumentDescriptionChangedFromMeta({
21
+ type: ChangeType.FieldArgumentDescriptionChanged,
22
+ meta: {
23
+ typeName: type.name,
24
+ fieldName: field.name,
25
+ argumentName: oldArg.name,
26
+ oldDescription: (_a = oldArg.description) !== null && _a !== void 0 ? _a : null,
27
+ newDescription: (_b = newArg.description) !== null && _b !== void 0 ? _b : null,
28
+ },
29
+ });
30
+ }
31
+ function buildFieldArgumentDefaultChangedMessage(args) {
32
+ return args.oldDefaultValue === undefined
33
+ ? `Default value '${args.newDefaultValue}' was added to argument '${args.argumentName}' on field '${args.typeName}.${args.fieldName}'`
34
+ : `Default value for argument '${args.argumentName}' on field '${args.typeName}.${args.fieldName}' changed from '${args.oldDefaultValue}' to '${args.newDefaultValue}'`;
35
+ }
36
+ const fieldArgumentDefaultChangedCriticalityDangerousReason = 'Changing the default value for an argument may change the runtime behaviour of a field if it was never provided.';
37
+ export function fieldArgumentDefaultChangedFromMeta(args) {
15
38
  return {
39
+ type: ChangeType.FieldArgumentDefaultChanged,
16
40
  criticality: {
17
41
  level: CriticalityLevel.Dangerous,
18
- reason: 'Changing the default value for an argument may change the runtime behaviour of a field if it was never provided.',
42
+ reason: fieldArgumentDefaultChangedCriticalityDangerousReason,
19
43
  },
20
- type: ChangeType.FieldArgumentDefaultChanged,
21
- message: typeof oldArg.defaultValue === 'undefined'
22
- ? `Default value '${safeString(newArg.defaultValue)}' was added to argument '${newArg.name}' on field '${type.name}.${field.name}'`
23
- : `Default value for argument '${newArg.name}' on field '${type.name}.${field.name}' changed from '${safeString(oldArg.defaultValue)}' to '${safeString(newArg.defaultValue)}'`,
24
- path: [type.name, field.name, oldArg.name].join('.'),
44
+ message: buildFieldArgumentDefaultChangedMessage(args.meta),
45
+ meta: args.meta,
46
+ path: [args.meta.typeName, args.meta.fieldName, args.meta.argumentName].join('.'),
25
47
  };
26
48
  }
27
- export function fieldArgumentTypeChanged(type, field, oldArg, newArg) {
49
+ export function fieldArgumentDefaultChanged(type, field, oldArg, newArg) {
50
+ const meta = {
51
+ typeName: type.name,
52
+ fieldName: field.name,
53
+ argumentName: newArg.name,
54
+ };
55
+ if (oldArg.defaultValue !== undefined) {
56
+ meta.oldDefaultValue = safeString(oldArg.defaultValue);
57
+ }
58
+ if (newArg.defaultValue !== undefined) {
59
+ meta.newDefaultValue = safeString(newArg.defaultValue);
60
+ }
61
+ return fieldArgumentDefaultChangedFromMeta({
62
+ type: ChangeType.FieldArgumentDefaultChanged,
63
+ meta,
64
+ });
65
+ }
66
+ function buildFieldArgumentTypeChangedMessage(args) {
67
+ return `Type for argument '${args.argumentName}' on field '${args.typeName}.${args.fieldName}' changed from '${args.oldArgumentType}' to '${args.newArgumentType}'`;
68
+ }
69
+ const fieldArgumentTypeChangedCriticalityNonBreakingReason = `Changing an input field from non-null to null is considered non-breaking.`;
70
+ const fieldArgumentTypeChangedCriticalityBreakingReason = `Changing the type of a field's argument can cause existing queries that use this argument to error.`;
71
+ export function fieldArgumentTypeChangedFromMeta(args) {
28
72
  return {
29
- criticality: safeChangeForInputValue(oldArg.type, newArg.type)
73
+ type: ChangeType.FieldArgumentTypeChanged,
74
+ criticality: args.meta.isSafeArgumentTypeChange
30
75
  ? {
31
76
  level: CriticalityLevel.NonBreaking,
32
- reason: `Changing an input field from non-null to null is considered non-breaking.`,
77
+ reason: fieldArgumentTypeChangedCriticalityNonBreakingReason,
33
78
  }
34
79
  : {
35
80
  level: CriticalityLevel.Breaking,
36
- reason: `Changing the type of a field's argument can cause existing queries that use this argument to error.`,
81
+ reason: fieldArgumentTypeChangedCriticalityBreakingReason,
37
82
  },
38
- type: ChangeType.FieldArgumentTypeChanged,
39
- message: `Type for argument '${newArg.name}' on field '${type.name}.${field.name}' changed from '${oldArg.type}' to '${newArg.type}'`,
40
- path: [type.name, field.name, oldArg.name].join('.'),
83
+ message: buildFieldArgumentTypeChangedMessage(args.meta),
84
+ meta: args.meta,
85
+ path: [args.meta.typeName, args.meta.fieldName, args.meta.argumentName].join('.'),
41
86
  };
42
87
  }
88
+ export function fieldArgumentTypeChanged(type, field, oldArg, newArg) {
89
+ return fieldArgumentTypeChangedFromMeta({
90
+ type: ChangeType.FieldArgumentTypeChanged,
91
+ meta: {
92
+ typeName: type.name,
93
+ fieldName: field.name,
94
+ argumentName: newArg.name,
95
+ oldArgumentType: oldArg.type.toString(),
96
+ newArgumentType: newArg.type.toString(),
97
+ isSafeArgumentTypeChange: safeChangeForInputValue(oldArg.type, newArg.type),
98
+ },
99
+ });
100
+ }
@@ -1,111 +1,270 @@
1
1
  import { isNonNullType } from 'graphql';
2
2
  import { safeChangeForInputValue } from '../../utils/graphql.js';
3
- import { ChangeType, CriticalityLevel } from './change.js';
4
- export function directiveRemoved(directive) {
3
+ import { safeString } from '../../utils/string.js';
4
+ import { ChangeType, CriticalityLevel, } from './change.js';
5
+ function buildDirectiveRemovedMessage(args) {
6
+ return `Directive '${args.removedDirectiveName}' was removed`;
7
+ }
8
+ const directiveRemovedCriticalityBreakingReason = `A directive could be in use of a client application. Removing it could break the client application.`;
9
+ export function directiveRemovedFromMeta(args) {
5
10
  return {
6
11
  criticality: {
7
12
  level: CriticalityLevel.Breaking,
13
+ reason: directiveRemovedCriticalityBreakingReason,
8
14
  },
9
15
  type: ChangeType.DirectiveRemoved,
10
- message: `Directive '${directive.name}' was removed`,
11
- path: `@${directive.name}`,
16
+ message: buildDirectiveRemovedMessage(args.meta),
17
+ path: `@${args.meta.removedDirectiveName}`,
18
+ meta: args.meta,
12
19
  };
13
20
  }
14
- export function directiveAdded(directive) {
21
+ export function directiveRemoved(directive) {
22
+ return directiveRemovedFromMeta({
23
+ type: ChangeType.DirectiveRemoved,
24
+ meta: {
25
+ removedDirectiveName: directive.name,
26
+ },
27
+ });
28
+ }
29
+ function buildDirectiveAddedMessage(args) {
30
+ return `Directive '${args.addedDirectiveName}' was added`;
31
+ }
32
+ export function directiveAddedFromMeta(args) {
15
33
  return {
16
34
  criticality: {
17
35
  level: CriticalityLevel.NonBreaking,
18
36
  },
19
37
  type: ChangeType.DirectiveAdded,
20
- message: `Directive '${directive.name}' was added`,
21
- path: `@${directive.name}`,
38
+ message: buildDirectiveAddedMessage(args.meta),
39
+ path: `@${args.meta.addedDirectiveName}`,
40
+ meta: args.meta,
22
41
  };
23
42
  }
24
- export function directiveDescriptionChanged(oldDirective, newDirective) {
43
+ export function directiveAdded(directive) {
44
+ return directiveAddedFromMeta({
45
+ type: ChangeType.DirectiveAdded,
46
+ meta: {
47
+ addedDirectiveName: directive.name,
48
+ },
49
+ });
50
+ }
51
+ function buildDirectiveDescriptionChangedMessage(args) {
52
+ var _a, _b;
53
+ return `Directive '${args.directiveName}' description changed from '${(_a = args.oldDirectiveDescription) !== null && _a !== void 0 ? _a : 'undefined'}' to '${(_b = args.newDirectiveDescription) !== null && _b !== void 0 ? _b : 'undefined'}'`;
54
+ }
55
+ export function directiveDescriptionChangedFromMeta(args) {
25
56
  return {
26
57
  criticality: {
27
58
  level: CriticalityLevel.NonBreaking,
28
59
  },
29
60
  type: ChangeType.DirectiveDescriptionChanged,
30
- message: `Directive '${oldDirective.name}' description changed from '${oldDirective.description}' to '${newDirective.description}'`,
31
- path: `@${oldDirective.name}`,
61
+ message: buildDirectiveDescriptionChangedMessage(args.meta),
62
+ path: `@${args.meta.directiveName}`,
63
+ meta: args.meta,
32
64
  };
33
65
  }
34
- export function directiveLocationAdded(directive, location) {
66
+ export function directiveDescriptionChanged(oldDirective, newDirective) {
67
+ var _a, _b;
68
+ return directiveDescriptionChangedFromMeta({
69
+ type: ChangeType.DirectiveDescriptionChanged,
70
+ meta: {
71
+ directiveName: oldDirective.name,
72
+ oldDirectiveDescription: (_a = oldDirective.description) !== null && _a !== void 0 ? _a : null,
73
+ newDirectiveDescription: (_b = newDirective.description) !== null && _b !== void 0 ? _b : null,
74
+ },
75
+ });
76
+ }
77
+ function buildDirectiveLocationAddedMessage(args) {
78
+ return `Location '${args.addedDirectiveLocation}' was added to directive '${args.directiveName}'`;
79
+ }
80
+ export function directiveLocationAddedFromMeta(args) {
35
81
  return {
36
82
  criticality: {
37
83
  level: CriticalityLevel.NonBreaking,
38
84
  },
39
85
  type: ChangeType.DirectiveLocationAdded,
40
- message: `Location '${location}' was added to directive '${directive.name}'`,
41
- path: `@${directive.name}`,
86
+ message: buildDirectiveLocationAddedMessage(args.meta),
87
+ path: `@${args.meta.directiveName}`,
88
+ meta: args.meta,
42
89
  };
43
90
  }
44
- export function directiveLocationRemoved(directive, location) {
91
+ export function directiveLocationAdded(directive, location) {
92
+ return directiveLocationAddedFromMeta({
93
+ type: ChangeType.DirectiveLocationAdded,
94
+ meta: {
95
+ directiveName: directive.name,
96
+ addedDirectiveLocation: location.toString(),
97
+ },
98
+ });
99
+ }
100
+ function buildDirectiveLocationRemovedMessage(args) {
101
+ return `Location '${args.removedDirectiveLocation}' was removed from directive '${args.directiveName}'`;
102
+ }
103
+ const directiveLocationRemovedBreakingReason = `A directive could be in use of a client application. Removing it could break the client application.`;
104
+ export function directiveLocationRemovedFromMeta(args) {
45
105
  return {
46
106
  criticality: {
47
107
  level: CriticalityLevel.Breaking,
108
+ reason: directiveLocationRemovedBreakingReason,
48
109
  },
49
110
  type: ChangeType.DirectiveLocationRemoved,
50
- message: `Location '${location}' was removed from directive '${directive.name}'`,
51
- path: `@${directive.name}`,
111
+ message: buildDirectiveLocationRemovedMessage(args.meta),
112
+ path: `@${args.meta.directiveName}`,
113
+ meta: args.meta,
52
114
  };
53
115
  }
54
- export function directiveArgumentAdded(directive, arg) {
55
- return {
56
- criticality: {
57
- level: isNonNullType(arg.type) ? CriticalityLevel.Breaking : CriticalityLevel.NonBreaking,
116
+ export function directiveLocationRemoved(directive, location) {
117
+ return directiveLocationRemovedFromMeta({
118
+ type: ChangeType.DirectiveLocationRemoved,
119
+ meta: {
120
+ directiveName: directive.name,
121
+ removedDirectiveLocation: location.toString(),
58
122
  },
123
+ });
124
+ }
125
+ const directiveArgumentAddedBreakingReason = `A directive could be in use of a client application. Adding a non-nullable argument will break those clients.`;
126
+ const directiveArgumentNonBreakingReason = `A directive could be in use of a client application. Adding a non-nullable argument will break those clients.`;
127
+ export function directiveArgumentAddedFromMeta(args) {
128
+ return {
129
+ criticality: args.meta.addedDirectiveArgumentTypeIsNonNull
130
+ ? {
131
+ level: CriticalityLevel.Breaking,
132
+ reason: directiveArgumentAddedBreakingReason,
133
+ }
134
+ : {
135
+ level: CriticalityLevel.NonBreaking,
136
+ reason: directiveArgumentNonBreakingReason,
137
+ },
59
138
  type: ChangeType.DirectiveArgumentAdded,
60
- message: `Argument '${arg.name}' was added to directive '${directive.name}'`,
61
- path: `@${directive.name}`,
139
+ message: `Argument '${args.meta.addedDirectiveArgumentName}' was added to directive '${args.meta.directiveName}'`,
140
+ path: `@${args.meta.directiveName}`,
141
+ meta: args.meta,
62
142
  };
63
143
  }
64
- export function directiveArgumentRemoved(directive, arg) {
144
+ export function directiveArgumentAdded(directive, arg) {
145
+ return directiveArgumentAddedFromMeta({
146
+ type: ChangeType.DirectiveArgumentAdded,
147
+ meta: {
148
+ directiveName: directive.name,
149
+ addedDirectiveArgumentName: arg.name,
150
+ addedDirectiveArgumentTypeIsNonNull: isNonNullType(arg.type),
151
+ },
152
+ });
153
+ }
154
+ function buildDirectiveArgumentRemovedMessage(args) {
155
+ return `Argument '${args.removedDirectiveArgumentName}' was removed from directive '${args.directiveName}'`;
156
+ }
157
+ const directiveArgumentRemovedBreakingReason = `A directive argument could be in use of a client application. Removing the argument can break client applications.`;
158
+ export function directiveArgumentRemovedFromMeta(args) {
65
159
  return {
66
160
  criticality: {
67
161
  level: CriticalityLevel.Breaking,
162
+ reason: directiveArgumentRemovedBreakingReason,
68
163
  },
69
164
  type: ChangeType.DirectiveArgumentRemoved,
70
- message: `Argument '${arg.name}' was removed from directive '${directive.name}'`,
71
- path: `@${directive.name}.${arg.name}`,
165
+ message: buildDirectiveArgumentRemovedMessage(args.meta),
166
+ path: `@${args.meta.directiveName}.${args.meta.removedDirectiveArgumentName}`,
167
+ meta: args.meta,
72
168
  };
73
169
  }
74
- export function directiveArgumentDescriptionChanged(directive, oldArg, newArg) {
170
+ export function directiveArgumentRemoved(directive, arg) {
171
+ return directiveArgumentRemovedFromMeta({
172
+ type: ChangeType.DirectiveArgumentRemoved,
173
+ meta: {
174
+ directiveName: directive.name,
175
+ removedDirectiveArgumentName: arg.name,
176
+ },
177
+ });
178
+ }
179
+ function buildDirectiveArgumentDescriptionChangedMessage(args) {
180
+ return `Description for argument '${args.directiveArgumentName}' on directive '${args.directiveName}' changed from '${args.oldDirectiveArgumentDescription}' to '${args.newDirectiveArgumentDescription}'`;
181
+ }
182
+ export function directiveArgumentDescriptionChangedFromMeta(args) {
75
183
  return {
76
184
  criticality: {
77
185
  level: CriticalityLevel.NonBreaking,
78
186
  },
79
187
  type: ChangeType.DirectiveArgumentDescriptionChanged,
80
- message: `Description for argument '${oldArg.name}' on directive '${directive.name}' changed from '${oldArg.description}' to '${newArg.description}'`,
81
- path: `@${directive.name}.${oldArg.name}`,
188
+ message: buildDirectiveArgumentDescriptionChangedMessage(args.meta),
189
+ path: `@${args.meta.directiveName}.${args.meta.directiveArgumentName}`,
190
+ meta: args.meta,
82
191
  };
83
192
  }
84
- export function directiveArgumentDefaultValueChanged(directive, oldArg, newArg) {
193
+ export function directiveArgumentDescriptionChanged(directive, oldArg, newArg) {
194
+ var _a, _b;
195
+ return directiveArgumentDescriptionChangedFromMeta({
196
+ type: ChangeType.DirectiveArgumentDescriptionChanged,
197
+ meta: {
198
+ directiveName: directive.name,
199
+ directiveArgumentName: oldArg.name,
200
+ oldDirectiveArgumentDescription: (_a = oldArg.description) !== null && _a !== void 0 ? _a : null,
201
+ newDirectiveArgumentDescription: (_b = newArg.description) !== null && _b !== void 0 ? _b : null,
202
+ },
203
+ });
204
+ }
205
+ function buildDirectiveArgumentDefaultValueChanged(args) {
206
+ return args.oldDirectiveArgumentDefaultValue === undefined
207
+ ? `Default value '${args.newDirectiveArgumentDefaultValue}' was added to argument '${args.directiveArgumentName}' on directive '${args.directiveName}'`
208
+ : `Default value for argument '${args.directiveArgumentName}' on directive '${args.directiveName}' changed from '${args.oldDirectiveArgumentDefaultValue}' to '${args.newDirectiveArgumentDefaultValue}'`;
209
+ }
210
+ const directiveArgumentDefaultValueChangedDangerousReason = 'Changing the default value for an argument may change the runtime behaviour of a field if it was never provided.';
211
+ export function directiveArgumentDefaultValueChangedFromMeta(args) {
85
212
  return {
86
213
  criticality: {
87
214
  level: CriticalityLevel.Dangerous,
88
- reason: 'Changing the default value for an argument may change the runtime behaviour of a field if it was never provided.',
215
+ reason: directiveArgumentDefaultValueChangedDangerousReason,
89
216
  },
90
217
  type: ChangeType.DirectiveArgumentDefaultValueChanged,
91
- message: typeof oldArg.defaultValue === 'undefined'
92
- ? `Default value '${newArg.defaultValue}' was added to argument '${newArg.name}' on directive '${directive.name}'`
93
- : `Default value for argument '${oldArg.name}' on directive '${directive.name}' changed from '${oldArg.defaultValue}' to '${newArg.defaultValue}'`,
94
- path: `@${directive.name}.${oldArg.name}`,
218
+ message: buildDirectiveArgumentDefaultValueChanged(args.meta),
219
+ path: `@${args.meta.directiveName}.${args.meta.directiveArgumentName}`,
220
+ meta: args.meta,
95
221
  };
96
222
  }
97
- export function directiveArgumentTypeChanged(directive, oldArg, newArg) {
223
+ export function directiveArgumentDefaultValueChanged(directive, oldArg, newArg) {
224
+ const meta = {
225
+ directiveName: directive.name,
226
+ directiveArgumentName: oldArg.name,
227
+ };
228
+ if (oldArg.defaultValue !== undefined) {
229
+ meta.oldDirectiveArgumentDefaultValue = safeString(oldArg.defaultValue);
230
+ }
231
+ if (newArg.defaultValue !== undefined) {
232
+ meta.newDirectiveArgumentDefaultValue = safeString(newArg.defaultValue);
233
+ }
234
+ return directiveArgumentDefaultValueChangedFromMeta({
235
+ type: ChangeType.DirectiveArgumentDefaultValueChanged,
236
+ meta,
237
+ });
238
+ }
239
+ function buildDirectiveArgumentTypeChangedMessage(args) {
240
+ return `Type for argument '${args.meta.directiveArgumentName}' on directive '${args.meta.directiveName}' changed from '${args.meta.oldDirectiveArgumentType}' to '${args.meta.newDirectiveArgumentType}'`;
241
+ }
242
+ const directiveArgumentTypeChangedNonBreakingReason = 'Changing an input field from non-null to null is considered non-breaking.';
243
+ export function directiveArgumentTypeChangedFromMeta(args) {
98
244
  return {
99
- criticality: safeChangeForInputValue(oldArg.type, newArg.type)
245
+ criticality: args.meta.isSafeDirectiveArgumentTypeChange
100
246
  ? {
101
247
  level: CriticalityLevel.NonBreaking,
102
- reason: 'Changing an input field from non-null to null is considered non-breaking.',
248
+ reason: directiveArgumentTypeChangedNonBreakingReason,
103
249
  }
104
250
  : {
105
251
  level: CriticalityLevel.Breaking,
106
252
  },
107
253
  type: ChangeType.DirectiveArgumentTypeChanged,
108
- message: `Type for argument '${oldArg.name}' on directive '${directive.name}' changed from '${oldArg.type}' to '${newArg.type}'`,
109
- path: `@${directive.name}.${oldArg.name}`,
254
+ message: buildDirectiveArgumentTypeChangedMessage(args),
255
+ path: `@${args.meta.directiveName}.${args.meta.directiveArgumentName}`,
256
+ meta: args.meta,
110
257
  };
111
258
  }
259
+ export function directiveArgumentTypeChanged(directive, oldArg, newArg) {
260
+ return directiveArgumentTypeChangedFromMeta({
261
+ type: ChangeType.DirectiveArgumentTypeChanged,
262
+ meta: {
263
+ directiveName: directive.name,
264
+ directiveArgumentName: oldArg.name,
265
+ oldDirectiveArgumentType: oldArg.type.toString(),
266
+ newDirectiveArgumentType: newArg.type.toString(),
267
+ isSafeDirectiveArgumentTypeChange: safeChangeForInputValue(oldArg.type, newArg.type),
268
+ },
269
+ });
270
+ }