@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
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://npmjs.com/package/@graphql-inspector/cli)
|
|
4
4
|
|
|
5
|
-
**GraphQL Inspector**
|
|
5
|
+
**GraphQL Inspector** outputs a list of changes between two GraphQL schemas. Every change is
|
|
6
6
|
precisely explained and marked as breaking, non-breaking or dangerous. It helps you validate
|
|
7
7
|
documents and fragments against a schema and even find similar or duplicated types.
|
|
8
8
|
|
|
@@ -21,7 +21,7 @@ Major features:
|
|
|
21
21
|
- **GitHub Bot**
|
|
22
22
|
- **GitHub Actions**
|
|
23
23
|
|
|
24
|
-
GraphQL Inspector has a **CLI** and also a **
|
|
24
|
+
GraphQL Inspector has a **CLI** and also a **programmatic API**, so you can use it however you want
|
|
25
25
|
to and even build tools on top of it.
|
|
26
26
|
|
|
27
27
|
## Installation
|
|
@@ -30,7 +30,7 @@ to and even build tools on top of it.
|
|
|
30
30
|
# CLI
|
|
31
31
|
pnpm add @graphql-inspector/cli
|
|
32
32
|
|
|
33
|
-
# Core API for
|
|
33
|
+
# Core API for programmatic usage
|
|
34
34
|
pnpm add @graphql-inspector/core
|
|
35
35
|
```
|
|
36
36
|
|
package/cjs/action/src/run.js
CHANGED
|
@@ -82,7 +82,7 @@ function run() {
|
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
84
|
let [schemaRef, schemaPath] = schemaPointer.split(':');
|
|
85
|
-
if (useMerge && (pullRequest === null || pullRequest === void 0 ? void 0 : pullRequest.state)
|
|
85
|
+
if (useMerge && (pullRequest === null || pullRequest === void 0 ? void 0 : pullRequest.state) == 'open') {
|
|
86
86
|
ref = `refs/pull/${pullRequest.number}/merge`;
|
|
87
87
|
workspace = undefined;
|
|
88
88
|
core.info(`EXPERIMENTAL - Using Pull Request ${ref}`);
|
|
@@ -26,26 +26,25 @@ function parseGlobalArgs(args) {
|
|
|
26
26
|
const leftHeaders = {};
|
|
27
27
|
const rightHeaders = {};
|
|
28
28
|
if (args.header) {
|
|
29
|
-
|
|
29
|
+
args.header.forEach(header => {
|
|
30
30
|
const [name, ...values] = header.split(':');
|
|
31
31
|
headers[name] = values.join('');
|
|
32
|
-
}
|
|
32
|
+
});
|
|
33
33
|
}
|
|
34
34
|
if (args.leftHeader) {
|
|
35
|
-
|
|
35
|
+
args.leftHeader.forEach(leftHeader => {
|
|
36
36
|
const [lname, ...lvalues] = leftHeader.split(':');
|
|
37
37
|
leftHeaders[lname] = lvalues.join('');
|
|
38
|
-
}
|
|
38
|
+
});
|
|
39
39
|
}
|
|
40
40
|
if (args.rightHeader) {
|
|
41
|
-
|
|
41
|
+
args.rightHeader.forEach(rightHeader => {
|
|
42
42
|
const [rname, ...rvalues] = rightHeader.split(':');
|
|
43
43
|
rightHeaders[rname] = rvalues.join('');
|
|
44
|
-
}
|
|
44
|
+
});
|
|
45
45
|
}
|
|
46
46
|
if (args.require) {
|
|
47
|
-
|
|
48
|
-
require(mod);
|
|
47
|
+
args.require.forEach(mod => require(mod));
|
|
49
48
|
}
|
|
50
49
|
return { headers, leftHeaders, rightHeaders, token: args.token };
|
|
51
50
|
}
|
|
@@ -133,23 +133,23 @@ function sortChanges(changes) {
|
|
|
133
133
|
function reportBreakingChanges(changes) {
|
|
134
134
|
const label = logger_1.symbols.error;
|
|
135
135
|
const sorted = sortChanges(changes);
|
|
136
|
-
|
|
136
|
+
sorted.forEach(change => {
|
|
137
137
|
logger_1.Logger.log(`${label} ${(0, logger_1.bolderize)(change.message)}`);
|
|
138
|
-
}
|
|
138
|
+
});
|
|
139
139
|
}
|
|
140
140
|
function reportDangerousChanges(changes) {
|
|
141
141
|
const label = logger_1.symbols.warning;
|
|
142
142
|
const sorted = sortChanges(changes);
|
|
143
|
-
|
|
143
|
+
sorted.forEach(change => {
|
|
144
144
|
logger_1.Logger.log(`${label} ${(0, logger_1.bolderize)(change.message)}`);
|
|
145
|
-
}
|
|
145
|
+
});
|
|
146
146
|
}
|
|
147
147
|
function reportNonBreakingChanges(changes) {
|
|
148
148
|
const label = logger_1.symbols.success;
|
|
149
149
|
const sorted = sortChanges(changes);
|
|
150
|
-
|
|
150
|
+
sorted.forEach(change => {
|
|
151
151
|
logger_1.Logger.log(`${label} ${(0, logger_1.bolderize)(change.message)}`);
|
|
152
|
-
}
|
|
152
|
+
});
|
|
153
153
|
}
|
|
154
154
|
function resolveRule(name) {
|
|
155
155
|
const filepath = (0, commands_1.ensureAbsolute)(name);
|
|
@@ -8,9 +8,7 @@ exports.default = (0, commands_1.createCommand)(() => {
|
|
|
8
8
|
command: ['docs', 'website'],
|
|
9
9
|
describe: 'Open Documentation',
|
|
10
10
|
handler() {
|
|
11
|
-
return
|
|
12
|
-
return yield (0, open_1.default)('https://graphql-inspector.com');
|
|
13
|
-
});
|
|
11
|
+
return (0, open_1.default)('https://graphql-inspector.com');
|
|
14
12
|
},
|
|
15
13
|
};
|
|
16
14
|
});
|
|
@@ -157,17 +157,17 @@ function assignResolveType(type) {
|
|
|
157
157
|
}
|
|
158
158
|
function forEachField(schema, fn) {
|
|
159
159
|
const typeMap = schema.getTypeMap();
|
|
160
|
-
|
|
160
|
+
Object.keys(typeMap).forEach(typeName => {
|
|
161
161
|
const type = typeMap[typeName];
|
|
162
162
|
// TODO: maybe have an option to include these?
|
|
163
163
|
if (!(0, graphql_1.getNamedType)(type).name.startsWith('__') && type instanceof graphql_1.GraphQLObjectType) {
|
|
164
164
|
const fields = type.getFields();
|
|
165
|
-
|
|
165
|
+
Object.keys(fields).forEach(fieldName => {
|
|
166
166
|
const field = fields[fieldName];
|
|
167
167
|
fn(field, typeName, fieldName);
|
|
168
|
-
}
|
|
168
|
+
});
|
|
169
169
|
}
|
|
170
|
-
}
|
|
170
|
+
});
|
|
171
171
|
}
|
|
172
172
|
class MockList {
|
|
173
173
|
// wrappedFunction can return another MockList or a value
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
|
-
const http_1 = require("http");
|
|
5
|
-
const graphql_yoga_1 = require("graphql-yoga");
|
|
6
4
|
const open_1 = tslib_1.__importDefault(require("open"));
|
|
7
5
|
const commands_1 = require("@graphql-inspector/commands");
|
|
8
6
|
const logger_1 = require("@graphql-inspector/logger");
|
|
7
|
+
const node_1 = require("@graphql-yoga/node");
|
|
9
8
|
const fake_js_1 = require("./fake.js");
|
|
10
9
|
exports.default = (0, commands_1.createCommand)(api => {
|
|
11
10
|
const { loaders } = api;
|
|
@@ -43,16 +42,18 @@ exports.default = (0, commands_1.createCommand)(api => {
|
|
|
43
42
|
const port = args.port;
|
|
44
43
|
try {
|
|
45
44
|
(0, fake_js_1.fake)(schema);
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
45
|
+
const server = (0, node_1.createServer)({
|
|
46
|
+
schema,
|
|
47
|
+
port,
|
|
48
|
+
cors: true,
|
|
49
|
+
logging: false,
|
|
50
50
|
});
|
|
51
|
+
yield server.start();
|
|
51
52
|
const url = `http://localhost:${port}`;
|
|
52
53
|
logger_1.Logger.success(`GraphQL API: ${url}`);
|
|
53
54
|
yield (0, open_1.default)(url);
|
|
54
55
|
const shutdown = () => {
|
|
55
|
-
server.
|
|
56
|
+
server.stop();
|
|
56
57
|
process.exit(0);
|
|
57
58
|
};
|
|
58
59
|
process.on('SIGINT', shutdown);
|
|
@@ -23,9 +23,9 @@ function handler({ schema, writePath, type, threshold, }) {
|
|
|
23
23
|
logger_1.Logger.log('');
|
|
24
24
|
logger_1.Logger.log(`${prefix} ${sourceType}`);
|
|
25
25
|
logger_1.Logger.log(printResult(name, matches.bestMatch.rating));
|
|
26
|
-
|
|
26
|
+
matches.ratings.forEach(match => {
|
|
27
27
|
logger_1.Logger.log(printResult(match.target.typeId, match.rating));
|
|
28
|
-
}
|
|
28
|
+
});
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
if (shouldWrite) {
|
|
@@ -230,13 +230,13 @@ function printInvalidDocuments(invalidDocuments, listKey, isError = false, silen
|
|
|
230
230
|
if (silent) {
|
|
231
231
|
return;
|
|
232
232
|
}
|
|
233
|
-
|
|
233
|
+
invalidDocuments.forEach(doc => {
|
|
234
234
|
if (doc.errors.length) {
|
|
235
|
-
|
|
235
|
+
renderErrors(doc.source.name, doc[listKey], isError).forEach(line => {
|
|
236
236
|
logger_1.Logger.log(line);
|
|
237
|
-
}
|
|
237
|
+
});
|
|
238
238
|
}
|
|
239
|
-
}
|
|
239
|
+
});
|
|
240
240
|
}
|
|
241
241
|
function renderErrors(sourceName, errors, isError = false) {
|
|
242
242
|
const errorsAsString = errors.map(e => ` - ${(0, logger_1.bolderize)(e.message)}`).join('\n');
|
|
@@ -13,7 +13,7 @@ function readDocument(source) {
|
|
|
13
13
|
const documentNode = (0, graphql_1.parse)(source.body);
|
|
14
14
|
const filepath = source.name;
|
|
15
15
|
const definitions = documentNode.definitions || [];
|
|
16
|
-
|
|
16
|
+
definitions.forEach((node) => {
|
|
17
17
|
if (isOperation(node)) {
|
|
18
18
|
result.operations.push({
|
|
19
19
|
node,
|
|
@@ -26,7 +26,7 @@ function readDocument(source) {
|
|
|
26
26
|
source: filepath,
|
|
27
27
|
});
|
|
28
28
|
}
|
|
29
|
-
}
|
|
29
|
+
});
|
|
30
30
|
result.hasFragments = result.fragments.length > 0;
|
|
31
31
|
result.hasOperations = result.operations.length > 0;
|
|
32
32
|
return result;
|
|
@@ -86,22 +86,22 @@ function coverage(schema, sources) {
|
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
88
|
const documents = coverage.sources.map(document_js_1.readDocument);
|
|
89
|
-
|
|
89
|
+
documents.forEach((doc, i) => {
|
|
90
90
|
const source = coverage.sources[i];
|
|
91
|
-
|
|
91
|
+
doc.operations.forEach(op => {
|
|
92
92
|
(0, graphql_1.visit)(op.node, (0, graphql_1.visitWithTypeInfo)(typeInfo, visitor(source)));
|
|
93
|
-
}
|
|
94
|
-
|
|
93
|
+
});
|
|
94
|
+
doc.fragments.forEach(fr => {
|
|
95
95
|
(0, graphql_1.visit)(fr.node, (0, graphql_1.visitWithTypeInfo)(typeInfo, visitor(source)));
|
|
96
|
-
}
|
|
97
|
-
}
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
98
|
for (const key in coverage.types) {
|
|
99
99
|
const me = coverage.types[key];
|
|
100
100
|
processStats(me);
|
|
101
101
|
coverage.stats.numTypes++;
|
|
102
102
|
if (me.fieldsCountCovered > 0)
|
|
103
103
|
coverage.stats.numTypesCovered++;
|
|
104
|
-
if (me.fieldsCount
|
|
104
|
+
if (me.fieldsCount == me.fieldsCountCovered)
|
|
105
105
|
coverage.stats.numTypesCoveredFully++;
|
|
106
106
|
coverage.stats.numFields += me.fieldsCount;
|
|
107
107
|
coverage.stats.numFiledsCovered += me.fieldsCountCovered;
|
|
@@ -1,48 +1,109 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.fieldArgumentTypeChanged = exports.fieldArgumentDefaultChanged = exports.fieldArgumentDescriptionChanged = void 0;
|
|
3
|
+
exports.fieldArgumentTypeChanged = exports.fieldArgumentTypeChangedFromMeta = exports.fieldArgumentDefaultChanged = exports.fieldArgumentDefaultChangedFromMeta = exports.fieldArgumentDescriptionChanged = exports.fieldArgumentDescriptionChangedFromMeta = void 0;
|
|
4
4
|
const graphql_js_1 = require("../../utils/graphql.js");
|
|
5
5
|
const string_js_1 = require("../../utils/string.js");
|
|
6
6
|
const change_js_1 = require("./change.js");
|
|
7
|
-
function
|
|
7
|
+
function buildFieldArgumentDescriptionChangedMessage(args) {
|
|
8
|
+
return `Description for argument '${args.argumentName}' on field '${args.typeName}.${args.fieldName}' changed from '${args.oldDescription}' to '${args.newDescription}'`;
|
|
9
|
+
}
|
|
10
|
+
function fieldArgumentDescriptionChangedFromMeta(args) {
|
|
8
11
|
return {
|
|
12
|
+
type: change_js_1.ChangeType.FieldArgumentDescriptionChanged,
|
|
9
13
|
criticality: {
|
|
10
14
|
level: change_js_1.CriticalityLevel.NonBreaking,
|
|
11
15
|
},
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
path: [
|
|
16
|
+
message: buildFieldArgumentDescriptionChangedMessage(args.meta),
|
|
17
|
+
meta: args.meta,
|
|
18
|
+
path: [args.meta.typeName, args.meta.fieldName, args.meta.argumentName].join('.'),
|
|
15
19
|
};
|
|
16
20
|
}
|
|
21
|
+
exports.fieldArgumentDescriptionChangedFromMeta = fieldArgumentDescriptionChangedFromMeta;
|
|
22
|
+
function fieldArgumentDescriptionChanged(type, field, oldArg, newArg) {
|
|
23
|
+
var _a, _b;
|
|
24
|
+
return fieldArgumentDescriptionChangedFromMeta({
|
|
25
|
+
type: change_js_1.ChangeType.FieldArgumentDescriptionChanged,
|
|
26
|
+
meta: {
|
|
27
|
+
typeName: type.name,
|
|
28
|
+
fieldName: field.name,
|
|
29
|
+
argumentName: oldArg.name,
|
|
30
|
+
oldDescription: (_a = oldArg.description) !== null && _a !== void 0 ? _a : null,
|
|
31
|
+
newDescription: (_b = newArg.description) !== null && _b !== void 0 ? _b : null,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
}
|
|
17
35
|
exports.fieldArgumentDescriptionChanged = fieldArgumentDescriptionChanged;
|
|
18
|
-
function
|
|
36
|
+
function buildFieldArgumentDefaultChangedMessage(args) {
|
|
37
|
+
return args.oldDefaultValue === undefined
|
|
38
|
+
? `Default value '${args.newDefaultValue}' was added to argument '${args.argumentName}' on field '${args.typeName}.${args.fieldName}'`
|
|
39
|
+
: `Default value for argument '${args.argumentName}' on field '${args.typeName}.${args.fieldName}' changed from '${args.oldDefaultValue}' to '${args.newDefaultValue}'`;
|
|
40
|
+
}
|
|
41
|
+
const fieldArgumentDefaultChangedCriticalityDangerousReason = 'Changing the default value for an argument may change the runtime behaviour of a field if it was never provided.';
|
|
42
|
+
function fieldArgumentDefaultChangedFromMeta(args) {
|
|
19
43
|
return {
|
|
44
|
+
type: change_js_1.ChangeType.FieldArgumentDefaultChanged,
|
|
20
45
|
criticality: {
|
|
21
46
|
level: change_js_1.CriticalityLevel.Dangerous,
|
|
22
|
-
reason:
|
|
47
|
+
reason: fieldArgumentDefaultChangedCriticalityDangerousReason,
|
|
23
48
|
},
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
: `Default value for argument '${newArg.name}' on field '${type.name}.${field.name}' changed from '${(0, string_js_1.safeString)(oldArg.defaultValue)}' to '${(0, string_js_1.safeString)(newArg.defaultValue)}'`,
|
|
28
|
-
path: [type.name, field.name, oldArg.name].join('.'),
|
|
49
|
+
message: buildFieldArgumentDefaultChangedMessage(args.meta),
|
|
50
|
+
meta: args.meta,
|
|
51
|
+
path: [args.meta.typeName, args.meta.fieldName, args.meta.argumentName].join('.'),
|
|
29
52
|
};
|
|
30
53
|
}
|
|
54
|
+
exports.fieldArgumentDefaultChangedFromMeta = fieldArgumentDefaultChangedFromMeta;
|
|
55
|
+
function fieldArgumentDefaultChanged(type, field, oldArg, newArg) {
|
|
56
|
+
const meta = {
|
|
57
|
+
typeName: type.name,
|
|
58
|
+
fieldName: field.name,
|
|
59
|
+
argumentName: newArg.name,
|
|
60
|
+
};
|
|
61
|
+
if (oldArg.defaultValue !== undefined) {
|
|
62
|
+
meta.oldDefaultValue = (0, string_js_1.safeString)(oldArg.defaultValue);
|
|
63
|
+
}
|
|
64
|
+
if (newArg.defaultValue !== undefined) {
|
|
65
|
+
meta.newDefaultValue = (0, string_js_1.safeString)(newArg.defaultValue);
|
|
66
|
+
}
|
|
67
|
+
return fieldArgumentDefaultChangedFromMeta({
|
|
68
|
+
type: change_js_1.ChangeType.FieldArgumentDefaultChanged,
|
|
69
|
+
meta,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
31
72
|
exports.fieldArgumentDefaultChanged = fieldArgumentDefaultChanged;
|
|
32
|
-
function
|
|
73
|
+
function buildFieldArgumentTypeChangedMessage(args) {
|
|
74
|
+
return `Type for argument '${args.argumentName}' on field '${args.typeName}.${args.fieldName}' changed from '${args.oldArgumentType}' to '${args.newArgumentType}'`;
|
|
75
|
+
}
|
|
76
|
+
const fieldArgumentTypeChangedCriticalityNonBreakingReason = `Changing an input field from non-null to null is considered non-breaking.`;
|
|
77
|
+
const fieldArgumentTypeChangedCriticalityBreakingReason = `Changing the type of a field's argument can cause existing queries that use this argument to error.`;
|
|
78
|
+
function fieldArgumentTypeChangedFromMeta(args) {
|
|
33
79
|
return {
|
|
34
|
-
|
|
80
|
+
type: change_js_1.ChangeType.FieldArgumentTypeChanged,
|
|
81
|
+
criticality: args.meta.isSafeArgumentTypeChange
|
|
35
82
|
? {
|
|
36
83
|
level: change_js_1.CriticalityLevel.NonBreaking,
|
|
37
|
-
reason:
|
|
84
|
+
reason: fieldArgumentTypeChangedCriticalityNonBreakingReason,
|
|
38
85
|
}
|
|
39
86
|
: {
|
|
40
87
|
level: change_js_1.CriticalityLevel.Breaking,
|
|
41
|
-
reason:
|
|
88
|
+
reason: fieldArgumentTypeChangedCriticalityBreakingReason,
|
|
42
89
|
},
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
path: [
|
|
90
|
+
message: buildFieldArgumentTypeChangedMessage(args.meta),
|
|
91
|
+
meta: args.meta,
|
|
92
|
+
path: [args.meta.typeName, args.meta.fieldName, args.meta.argumentName].join('.'),
|
|
46
93
|
};
|
|
47
94
|
}
|
|
95
|
+
exports.fieldArgumentTypeChangedFromMeta = fieldArgumentTypeChangedFromMeta;
|
|
96
|
+
function fieldArgumentTypeChanged(type, field, oldArg, newArg) {
|
|
97
|
+
return fieldArgumentTypeChangedFromMeta({
|
|
98
|
+
type: change_js_1.ChangeType.FieldArgumentTypeChanged,
|
|
99
|
+
meta: {
|
|
100
|
+
typeName: type.name,
|
|
101
|
+
fieldName: field.name,
|
|
102
|
+
argumentName: newArg.name,
|
|
103
|
+
oldArgumentType: oldArg.type.toString(),
|
|
104
|
+
newArgumentType: newArg.type.toString(),
|
|
105
|
+
isSafeArgumentTypeChange: (0, graphql_js_1.safeChangeForInputValue)(oldArg.type, newArg.type),
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
}
|
|
48
109
|
exports.fieldArgumentTypeChanged = fieldArgumentTypeChanged;
|