@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,23 +1,49 @@
|
|
|
1
|
-
import { ChangeType, CriticalityLevel } from './change.js';
|
|
2
|
-
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
path:
|
|
12
|
+
message: buildObjectTypeInterfaceAddedMessage(args.meta),
|
|
13
|
+
meta: args.meta,
|
|
14
|
+
path: args.meta.objectTypeName,
|
|
11
15
|
};
|
|
12
16
|
}
|
|
13
|
-
export function
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
path:
|
|
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
|
-
|
|
10
|
-
|
|
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
|
-
|
|
21
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
10
|
-
|
|
12
|
+
message: buildTypeRemovedMessage(args.meta),
|
|
13
|
+
meta: args.meta,
|
|
14
|
+
path: args.meta.removedTypeName,
|
|
11
15
|
};
|
|
12
16
|
}
|
|
13
|
-
export function
|
|
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:
|
|
20
|
-
|
|
34
|
+
message: buildTypeAddedMessage(args.meta),
|
|
35
|
+
meta: args.meta,
|
|
36
|
+
path: args.meta.addedTypeName,
|
|
21
37
|
};
|
|
22
38
|
}
|
|
23
|
-
export function
|
|
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:
|
|
31
|
-
path:
|
|
57
|
+
message: buildTypeKindChangedMessage(args),
|
|
58
|
+
path: args.meta.typeName,
|
|
59
|
+
meta: args.meta,
|
|
32
60
|
};
|
|
33
61
|
}
|
|
34
|
-
export function
|
|
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:
|
|
41
|
-
path:
|
|
81
|
+
message: buildTypeDescriptionChangedMessage(args.meta),
|
|
82
|
+
path: args.meta.typeName,
|
|
83
|
+
meta: args.meta,
|
|
42
84
|
};
|
|
43
85
|
}
|
|
44
|
-
export function
|
|
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:
|
|
51
|
-
path:
|
|
106
|
+
message: buildTypeDescriptionRemoved(args.meta),
|
|
107
|
+
path: args.meta.typeName,
|
|
108
|
+
meta: args.meta,
|
|
52
109
|
};
|
|
53
110
|
}
|
|
54
|
-
export function
|
|
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:
|
|
61
|
-
path:
|
|
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
|
-
|
|
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:
|
|
10
|
-
|
|
12
|
+
message: buildUnionMemberRemovedMessage(args.meta),
|
|
13
|
+
meta: args.meta,
|
|
14
|
+
path: args.meta.unionName,
|
|
11
15
|
};
|
|
12
16
|
}
|
|
13
|
-
export function
|
|
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:
|
|
21
|
-
|
|
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
|
+
}
|
|
@@ -9,11 +9,9 @@ export function changesInDirective(oldDirective, newDirective, addChange) {
|
|
|
9
9
|
removed: diffArrays(oldDirective.locations, newDirective.locations),
|
|
10
10
|
};
|
|
11
11
|
// locations added
|
|
12
|
-
|
|
13
|
-
addChange(directiveLocationAdded(newDirective, location));
|
|
12
|
+
locations.added.forEach(location => addChange(directiveLocationAdded(newDirective, location)));
|
|
14
13
|
// locations removed
|
|
15
|
-
|
|
16
|
-
addChange(directiveLocationRemoved(oldDirective, location));
|
|
14
|
+
locations.removed.forEach(location => addChange(directiveLocationRemoved(oldDirective, location)));
|
|
17
15
|
compareLists(oldDirective.args, newDirective.args, {
|
|
18
16
|
onAdded(arg) {
|
|
19
17
|
addChange(directiveArgumentAdded(newDirective, arg));
|
|
@@ -6,7 +6,7 @@ export const considerUsage = ({ changes, config }) => __awaiter(void 0, void 0,
|
|
|
6
6
|
throw new Error(`considerUsage rule is missing config`);
|
|
7
7
|
}
|
|
8
8
|
const collectedBreakingField = [];
|
|
9
|
-
|
|
9
|
+
changes.forEach(change => {
|
|
10
10
|
if (change.criticality.level === CriticalityLevel.Breaking && change.path) {
|
|
11
11
|
const [typeName, fieldName, argumentName] = parsePath(change.path);
|
|
12
12
|
collectedBreakingField.push({
|
|
@@ -15,7 +15,7 @@ export const considerUsage = ({ changes, config }) => __awaiter(void 0, void 0,
|
|
|
15
15
|
argument: argumentName,
|
|
16
16
|
});
|
|
17
17
|
}
|
|
18
|
-
}
|
|
18
|
+
});
|
|
19
19
|
// True if safe to break, false otherwise
|
|
20
20
|
const usageList = yield config.checkUsage(collectedBreakingField);
|
|
21
21
|
// turns an array of booleans into an array of `Type.Field` strings
|
|
@@ -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
|
});
|
package/esm/core/src/index.js
CHANGED
|
@@ -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';
|
|
@@ -13,7 +13,7 @@ export function similar(schema, typeName, threshold = 0.4) {
|
|
|
13
13
|
if (typeof typeName !== 'undefined' && !targets.some(t => t.typeId === typeName)) {
|
|
14
14
|
throw new Error(`Type '${typeName}' doesn't exist`);
|
|
15
15
|
}
|
|
16
|
-
|
|
16
|
+
(typeName ? [{ typeId: typeName, value: '' }] : targets).forEach(source => {
|
|
17
17
|
const sourceType = schema.getType(source.typeId);
|
|
18
18
|
const matchWith = targets.filter(target => schema.getType(target.typeId).astNode.kind === sourceType.astNode.kind &&
|
|
19
19
|
target.typeId !== source.typeId);
|
|
@@ -23,7 +23,7 @@ export function similar(schema, typeName, threshold = 0.4) {
|
|
|
23
23
|
results[source.typeId] = found;
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
|
-
}
|
|
26
|
+
});
|
|
27
27
|
return results;
|
|
28
28
|
}
|
|
29
29
|
function similarTo(type, targets, threshold) {
|
|
@@ -65,19 +65,13 @@ export function compareLists(oldList, newList, callbacks) {
|
|
|
65
65
|
}
|
|
66
66
|
if (callbacks) {
|
|
67
67
|
if (callbacks.onAdded) {
|
|
68
|
-
|
|
69
|
-
callbacks.onAdded(item);
|
|
70
|
-
}
|
|
68
|
+
added.forEach(callbacks.onAdded);
|
|
71
69
|
}
|
|
72
70
|
if (callbacks.onRemoved) {
|
|
73
|
-
|
|
74
|
-
callbacks.onRemoved(item);
|
|
75
|
-
}
|
|
71
|
+
removed.forEach(callbacks.onRemoved);
|
|
76
72
|
}
|
|
77
73
|
if (callbacks.onMutual) {
|
|
78
|
-
|
|
79
|
-
callbacks.onMutual(item);
|
|
80
|
-
}
|
|
74
|
+
mutual.forEach(callbacks.onMutual);
|
|
81
75
|
}
|
|
82
76
|
}
|
|
83
77
|
return {
|
|
@@ -12,7 +12,7 @@ function compareTwoStrings(str1, str2) {
|
|
|
12
12
|
const pairs2 = wordLetterPairs(str2);
|
|
13
13
|
const union = pairs1.length + pairs2.length;
|
|
14
14
|
let intersection = 0;
|
|
15
|
-
|
|
15
|
+
pairs1.forEach(pair1 => {
|
|
16
16
|
for (let i = 0, pair2; (pair2 = pairs2[i]); i++) {
|
|
17
17
|
if (pair1 !== pair2)
|
|
18
18
|
continue;
|
|
@@ -20,7 +20,7 @@ function compareTwoStrings(str1, str2) {
|
|
|
20
20
|
pairs2.splice(i, 1);
|
|
21
21
|
break;
|
|
22
22
|
}
|
|
23
|
-
}
|
|
23
|
+
});
|
|
24
24
|
return (intersection * 2) / union;
|
|
25
25
|
}
|
|
26
26
|
export function findBestMatch(mainString, targetStrings) {
|
|
@@ -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, '');
|
|
@@ -22,7 +22,7 @@ export function calculateOperationComplexity(node, config, getFragmentByName, de
|
|
|
22
22
|
calculateOperationComplexity(child, config, getFragmentByName, depth + 1);
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
|
-
if (node.kind
|
|
25
|
+
if (node.kind == Kind.FRAGMENT_SPREAD) {
|
|
26
26
|
const fragment = getFragmentByName(node.name.value);
|
|
27
27
|
if (fragment) {
|
|
28
28
|
cost +=
|
|
@@ -22,7 +22,7 @@ export function countDirectives(node, getFragmentByName) {
|
|
|
22
22
|
directives += countDirectives(child, getFragmentByName);
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
|
-
if (node.kind
|
|
25
|
+
if (node.kind == Kind.FRAGMENT_SPREAD) {
|
|
26
26
|
const fragment = getFragmentByName(node.name.value);
|
|
27
27
|
if (fragment) {
|
|
28
28
|
directives += countDirectives(fragment, getFragmentByName);
|
|
@@ -16,24 +16,25 @@ export function validate(schema, sources, options) {
|
|
|
16
16
|
const fragments = [];
|
|
17
17
|
const fragmentNames = [];
|
|
18
18
|
const graph = new DepGraph({ circular: true });
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
documents.forEach(doc => {
|
|
20
|
+
doc.fragments.forEach(fragment => {
|
|
21
21
|
fragmentNames.push(fragment.node.name.value);
|
|
22
22
|
fragments.push(fragment);
|
|
23
23
|
graph.addNode(fragment.node.name.value, fragment.node);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
fragments.forEach(fragment => {
|
|
27
27
|
const depends = extractFragments(print(fragment.node));
|
|
28
28
|
if (depends) {
|
|
29
|
-
|
|
29
|
+
depends.forEach(name => {
|
|
30
30
|
graph.addDependency(fragment.node.name.value, name);
|
|
31
|
-
}
|
|
31
|
+
});
|
|
32
32
|
}
|
|
33
|
-
}
|
|
34
|
-
|
|
33
|
+
});
|
|
34
|
+
documents
|
|
35
35
|
// since we include fragments, validate only operations
|
|
36
|
-
.filter(doc => doc.hasOperations)
|
|
36
|
+
.filter(doc => doc.hasOperations)
|
|
37
|
+
.forEach(doc => {
|
|
37
38
|
const docWithOperations = {
|
|
38
39
|
kind: Kind.DOCUMENT,
|
|
39
40
|
definitions: doc.operations.map(d => d.node),
|
|
@@ -113,7 +114,7 @@ export function validate(schema, sources, options) {
|
|
|
113
114
|
deprecated,
|
|
114
115
|
});
|
|
115
116
|
}
|
|
116
|
-
}
|
|
117
|
+
});
|
|
117
118
|
return invalidDocuments;
|
|
118
119
|
}
|
|
119
120
|
function findDuplicatedFragments(fragmentNames) {
|
|
@@ -87,7 +87,7 @@ export function countDepth(node, parentDepth, getFragmentReference) {
|
|
|
87
87
|
depth = Math.max(depth, countDepth(child, parentDepth + 1, getFragmentReference));
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
|
-
if (node.kind
|
|
90
|
+
if (node.kind == Kind.FRAGMENT_SPREAD) {
|
|
91
91
|
const fragment = getFragmentReference(node.name.value);
|
|
92
92
|
if (fragment) {
|
|
93
93
|
depth = Math.max(depth, countDepth(fragment, parentDepth + 1, getFragmentReference));
|
|
@@ -84,12 +84,16 @@ export function createConfig(rawConfig, setConfigKind, branches = [], fallbackBr
|
|
|
84
84
|
return config;
|
|
85
85
|
}
|
|
86
86
|
for (const branch of branches) {
|
|
87
|
-
|
|
87
|
+
if (config == null) {
|
|
88
|
+
config = findConfigByBranch(branch, normalizedConfig, false);
|
|
89
|
+
}
|
|
88
90
|
if (config) {
|
|
89
91
|
break;
|
|
90
92
|
}
|
|
91
93
|
}
|
|
92
|
-
|
|
94
|
+
if (config == null) {
|
|
95
|
+
config = getGlobalConfig(rawConfig, fallbackBranch);
|
|
96
|
+
}
|
|
93
97
|
return config;
|
|
94
98
|
}
|
|
95
99
|
function isNormalizedLegacyConfig(config) {
|
|
@@ -19,7 +19,7 @@ export function discordCoderize(msg) {
|
|
|
19
19
|
export function filterChangesByLevel(level) {
|
|
20
20
|
return (change) => change.criticality.level === level;
|
|
21
21
|
}
|
|
22
|
-
export function createSummary(changes, summaryLimit, isLegacyConfig) {
|
|
22
|
+
export function createSummary(changes, summaryLimit, isLegacyConfig = false) {
|
|
23
23
|
const breakingChanges = changes.filter(filterChangesByLevel(CriticalityLevel.Breaking));
|
|
24
24
|
const dangerousChanges = changes.filter(filterChangesByLevel(CriticalityLevel.Dangerous));
|
|
25
25
|
const safeChanges = changes.filter(filterChangesByLevel(CriticalityLevel.NonBreaking));
|
|
@@ -72,8 +72,7 @@ export class LoadersRegistry {
|
|
|
72
72
|
}
|
|
73
73
|
export function useLoaders(config) {
|
|
74
74
|
const loaders = new LoadersRegistry();
|
|
75
|
-
|
|
76
|
-
loaders.registerModule(loaderName);
|
|
75
|
+
config.loaders.forEach(loaderName => loaders.registerModule(loaderName));
|
|
77
76
|
return loaders;
|
|
78
77
|
}
|
|
79
78
|
function loadModule(name) {
|