@graphql-inspector/cli 3.4.13-alpha-20230417141810-fd2d33e7 → 3.4.13

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 (98) hide show
  1. package/README.md +3 -3
  2. package/cjs/action/src/run.js +1 -1
  3. package/cjs/commands/commands/src/index.js +7 -8
  4. package/cjs/commands/diff/src/index.js +6 -6
  5. package/cjs/commands/docs/src/index.js +1 -3
  6. package/cjs/commands/serve/src/fake.js +4 -4
  7. package/cjs/commands/serve/src/index.js +8 -7
  8. package/cjs/commands/similar/src/index.js +2 -2
  9. package/cjs/commands/validate/src/index.js +4 -4
  10. package/cjs/core/src/ast/document.js +2 -2
  11. package/cjs/core/src/coverage/index.js +7 -7
  12. package/cjs/core/src/diff/changes/argument.js +80 -19
  13. package/cjs/core/src/diff/changes/directive.js +208 -39
  14. package/cjs/core/src/diff/changes/enum.js +123 -25
  15. package/cjs/core/src/diff/changes/field.js +260 -69
  16. package/cjs/core/src/diff/changes/input.js +153 -34
  17. package/cjs/core/src/diff/changes/object.js +37 -9
  18. package/cjs/core/src/diff/changes/schema.js +55 -13
  19. package/cjs/core/src/diff/changes/type.js +106 -19
  20. package/cjs/core/src/diff/changes/union.js +35 -7
  21. package/cjs/core/src/diff/directive.js +2 -4
  22. package/cjs/core/src/diff/rules/consider-usage.js +3 -3
  23. package/cjs/core/src/index.js +63 -1
  24. package/cjs/core/src/similar/index.js +2 -2
  25. package/cjs/core/src/utils/compare.js +3 -9
  26. package/cjs/core/src/utils/is-deprecated.js +1 -1
  27. package/cjs/core/src/utils/string.js +5 -2
  28. package/cjs/core/src/validate/complexity.js +1 -1
  29. package/cjs/core/src/validate/directive-count.js +1 -1
  30. package/cjs/core/src/validate/index.js +12 -11
  31. package/cjs/core/src/validate/query-depth.js +1 -1
  32. package/cjs/github/src/helpers/config.js +6 -2
  33. package/cjs/github/src/helpers/utils.js +1 -1
  34. package/cjs/loaders/loaders/src/index.js +1 -2
  35. package/esm/action/src/run.js +1 -1
  36. package/esm/commands/commands/src/index.js +7 -8
  37. package/esm/commands/diff/src/index.js +6 -6
  38. package/esm/commands/docs/src/index.js +1 -4
  39. package/esm/commands/serve/src/fake.js +4 -4
  40. package/esm/commands/serve/src/index.js +8 -7
  41. package/esm/commands/similar/src/index.js +2 -2
  42. package/esm/commands/validate/src/index.js +4 -4
  43. package/esm/core/src/ast/document.js +2 -2
  44. package/esm/core/src/coverage/index.js +7 -7
  45. package/esm/core/src/diff/changes/argument.js +77 -19
  46. package/esm/core/src/diff/changes/directive.js +198 -39
  47. package/esm/core/src/diff/changes/enum.js +117 -25
  48. package/esm/core/src/diff/changes/field.js +240 -62
  49. package/esm/core/src/diff/changes/input.js +145 -34
  50. package/esm/core/src/diff/changes/object.js +35 -9
  51. package/esm/core/src/diff/changes/schema.js +50 -11
  52. package/esm/core/src/diff/changes/type.js +100 -19
  53. package/esm/core/src/diff/changes/union.js +33 -7
  54. package/esm/core/src/diff/directive.js +2 -4
  55. package/esm/core/src/diff/rules/consider-usage.js +3 -3
  56. package/esm/core/src/index.js +9 -0
  57. package/esm/core/src/similar/index.js +2 -2
  58. package/esm/core/src/utils/compare.js +3 -9
  59. package/esm/core/src/utils/is-deprecated.js +1 -1
  60. package/esm/core/src/utils/string.js +5 -2
  61. package/esm/core/src/validate/complexity.js +1 -1
  62. package/esm/core/src/validate/directive-count.js +1 -1
  63. package/esm/core/src/validate/index.js +12 -11
  64. package/esm/core/src/validate/query-depth.js +1 -1
  65. package/esm/github/src/helpers/config.js +6 -2
  66. package/esm/github/src/helpers/utils.js +1 -1
  67. package/esm/loaders/loaders/src/index.js +1 -2
  68. package/package.json +20 -20
  69. package/typings/core/src/diff/changes/argument.d.cts +52 -4
  70. package/typings/core/src/diff/changes/argument.d.ts +52 -4
  71. package/typings/core/src/diff/changes/change.d.cts +500 -2
  72. package/typings/core/src/diff/changes/change.d.ts +500 -2
  73. package/typings/core/src/diff/changes/directive.d.cts +147 -11
  74. package/typings/core/src/diff/changes/directive.d.ts +147 -11
  75. package/typings/core/src/diff/changes/enum.d.cts +75 -7
  76. package/typings/core/src/diff/changes/enum.d.ts +75 -7
  77. package/typings/core/src/diff/changes/field.d.cts +189 -14
  78. package/typings/core/src/diff/changes/field.d.ts +189 -14
  79. package/typings/core/src/diff/changes/input.d.cts +112 -8
  80. package/typings/core/src/diff/changes/input.d.ts +112 -8
  81. package/typings/core/src/diff/changes/object.d.cts +29 -3
  82. package/typings/core/src/diff/changes/object.d.ts +29 -3
  83. package/typings/core/src/diff/changes/schema.d.cts +37 -4
  84. package/typings/core/src/diff/changes/schema.d.ts +37 -4
  85. package/typings/core/src/diff/changes/type.d.cts +80 -7
  86. package/typings/core/src/diff/changes/type.d.ts +80 -7
  87. package/typings/core/src/diff/changes/union.d.cts +29 -3
  88. package/typings/core/src/diff/changes/union.d.ts +29 -3
  89. package/typings/core/src/index.d.cts +10 -0
  90. package/typings/core/src/index.d.ts +10 -0
  91. package/typings/core/src/utils/is-deprecated.d.cts +1 -1
  92. package/typings/core/src/utils/is-deprecated.d.ts +1 -1
  93. package/typings/core/src/utils/string.d.cts +1 -1
  94. package/typings/core/src/utils/string.d.ts +1 -1
  95. package/typings/core/utils/testing.d.cts +2 -2
  96. package/typings/core/utils/testing.d.ts +2 -2
  97. package/typings/github/src/helpers/utils.d.cts +1 -1
  98. package/typings/github/src/helpers/utils.d.ts +1 -1
