@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
@@ -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
+ }
@@ -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
+ }