@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
@@ -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
+ }
@@ -1,23 +1,49 @@
1
- import { ChangeType, CriticalityLevel } from './change.js';
2
- export function objectTypeInterfaceAdded(iface, type) {
1
+ import { ChangeType, CriticalityLevel, } from './change.js';
2
+ function buildObjectTypeInterfaceAddedMessage(args) {
3
+ return `'${args.objectTypeName}' object implements '${args.addedInterfaceName}' interface`;
4
+ }
5
+ export function objectTypeInterfaceAddedFromMeta(args) {
3
6
  return {
7
+ type: ChangeType.ObjectTypeInterfaceAdded,
4
8
  criticality: {
5
9
  level: CriticalityLevel.Dangerous,
6
10
  reason: 'Adding an interface to an object type may break existing clients that were not programming defensively against a new possible type.',
7
11
  },
8
- type: ChangeType.ObjectTypeInterfaceAdded,
9
- message: `'${type.name}' object implements '${iface.name}' interface`,
10
- path: type.name,
12
+ message: buildObjectTypeInterfaceAddedMessage(args.meta),
13
+ meta: args.meta,
14
+ path: args.meta.objectTypeName,
11
15
  };
12
16
  }
13
- export function objectTypeInterfaceRemoved(iface, type) {
17
+ export function objectTypeInterfaceAdded(iface, type) {
18
+ return objectTypeInterfaceAddedFromMeta({
19
+ type: ChangeType.ObjectTypeInterfaceAdded,
20
+ meta: {
21
+ objectTypeName: type.name,
22
+ addedInterfaceName: iface.name,
23
+ },
24
+ });
25
+ }
26
+ function buildObjectTypeInterfaceRemovedMessage(args) {
27
+ return `'${args.objectTypeName}' object type no longer implements '${args.removedInterfaceName}' interface`;
28
+ }
29
+ export function objectTypeInterfaceRemovedFromMeta(args) {
14
30
  return {
31
+ type: ChangeType.ObjectTypeInterfaceRemoved,
15
32
  criticality: {
16
33
  level: CriticalityLevel.Breaking,
17
34
  reason: 'Removing an interface from an object type can cause existing queries that use this in a fragment spread to error.',
18
35
  },
19
- type: ChangeType.ObjectTypeInterfaceRemoved,
20
- message: `'${type.name}' object type no longer implements '${iface.name}' interface`,
21
- path: type.name,
36
+ message: buildObjectTypeInterfaceRemovedMessage(args.meta),
37
+ meta: args.meta,
38
+ path: args.meta.objectTypeName,
22
39
  };
23
40
  }
41
+ export function objectTypeInterfaceRemoved(iface, type) {
42
+ return objectTypeInterfaceRemovedFromMeta({
43
+ type: ChangeType.ObjectTypeInterfaceRemoved,
44
+ meta: {
45
+ objectTypeName: type.name,
46
+ removedInterfaceName: iface.name,
47
+ },
48
+ });
49
+ }
@@ -1,34 +1,73 @@
1
- import { ChangeType, CriticalityLevel } from './change.js';
1
+ import { ChangeType, CriticalityLevel, } from './change.js';
2
+ function buildSchemaQueryTypeChangedMessage(args) {
3
+ return `Schema query root has changed from '${args.oldQueryTypeName}' to '${args.newQueryTypeName}'`;
4
+ }
5
+ export function schemaQueryTypeChangedFromMeta(args) {
6
+ return {
7
+ type: ChangeType.SchemaQueryTypeChanged,
8
+ criticality: {
9
+ level: CriticalityLevel.Breaking,
10
+ },
11
+ message: buildSchemaQueryTypeChangedMessage(args.meta),
12
+ meta: args.meta,
13
+ };
14
+ }
2
15
  export function schemaQueryTypeChanged(oldSchema, newSchema) {
3
16
  const oldName = (oldSchema.getQueryType() || {}).name || 'unknown';
4
17
  const newName = (newSchema.getQueryType() || {}).name || 'unknown';
18
+ return schemaQueryTypeChangedFromMeta({
19
+ type: ChangeType.SchemaQueryTypeChanged,
20
+ meta: {
21
+ oldQueryTypeName: oldName,
22
+ newQueryTypeName: newName,
23
+ },
24
+ });
25
+ }
26
+ function buildSchemaMutationTypeChangedMessage(args) {
27
+ return `Schema mutation root has changed from '${args.oldMutationTypeName}' to '${args.newMutationTypeName}'`;
28
+ }
29
+ export function schemaMutationTypeChangedFromMeta(args) {
5
30
  return {
31
+ type: ChangeType.SchemaMutationTypeChanged,
6
32
  criticality: {
7
33
  level: CriticalityLevel.Breaking,
8
34
  },
9
- type: ChangeType.SchemaQueryTypeChanged,
10
- message: `Schema query root has changed from '${oldName}' to '${newName}'`,
35
+ message: buildSchemaMutationTypeChangedMessage(args.meta),
36
+ meta: args.meta,
11
37
  };
12
38
  }
13
39
  export function schemaMutationTypeChanged(oldSchema, newSchema) {
14
40
  const oldName = (oldSchema.getMutationType() || {}).name || 'unknown';
15
41
  const newName = (newSchema.getMutationType() || {}).name || 'unknown';
42
+ return schemaMutationTypeChangedFromMeta({
43
+ type: ChangeType.SchemaMutationTypeChanged,
44
+ meta: {
45
+ newMutationTypeName: newName,
46
+ oldMutationTypeName: oldName,
47
+ },
48
+ });
49
+ }
50
+ function buildSchemaSubscriptionTypeChangedMessage(args) {
51
+ return `Schema subscription root has changed from '${args.oldSubscriptionTypeName}' to '${args.newSubscriptionTypeName}'`;
52
+ }
53
+ export function schemaSubscriptionTypeChangedFromMeta(args) {
16
54
  return {
55
+ type: ChangeType.SchemaSubscriptionTypeChanged,
17
56
  criticality: {
18
57
  level: CriticalityLevel.Breaking,
19
58
  },
20
- type: ChangeType.SchemaMutationTypeChanged,
21
- message: `Schema mutation root has changed from '${oldName}' to '${newName}'`,
59
+ message: buildSchemaSubscriptionTypeChangedMessage(args.meta),
60
+ meta: args.meta,
22
61
  };
23
62
  }
24
63
  export function schemaSubscriptionTypeChanged(oldSchema, newSchema) {
25
64
  const oldName = (oldSchema.getSubscriptionType() || {}).name || 'unknown';
26
65
  const newName = (newSchema.getSubscriptionType() || {}).name || 'unknown';
27
- return {
28
- criticality: {
29
- level: CriticalityLevel.Breaking,
30
- },
66
+ return schemaSubscriptionTypeChangedFromMeta({
31
67
  type: ChangeType.SchemaSubscriptionTypeChanged,
32
- message: `Schema subscription root has changed from '${oldName}' to '${newName}'`,
33
- };
68
+ meta: {
69
+ newSubscriptionTypeName: newName,
70
+ oldSubscriptionTypeName: oldName,
71
+ },
72
+ });
34
73
  }
@@ -1,63 +1,144 @@
1
1
  import { getKind } from '../../utils/graphql.js';
2
- import { ChangeType, CriticalityLevel } from './change.js';
3
- export function typeRemoved(type) {
2
+ import { ChangeType, CriticalityLevel, } from './change.js';
3
+ function buildTypeRemovedMessage(type) {
4
+ return `Type '${type.removedTypeName}' was removed`;
5
+ }
6
+ export function typeRemovedFromMeta(args) {
4
7
  return {
5
8
  criticality: {
6
9
  level: CriticalityLevel.Breaking,
7
10
  },
8
11
  type: ChangeType.TypeRemoved,
9
- message: `Type '${type.name}' was removed`,
10
- path: type.name,
12
+ message: buildTypeRemovedMessage(args.meta),
13
+ meta: args.meta,
14
+ path: args.meta.removedTypeName,
11
15
  };
12
16
  }
13
- export function typeAdded(type) {
17
+ export function typeRemoved(type) {
18
+ return typeRemovedFromMeta({
19
+ type: ChangeType.TypeRemoved,
20
+ meta: {
21
+ removedTypeName: type.name,
22
+ },
23
+ });
24
+ }
25
+ function buildTypeAddedMessage(type) {
26
+ return `Type '${type.addedTypeName}' was added`;
27
+ }
28
+ export function typeAddedFromMeta(args) {
14
29
  return {
15
30
  criticality: {
16
31
  level: CriticalityLevel.NonBreaking,
17
32
  },
18
33
  type: ChangeType.TypeAdded,
19
- message: `Type '${type.name}' was added`,
20
- path: type.name,
34
+ message: buildTypeAddedMessage(args.meta),
35
+ meta: args.meta,
36
+ path: args.meta.addedTypeName,
21
37
  };
22
38
  }
23
- export function typeKindChanged(oldType, newType) {
39
+ export function typeAdded(type) {
40
+ return typeAddedFromMeta({
41
+ type: ChangeType.TypeAdded,
42
+ meta: {
43
+ addedTypeName: type.name,
44
+ },
45
+ });
46
+ }
47
+ function buildTypeKindChangedMessage(args) {
48
+ return `'${args.meta.typeName}' kind changed from '${args.meta.oldTypeKind}' to '${args.meta.newTypeKind}'`;
49
+ }
50
+ export function typeKindChangedFromMeta(args) {
24
51
  return {
25
52
  criticality: {
26
53
  level: CriticalityLevel.Breaking,
27
54
  reason: `Changing the kind of a type is a breaking change because it can cause existing queries to error. For example, turning an object type to a scalar type would break queries that define a selection set for this type.`,
28
55
  },
29
56
  type: ChangeType.TypeKindChanged,
30
- message: `'${oldType.name}' kind changed from '${getKind(oldType)}' to '${getKind(newType)}'`,
31
- path: oldType.name,
57
+ message: buildTypeKindChangedMessage(args),
58
+ path: args.meta.typeName,
59
+ meta: args.meta,
32
60
  };
33
61
  }
34
- export function typeDescriptionChanged(oldType, newType) {
62
+ export function typeKindChanged(oldType, newType) {
63
+ return typeKindChangedFromMeta({
64
+ type: ChangeType.TypeKindChanged,
65
+ meta: {
66
+ typeName: oldType.name,
67
+ newTypeKind: String(getKind(newType)),
68
+ oldTypeKind: String(getKind(oldType)),
69
+ },
70
+ });
71
+ }
72
+ function buildTypeDescriptionChangedMessage(args) {
73
+ return `Description '${args.oldTypeDescription}' on type '${args.typeName}' has changed to '${args.newTypeDescription}'`;
74
+ }
75
+ export function typeDescriptionChangedFromMeta(args) {
35
76
  return {
36
77
  criticality: {
37
78
  level: CriticalityLevel.NonBreaking,
38
79
  },
39
80
  type: ChangeType.TypeDescriptionChanged,
40
- message: `Description '${oldType.description}' on type '${oldType.name}' has changed to '${newType.description}'`,
41
- path: oldType.name,
81
+ message: buildTypeDescriptionChangedMessage(args.meta),
82
+ path: args.meta.typeName,
83
+ meta: args.meta,
42
84
  };
43
85
  }
44
- export function typeDescriptionRemoved(type) {
86
+ export function typeDescriptionChanged(oldType, newType) {
87
+ var _a, _b;
88
+ return typeDescriptionChangedFromMeta({
89
+ type: ChangeType.TypeDescriptionChanged,
90
+ meta: {
91
+ typeName: oldType.name,
92
+ newTypeDescription: (_a = newType.description) !== null && _a !== void 0 ? _a : '',
93
+ oldTypeDescription: (_b = oldType.description) !== null && _b !== void 0 ? _b : '',
94
+ },
95
+ });
96
+ }
97
+ function buildTypeDescriptionRemoved(args) {
98
+ return `Description '${args.removedTypeDescription}' was removed from object type '${args.typeName}'`;
99
+ }
100
+ export function typeDescriptionRemovedFromMeta(args) {
45
101
  return {
46
102
  criticality: {
47
103
  level: CriticalityLevel.NonBreaking,
48
104
  },
49
105
  type: ChangeType.TypeDescriptionRemoved,
50
- message: `Description '${type.description}' was removed from object type '${type.name}'`,
51
- path: type.name,
106
+ message: buildTypeDescriptionRemoved(args.meta),
107
+ path: args.meta.typeName,
108
+ meta: args.meta,
52
109
  };
53
110
  }
54
- export function typeDescriptionAdded(type) {
111
+ export function typeDescriptionRemoved(type) {
112
+ var _a;
113
+ return typeDescriptionRemovedFromMeta({
114
+ type: ChangeType.TypeDescriptionRemoved,
115
+ meta: {
116
+ typeName: type.name,
117
+ removedTypeDescription: (_a = type.description) !== null && _a !== void 0 ? _a : '',
118
+ },
119
+ });
120
+ }
121
+ function buildTypeDescriptionAddedMessage(args) {
122
+ return `Object type '${args.typeName}' has description '${args.addedTypeDescription}'`;
123
+ }
124
+ export function typeDescriptionAddedFromMeta(args) {
55
125
  return {
56
126
  criticality: {
57
127
  level: CriticalityLevel.NonBreaking,
58
128
  },
59
129
  type: ChangeType.TypeDescriptionAdded,
60
- message: `Object type '${type.name}' has description '${type.description}'`,
61
- path: type.name,
130
+ message: buildTypeDescriptionAddedMessage(args.meta),
131
+ path: args.meta.typeName,
132
+ meta: args.meta,
62
133
  };
63
134
  }
135
+ export function typeDescriptionAdded(type) {
136
+ var _a;
137
+ return typeDescriptionAddedFromMeta({
138
+ type: ChangeType.TypeDescriptionAdded,
139
+ meta: {
140
+ typeName: type.name,
141
+ addedTypeDescription: (_a = type.description) !== null && _a !== void 0 ? _a : '',
142
+ },
143
+ });
144
+ }
@@ -1,23 +1,49 @@
1
- import { ChangeType, CriticalityLevel } from './change.js';
2
- export function unionMemberRemoved(union, type) {
1
+ import { ChangeType, CriticalityLevel, } from './change.js';
2
+ function buildUnionMemberRemovedMessage(args) {
3
+ return `Member '${args.removedUnionMemberTypeName}' was removed from Union type '${args.unionName}'`;
4
+ }
5
+ export function unionMemberRemovedFromMeta(args) {
3
6
  return {
4
7
  criticality: {
5
8
  level: CriticalityLevel.Breaking,
6
9
  reason: 'Removing a union member from a union can cause existing queries that use this union member in a fragment spread to error.',
7
10
  },
8
11
  type: ChangeType.UnionMemberRemoved,
9
- message: `Member '${type.name}' was removed from Union type '${union.name}'`,
10
- path: union.name,
12
+ message: buildUnionMemberRemovedMessage(args.meta),
13
+ meta: args.meta,
14
+ path: args.meta.unionName,
11
15
  };
12
16
  }
13
- export function unionMemberAdded(union, type) {
17
+ export function unionMemberRemoved(union, type) {
18
+ return unionMemberRemovedFromMeta({
19
+ type: ChangeType.UnionMemberRemoved,
20
+ meta: {
21
+ unionName: union.name,
22
+ removedUnionMemberTypeName: type.name,
23
+ },
24
+ });
25
+ }
26
+ function buildUnionMemberAddedMessage(args) {
27
+ return `Member '${args.addedUnionMemberTypeName}' was added to Union type '${args.unionName}'`;
28
+ }
29
+ export function buildUnionMemberAddedMessageFromMeta(args) {
14
30
  return {
15
31
  criticality: {
16
32
  level: CriticalityLevel.Dangerous,
17
33
  reason: 'Adding a possible type to Unions may break existing clients that were not programming defensively against a new possible type.',
18
34
  },
19
35
  type: ChangeType.UnionMemberAdded,
20
- message: `Member '${type.name}' was added to Union type '${union.name}'`,
21
- path: union.name,
36
+ message: buildUnionMemberAddedMessage(args.meta),
37
+ meta: args.meta,
38
+ path: args.meta.unionName,
22
39
  };
23
40
  }
41
+ export function unionMemberAdded(union, type) {
42
+ return buildUnionMemberAddedMessageFromMeta({
43
+ type: ChangeType.UnionMemberAdded,
44
+ meta: {
45
+ unionName: union.name,
46
+ addedUnionMemberTypeName: type.name,
47
+ },
48
+ });
49
+ }
@@ -28,7 +28,7 @@ export const considerUsage = ({ changes, config }) => __awaiter(void 0, void 0,
28
28
  if (change.criticality.level === CriticalityLevel.Breaking &&
29
29
  change.path &&
30
30
  suppressedPaths.some(p => change.path.startsWith(p))) {
31
- return Object.assign(Object.assign({}, change), { criticality: Object.assign(Object.assign({}, change.criticality), { level: CriticalityLevel.Dangerous }), message: `${change.message} (non-breaking based on usage)` });
31
+ return Object.assign(Object.assign({}, change), { criticality: Object.assign(Object.assign({}, change.criticality), { level: CriticalityLevel.Dangerous, isSafeBasedOnUsage: true }), message: `${change.message} (non-breaking based on usage)` });
32
32
  }
33
33
  return change;
34
34
  });
@@ -9,3 +9,12 @@ export { calculateOperationComplexity, } from './validate/complexity.js';
9
9
  export { countDirectives } from './validate/directive-count.js';
10
10
  export { countDepth } from './validate/query-depth.js';
11
11
  export { calculateTokenCount } from './validate/token-count.js';
12
+ export { fieldArgumentDescriptionChangedFromMeta, fieldArgumentDefaultChangedFromMeta, fieldArgumentTypeChangedFromMeta, } from './diff/changes/argument.js';
13
+ export { directiveRemovedFromMeta, directiveAddedFromMeta, directiveDescriptionChangedFromMeta, directiveLocationAddedFromMeta, directiveLocationRemovedFromMeta, directiveArgumentAddedFromMeta, directiveArgumentRemovedFromMeta, directiveArgumentDescriptionChangedFromMeta, directiveArgumentDefaultValueChangedFromMeta, directiveArgumentTypeChangedFromMeta, } from './diff/changes/directive.js';
14
+ export { enumValueRemovedFromMeta, enumValueAddedFromMeta, enumValueDescriptionChangedFromMeta, enumValueDeprecationReasonChangedFromMeta, enumValueDeprecationReasonAddedFromMeta, enumValueDeprecationReasonRemovedFromMeta, } from './diff/changes/enum.js';
15
+ export { fieldRemovedFromMeta, fieldAddedFromMeta, fieldDescriptionChangedFromMeta, fieldDescriptionAddedFromMeta, fieldDescriptionRemovedFromMeta, fieldDeprecationAddedFromMeta, fieldDeprecationRemovedFromMeta, fieldDeprecationReasonChangedFromMeta, fieldDeprecationReasonAddedFromMeta, fieldDeprecationReasonRemovedFromMeta, fieldTypeChangedFromMeta, fieldArgumentAddedFromMeta, fieldArgumentRemovedFromMeta, } from './diff/changes/field.js';
16
+ export { inputFieldRemovedFromMeta, inputFieldAddedFromMeta, inputFieldDescriptionAddedFromMeta, inputFieldDescriptionRemovedFromMeta, inputFieldDescriptionChangedFromMeta, inputFieldDefaultValueChangedFromMeta, inputFieldTypeChangedFromMeta, } from './diff/changes/input.js';
17
+ export { objectTypeInterfaceAddedFromMeta, objectTypeInterfaceRemovedFromMeta, } from './diff/changes/object.js';
18
+ export { schemaQueryTypeChangedFromMeta, schemaMutationTypeChangedFromMeta, schemaSubscriptionTypeChangedFromMeta, } from './diff/changes/schema.js';
19
+ export { typeRemovedFromMeta, typeAddedFromMeta, typeKindChangedFromMeta, typeDescriptionChangedFromMeta, typeDescriptionRemovedFromMeta, typeDescriptionAddedFromMeta, } from './diff/changes/type.js';
20
+ export { unionMemberRemovedFromMeta, buildUnionMemberAddedMessageFromMeta, } from './diff/changes/union.js';
@@ -1,7 +1,7 @@
1
1
  export function isDeprecated(fieldOrEnumValue) {
2
2
  var _a, _b;
3
3
  if ('isDeprecated' in fieldOrEnumValue) {
4
- return fieldOrEnumValue['isDeprecated'];
4
+ return !!fieldOrEnumValue['isDeprecated'];
5
5
  }
6
6
  if (fieldOrEnumValue.deprecationReason != null) {
7
7
  return true;
@@ -58,6 +58,9 @@ function wordLetterPairs(str) {
58
58
  return flattenDeep(pairs);
59
59
  }
60
60
  export function safeString(obj) {
61
+ if (typeof obj === 'string') {
62
+ return JSON.stringify(obj);
63
+ }
61
64
  return inspect(obj)
62
65
  .replace(/\[Object: null prototype\] /g, '')
63
66
  .replace(/(^')|('$)/g, '');