@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.
Files changed (98) hide show
  1. package/README.md +3 -3
  2. package/cjs/action/src/run.js +1 -1
  3. package/cjs/commands/commands/src/index.js +7 -8
  4. package/cjs/commands/diff/src/index.js +6 -6
  5. package/cjs/commands/docs/src/index.js +1 -3
  6. package/cjs/commands/serve/src/fake.js +4 -4
  7. package/cjs/commands/serve/src/index.js +8 -7
  8. package/cjs/commands/similar/src/index.js +2 -2
  9. package/cjs/commands/validate/src/index.js +4 -4
  10. package/cjs/core/src/ast/document.js +2 -2
  11. package/cjs/core/src/coverage/index.js +7 -7
  12. package/cjs/core/src/diff/changes/argument.js +80 -19
  13. package/cjs/core/src/diff/changes/directive.js +208 -39
  14. package/cjs/core/src/diff/changes/enum.js +123 -25
  15. package/cjs/core/src/diff/changes/field.js +260 -69
  16. package/cjs/core/src/diff/changes/input.js +153 -34
  17. package/cjs/core/src/diff/changes/object.js +37 -9
  18. package/cjs/core/src/diff/changes/schema.js +55 -13
  19. package/cjs/core/src/diff/changes/type.js +106 -19
  20. package/cjs/core/src/diff/changes/union.js +35 -7
  21. package/cjs/core/src/diff/directive.js +2 -4
  22. package/cjs/core/src/diff/rules/consider-usage.js +3 -3
  23. package/cjs/core/src/index.js +63 -1
  24. package/cjs/core/src/similar/index.js +2 -2
  25. package/cjs/core/src/utils/compare.js +3 -9
  26. package/cjs/core/src/utils/is-deprecated.js +1 -1
  27. package/cjs/core/src/utils/string.js +5 -2
  28. package/cjs/core/src/validate/complexity.js +1 -1
  29. package/cjs/core/src/validate/directive-count.js +1 -1
  30. package/cjs/core/src/validate/index.js +12 -11
  31. package/cjs/core/src/validate/query-depth.js +1 -1
  32. package/cjs/github/src/helpers/config.js +6 -2
  33. package/cjs/github/src/helpers/utils.js +1 -1
  34. package/cjs/loaders/loaders/src/index.js +1 -2
  35. package/esm/action/src/run.js +1 -1
  36. package/esm/commands/commands/src/index.js +7 -8
  37. package/esm/commands/diff/src/index.js +6 -6
  38. package/esm/commands/docs/src/index.js +1 -4
  39. package/esm/commands/serve/src/fake.js +4 -4
  40. package/esm/commands/serve/src/index.js +8 -7
  41. package/esm/commands/similar/src/index.js +2 -2
  42. package/esm/commands/validate/src/index.js +4 -4
  43. package/esm/core/src/ast/document.js +2 -2
  44. package/esm/core/src/coverage/index.js +7 -7
  45. package/esm/core/src/diff/changes/argument.js +77 -19
  46. package/esm/core/src/diff/changes/directive.js +198 -39
  47. package/esm/core/src/diff/changes/enum.js +117 -25
  48. package/esm/core/src/diff/changes/field.js +240 -62
  49. package/esm/core/src/diff/changes/input.js +145 -34
  50. package/esm/core/src/diff/changes/object.js +35 -9
  51. package/esm/core/src/diff/changes/schema.js +50 -11
  52. package/esm/core/src/diff/changes/type.js +100 -19
  53. package/esm/core/src/diff/changes/union.js +33 -7
  54. package/esm/core/src/diff/directive.js +2 -4
  55. package/esm/core/src/diff/rules/consider-usage.js +3 -3
  56. package/esm/core/src/index.js +9 -0
  57. package/esm/core/src/similar/index.js +2 -2
  58. package/esm/core/src/utils/compare.js +3 -9
  59. package/esm/core/src/utils/is-deprecated.js +1 -1
  60. package/esm/core/src/utils/string.js +5 -2
  61. package/esm/core/src/validate/complexity.js +1 -1
  62. package/esm/core/src/validate/directive-count.js +1 -1
  63. package/esm/core/src/validate/index.js +12 -11
  64. package/esm/core/src/validate/query-depth.js +1 -1
  65. package/esm/github/src/helpers/config.js +6 -2
  66. package/esm/github/src/helpers/utils.js +1 -1
  67. package/esm/loaders/loaders/src/index.js +1 -2
  68. package/package.json +20 -20
  69. package/typings/core/src/diff/changes/argument.d.cts +52 -4
  70. package/typings/core/src/diff/changes/argument.d.ts +52 -4
  71. package/typings/core/src/diff/changes/change.d.cts +500 -2
  72. package/typings/core/src/diff/changes/change.d.ts +500 -2
  73. package/typings/core/src/diff/changes/directive.d.cts +147 -11
  74. package/typings/core/src/diff/changes/directive.d.ts +147 -11
  75. package/typings/core/src/diff/changes/enum.d.cts +75 -7
  76. package/typings/core/src/diff/changes/enum.d.ts +75 -7
  77. package/typings/core/src/diff/changes/field.d.cts +189 -14
  78. package/typings/core/src/diff/changes/field.d.ts +189 -14
  79. package/typings/core/src/diff/changes/input.d.cts +112 -8
  80. package/typings/core/src/diff/changes/input.d.ts +112 -8
  81. package/typings/core/src/diff/changes/object.d.cts +29 -3
  82. package/typings/core/src/diff/changes/object.d.ts +29 -3
  83. package/typings/core/src/diff/changes/schema.d.cts +37 -4
  84. package/typings/core/src/diff/changes/schema.d.ts +37 -4
  85. package/typings/core/src/diff/changes/type.d.cts +80 -7
  86. package/typings/core/src/diff/changes/type.d.ts +80 -7
  87. package/typings/core/src/diff/changes/union.d.cts +29 -3
  88. package/typings/core/src/diff/changes/union.d.ts +29 -3
  89. package/typings/core/src/index.d.cts +10 -0
  90. package/typings/core/src/index.d.ts +10 -0
  91. package/typings/core/src/utils/is-deprecated.d.cts +1 -1
  92. package/typings/core/src/utils/is-deprecated.d.ts +1 -1
  93. package/typings/core/src/utils/string.d.cts +1 -1
  94. package/typings/core/src/utils/string.d.ts +1 -1
  95. package/typings/core/utils/testing.d.cts +2 -2
  96. package/typings/core/utils/testing.d.ts +2 -2
  97. package/typings/github/src/helpers/utils.d.cts +1 -1
  98. package/typings/github/src/helpers/utils.d.ts +1 -1
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![npm version](https://badge.fury.io/js/%40graphql-inspector%2Fcli.svg)](https://npmjs.com/package/@graphql-inspector/cli)
4
4
 
5
- **GraphQL Inspector** ouputs a list of changes between two GraphQL schemas. Every change is
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 **programatic API**, so you can use it however you want
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 programatic usage
33
+ # Core API for programmatic usage
34
34
  pnpm add @graphql-inspector/core
35
35
  ```
36
36
 
@@ -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) === 'open') {
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
- for (const header of args.header) {
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
- for (const leftHeader of args.leftHeader) {
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
- for (const rightHeader of args.rightHeader) {
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
- for (const mod of args.require)
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
- for (const change of sorted) {
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
- for (const change of sorted) {
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
- for (const change of sorted) {
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 tslib_1.__awaiter(this, void 0, void 0, function* () {
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
- for (const typeName of Object.keys(typeMap)) {
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
- for (const fieldName of Object.keys(fields)) {
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 yoga = (0, graphql_yoga_1.createYoga)({ schema, cors: true, logging: false });
47
- const server = (0, http_1.createServer)(yoga);
48
- yield server.listen(port, () => {
49
- console.info(`Server is running on http://localhost:${port}`);
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.close();
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
- for (const match of matches.ratings) {
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
- for (const doc of invalidDocuments) {
233
+ invalidDocuments.forEach(doc => {
234
234
  if (doc.errors.length) {
235
- for (const line of renderErrors(doc.source.name, doc[listKey], isError)) {
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
- for (const node of definitions) {
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
- for (const [i, doc] of documents.entries()) {
89
+ documents.forEach((doc, i) => {
90
90
  const source = coverage.sources[i];
91
- for (const op of doc.operations) {
91
+ doc.operations.forEach(op => {
92
92
  (0, graphql_1.visit)(op.node, (0, graphql_1.visitWithTypeInfo)(typeInfo, visitor(source)));
93
- }
94
- for (const fr of doc.fragments) {
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 === me.fieldsCountCovered)
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 fieldArgumentDescriptionChanged(type, field, oldArg, newArg) {
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
- type: change_js_1.ChangeType.FieldArgumentDescriptionChanged,
13
- message: `Description for argument '${newArg.name}' on field '${type.name}.${field.name}' changed from '${oldArg.description}' to '${newArg.description}'`,
14
- path: [type.name, field.name, oldArg.name].join('.'),
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 fieldArgumentDefaultChanged(type, field, oldArg, newArg) {
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: 'Changing the default value for an argument may change the runtime behaviour of a field if it was never provided.',
47
+ reason: fieldArgumentDefaultChangedCriticalityDangerousReason,
23
48
  },
24
- type: change_js_1.ChangeType.FieldArgumentDefaultChanged,
25
- message: typeof oldArg.defaultValue === 'undefined'
26
- ? `Default value '${(0, string_js_1.safeString)(newArg.defaultValue)}' was added to argument '${newArg.name}' on field '${type.name}.${field.name}'`
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 fieldArgumentTypeChanged(type, field, oldArg, newArg) {
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
- criticality: (0, graphql_js_1.safeChangeForInputValue)(oldArg.type, newArg.type)
80
+ type: change_js_1.ChangeType.FieldArgumentTypeChanged,
81
+ criticality: args.meta.isSafeArgumentTypeChange
35
82
  ? {
36
83
  level: change_js_1.CriticalityLevel.NonBreaking,
37
- reason: `Changing an input field from non-null to null is considered non-breaking.`,
84
+ reason: fieldArgumentTypeChangedCriticalityNonBreakingReason,
38
85
  }
39
86
  : {
40
87
  level: change_js_1.CriticalityLevel.Breaking,
41
- reason: `Changing the type of a field's argument can cause existing queries that use this argument to error.`,
88
+ reason: fieldArgumentTypeChangedCriticalityBreakingReason,
42
89
  },
43
- type: change_js_1.ChangeType.FieldArgumentTypeChanged,
44
- message: `Type for argument '${newArg.name}' on field '${type.name}.${field.name}' changed from '${oldArg.type}' to '${newArg.type}'`,
45
- path: [type.name, field.name, oldArg.name].join('.'),
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;