@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.
- package/README.md +3 -3
- package/cjs/action/src/run.js +1 -1
- package/cjs/commands/commands/src/index.js +7 -8
- package/cjs/commands/diff/src/index.js +6 -6
- package/cjs/commands/docs/src/index.js +1 -3
- package/cjs/commands/serve/src/fake.js +4 -4
- package/cjs/commands/serve/src/index.js +8 -7
- package/cjs/commands/similar/src/index.js +2 -2
- package/cjs/commands/validate/src/index.js +4 -4
- package/cjs/core/src/ast/document.js +2 -2
- package/cjs/core/src/coverage/index.js +7 -7
- package/cjs/core/src/diff/changes/argument.js +80 -19
- package/cjs/core/src/diff/changes/directive.js +208 -39
- package/cjs/core/src/diff/changes/enum.js +123 -25
- package/cjs/core/src/diff/changes/field.js +260 -69
- package/cjs/core/src/diff/changes/input.js +153 -34
- package/cjs/core/src/diff/changes/object.js +37 -9
- package/cjs/core/src/diff/changes/schema.js +55 -13
- package/cjs/core/src/diff/changes/type.js +106 -19
- package/cjs/core/src/diff/changes/union.js +35 -7
- package/cjs/core/src/diff/directive.js +2 -4
- package/cjs/core/src/diff/rules/consider-usage.js +3 -3
- package/cjs/core/src/index.js +63 -1
- package/cjs/core/src/similar/index.js +2 -2
- package/cjs/core/src/utils/compare.js +3 -9
- package/cjs/core/src/utils/is-deprecated.js +1 -1
- package/cjs/core/src/utils/string.js +5 -2
- package/cjs/core/src/validate/complexity.js +1 -1
- package/cjs/core/src/validate/directive-count.js +1 -1
- package/cjs/core/src/validate/index.js +12 -11
- package/cjs/core/src/validate/query-depth.js +1 -1
- package/cjs/github/src/helpers/config.js +6 -2
- package/cjs/github/src/helpers/utils.js +1 -1
- package/cjs/loaders/loaders/src/index.js +1 -2
- package/esm/action/src/run.js +1 -1
- package/esm/commands/commands/src/index.js +7 -8
- package/esm/commands/diff/src/index.js +6 -6
- package/esm/commands/docs/src/index.js +1 -4
- package/esm/commands/serve/src/fake.js +4 -4
- package/esm/commands/serve/src/index.js +8 -7
- package/esm/commands/similar/src/index.js +2 -2
- package/esm/commands/validate/src/index.js +4 -4
- package/esm/core/src/ast/document.js +2 -2
- package/esm/core/src/coverage/index.js +7 -7
- package/esm/core/src/diff/changes/argument.js +77 -19
- package/esm/core/src/diff/changes/directive.js +198 -39
- package/esm/core/src/diff/changes/enum.js +117 -25
- package/esm/core/src/diff/changes/field.js +240 -62
- package/esm/core/src/diff/changes/input.js +145 -34
- package/esm/core/src/diff/changes/object.js +35 -9
- package/esm/core/src/diff/changes/schema.js +50 -11
- package/esm/core/src/diff/changes/type.js +100 -19
- package/esm/core/src/diff/changes/union.js +33 -7
- package/esm/core/src/diff/directive.js +2 -4
- package/esm/core/src/diff/rules/consider-usage.js +3 -3
- package/esm/core/src/index.js +9 -0
- package/esm/core/src/similar/index.js +2 -2
- package/esm/core/src/utils/compare.js +3 -9
- package/esm/core/src/utils/is-deprecated.js +1 -1
- package/esm/core/src/utils/string.js +5 -2
- package/esm/core/src/validate/complexity.js +1 -1
- package/esm/core/src/validate/directive-count.js +1 -1
- package/esm/core/src/validate/index.js +12 -11
- package/esm/core/src/validate/query-depth.js +1 -1
- package/esm/github/src/helpers/config.js +6 -2
- package/esm/github/src/helpers/utils.js +1 -1
- package/esm/loaders/loaders/src/index.js +1 -2
- package/package.json +20 -20
- package/typings/core/src/diff/changes/argument.d.cts +52 -4
- package/typings/core/src/diff/changes/argument.d.ts +52 -4
- package/typings/core/src/diff/changes/change.d.cts +500 -2
- package/typings/core/src/diff/changes/change.d.ts +500 -2
- package/typings/core/src/diff/changes/directive.d.cts +147 -11
- package/typings/core/src/diff/changes/directive.d.ts +147 -11
- package/typings/core/src/diff/changes/enum.d.cts +75 -7
- package/typings/core/src/diff/changes/enum.d.ts +75 -7
- package/typings/core/src/diff/changes/field.d.cts +189 -14
- package/typings/core/src/diff/changes/field.d.ts +189 -14
- package/typings/core/src/diff/changes/input.d.cts +112 -8
- package/typings/core/src/diff/changes/input.d.ts +112 -8
- package/typings/core/src/diff/changes/object.d.cts +29 -3
- package/typings/core/src/diff/changes/object.d.ts +29 -3
- package/typings/core/src/diff/changes/schema.d.cts +37 -4
- package/typings/core/src/diff/changes/schema.d.ts +37 -4
- package/typings/core/src/diff/changes/type.d.cts +80 -7
- package/typings/core/src/diff/changes/type.d.ts +80 -7
- package/typings/core/src/diff/changes/union.d.cts +29 -3
- package/typings/core/src/diff/changes/union.d.ts +29 -3
- package/typings/core/src/index.d.cts +10 -0
- package/typings/core/src/index.d.ts +10 -0
- package/typings/core/src/utils/is-deprecated.d.cts +1 -1
- package/typings/core/src/utils/is-deprecated.d.ts +1 -1
- package/typings/core/src/utils/string.d.cts +1 -1
- package/typings/core/src/utils/string.d.ts +1 -1
- package/typings/core/utils/testing.d.cts +2 -2
- package/typings/core/utils/testing.d.ts +2 -2
- package/typings/github/src/helpers/utils.d.cts +1 -1
- 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 {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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:
|
|
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
|
-
|
|
16
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
path: [
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
path: [
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
path: [
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
path: [
|
|
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.
|
|
159
|
+
level: CriticalityLevel.Dangerous,
|
|
64
160
|
},
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
path: [
|
|
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.
|
|
182
|
+
level: CriticalityLevel.NonBreaking,
|
|
74
183
|
},
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
path: [
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
path: [
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
path: [
|
|
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:
|
|
253
|
+
level: args.meta.isSafeFieldTypeChange
|
|
254
|
+
? CriticalityLevel.NonBreaking
|
|
255
|
+
: CriticalityLevel.Breaking,
|
|
104
256
|
},
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
path: [
|
|
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:
|
|
114
|
-
? CriticalityLevel.
|
|
115
|
-
: CriticalityLevel.
|
|
281
|
+
level: args.meta.isAddedFieldArgumentBreaking
|
|
282
|
+
? CriticalityLevel.Breaking
|
|
283
|
+
: CriticalityLevel.Dangerous,
|
|
116
284
|
},
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
path: [
|
|
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
|
-
|
|
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
|
-
|
|
137
|
-
|
|
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
|
-
|
|
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
|
-
|
|
147
|
-
|
|
148
|
-
path: [
|
|
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
|
-
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
path: [
|
|
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
|
|
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
|
-
|
|
36
|
+
type: ChangeType.InputFieldAdded,
|
|
37
|
+
criticality: args.meta.isAddedInputFieldTypeNullable
|
|
20
38
|
? {
|
|
21
|
-
level: CriticalityLevel.
|
|
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.
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
path: [
|
|
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
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
path: [
|
|
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
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
path: [
|
|
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
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
path: [
|
|
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
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
path: [
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
path: [
|
|
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
|
+
}
|