@@ -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
+ }
@@ -1,66 +1,158 @@
1
1
  import { isDeprecated } from '../../utils/is-deprecated.js';
2
- import { ChangeType, CriticalityLevel } from './change.js';
3
- export function enumValueRemoved(oldEnum, value) {
2
+ import { ChangeType, CriticalityLevel, } from './change.js';
3
+ function buildEnumValueRemovedMessage(args) {
4
+ return `Enum value '${args.removedEnumValueName}' ${args.isEnumValueDeprecated ? '(deprecated) ' : ''}was removed from enum '${args.enumName}'`;
5
+ }
6
+ const enumValueRemovedCriticalityBreakingReason = `Removing an enum value will cause existing queries that use this enum value to error.`;
7
+ export function enumValueRemovedFromMeta(args) {
4
8
  return {
9
+ type: ChangeType.EnumValueRemoved,
5
10
  criticality: {
6
11
  level: CriticalityLevel.Breaking,
7
- reason: `Removing an enum value will cause existing queries that use this enum value to error.`,
12
+ reason: enumValueRemovedCriticalityBreakingReason,
8
13
  },
9
- type: ChangeType.EnumValueRemoved,
10
- message: `Enum value '${value.name}' ${isDeprecated(value) ? '(deprecated) ' : ''}was removed from enum '${oldEnum.name}'`,
11
- path: [oldEnum.name, value.name].join('.'),
14
+ message: buildEnumValueRemovedMessage(args.meta),
15
+ meta: args.meta,
16
+ path: [args.meta.enumName, args.meta.removedEnumValueName].join('.'),
12
17
  };
13
18
  }
14
- export function enumValueAdded(newEnum, value) {
19
+ export function enumValueRemoved(oldEnum, value) {
20
+ return enumValueRemovedFromMeta({
21
+ type: ChangeType.EnumValueRemoved,
22
+ meta: {
23
+ enumName: oldEnum.name,
24
+ removedEnumValueName: value.name,
25
+ isEnumValueDeprecated: isDeprecated(value),
26
+ },
27
+ });
28
+ }
29
+ function buildEnumValueAddedMessage(args) {
30
+ return `Enum value '${args.meta.addedEnumValueName}' was added to enum '${args.meta.enumName}'`;
31
+ }
32
+ const enumValueAddedCriticalityDangerousReason = `Adding an enum value may break existing clients that were not programming defensively against an added case when querying an enum.`;
33
+ export function enumValueAddedFromMeta(args) {
15
34
  return {
35
+ type: ChangeType.EnumValueAdded,
16
36
  criticality: {
17
37
  level: CriticalityLevel.Dangerous,
18
- reason: `Adding an enum value may break existing clients that were not programming defensively against an added case when querying an enum.`,
38
+ reason: enumValueAddedCriticalityDangerousReason,
19
39
  },
20
- type: ChangeType.EnumValueAdded,
21
- message: `Enum value '${value.name}' was added to enum '${newEnum.name}'`,
22
- path: [newEnum.name, value.name].join('.'),
40
+ message: buildEnumValueAddedMessage(args),
41
+ meta: args.meta,
42
+ path: [args.meta.enumName, args.meta.addedEnumValueName].join('.'),
23
43
  };
24
44
  }
25
- export function enumValueDescriptionChanged(newEnum, oldValue, newValue) {
45
+ export function enumValueAdded(newEnum, value) {
46
+ return enumValueAddedFromMeta({
47
+ type: ChangeType.EnumValueAdded,
48
+ meta: {
49
+ enumName: newEnum.name,
50
+ addedEnumValueName: value.name,
51
+ },
52
+ });
53
+ }
54
+ function buildEnumValueDescriptionChangedMessage(args) {
55
+ var _a, _b, _c;
56
+ return args.oldEnumValueDescription === null
57
+ ? `Description '${(_a = args.newEnumValueDescription) !== null && _a !== void 0 ? _a : 'undefined'}' was added to enum value '${args.enumName}.${args.enumValueName}'`
58
+ : `Description for enum value '${args.enumName}.${args.enumValueName}' changed from '${(_b = args.oldEnumValueDescription) !== null && _b !== void 0 ? _b : 'undefined'}' to '${(_c = args.newEnumValueDescription) !== null && _c !== void 0 ? _c : 'undefined'}'`;
59
+ }
60
+ export function enumValueDescriptionChangedFromMeta(args) {
26
61
  return {
27
62
  criticality: {
28
63
  level: CriticalityLevel.NonBreaking,
29
64
  },
30
65
  type: ChangeType.EnumValueDescriptionChanged,
31
- message: typeof oldValue.description === 'undefined'
32
- ? `Description '${newValue.description}' was added to enum value '${newEnum.name}.${newValue.name}'`
33
- : `Description for enum value '${newEnum.name}.${newValue.name}' changed from '${oldValue.description}' to '${newValue.description}'`,
34
- path: [newEnum.name, oldValue.name].join('.'),
66
+ message: buildEnumValueDescriptionChangedMessage(args.meta),
67
+ path: [args.meta.enumName, args.meta.enumValueName].join('.'),
68
+ meta: args.meta,
35
69
  };
36
70
  }
37
- export function enumValueDeprecationReasonChanged(newEnum, oldValue, newValue) {
71
+ export function enumValueDescriptionChanged(newEnum, oldValue, newValue) {
72
+ var _a, _b;
73
+ return enumValueDescriptionChangedFromMeta({
74
+ type: ChangeType.EnumValueDescriptionChanged,
75
+ meta: {
76
+ enumName: newEnum.name,
77
+ enumValueName: oldValue.name,
78
+ oldEnumValueDescription: (_a = oldValue.description) !== null && _a !== void 0 ? _a : null,
79
+ newEnumValueDescription: (_b = newValue.description) !== null && _b !== void 0 ? _b : null,
80
+ },
81
+ });
82
+ }
83
+ function buildEnumValueDeprecationChangedMessage(args) {
84
+ return `Enum value '${args.enumName}.${args.enumValueName}' deprecation reason changed from '${args.oldEnumValueDeprecationReason}' to '${args.newEnumValueDeprecationReason}'`;
85
+ }
86
+ export function enumValueDeprecationReasonChangedFromMeta(args) {
38
87
  return {
39
88
  criticality: {
40
89
  level: CriticalityLevel.NonBreaking,
41
90
  },
42
91
  type: ChangeType.EnumValueDeprecationReasonChanged,
43
- message: `Enum value '${newEnum.name}.${newValue.name}' deprecation reason changed from '${oldValue.deprecationReason}' to '${newValue.deprecationReason}'`,
44
- path: [newEnum.name, oldValue.name].join('.'),
92
+ message: buildEnumValueDeprecationChangedMessage(args.meta),
93
+ path: [args.meta.enumName, args.meta.enumValueName].join('.'),
94
+ meta: args.meta,
45
95
  };
46
96
  }
47
- export function enumValueDeprecationReasonAdded(newEnum, oldValue, newValue) {
97
+ export function enumValueDeprecationReasonChanged(newEnum, oldValue, newValue) {
98
+ var _a, _b;
99
+ return enumValueDeprecationReasonChangedFromMeta({
100
+ type: ChangeType.EnumValueDeprecationReasonChanged,
101
+ meta: {
102
+ enumName: newEnum.name,
103
+ enumValueName: oldValue.name,
104
+ oldEnumValueDeprecationReason: (_a = oldValue.deprecationReason) !== null && _a !== void 0 ? _a : '',
105
+ newEnumValueDeprecationReason: (_b = newValue.deprecationReason) !== null && _b !== void 0 ? _b : '',
106
+ },
107
+ });
108
+ }
109
+ function buildEnumValueDeprecationReasonAddedMessage(args) {
110
+ return `Enum value '${args.enumName}.${args.enumValueName}' was deprecated with reason '${args.addedValueDeprecationReason}'`;
111
+ }
112
+ export function enumValueDeprecationReasonAddedFromMeta(args) {
48
113
  return {
49
114
  criticality: {
50
115
  level: CriticalityLevel.NonBreaking,
51
116
  },
52
117
  type: ChangeType.EnumValueDeprecationReasonAdded,
53
- message: `Enum value '${newEnum.name}.${newValue.name}' was deprecated with reason '${newValue.deprecationReason}'`,
54
- path: [newEnum.name, oldValue.name].join('.'),
118
+ message: buildEnumValueDeprecationReasonAddedMessage(args.meta),
119
+ path: [args.meta.enumName, args.meta.enumValueName].join('.'),
120
+ meta: args.meta,
55
121
  };
56
122
  }
57
- export function enumValueDeprecationReasonRemoved(newEnum, oldValue, newValue) {
123
+ export function enumValueDeprecationReasonAdded(newEnum, oldValue, newValue) {
124
+ var _a;
125
+ return enumValueDeprecationReasonAddedFromMeta({
126
+ type: ChangeType.EnumValueDeprecationReasonAdded,
127
+ meta: {
128
+ enumName: newEnum.name,
129
+ enumValueName: oldValue.name,
130
+ addedValueDeprecationReason: (_a = newValue.deprecationReason) !== null && _a !== void 0 ? _a : '',
131
+ },
132
+ });
133
+ }
134
+ function buildEnumValueDeprecationReasonRemovedMessage(args) {
135
+ return `Deprecation reason was removed from enum value '${args.enumName}.${args.enumValueName}'`;
136
+ }
137
+ export function enumValueDeprecationReasonRemovedFromMeta(args) {
58
138
  return {
59
139
  criticality: {
60
140
  level: CriticalityLevel.NonBreaking,
61
141
  },
62
142
  type: ChangeType.EnumValueDeprecationReasonRemoved,
63
- message: `Deprecation reason was removed from enum value '${newEnum.name}.${newValue.name}'`,
64
- path: [newEnum.name, oldValue.name].join('.'),
143
+ message: buildEnumValueDeprecationReasonRemovedMessage(args.meta),
144
+ path: [args.meta.enumName, args.meta.enumValueName].join('.'),
145
+ meta: args.meta,
65
146
  };
66
147
  }
148
+ export function enumValueDeprecationReasonRemoved(newEnum, oldValue, _newValue) {
149
+ var _a;
150
+ return enumValueDeprecationReasonRemovedFromMeta({
151
+ type: ChangeType.EnumValueDeprecationReasonRemoved,
152
+ meta: {
153
+ enumName: newEnum.name,
154
+ enumValueName: oldValue.name,
155
+ removedEnumValueDeprecationReason: (_a = oldValue.deprecationReason) !== null && _a !== void 0 ? _a : '',
156
+ },
157
+ });
158
+ }