@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,150 +1,328 @@
1
1
  import { isInterfaceType, isNonNullType, } from 'graphql';
2
2
  import { safeChangeForField } from '../../utils/graphql.js';
3
- import { isDeprecated } from '../../utils/is-deprecated.js';
4
- import { ChangeType, CriticalityLevel } from './change.js';
5
- export function fieldRemoved(type, field) {
6
- const entity = isInterfaceType(type) ? 'interface' : 'object type';
3
+ import { ChangeType, CriticalityLevel, } from './change.js';
4
+ function buildFieldRemovedMessage(args) {
5
+ return `Field '${args.removedFieldName}' ${args.isRemovedFieldDeprecated ? '(deprecated) ' : ''}was removed from ${args.typeType} '${args.typeName}'`;
6
+ }
7
+ export function fieldRemovedFromMeta(args) {
7
8
  return {
9
+ type: ChangeType.FieldRemoved,
8
10
  criticality: {
9
11
  level: CriticalityLevel.Breaking,
10
- reason: field.deprecationReason
12
+ reason: args.meta.isRemovedFieldDeprecated
11
13
  ? `Removing a deprecated field is a breaking change. Before removing it, you may want to look at the field's usage to see the impact of removing the field.`
12
14
  : `Removing a field is a breaking change. It is preferable to deprecate the field before removing it.`,
13
15
  },
16
+ message: buildFieldRemovedMessage(args.meta),
17
+ meta: args.meta,
18
+ path: [args.meta.typeName, args.meta.removedFieldName].join('.'),
19
+ };
20
+ }
21
+ export function fieldRemoved(type, field) {
22
+ const entity = isInterfaceType(type) ? 'interface' : 'object type';
23
+ return fieldRemovedFromMeta({
14
24
  type: ChangeType.FieldRemoved,
15
- message: `Field '${field.name}' ${isDeprecated(field) ? '(deprecated) ' : ''}was removed from ${entity} '${type.name}'`,
16
- path: [type.name, field.name].join('.'),
25
+ meta: {
26
+ typeName: type.name,
27
+ removedFieldName: field.name,
28
+ isRemovedFieldDeprecated: field.deprecationReason != null,
29
+ typeType: entity,
30
+ },
31
+ });
32
+ }
33
+ function buildFieldAddedMessage(args) {
34
+ return `Field '${args.addedFieldName}' was added to ${args.typeType} '${args.typeName}'`;
35
+ }
36
+ export function fieldAddedFromMeta(args) {
37
+ return {
38
+ type: ChangeType.FieldAdded,
39
+ criticality: {
40
+ level: CriticalityLevel.NonBreaking,
41
+ },
42
+ message: buildFieldAddedMessage(args.meta),
43
+ meta: args.meta,
44
+ path: [args.meta.typeName, args.meta.addedFieldName].join('.'),
17
45
  };
18
46
  }
19
47
  export function fieldAdded(type, field) {
20
48
  const entity = isInterfaceType(type) ? 'interface' : 'object type';
49
+ return fieldAddedFromMeta({
50
+ type: ChangeType.FieldAdded,
51
+ meta: {
52
+ typeName: type.name,
53
+ addedFieldName: field.name,
54
+ typeType: entity,
55
+ },
56
+ });
57
+ }
58
+ function buildFieldDescriptionChangedMessage(args) {
59
+ return `Field '${args.typeName}.${args.fieldName}' description changed from '${args.oldDescription}' to '${args.newDescription}'`;
60
+ }
61
+ export function fieldDescriptionChangedFromMeta(args) {
21
62
  return {
63
+ type: ChangeType.FieldDescriptionChanged,
22
64
  criticality: {
23
65
  level: CriticalityLevel.NonBreaking,
24
66
  },
25
- type: ChangeType.FieldAdded,
26
- message: `Field '${field.name}' was added to ${entity} '${type.name}'`,
27
- path: [type.name, field.name].join('.'),
67
+ message: buildFieldDescriptionChangedMessage(args.meta),
68
+ meta: args.meta,
69
+ path: [args.meta.typeName, args.meta.fieldName].join('.'),
28
70
  };
29
71
  }
30
72
  export function fieldDescriptionChanged(type, oldField, newField) {
73
+ var _a, _b;
74
+ return fieldDescriptionChangedFromMeta({
75
+ type: ChangeType.FieldDescriptionChanged,
76
+ meta: {
77
+ fieldName: oldField.name,
78
+ typeName: type.name,
79
+ oldDescription: (_a = oldField.description) !== null && _a !== void 0 ? _a : '',
80
+ newDescription: (_b = newField.description) !== null && _b !== void 0 ? _b : '',
81
+ },
82
+ });
83
+ }
84
+ function buildFieldDescriptionAddedMessage(args) {
85
+ return `Field '${args.typeName}.${args.fieldName}' has description '${args.addedDescription}'`;
86
+ }
87
+ export function fieldDescriptionAddedFromMeta(args) {
31
88
  return {
89
+ type: ChangeType.FieldDescriptionAdded,
32
90
  criticality: {
33
91
  level: CriticalityLevel.NonBreaking,
34
92
  },
35
- type: ChangeType.FieldDescriptionChanged,
36
- message: `Field '${type.name}.${oldField.name}' description changed from '${oldField.description}' to '${newField.description}'`,
37
- path: [type.name, oldField.name].join('.'),
93
+ message: buildFieldDescriptionAddedMessage(args.meta),
94
+ meta: args.meta,
95
+ path: [args.meta.typeName, args.meta.fieldName].join('.'),
38
96
  };
39
97
  }
40
98
  export function fieldDescriptionAdded(type, field) {
99
+ var _a;
100
+ return fieldDescriptionAddedFromMeta({
101
+ type: ChangeType.FieldDescriptionAdded,
102
+ meta: {
103
+ typeName: type.name,
104
+ fieldName: field.name,
105
+ addedDescription: (_a = field.description) !== null && _a !== void 0 ? _a : '',
106
+ },
107
+ });
108
+ }
109
+ function buildFieldDescriptionRemovedMessage(args) {
110
+ return `Description was removed from field '${args.typeName}.${args.fieldName}'`;
111
+ }
112
+ export function fieldDescriptionRemovedFromMeta(args) {
41
113
  return {
114
+ type: ChangeType.FieldDescriptionRemoved,
42
115
  criticality: {
43
116
  level: CriticalityLevel.NonBreaking,
44
117
  },
45
- type: ChangeType.FieldDescriptionAdded,
46
- message: `Field '${type.name}.${field.name}' has description '${field.description}'`,
47
- path: [type.name, field.name].join('.'),
118
+ message: buildFieldDescriptionRemovedMessage(args.meta),
119
+ meta: args.meta,
120
+ path: [args.meta.typeName, args.meta.fieldName].join('.'),
48
121
  };
49
122
  }
50
123
  export function fieldDescriptionRemoved(type, field) {
124
+ return fieldDescriptionRemovedFromMeta({
125
+ type: ChangeType.FieldDescriptionRemoved,
126
+ meta: {
127
+ typeName: type.name,
128
+ fieldName: field.name,
129
+ },
130
+ });
131
+ }
132
+ function buildFieldDeprecatedAddedMessage(args) {
133
+ return `Field '${args.typeName}.${args.fieldName}' is deprecated`;
134
+ }
135
+ export function fieldDeprecationAddedFromMeta(args) {
51
136
  return {
137
+ type: ChangeType.FieldDeprecationAdded,
52
138
  criticality: {
53
139
  level: CriticalityLevel.NonBreaking,
54
140
  },
55
- type: ChangeType.FieldDescriptionRemoved,
56
- message: `Description was removed from field '${type.name}.${field.name}'`,
57
- path: [type.name, field.name].join('.'),
141
+ message: buildFieldDeprecatedAddedMessage(args.meta),
142
+ meta: args.meta,
143
+ path: [args.meta.typeName, args.meta.fieldName].join('.'),
58
144
  };
59
145
  }
60
146
  export function fieldDeprecationAdded(type, field) {
147
+ return fieldDeprecationAddedFromMeta({
148
+ type: ChangeType.FieldDeprecationAdded,
149
+ meta: {
150
+ typeName: type.name,
151
+ fieldName: field.name,
152
+ },
153
+ });
154
+ }
155
+ export function fieldDeprecationRemovedFromMeta(args) {
61
156
  return {
157
+ type: ChangeType.FieldDeprecationRemoved,
62
158
  criticality: {
63
- level: CriticalityLevel.NonBreaking,
159
+ level: CriticalityLevel.Dangerous,
64
160
  },
65
- type: ChangeType.FieldDeprecationAdded,
66
- message: `Field '${type.name}.${field.name}' is deprecated`,
67
- path: [type.name, field.name].join('.'),
161
+ message: `Field '${args.meta.typeName}.${args.meta.fieldName}' is no longer deprecated`,
162
+ meta: args.meta,
163
+ path: [args.meta.typeName, args.meta.fieldName].join('.'),
68
164
  };
69
165
  }
70
166
  export function fieldDeprecationRemoved(type, field) {
167
+ return fieldDeprecationRemovedFromMeta({
168
+ type: ChangeType.FieldDeprecationRemoved,
169
+ meta: {
170
+ fieldName: field.name,
171
+ typeName: type.name,
172
+ },
173
+ });
174
+ }
175
+ function buildFieldDeprecationReasonChangedMessage(args) {
176
+ return `Deprecation reason on field '${args.typeName}.${args.fieldName}' has changed from '${args.oldDeprecationReason}' to '${args.newDeprecationReason}'`;
177
+ }
178
+ export function fieldDeprecationReasonChangedFromMeta(args) {
71
179
  return {
180
+ type: ChangeType.FieldDeprecationReasonChanged,
72
181
  criticality: {
73
- level: CriticalityLevel.Dangerous,
182
+ level: CriticalityLevel.NonBreaking,
74
183
  },
75
- type: ChangeType.FieldDeprecationRemoved,
76
- message: `Field '${type.name}.${field.name}' is no longer deprecated`,
77
- path: [type.name, field.name].join('.'),
184
+ message: buildFieldDeprecationReasonChangedMessage(args.meta),
185
+ meta: args.meta,
186
+ path: [args.meta.typeName, args.meta.fieldName].join('.'),
78
187
  };
79
188
  }
80
189
  export function fieldDeprecationReasonChanged(type, oldField, newField) {
190
+ var _a, _b;
191
+ return fieldDeprecationReasonChangedFromMeta({
192
+ type: ChangeType.FieldDeprecationReasonChanged,
193
+ meta: {
194
+ fieldName: newField.name,
195
+ typeName: type.name,
196
+ newDeprecationReason: (_a = newField.deprecationReason) !== null && _a !== void 0 ? _a : '',
197
+ oldDeprecationReason: (_b = oldField.deprecationReason) !== null && _b !== void 0 ? _b : '',
198
+ },
199
+ });
200
+ }
201
+ function buildFieldDeprecationReasonAddedMessage(args) {
202
+ return `Field '${args.typeName}.${args.fieldName}' has deprecation reason '${args.addedDeprecationReason}'`;
203
+ }
204
+ export function fieldDeprecationReasonAddedFromMeta(args) {
81
205
  return {
206
+ type: ChangeType.FieldDeprecationReasonAdded,
82
207
  criticality: {
83
208
  level: CriticalityLevel.NonBreaking,
84
209
  },
85
- type: ChangeType.FieldDeprecationReasonChanged,
86
- message: `Deprecation reason on field '${type.name}.${newField.name}' has changed from '${oldField.deprecationReason}' to '${newField.deprecationReason}'`,
87
- path: [type.name, oldField.name].join('.'),
210
+ message: buildFieldDeprecationReasonAddedMessage(args.meta),
211
+ meta: args.meta,
212
+ path: [args.meta.typeName, args.meta.fieldName].join('.'),
88
213
  };
89
214
  }
90
215
  export function fieldDeprecationReasonAdded(type, field) {
216
+ var _a;
217
+ return fieldDeprecationReasonAddedFromMeta({
218
+ type: ChangeType.FieldDeprecationReasonAdded,
219
+ meta: {
220
+ typeName: type.name,
221
+ fieldName: field.name,
222
+ addedDeprecationReason: (_a = field.deprecationReason) !== null && _a !== void 0 ? _a : '',
223
+ },
224
+ });
225
+ }
226
+ export function fieldDeprecationReasonRemovedFromMeta(args) {
91
227
  return {
228
+ type: ChangeType.FieldDeprecationReasonRemoved,
92
229
  criticality: {
93
230
  level: CriticalityLevel.NonBreaking,
94
231
  },
95
- type: ChangeType.FieldDeprecationReasonAdded,
96
- message: `Field '${type.name}.${field.name}' has deprecation reason '${field.deprecationReason}'`,
97
- path: [type.name, field.name].join('.'),
232
+ message: `Deprecation reason was removed from field '${args.meta.typeName}.${args.meta.fieldName}'`,
233
+ meta: args.meta,
234
+ path: [args.meta.typeName, args.meta.fieldName].join('.'),
98
235
  };
99
236
  }
100
237
  export function fieldDeprecationReasonRemoved(type, field) {
238
+ return fieldDeprecationReasonRemovedFromMeta({
239
+ type: ChangeType.FieldDeprecationReasonRemoved,
240
+ meta: {
241
+ typeName: type.name,
242
+ fieldName: field.name,
243
+ },
244
+ });
245
+ }
246
+ function buildFieldTypeChangedMessage(args) {
247
+ return `Field '${args.meta.typeName}.${args.meta.fieldName}' changed type from '${args.meta.oldFieldType}' to '${args.meta.newFieldType}'`;
248
+ }
249
+ export function fieldTypeChangedFromMeta(args) {
101
250
  return {
251
+ type: ChangeType.FieldTypeChanged,
102
252
  criticality: {
103
- level: CriticalityLevel.NonBreaking,
253
+ level: args.meta.isSafeFieldTypeChange
254
+ ? CriticalityLevel.NonBreaking
255
+ : CriticalityLevel.Breaking,
104
256
  },
105
- type: ChangeType.FieldDeprecationReasonRemoved,
106
- message: `Deprecation reason was removed from field '${type.name}.${field.name}'`,
107
- path: [type.name, field.name].join('.'),
257
+ message: buildFieldTypeChangedMessage(args),
258
+ meta: args.meta,
259
+ path: [args.meta.typeName, args.meta.fieldName].join('.'),
108
260
  };
109
261
  }
110
262
  export function fieldTypeChanged(type, oldField, newField) {
263
+ return fieldTypeChangedFromMeta({
264
+ type: ChangeType.FieldTypeChanged,
265
+ meta: {
266
+ typeName: type.name,
267
+ fieldName: oldField.name,
268
+ oldFieldType: oldField.type.toString(),
269
+ newFieldType: newField.type.toString(),
270
+ isSafeFieldTypeChange: safeChangeForField(oldField.type, newField.type),
271
+ },
272
+ });
273
+ }
274
+ function buildFieldArgumentAddedMessage(args) {
275
+ return `Argument '${args.addedArgumentName}: ${args.addedArgumentType}'${args.hasDefaultValue ? ' (with default value) ' : ' '}added to field '${args.typeName}.${args.fieldName}'`;
276
+ }
277
+ export function fieldArgumentAddedFromMeta(args) {
111
278
  return {
279
+ type: ChangeType.FieldArgumentAdded,
112
280
  criticality: {
113
- level: safeChangeForField(oldField.type, newField.type)
114
- ? CriticalityLevel.NonBreaking
115
- : CriticalityLevel.Breaking,
281
+ level: args.meta.isAddedFieldArgumentBreaking
282
+ ? CriticalityLevel.Breaking
283
+ : CriticalityLevel.Dangerous,
116
284
  },
117
- type: ChangeType.FieldTypeChanged,
118
- message: `Field '${type}.${oldField.name}' changed type from '${oldField.type}' to '${newField.type}'`,
119
- path: [type.name, oldField.name].join('.'),
285
+ message: buildFieldArgumentAddedMessage(args.meta),
286
+ meta: args.meta,
287
+ path: [args.meta.typeName, args.meta.fieldName, args.meta.addedArgumentName].join('.'),
120
288
  };
121
289
  }
122
290
  export function fieldArgumentAdded(type, field, arg) {
123
291
  const isBreaking = isNonNullType(arg.type) && typeof arg.defaultValue === 'undefined';
124
- const defaultValueMsg = typeof arg.defaultValue === 'undefined' ? ' ' : ' (with default value) ';
125
- return {
126
- criticality: isBreaking
127
- ? {
128
- level: CriticalityLevel.Breaking,
129
- reason: `Adding a required argument to an existing field is a breaking change because it will cause existing uses of this field to error.`,
130
- }
131
- : {
132
- level: CriticalityLevel.Dangerous,
133
- reason: `Adding a new argument to an existing field may involve a change in resolve function logic that potentially may cause some side effects.`,
134
- },
292
+ return fieldArgumentAddedFromMeta({
135
293
  type: ChangeType.FieldArgumentAdded,
136
- message: `Argument '${arg.name}: ${arg.type}'${defaultValueMsg}added to field '${type.name}.${field.name}'`,
137
- path: [type.name, field.name, arg.name].join('.'),
138
- };
294
+ meta: {
295
+ typeName: type.name,
296
+ fieldName: field.name,
297
+ addedArgumentName: arg.name,
298
+ addedArgumentType: arg.type.toString(),
299
+ hasDefaultValue: arg.defaultValue != null,
300
+ isAddedFieldArgumentBreaking: isBreaking,
301
+ },
302
+ });
139
303
  }
140
- export function fieldArgumentRemoved(type, field, arg) {
304
+ function buildFieldArgumentRemovedMessage(args) {
305
+ return `Argument '${args.meta.removedFieldArgumentName}: ${args.meta.removedFieldType}' was removed from field '${args.meta.typeName}.${args.meta.fieldName}'`;
306
+ }
307
+ export function fieldArgumentRemovedFromMeta(args) {
141
308
  return {
309
+ type: ChangeType.FieldArgumentRemoved,
142
310
  criticality: {
143
311
  level: CriticalityLevel.Breaking,
144
- reason: `Removing a field argument is a breaking change because it will cause existing queries that use this argument to error.`,
145
312
  },
146
- type: ChangeType.FieldArgumentRemoved,
147
- message: `Argument '${arg.name}: ${arg.type}' was removed from field '${type.name}.${field.name}'`,
148
- path: [type.name, field.name, arg.name].join('.'),
313
+ message: buildFieldArgumentRemovedMessage(args),
314
+ meta: args.meta,
315
+ path: [args.meta.typeName, args.meta.fieldName, args.meta.removedFieldArgumentName].join('.'),
149
316
  };
150
317
  }
318
+ export function fieldArgumentRemoved(type, field, arg) {
319
+ return fieldArgumentRemovedFromMeta({
320
+ type: ChangeType.FieldArgumentRemoved,
321
+ meta: {
322
+ typeName: type.name,
323
+ fieldName: field.name,
324
+ removedFieldArgumentName: arg.name,
325
+ removedFieldType: arg.type.toString(),
326
+ },
327
+ });
328
+ }
@@ -2,77 +2,176 @@ import { isNonNullType } from 'graphql';
2
2
  import { safeChangeForInputValue } from '../../utils/graphql.js';
3
3
  import { isDeprecated } from '../../utils/is-deprecated.js';
4
4
  import { safeString } from '../../utils/string.js';
5
- import { ChangeType, CriticalityLevel } from './change.js';
6
- export function inputFieldRemoved(input, field) {
5
+ import { ChangeType, CriticalityLevel, } from './change.js';
6
+ function buildInputFieldRemovedMessage(args) {
7
+ return `Input field '${args.removedFieldName}' ${args.isInputFieldDeprecated ? '(deprecated) ' : ''}was removed from input object type '${args.inputName}'`;
8
+ }
9
+ export function inputFieldRemovedFromMeta(args) {
7
10
  return {
11
+ type: ChangeType.InputFieldRemoved,
8
12
  criticality: {
9
13
  level: CriticalityLevel.Breaking,
10
14
  reason: 'Removing an input field will cause existing queries that use this input field to error.',
11
15
  },
12
- type: ChangeType.InputFieldRemoved,
13
- message: `Input field '${field.name}' ${isDeprecated(field) ? '(deprecated) ' : ''}was removed from input object type '${input.name}'`,
14
- path: [input.name, field.name].join('.'),
16
+ message: buildInputFieldRemovedMessage(args.meta),
17
+ meta: args.meta,
18
+ path: [args.meta.inputName, args.meta.removedFieldName].join('.'),
15
19
  };
16
20
  }
17
- export function inputFieldAdded(input, field) {
21
+ export function inputFieldRemoved(input, field) {
22
+ return inputFieldRemovedFromMeta({
23
+ type: ChangeType.InputFieldRemoved,
24
+ meta: {
25
+ inputName: input.name,
26
+ removedFieldName: field.name,
27
+ isInputFieldDeprecated: isDeprecated(field),
28
+ },
29
+ });
30
+ }
31
+ export function buildInputFieldAddedMessage(args) {
32
+ return `Input field '${args.addedInputFieldName}' of type '${args.addedInputFieldType}' was added to input object type '${args.inputName}'`;
33
+ }
34
+ export function inputFieldAddedFromMeta(args) {
18
35
  return {
19
- criticality: isNonNullType(field.type)
36
+ type: ChangeType.InputFieldAdded,
37
+ criticality: args.meta.isAddedInputFieldTypeNullable
20
38
  ? {
21
- level: CriticalityLevel.Breaking,
22
- reason: 'Adding a required input field to an existing input object type is a breaking change because it will cause existing uses of this input object type to error.',
39
+ level: CriticalityLevel.Dangerous,
23
40
  }
24
41
  : {
25
- level: CriticalityLevel.Dangerous,
42
+ level: CriticalityLevel.Breaking,
43
+ reason: 'Adding a required input field to an existing input object type is a breaking change because it will cause existing uses of this input object type to error.',
26
44
  },
27
- type: ChangeType.InputFieldAdded,
28
- message: `Input field '${field.name}' was added to input object type '${input.name}'`,
29
- path: [input.name, field.name].join('.'),
45
+ message: buildInputFieldAddedMessage(args.meta),
46
+ meta: args.meta,
47
+ path: [args.meta.inputName, args.meta.addedInputFieldName].join('.'),
30
48
  };
31
49
  }
32
- export function inputFieldDescriptionAdded(type, field) {
50
+ export function inputFieldAdded(input, field) {
51
+ return inputFieldAddedFromMeta({
52
+ type: ChangeType.InputFieldAdded,
53
+ meta: {
54
+ inputName: input.name,
55
+ addedInputFieldName: field.name,
56
+ isAddedInputFieldTypeNullable: !isNonNullType(field.type),
57
+ addedInputFieldType: field.type.toString(),
58
+ },
59
+ });
60
+ }
61
+ function buildInputFieldDescriptionAddedMessage(args) {
62
+ return `Input field '${args.inputName}.${args.inputFieldName}' has description '${args.addedInputFieldDescription}'`;
63
+ }
64
+ export function inputFieldDescriptionAddedFromMeta(args) {
33
65
  return {
66
+ type: ChangeType.InputFieldDescriptionAdded,
34
67
  criticality: {
35
68
  level: CriticalityLevel.NonBreaking,
36
69
  },
37
- type: ChangeType.InputFieldDescriptionAdded,
38
- message: `Input field '${type.name}.${field.name}' has description '${field.description}'`,
39
- path: [type.name, field.name].join('.'),
70
+ message: buildInputFieldDescriptionAddedMessage(args.meta),
71
+ meta: args.meta,
72
+ path: [args.meta.inputName, args.meta.inputFieldName].join('.'),
40
73
  };
41
74
  }
42
- export function inputFieldDescriptionRemoved(type, field) {
75
+ export function inputFieldDescriptionAdded(type, field) {
76
+ var _a;
77
+ return inputFieldDescriptionAddedFromMeta({
78
+ type: ChangeType.InputFieldDescriptionAdded,
79
+ meta: {
80
+ inputName: type.name,
81
+ inputFieldName: field.name,
82
+ addedInputFieldDescription: (_a = field.description) !== null && _a !== void 0 ? _a : '',
83
+ },
84
+ });
85
+ }
86
+ function buildInputFieldDescriptionRemovedMessage(args) {
87
+ return `Description '${args.removedDescription}' was removed from input field '${args.inputName}.${args.inputFieldName}'`;
88
+ }
89
+ export function inputFieldDescriptionRemovedFromMeta(args) {
43
90
  return {
91
+ type: ChangeType.InputFieldDescriptionRemoved,
44
92
  criticality: {
45
93
  level: CriticalityLevel.NonBreaking,
46
94
  },
47
- type: ChangeType.InputFieldDescriptionRemoved,
48
- message: `Description was removed from input field '${type.name}.${field.name}'`,
49
- path: [type.name, field.name].join('.'),
95
+ message: buildInputFieldDescriptionRemovedMessage(args.meta),
96
+ meta: args.meta,
97
+ path: [args.meta.inputName, args.meta.inputFieldName].join('.'),
50
98
  };
51
99
  }
52
- export function inputFieldDescriptionChanged(input, oldField, newField) {
100
+ export function inputFieldDescriptionRemoved(type, field) {
101
+ var _a;
102
+ return inputFieldDescriptionRemovedFromMeta({
103
+ type: ChangeType.InputFieldDescriptionRemoved,
104
+ meta: {
105
+ inputName: type.name,
106
+ inputFieldName: field.name,
107
+ removedDescription: (_a = field.description) !== null && _a !== void 0 ? _a : '',
108
+ },
109
+ });
110
+ }
111
+ function buildInputFieldDescriptionChangedMessage(args) {
112
+ return `Input field '${args.inputName}.${args.inputFieldName}' description changed from '${args.oldInputFieldDescription}' to '${args.newInputFieldDescription}'`;
113
+ }
114
+ export function inputFieldDescriptionChangedFromMeta(args) {
53
115
  return {
116
+ type: ChangeType.InputFieldDescriptionChanged,
54
117
  criticality: {
55
118
  level: CriticalityLevel.NonBreaking,
56
119
  },
57
- type: ChangeType.InputFieldDescriptionChanged,
58
- message: `Input field '${input.name}.${oldField.name}' description changed from '${oldField.description}' to '${newField.description}'`,
59
- path: [input.name, oldField.name].join('.'),
120
+ message: buildInputFieldDescriptionChangedMessage(args.meta),
121
+ meta: args.meta,
122
+ path: [args.meta.inputName, args.meta.inputFieldName].join('.'),
60
123
  };
61
124
  }
62
- export function inputFieldDefaultValueChanged(input, oldField, newField) {
125
+ export function inputFieldDescriptionChanged(input, oldField, newField) {
126
+ var _a, _b;
127
+ return inputFieldDescriptionChangedFromMeta({
128
+ type: ChangeType.InputFieldDescriptionChanged,
129
+ meta: {
130
+ inputName: input.name,
131
+ inputFieldName: oldField.name,
132
+ oldInputFieldDescription: (_a = oldField.description) !== null && _a !== void 0 ? _a : '',
133
+ newInputFieldDescription: (_b = newField.description) !== null && _b !== void 0 ? _b : '',
134
+ },
135
+ });
136
+ }
137
+ function buildInputFieldDefaultValueChangedMessage(args) {
138
+ return `Input field '${args.inputName}.${args.inputFieldName}' default value changed from '${args.oldDefaultValue}' to '${args.newDefaultValue}'`;
139
+ }
140
+ export function inputFieldDefaultValueChangedFromMeta(args) {
63
141
  return {
142
+ type: ChangeType.InputFieldDefaultValueChanged,
64
143
  criticality: {
65
144
  level: CriticalityLevel.Dangerous,
66
145
  reason: 'Changing the default value for an argument may change the runtime behavior of a field if it was never provided.',
67
146
  },
68
- type: ChangeType.InputFieldDefaultValueChanged,
69
- message: `Input field '${input.name}.${oldField.name}' default value changed from '${safeString(oldField.defaultValue)}' to '${safeString(newField.defaultValue)}'`,
70
- path: [input.name, oldField.name].join('.'),
147
+ message: buildInputFieldDefaultValueChangedMessage(args.meta),
148
+ meta: args.meta,
149
+ path: [args.meta.inputName, args.meta.inputFieldName].join('.'),
71
150
  };
72
151
  }
73
- export function inputFieldTypeChanged(input, oldField, newField) {
152
+ export function inputFieldDefaultValueChanged(input, oldField, newField) {
153
+ const meta = {
154
+ inputName: input.name,
155
+ inputFieldName: oldField.name,
156
+ };
157
+ if (oldField.defaultValue !== undefined) {
158
+ meta.oldDefaultValue = safeString(oldField.defaultValue);
159
+ }
160
+ if (newField.defaultValue !== undefined) {
161
+ meta.newDefaultValue = safeString(newField.defaultValue);
162
+ }
163
+ return inputFieldDefaultValueChangedFromMeta({
164
+ type: ChangeType.InputFieldDefaultValueChanged,
165
+ meta,
166
+ });
167
+ }
168
+ function buildInputFieldTypeChangedMessage(args) {
169
+ return `Input field '${args.inputName}.${args.inputFieldName}' changed type from '${args.oldInputFieldType}' to '${args.newInputFieldType}'`;
170
+ }
171
+ export function inputFieldTypeChangedFromMeta(args) {
74
172
  return {
75
- criticality: safeChangeForInputValue(oldField.type, newField.type)
173
+ type: ChangeType.InputFieldTypeChanged,
174
+ criticality: args.meta.isInputFieldTypeChangeSafe
76
175
  ? {
77
176
  level: CriticalityLevel.NonBreaking,
78
177
  reason: 'Changing an input field from non-null to null is considered non-breaking.',
@@ -81,8 +180,20 @@ export function inputFieldTypeChanged(input, oldField, newField) {
81
180
  level: CriticalityLevel.Breaking,
82
181
  reason: 'Changing the type of an input field can cause existing queries that use this field to error.',
83
182
  },
84
- type: ChangeType.InputFieldTypeChanged,
85
- message: `Input field '${input.name}.${oldField.name}' changed type from '${oldField.type.toString()}' to '${newField.type.toString()}'`,
86
- path: [input.name, oldField.name].join('.'),
183
+ message: buildInputFieldTypeChangedMessage(args.meta),
184
+ meta: args.meta,
185
+ path: [args.meta.inputName, args.meta.inputFieldName].join('.'),
87
186
  };
88
187
  }
188
+ export function inputFieldTypeChanged(input, oldField, newField) {
189
+ return inputFieldTypeChangedFromMeta({
190
+ type: ChangeType.InputFieldTypeChanged,
191
+ meta: {
192
+ inputName: input.name,
193
+ inputFieldName: oldField.name,
194
+ oldInputFieldType: oldField.type.toString(),
195
+ newInputFieldType: newField.type.toString(),
196
+ isInputFieldTypeChangeSafe: safeChangeForInputValue(oldField.type, newField.type),
197
+ },
198
+ });
199
+ }