relay-test-utils-internal 13.2.0 → 14.0.0

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.
@@ -13,6 +13,8 @@
13
13
 
14
14
  /* global jest */
15
15
 
16
+ import type {WillFireOptions} from './consoleErrorsAndWarnings';
17
+
16
18
  const {createConsoleInterceptionSystem} = require('./consoleErrorsAndWarnings');
17
19
 
18
20
  const consoleErrorsSystem = createConsoleInterceptionSystem(
@@ -38,8 +40,11 @@ function disallowConsoleErrors(): void {
38
40
  * Expect an error with the given message. If the message isn't fired in the
39
41
  * current test, the test will fail.
40
42
  */
41
- function expectConsoleErrorWillFire(message: string): void {
42
- consoleErrorsSystem.expectMessageWillFire(message);
43
+ function expectConsoleErrorWillFire(
44
+ message: string,
45
+ options?: WillFireOptions,
46
+ ): void {
47
+ consoleErrorsSystem.expectMessageWillFire(message, options);
43
48
  }
44
49
 
45
50
  /**
@@ -11,11 +11,16 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- /* global jest, afterEach */
14
+ /* global afterEach */
15
+
16
+ export type WillFireOptions = {
17
+ count?: number,
18
+ optional?: boolean,
19
+ };
15
20
 
16
21
  type API = $ReadOnly<{|
17
22
  disallowMessages: () => void,
18
- expectMessageWillFire: string => void,
23
+ expectMessageWillFire: (string, void | WillFireOptions) => void,
19
24
  expectMessage: <T>(string, () => T) => T,
20
25
  expectMessageMany: <T>(Array<string>, () => T) => T,
21
26
  |}>;
@@ -29,6 +34,7 @@ function createConsoleInterceptionSystem(
29
34
  ): API {
30
35
  let installed = false;
31
36
  const expectedMessages: Array<string> = [];
37
+ const optionalMessages: Array<string> = [];
32
38
  const contextualExpectedMessage: Array<string> = [];
33
39
 
34
40
  const typenameCap = typename.charAt(0).toUpperCase() + typename.slice(1);
@@ -39,13 +45,18 @@ function createConsoleInterceptionSystem(
39
45
  const index = expectedMessages.findIndex(expected =>
40
46
  message.startsWith(expected),
41
47
  );
48
+ const optionalIndex = optionalMessages.findIndex(expected =>
49
+ message.startsWith(expected),
50
+ );
42
51
  if (
43
52
  contextualExpectedMessage.length > 0 &&
44
- contextualExpectedMessage[0] === message
53
+ message.startsWith(contextualExpectedMessage[0])
45
54
  ) {
46
55
  contextualExpectedMessage.shift();
47
56
  } else if (index >= 0) {
48
57
  expectedMessages.splice(index, 1);
58
+ } else if (optionalIndex >= 0) {
59
+ optionalMessages.splice(optionalIndex, 1);
49
60
  } else {
50
61
  // log to console in case the error gets swallowed somewhere
51
62
  originalConsoleError(`Unexpected ${typenameCap}: ` + message);
@@ -61,10 +72,11 @@ function createConsoleInterceptionSystem(
61
72
  setUpMock(handleMessage);
62
73
 
63
74
  afterEach(() => {
75
+ optionalMessages.length = 0;
64
76
  contextualExpectedMessage.length = 0;
65
77
  if (expectedMessages.length > 0) {
66
78
  const error = new Error(
67
- `Some expected ${typename}s where not triggered:\n\n` +
79
+ `Some ${expectedMessages.length} expected ${typename}s where not triggered:\n\n` +
68
80
  Array.from(expectedMessages, message => ` * ${message}`).join(
69
81
  '\n',
70
82
  ) +
@@ -76,13 +88,19 @@ function createConsoleInterceptionSystem(
76
88
  });
77
89
  }
78
90
 
79
- function expectMessageWillFire(message: string): void {
91
+ function expectMessageWillFire(
92
+ message: string,
93
+ options?: WillFireOptions,
94
+ ): void {
80
95
  if (!installed) {
81
96
  throw new Error(
82
97
  `${installerName} needs to be called before expect${typenameCapPlural}WillFire`,
83
98
  );
84
99
  }
85
- expectedMessages.push(message);
100
+ const optional = options?.optional === true; // avoid "sketchy null check"
101
+ for (let i = 0; i < (options?.count ?? 1); i++) {
102
+ (optional ? optionalMessages : expectedMessages).push(message);
103
+ }
86
104
  }
87
105
 
88
106
  function expectMessage<T>(message: string, fn: () => T): T {
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ * @emails oncall+relay
8
+ * @flow strict-local
9
+ * @format
10
+ */
11
+
12
+ 'use strict';
13
+
14
+ /* global jest */
15
+
16
+ import type {WillFireOptions} from './consoleErrorsAndWarnings';
17
+
18
+ const {createConsoleInterceptionSystem} = require('./consoleErrorsAndWarnings');
19
+
20
+ const consoleWarningsSystem = createConsoleInterceptionSystem(
21
+ 'warning',
22
+ 'expectConsoleWarning',
23
+ impl => {
24
+ jest.spyOn(console, 'warn').mockImplementation(impl);
25
+ },
26
+ );
27
+
28
+ /**
29
+ * Mocks console.warn so that warnings printed to the console are instead thrown.
30
+ * Any expected warnings need to be explicitly expected with `expectConsoleWarningWillFire(message)`.
31
+ *
32
+ * NOTE: This should be called on top of a test file. The test should NOT
33
+ * use `jest.resetModules()` or manually mock `console`.
34
+ */
35
+ function disallowConsoleWarnings(): void {
36
+ consoleWarningsSystem.disallowMessages();
37
+ }
38
+
39
+ /**
40
+ * Expect a warning with the given message. If the message isn't fired in the
41
+ * current test, the test will fail.
42
+ */
43
+ function expectConsoleWarningWillFire(
44
+ message: string,
45
+ options?: WillFireOptions,
46
+ ): void {
47
+ consoleWarningsSystem.expectMessageWillFire(message, options);
48
+ }
49
+
50
+ /**
51
+ * Expect the callback `fn` to print a warning with the message, and otherwise fail.
52
+ */
53
+ function expectConsoleWarning<T>(message: string, fn: () => T): T {
54
+ return consoleWarningsSystem.expectMessage(message, fn);
55
+ }
56
+
57
+ /**
58
+ * Expect the callback `fn` to trigger all console warnings (in sequence),
59
+ * and otherwise fail.
60
+ */
61
+ function expectConsoleWarningsMany<T>(messages: Array<string>, fn: () => T): T {
62
+ return consoleWarningsSystem.expectMessageMany(messages, fn);
63
+ }
64
+
65
+ module.exports = {
66
+ disallowConsoleWarnings,
67
+ expectConsoleWarningWillFire,
68
+ expectConsoleWarning,
69
+ expectConsoleWarningsMany,
70
+ };
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Relay v13.2.0
2
+ * Relay v14.0.0
3
3
  *
4
4
  * Copyright (c) Meta Platforms, Inc. and affiliates.
5
5
  *
package/index.js.flow CHANGED
@@ -18,6 +18,12 @@ const {
18
18
  expectConsoleErrorsMany,
19
19
  expectConsoleErrorWillFire,
20
20
  } = require('./consoleError');
21
+ const {
22
+ disallowConsoleWarnings,
23
+ expectConsoleWarning,
24
+ expectConsoleWarningsMany,
25
+ expectConsoleWarningWillFire,
26
+ } = require('./consoleWarning');
21
27
  const describeWithFeatureFlags = require('./describeWithFeatureFlags');
22
28
  const {
23
29
  FIXTURE_TAG,
@@ -26,6 +32,7 @@ const {
26
32
  const Matchers = require('./Matchers');
27
33
  const printAST = require('./printAST');
28
34
  const simpleClone = require('./simpleClone');
35
+ const trackRetentionForEnvironment = require('./trackRetentionForEnvironment');
29
36
  const {
30
37
  disallowWarnings,
31
38
  expectToWarn,
@@ -57,10 +64,14 @@ module.exports = {
57
64
  createMockEnvironment,
58
65
  describeWithFeatureFlags,
59
66
  disallowConsoleErrors,
67
+ disallowConsoleWarnings,
60
68
  disallowWarnings,
61
69
  expectConsoleError,
62
70
  expectConsoleErrorsMany,
63
71
  expectConsoleErrorWillFire,
72
+ expectConsoleWarningWillFire,
73
+ expectConsoleWarning,
74
+ expectConsoleWarningsMany,
64
75
  expectToWarn,
65
76
  expectToWarnMany,
66
77
  expectWarningWillFire,
@@ -69,5 +80,6 @@ module.exports = {
69
80
  matchers: Matchers,
70
81
  printAST,
71
82
  simpleClone,
83
+ trackRetentionForEnvironment,
72
84
  unwrapContainer,
73
85
  };
@@ -34,8 +34,8 @@ function disallowConsoleErrors() {
34
34
  */
35
35
 
36
36
 
37
- function expectConsoleErrorWillFire(message) {
38
- consoleErrorsSystem.expectMessageWillFire(message);
37
+ function expectConsoleErrorWillFire(message, options) {
38
+ consoleErrorsSystem.expectMessageWillFire(message, options);
39
39
  }
40
40
  /**
41
41
  * Expect the callback `fn` to print an error with the message, and otherwise fail.
@@ -9,7 +9,7 @@
9
9
  * @format
10
10
  */
11
11
  'use strict';
12
- /* global jest, afterEach */
12
+ /* global afterEach */
13
13
 
14
14
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
15
15
 
@@ -20,6 +20,7 @@ var originalConsoleError = console.error;
20
20
  function createConsoleInterceptionSystem(typename, expectFunctionName, setUpMock) {
21
21
  var installed = false;
22
22
  var expectedMessages = [];
23
+ var optionalMessages = [];
23
24
  var contextualExpectedMessage = [];
24
25
  var typenameCap = typename.charAt(0).toUpperCase() + typename.slice(1);
25
26
  var typenameCapPlural = typenameCap + 's';
@@ -29,11 +30,16 @@ function createConsoleInterceptionSystem(typename, expectFunctionName, setUpMock
29
30
  var index = expectedMessages.findIndex(function (expected) {
30
31
  return message.startsWith(expected);
31
32
  });
33
+ var optionalIndex = optionalMessages.findIndex(function (expected) {
34
+ return message.startsWith(expected);
35
+ });
32
36
 
33
- if (contextualExpectedMessage.length > 0 && contextualExpectedMessage[0] === message) {
37
+ if (contextualExpectedMessage.length > 0 && message.startsWith(contextualExpectedMessage[0])) {
34
38
  contextualExpectedMessage.shift();
35
39
  } else if (index >= 0) {
36
40
  expectedMessages.splice(index, 1);
41
+ } else if (optionalIndex >= 0) {
42
+ optionalMessages.splice(optionalIndex, 1);
37
43
  } else {
38
44
  // log to console in case the error gets swallowed somewhere
39
45
  originalConsoleError("Unexpected ".concat(typenameCap, ": ") + message);
@@ -49,10 +55,11 @@ function createConsoleInterceptionSystem(typename, expectFunctionName, setUpMock
49
55
  installed = true;
50
56
  setUpMock(handleMessage);
51
57
  afterEach(function () {
58
+ optionalMessages.length = 0;
52
59
  contextualExpectedMessage.length = 0;
53
60
 
54
61
  if (expectedMessages.length > 0) {
55
- var error = new Error("Some expected ".concat(typename, "s where not triggered:\n\n") + Array.from(expectedMessages, function (message) {
62
+ var error = new Error("Some ".concat(expectedMessages.length, " expected ").concat(typename, "s where not triggered:\n\n") + Array.from(expectedMessages, function (message) {
56
63
  return " * ".concat(message);
57
64
  }).join('\n') + '\n');
58
65
  expectedMessages.length = 0;
@@ -61,12 +68,18 @@ function createConsoleInterceptionSystem(typename, expectFunctionName, setUpMock
61
68
  });
62
69
  }
63
70
 
64
- function expectMessageWillFire(message) {
71
+ function expectMessageWillFire(message, options) {
65
72
  if (!installed) {
66
73
  throw new Error("".concat(installerName, " needs to be called before expect").concat(typenameCapPlural, "WillFire"));
67
74
  }
68
75
 
69
- expectedMessages.push(message);
76
+ var optional = (options === null || options === void 0 ? void 0 : options.optional) === true; // avoid "sketchy null check"
77
+
78
+ for (var i = 0; i < ((_options$count = options === null || options === void 0 ? void 0 : options.count) !== null && _options$count !== void 0 ? _options$count : 1); i++) {
79
+ var _options$count;
80
+
81
+ (optional ? optionalMessages : expectedMessages).push(message);
82
+ }
70
83
  }
71
84
 
72
85
  function expectMessage(message, fn) {
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ * @emails oncall+relay
8
+ *
9
+ * @format
10
+ */
11
+ 'use strict';
12
+ /* global jest */
13
+
14
+ var _require = require('./consoleErrorsAndWarnings'),
15
+ createConsoleInterceptionSystem = _require.createConsoleInterceptionSystem;
16
+
17
+ var consoleWarningsSystem = createConsoleInterceptionSystem('warning', 'expectConsoleWarning', function (impl) {
18
+ jest.spyOn(console, 'warn').mockImplementation(impl);
19
+ });
20
+ /**
21
+ * Mocks console.warn so that warnings printed to the console are instead thrown.
22
+ * Any expected warnings need to be explicitly expected with `expectConsoleWarningWillFire(message)`.
23
+ *
24
+ * NOTE: This should be called on top of a test file. The test should NOT
25
+ * use `jest.resetModules()` or manually mock `console`.
26
+ */
27
+
28
+ function disallowConsoleWarnings() {
29
+ consoleWarningsSystem.disallowMessages();
30
+ }
31
+ /**
32
+ * Expect a warning with the given message. If the message isn't fired in the
33
+ * current test, the test will fail.
34
+ */
35
+
36
+
37
+ function expectConsoleWarningWillFire(message, options) {
38
+ consoleWarningsSystem.expectMessageWillFire(message, options);
39
+ }
40
+ /**
41
+ * Expect the callback `fn` to print a warning with the message, and otherwise fail.
42
+ */
43
+
44
+
45
+ function expectConsoleWarning(message, fn) {
46
+ return consoleWarningsSystem.expectMessage(message, fn);
47
+ }
48
+ /**
49
+ * Expect the callback `fn` to trigger all console warnings (in sequence),
50
+ * and otherwise fail.
51
+ */
52
+
53
+
54
+ function expectConsoleWarningsMany(messages, fn) {
55
+ return consoleWarningsSystem.expectMessageMany(messages, fn);
56
+ }
57
+
58
+ module.exports = {
59
+ disallowConsoleWarnings: disallowConsoleWarnings,
60
+ expectConsoleWarningWillFire: expectConsoleWarningWillFire,
61
+ expectConsoleWarning: expectConsoleWarning,
62
+ expectConsoleWarningsMany: expectConsoleWarningsMany
63
+ };
package/lib/index.js CHANGED
@@ -16,11 +16,17 @@ var _require = require('./consoleError'),
16
16
  expectConsoleErrorsMany = _require.expectConsoleErrorsMany,
17
17
  expectConsoleErrorWillFire = _require.expectConsoleErrorWillFire;
18
18
 
19
+ var _require2 = require('./consoleWarning'),
20
+ disallowConsoleWarnings = _require2.disallowConsoleWarnings,
21
+ expectConsoleWarning = _require2.expectConsoleWarning,
22
+ expectConsoleWarningsMany = _require2.expectConsoleWarningsMany,
23
+ expectConsoleWarningWillFire = _require2.expectConsoleWarningWillFire;
24
+
19
25
  var describeWithFeatureFlags = require('./describeWithFeatureFlags');
20
26
 
21
- var _require2 = require('./generateTestsFromFixtures'),
22
- FIXTURE_TAG = _require2.FIXTURE_TAG,
23
- generateTestsFromFixtures = _require2.generateTestsFromFixtures;
27
+ var _require3 = require('./generateTestsFromFixtures'),
28
+ FIXTURE_TAG = _require3.FIXTURE_TAG,
29
+ generateTestsFromFixtures = _require3.generateTestsFromFixtures;
24
30
 
25
31
  var Matchers = require('./Matchers');
26
32
 
@@ -28,15 +34,17 @@ var printAST = require('./printAST');
28
34
 
29
35
  var simpleClone = require('./simpleClone');
30
36
 
31
- var _require3 = require('./warnings'),
32
- disallowWarnings = _require3.disallowWarnings,
33
- expectToWarn = _require3.expectToWarn,
34
- expectToWarnMany = _require3.expectToWarnMany,
35
- expectWarningWillFire = _require3.expectWarningWillFire;
37
+ var trackRetentionForEnvironment = require('./trackRetentionForEnvironment');
38
+
39
+ var _require4 = require('./warnings'),
40
+ disallowWarnings = _require4.disallowWarnings,
41
+ expectToWarn = _require4.expectToWarn,
42
+ expectToWarnMany = _require4.expectToWarnMany,
43
+ expectWarningWillFire = _require4.expectWarningWillFire;
36
44
 
37
- var _require4 = require('relay-test-utils'),
38
- createMockEnvironment = _require4.createMockEnvironment,
39
- unwrapContainer = _require4.unwrapContainer; // Apparently, in node v16 (because now they are using V8 V9.something)
45
+ var _require5 = require('relay-test-utils'),
46
+ createMockEnvironment = _require5.createMockEnvironment,
47
+ unwrapContainer = _require5.unwrapContainer; // Apparently, in node v16 (because now they are using V8 V9.something)
40
48
  // the content of the TypeError has changed, and now some of our tests
41
49
  // stated to fail.
42
50
  // This is a temporary work-around to make test pass, but we need to
@@ -60,10 +68,14 @@ module.exports = {
60
68
  createMockEnvironment: createMockEnvironment,
61
69
  describeWithFeatureFlags: describeWithFeatureFlags,
62
70
  disallowConsoleErrors: disallowConsoleErrors,
71
+ disallowConsoleWarnings: disallowConsoleWarnings,
63
72
  disallowWarnings: disallowWarnings,
64
73
  expectConsoleError: expectConsoleError,
65
74
  expectConsoleErrorsMany: expectConsoleErrorsMany,
66
75
  expectConsoleErrorWillFire: expectConsoleErrorWillFire,
76
+ expectConsoleWarningWillFire: expectConsoleWarningWillFire,
77
+ expectConsoleWarning: expectConsoleWarning,
78
+ expectConsoleWarningsMany: expectConsoleWarningsMany,
67
79
  expectToWarn: expectToWarn,
68
80
  expectToWarnMany: expectToWarnMany,
69
81
  expectWarningWillFire: expectWarningWillFire,
@@ -72,5 +84,6 @@ module.exports = {
72
84
  matchers: Matchers,
73
85
  printAST: printAST,
74
86
  simpleClone: simpleClone,
87
+ trackRetentionForEnvironment: trackRetentionForEnvironment,
75
88
  unwrapContainer: unwrapContainer
76
89
  };
@@ -143,28 +143,23 @@ type Subscription {
143
143
  }
144
144
 
145
145
  input ActorSubscribeInput {
146
- clientMutationId: String
147
146
  subscribeeId: ID
148
147
  }
149
148
 
150
149
  input ActorNameChangeInput {
151
- clientMutationId: String
152
150
  newName: String
153
151
  }
154
152
 
155
153
  input ApplicationRequestDeleteAllInput {
156
- clientMutationId: String
157
154
  deletedRequestIds: [ID]
158
155
  }
159
156
 
160
157
  input CommentCreateInput {
161
- clientMutationId: String
162
158
  feedbackId: ID
163
159
  feedback: CommentfeedbackFeedback
164
160
  }
165
161
 
166
162
  input CommentsCreateInput {
167
- clientMutationId: String
168
163
  feedbackId: ID
169
164
  feedback: [CommentfeedbackFeedback]
170
165
  }
@@ -178,40 +173,33 @@ input FeedbackcommentComment {
178
173
  }
179
174
 
180
175
  input CommentCreateSubscriptionInput {
181
- clientSubscriptionId: String
182
176
  feedbackId: ID
183
177
  text: String
184
178
  }
185
179
 
186
180
  input CommentDeleteInput {
187
- clientMutationId: String
188
181
  commentId: ID
189
182
  }
190
183
 
191
184
  input CommentsDeleteInput {
192
- clientMutationId: String
193
185
  commentIds: [ID]
194
186
  }
195
187
 
196
188
  input FeedbackLikeInput {
197
- clientMutationId: String
198
189
  feedbackId: ID
199
190
  }
200
191
 
201
192
  input FeedbackLikeInputStrict {
202
193
  userID: ID!
203
- clientMutationId: ID!
204
194
  feedbackId: ID!
205
195
  description: String
206
196
  }
207
197
 
208
198
  input NodeSaveStateInput {
209
- clientMutationId: String
210
199
  nodeId: ID
211
200
  }
212
201
 
213
202
  input UpdateAllSeenStateInput {
214
- clientMutationId: String
215
203
  storyIds: [ID]
216
204
  }
217
205
 
@@ -221,22 +209,18 @@ input LocationInput {
221
209
  }
222
210
 
223
211
  type setLocationResponsePayload {
224
- clientMutationId: String
225
212
  viewer: Viewer
226
213
  }
227
214
 
228
215
  type ActorSubscribeResponsePayload {
229
- clientMutationId: String
230
216
  subscribee: Actor
231
217
  }
232
218
 
233
219
  type ActorNameChangePayload {
234
- clientMutationId: String
235
220
  actor: Actor
236
221
  }
237
222
 
238
223
  type ApplicationRequestDeleteAllResponsePayload {
239
- clientMutationId: String
240
224
  deletedRequestIds: [ID]
241
225
  }
242
226
 
@@ -250,7 +234,6 @@ input CheckinSearchInput {
250
234
  }
251
235
 
252
236
  input StoryUpdateInput {
253
- clientMutationId: String
254
237
  body: InputText
255
238
  }
256
239
 
@@ -334,7 +317,6 @@ type ConfigCreateSubscriptResponsePayload {
334
317
  }
335
318
 
336
319
  type CommentCreateResponsePayload {
337
- clientMutationId: String
338
320
  comment: Comment
339
321
  feedback: Feedback
340
322
  feedbackCommentEdge: CommentsEdge
@@ -342,7 +324,6 @@ type CommentCreateResponsePayload {
342
324
  }
343
325
 
344
326
  type CommentsCreateResponsePayload {
345
- clientMutationId: String
346
327
  comments: [Comment]
347
328
  feedback: [Feedback]
348
329
  feedbackCommentEdges: [CommentsEdge]
@@ -350,19 +331,16 @@ type CommentsCreateResponsePayload {
350
331
  }
351
332
 
352
333
  type CommentDeleteResponsePayload {
353
- clientMutationId: String
354
334
  deletedCommentId: ID
355
335
  feedback: Feedback
356
336
  }
357
337
 
358
338
  type CommentsDeleteResponsePayload {
359
- clientMutationId: String
360
339
  deletedCommentIds: [ID]
361
340
  feedback: Feedback
362
341
  }
363
342
 
364
343
  type StoryUpdateResponsePayload {
365
- clientMutationId: String
366
344
  story: Story
367
345
  }
368
346
 
@@ -478,8 +456,6 @@ type Feedback implements Node & HasJsField {
478
456
  }
479
457
 
480
458
  type FeedbackLikeResponsePayload {
481
- clientMutationId: String
482
- clientSubscriptionId: String
483
459
  feedback: Feedback
484
460
  }
485
461
 
@@ -938,13 +914,11 @@ type TopLevelCommentsConnection {
938
914
  }
939
915
 
940
916
  input UnfriendInput {
941
- clientMutationId: String
942
917
  friendId: ID
943
918
  }
944
919
 
945
920
  type UnfriendResponsePayload {
946
921
  actor: Actor
947
- clientMutationId: String
948
922
  formerFriend: User
949
923
  }
950
924
 
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ *
8
+ * @format
9
+ */
10
+ // flowlint ambiguous-object-type:error
11
+ 'use strict';
12
+ /* global jest */
13
+
14
+ /**
15
+ * Takes an environment and augments it with a mock implementation of `retain`
16
+ * that tracks what operations are currently retained. Also returns the Jest mock
17
+ * `release` function for backwards-compatibility with existing tests, but you
18
+ * should use `isOperationRetained` for new tests as it is much less error-prone.
19
+ */
20
+ function trackRetentionForEnvironment(environment) {
21
+ var retainCountsByOperation = new Map();
22
+ var release = jest.fn(function (id) {
23
+ var _retainCountsByOperat;
24
+
25
+ var existing = (_retainCountsByOperat = retainCountsByOperation.get(id)) !== null && _retainCountsByOperat !== void 0 ? _retainCountsByOperat : NaN;
26
+
27
+ if (existing === 1) {
28
+ retainCountsByOperation["delete"](id);
29
+ } else {
30
+ retainCountsByOperation.set(id, existing - 1);
31
+ }
32
+ }); // $FlowFixMe[cannot-write] safe to do for mocking
33
+
34
+ environment.retain = jest.fn(function (operation) {
35
+ var _retainCountsByOperat2;
36
+
37
+ var id = operation.request.identifier;
38
+ var existing = (_retainCountsByOperat2 = retainCountsByOperation.get(id)) !== null && _retainCountsByOperat2 !== void 0 ? _retainCountsByOperat2 : 0;
39
+ retainCountsByOperation.set(id, existing + 1);
40
+ var released = false;
41
+ return {
42
+ dispose: function dispose() {
43
+ if (!released) {
44
+ release(id);
45
+ }
46
+
47
+ released = true;
48
+ }
49
+ };
50
+ });
51
+
52
+ function isOperationRetained(operation) {
53
+ var _retainCountsByOperat3;
54
+
55
+ var id = operation.request.identifier;
56
+ return ((_retainCountsByOperat3 = retainCountsByOperation.get(id)) !== null && _retainCountsByOperat3 !== void 0 ? _retainCountsByOperat3 : 0) > 0;
57
+ }
58
+
59
+ return {
60
+ release_DEPRECATED: release,
61
+ isOperationRetained: isOperationRetained
62
+ };
63
+ }
64
+
65
+ module.exports = trackRetentionForEnvironment;
package/lib/warnings.js CHANGED
@@ -48,8 +48,8 @@ function disallowWarnings() {
48
48
  */
49
49
 
50
50
 
51
- function expectWarningWillFire(message) {
52
- warningsSystem.expectMessageWillFire(message);
51
+ function expectWarningWillFire(message, options) {
52
+ warningsSystem.expectMessageWillFire(message, options);
53
53
  }
54
54
  /**
55
55
  * Expect the callback `fn` to trigger the warning message and otherwise fail.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "relay-test-utils-internal",
3
3
  "description": "Internal utilities for testing Relay.",
4
- "version": "13.2.0",
4
+ "version": "14.0.0",
5
5
  "keywords": [
6
6
  "graphql",
7
7
  "relay"
@@ -17,7 +17,7 @@
17
17
  "dependencies": {
18
18
  "@babel/runtime": "^7.0.0",
19
19
  "fbjs": "^3.0.2",
20
- "relay-runtime": "13.2.0"
20
+ "relay-runtime": "14.0.0"
21
21
  },
22
22
  "directories": {
23
23
  "": "./"
@@ -1,4 +1,4 @@
1
1
  /**
2
- * Relay v13.2.0
2
+ * Relay v14.0.0
3
3
  */
4
- module.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=3)}([function(e,t){e.exports=require("@babel/runtime/helpers/interopRequireDefault")},function(e,t,n){"use strict";var r=n(0)(n(5)),o=console.error;e.exports={createConsoleInterceptionSystem:function(e,t,n){var c=!1,i=[],a=[],s=e.charAt(0).toUpperCase()+e.slice(1),u=s+"s",l="disallow".concat(s,"s");function f(e){var t=i.findIndex((function(t){return e.startsWith(t)}));if(a.length>0&&a[0]===e)a.shift();else{if(!(t>=0))throw o("Unexpected ".concat(s,": ")+e),new Error("".concat(s,": ")+e);i.splice(t,1)}}function p(n,o){if(a.length>0)throw new Error("Cannot nest ".concat(t,"() calls."));a.push.apply(a,(0,r.default)(n));var c=o();if(a.length>0){var i=a.toString();throw a.length=0,new Error("Expected ".concat(e," in callback: ").concat(i))}return c}return{disallowMessages:function(){if(c)throw new Error("".concat(l," should be called only once."));c=!0,n(f),afterEach((function(){if(a.length=0,i.length>0){var t=new Error("Some expected ".concat(e,"s where not triggered:\n\n")+Array.from(i,(function(e){return" * ".concat(e)})).join("\n")+"\n");throw i.length=0,t}}))},expectMessageWillFire:function(e){if(!c)throw new Error("".concat(l," needs to be called before expect").concat(u,"WillFire"));i.push(e)},expectMessage:function(e,t){return p([e],t)},expectMessageMany:p}}}},function(e,t){e.exports=require("relay-runtime")},function(e,t,n){"use strict";var r=n(4),o=r.disallowConsoleErrors,c=r.expectConsoleError,i=r.expectConsoleErrorsMany,a=r.expectConsoleErrorWillFire,s=n(6),u=n(8),l=u.FIXTURE_TAG,f=u.generateTestsFromFixtures,p=n(13),d=n(15),g=n(17),x=n(18),h=x.disallowWarnings,y=x.expectToWarn,v=x.expectToWarnMany,b=x.expectWarningWillFire,w=n(19),m=w.createMockEnvironment,E=w.unwrapContainer;e.exports={cannotReadPropertyOfUndefined__DEPRECATED:function(e){return process.version.match(/^v16\.(.+)$/)?"Cannot read properties of undefined (reading '".concat(e,"')"):"Cannot read property '".concat(e,"' of undefined")},createMockEnvironment:m,describeWithFeatureFlags:s,disallowConsoleErrors:o,disallowWarnings:h,expectConsoleError:c,expectConsoleErrorsMany:i,expectConsoleErrorWillFire:a,expectToWarn:y,expectToWarnMany:v,expectWarningWillFire:b,FIXTURE_TAG:l,generateTestsFromFixtures:f,matchers:p,printAST:d,simpleClone:g,unwrapContainer:E}},function(e,t,n){"use strict";var r=(0,n(1).createConsoleInterceptionSystem)("error","expectConsoleError",(function(e){jest.spyOn(console,"error").mockImplementation(e)}));e.exports={disallowConsoleErrors:function(){r.disallowMessages()},expectConsoleErrorWillFire:function(e){r.expectMessageWillFire(e)},expectConsoleError:function(e,t){return r.expectMessage(e,t)},expectConsoleErrorsMany:function(e,t){return r.expectMessageMany(e,t)}}},function(e,t){e.exports=require("@babel/runtime/helpers/toConsumableArray")},function(e,t,n){"use strict";var r=n(0)(n(7));e.exports=function(e,t,o){describe.each(e)("".concat(t," - Feature flags: %o"),(function(e){var t;beforeEach((function(){var o=n(2).RelayFeatureFlags;t=(0,r.default)({},o),Object.assign(o,e)})),afterEach((function(){var e=n(2).RelayFeatureFlags;Object.assign(e,t)})),o()}))}},function(e,t){e.exports=require("@babel/runtime/helpers/objectSpread2")},function(e,t,n){"use strict";var r=n(0)(n(9)),o=n(10),c=n(11),i=n(12),a=Symbol.for("FIXTURE_TAG");expect.addSnapshotSerializer({print:function(e){return Object.keys(e).map((function(t){return"~~~~~~~~~~ ".concat(t.toUpperCase()," ~~~~~~~~~~\n").concat(e[t])})).join("\n")},test:function(e){return e&&!0===e[a]}}),e.exports={generateTestsFromFixtures:function(e,t){var n=c.readdirSync(e);test("has fixtures in ".concat(e),(function(){expect(n.length>0).toBe(!0)}));var s=n.filter((function(e){return e.startsWith("only.")}));s.length&&(test.skip.each(n.filter((function(e){return!e.startsWith("only.")})))("matches expected output: %s",(function(){})),n=s),test.each(n)("matches expected output: %s",(function(n){var s,u=c.readFileSync(i.join(e,n),"utf8"),l=o(u,t,n);expect((s={},(0,r.default)(s,a,!0),(0,r.default)(s,"input",u),(0,r.default)(s,"output",l),s)).toMatchSnapshot()}))},FIXTURE_TAG:a}},function(e,t){e.exports=require("@babel/runtime/helpers/defineProperty")},function(e,t,n){"use strict";e.exports=function(e,t,n){if(/^# *expected-to-throw/.test(e)||/\.error\.\w+$/.test(n)){var r;try{r=t(e)}catch(e){return"THROWN EXCEPTION:\n\n".concat(e.toString())}throw new Error("Expected test file '".concat(n,"' to throw, but it passed:\n").concat(r))}return t(e)}},function(e,t){e.exports=require("fs")},function(e,t){e.exports=require("path")},function(e,t,n){"use strict";e.exports={toBeDeeplyFrozen:function(e){return function e(t){if(expect(Object.isFrozen(t)).toBe(!0),Array.isArray(t))t.forEach((function(t){return e(t)}));else if("object"==typeof t&&null!==t)for(var n in t)e(t[n])}(e),{pass:!0}},toWarn:function(e,t){var r=this.isNot;function o(e){return e instanceof RegExp?e.toString():JSON.stringify(e)}function c(e){return"["+e.map(o).join(", ")+"]"}function i(e){return e.length?e.map((function(e){return c([!!e[0]].concat(e.slice(1)))})).join(", "):"[]"}var a=n(14);if(!a.mock)throw new Error("toWarn(): Requires `jest.mock('warning')`.");var s=a.mock.calls.length;e();var u=a.mock.calls.slice(s);return t?(Array.isArray(t)||(t=[t]),{pass:!!u.find((function(e){return e.length===t.length+1&&e.every((function(e,n){if(!n)return!e;var r=t[n-1];return r instanceof RegExp?r.test(e):e===r}))})),message:function(){return"Expected ".concat(r?"not ":"","to warn: ")+"".concat(c([!1].concat(t))," but ")+"`warning` received the following calls: "+"".concat(i(u),".")}}):{pass:!!u.filter((function(e){return!e[0]})).length,message:function(){return"Expected ".concat(r?"not ":"","to warn but ")+"`warning` received the following calls: "+"".concat(i(u),".")}}}}},function(e,t){e.exports=require("fbjs/lib/warning")},function(e,t,n){"use strict";var r=n(0)(n(16));e.exports=function(e){return function e(t,n){switch(typeof t){case"undefined":return"undefined";case"object":if(null===t)return"null";if(Array.isArray(t)){if(0===t.length)return"[]";var o,c="[\n",i=n+" ",a=(0,r.default)(t);try{for(a.s();!(o=a.n()).done;){var s=o.value;c+=i+e(s,i)+",\n"}}catch(e){a.e(e)}finally{a.f()}return c+=n+"]"}if("string"==typeof t.kind){for(var u="".concat(t.kind," {\n"),l=n+" ",f=0,p=Object.entries(t);f<p.length;f++){var d=p[f],g=d[0],x=d[1];"kind"!==g&&(u+="".concat(l).concat(g,": ").concat(e(x,l),",\n"))}return u+=n+"}"}if("function"==typeof t.toJSON)return e(t.toJSON(),n);for(var h="{\n",y=n+" ",v=0,b=Object.entries(t);v<b.length;v++){var w=b[v],m=w[0],E=w[1];h+="".concat(y).concat(JSON.stringify(m),": ").concat(e(E,y),",\n")}return h+=n+"}";case"string":case"number":case"boolean":return JSON.stringify(t,null,2).replace("\n","\n"+n);default:throw new Error("printAST doesn't handle values where "+"typeof value === '".concat(typeof t,"'."))}}(e,"")}},function(e,t){e.exports=require("@babel/runtime/helpers/createForOfIteratorHelper")},function(e,t,n){"use strict";e.exports=function e(t){if(Array.isArray(t))return t.map(e);if(null!=t&&"object"==typeof t){var n={};for(var r in t)n[r]=e(t[r]);return n}return t}},function(e,t,n){"use strict";var r=(0,n(1).createConsoleInterceptionSystem)("warning","expectToWarn",(function(e){jest.mock("fbjs/lib/warning",(function(){return jest.fn((function(t,n){for(var r=arguments.length,o=new Array(r>2?r-2:0),c=2;c<r;c++)o[c-2]=arguments[c];if(!t){var i=0,a=n.replace(/%s/g,(function(){return String(o[i++])}));e(a)}}))}))}));e.exports={disallowWarnings:function(){r.disallowMessages()},expectWarningWillFire:function(e){r.expectMessageWillFire(e)},expectToWarn:function(e,t){return r.expectMessage(e,t)},expectToWarnMany:function(e,t){return r.expectMessageMany(e,t)}}},function(e,t){e.exports=require("relay-test-utils")}]);
4
+ module.exports=function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=3)}([function(e,n){e.exports=require("@babel/runtime/helpers/interopRequireDefault")},function(e,n,t){"use strict";var r=t(0)(t(5)),o=console.error;e.exports={createConsoleInterceptionSystem:function(e,n,t){var i=!1,c=[],a=[],s=[],u=e.charAt(0).toUpperCase()+e.slice(1),l=u+"s",f="disallow".concat(u,"s");function p(e){var n=c.findIndex((function(n){return e.startsWith(n)})),t=a.findIndex((function(n){return e.startsWith(n)}));if(s.length>0&&e.startsWith(s[0]))s.shift();else if(n>=0)c.splice(n,1);else{if(!(t>=0))throw o("Unexpected ".concat(u,": ")+e),new Error("".concat(u,": ")+e);a.splice(t,1)}}function d(t,o){if(s.length>0)throw new Error("Cannot nest ".concat(n,"() calls."));s.push.apply(s,(0,r.default)(t));var i=o();if(s.length>0){var c=s.toString();throw s.length=0,new Error("Expected ".concat(e," in callback: ").concat(c))}return i}return{disallowMessages:function(){if(i)throw new Error("".concat(f," should be called only once."));i=!0,t(p),afterEach((function(){if(a.length=0,s.length=0,c.length>0){var n=new Error("Some ".concat(c.length," expected ").concat(e,"s where not triggered:\n\n")+Array.from(c,(function(e){return" * ".concat(e)})).join("\n")+"\n");throw c.length=0,n}}))},expectMessageWillFire:function(e,n){if(!i)throw new Error("".concat(f," needs to be called before expect").concat(l,"WillFire"));for(var t=!0===(null==n?void 0:n.optional),r=0;r<(null!==(o=null==n?void 0:n.count)&&void 0!==o?o:1);r++){var o;(t?a:c).push(e)}},expectMessage:function(e,n){return d([e],n)},expectMessageMany:d}}}},function(e,n){e.exports=require("relay-runtime")},function(e,n,t){"use strict";var r=t(4),o=r.disallowConsoleErrors,i=r.expectConsoleError,c=r.expectConsoleErrorsMany,a=r.expectConsoleErrorWillFire,s=t(6),u=s.disallowConsoleWarnings,l=s.expectConsoleWarning,f=s.expectConsoleWarningsMany,p=s.expectConsoleWarningWillFire,d=t(7),g=t(9),x=g.FIXTURE_TAG,h=g.generateTestsFromFixtures,y=t(14),v=t(16),w=t(18),b=t(19),m=t(20),W=m.disallowWarnings,E=m.expectToWarn,C=m.expectToWarnMany,M=m.expectWarningWillFire,F=t(21),j=F.createMockEnvironment,S=F.unwrapContainer;e.exports={cannotReadPropertyOfUndefined__DEPRECATED:function(e){return process.version.match(/^v16\.(.+)$/)?"Cannot read properties of undefined (reading '".concat(e,"')"):"Cannot read property '".concat(e,"' of undefined")},createMockEnvironment:j,describeWithFeatureFlags:d,disallowConsoleErrors:o,disallowConsoleWarnings:u,disallowWarnings:W,expectConsoleError:i,expectConsoleErrorsMany:c,expectConsoleErrorWillFire:a,expectConsoleWarningWillFire:p,expectConsoleWarning:l,expectConsoleWarningsMany:f,expectToWarn:E,expectToWarnMany:C,expectWarningWillFire:M,FIXTURE_TAG:x,generateTestsFromFixtures:h,matchers:y,printAST:v,simpleClone:w,trackRetentionForEnvironment:b,unwrapContainer:S}},function(e,n,t){"use strict";var r=(0,t(1).createConsoleInterceptionSystem)("error","expectConsoleError",(function(e){jest.spyOn(console,"error").mockImplementation(e)}));e.exports={disallowConsoleErrors:function(){r.disallowMessages()},expectConsoleErrorWillFire:function(e,n){r.expectMessageWillFire(e,n)},expectConsoleError:function(e,n){return r.expectMessage(e,n)},expectConsoleErrorsMany:function(e,n){return r.expectMessageMany(e,n)}}},function(e,n){e.exports=require("@babel/runtime/helpers/toConsumableArray")},function(e,n,t){"use strict";var r=(0,t(1).createConsoleInterceptionSystem)("warning","expectConsoleWarning",(function(e){jest.spyOn(console,"warn").mockImplementation(e)}));e.exports={disallowConsoleWarnings:function(){r.disallowMessages()},expectConsoleWarningWillFire:function(e,n){r.expectMessageWillFire(e,n)},expectConsoleWarning:function(e,n){return r.expectMessage(e,n)},expectConsoleWarningsMany:function(e,n){return r.expectMessageMany(e,n)}}},function(e,n,t){"use strict";var r=t(0)(t(8));e.exports=function(e,n,o){describe.each(e)("".concat(n," - Feature flags: %o"),(function(e){var n;beforeEach((function(){var o=t(2).RelayFeatureFlags;n=(0,r.default)({},o),Object.assign(o,e)})),afterEach((function(){var e=t(2).RelayFeatureFlags;Object.assign(e,n)})),o()}))}},function(e,n){e.exports=require("@babel/runtime/helpers/objectSpread2")},function(e,n,t){"use strict";var r=t(0)(t(10)),o=t(11),i=t(12),c=t(13),a=Symbol.for("FIXTURE_TAG");expect.addSnapshotSerializer({print:function(e){return Object.keys(e).map((function(n){return"~~~~~~~~~~ ".concat(n.toUpperCase()," ~~~~~~~~~~\n").concat(e[n])})).join("\n")},test:function(e){return e&&!0===e[a]}}),e.exports={generateTestsFromFixtures:function(e,n){var t=i.readdirSync(e);test("has fixtures in ".concat(e),(function(){expect(t.length>0).toBe(!0)}));var s=t.filter((function(e){return e.startsWith("only.")}));s.length&&(test.skip.each(t.filter((function(e){return!e.startsWith("only.")})))("matches expected output: %s",(function(){})),t=s),test.each(t)("matches expected output: %s",(function(t){var s,u=i.readFileSync(c.join(e,t),"utf8"),l=o(u,n,t);expect((s={},(0,r.default)(s,a,!0),(0,r.default)(s,"input",u),(0,r.default)(s,"output",l),s)).toMatchSnapshot()}))},FIXTURE_TAG:a}},function(e,n){e.exports=require("@babel/runtime/helpers/defineProperty")},function(e,n,t){"use strict";e.exports=function(e,n,t){if(/^# *expected-to-throw/.test(e)||/\.error\.\w+$/.test(t)){var r;try{r=n(e)}catch(e){return"THROWN EXCEPTION:\n\n".concat(e.toString())}throw new Error("Expected test file '".concat(t,"' to throw, but it passed:\n").concat(r))}return n(e)}},function(e,n){e.exports=require("fs")},function(e,n){e.exports=require("path")},function(e,n,t){"use strict";e.exports={toBeDeeplyFrozen:function(e){return function e(n){if(expect(Object.isFrozen(n)).toBe(!0),Array.isArray(n))n.forEach((function(n){return e(n)}));else if("object"==typeof n&&null!==n)for(var t in n)e(n[t])}(e),{pass:!0}},toWarn:function(e,n){var r=this.isNot;function o(e){return e instanceof RegExp?e.toString():JSON.stringify(e)}function i(e){return"["+e.map(o).join(", ")+"]"}function c(e){return e.length?e.map((function(e){return i([!!e[0]].concat(e.slice(1)))})).join(", "):"[]"}var a=t(15);if(!a.mock)throw new Error("toWarn(): Requires `jest.mock('warning')`.");var s=a.mock.calls.length;e();var u=a.mock.calls.slice(s);return n?(Array.isArray(n)||(n=[n]),{pass:!!u.find((function(e){return e.length===n.length+1&&e.every((function(e,t){if(!t)return!e;var r=n[t-1];return r instanceof RegExp?r.test(e):e===r}))})),message:function(){return"Expected ".concat(r?"not ":"","to warn: ")+"".concat(i([!1].concat(n))," but ")+"`warning` received the following calls: "+"".concat(c(u),".")}}):{pass:!!u.filter((function(e){return!e[0]})).length,message:function(){return"Expected ".concat(r?"not ":"","to warn but ")+"`warning` received the following calls: "+"".concat(c(u),".")}}}}},function(e,n){e.exports=require("fbjs/lib/warning")},function(e,n,t){"use strict";var r=t(0)(t(17));e.exports=function(e){return function e(n,t){switch(typeof n){case"undefined":return"undefined";case"object":if(null===n)return"null";if(Array.isArray(n)){if(0===n.length)return"[]";var o,i="[\n",c=t+" ",a=(0,r.default)(n);try{for(a.s();!(o=a.n()).done;){var s=o.value;i+=c+e(s,c)+",\n"}}catch(e){a.e(e)}finally{a.f()}return i+=t+"]"}if("string"==typeof n.kind){for(var u="".concat(n.kind," {\n"),l=t+" ",f=0,p=Object.entries(n);f<p.length;f++){var d=p[f],g=d[0],x=d[1];"kind"!==g&&(u+="".concat(l).concat(g,": ").concat(e(x,l),",\n"))}return u+=t+"}"}if("function"==typeof n.toJSON)return e(n.toJSON(),t);for(var h="{\n",y=t+" ",v=0,w=Object.entries(n);v<w.length;v++){var b=w[v],m=b[0],W=b[1];h+="".concat(y).concat(JSON.stringify(m),": ").concat(e(W,y),",\n")}return h+=t+"}";case"string":case"number":case"boolean":return JSON.stringify(n,null,2).replace("\n","\n"+t);default:throw new Error("printAST doesn't handle values where "+"typeof value === '".concat(typeof n,"'."))}}(e,"")}},function(e,n){e.exports=require("@babel/runtime/helpers/createForOfIteratorHelper")},function(e,n,t){"use strict";e.exports=function e(n){if(Array.isArray(n))return n.map(e);if(null!=n&&"object"==typeof n){var t={};for(var r in n)t[r]=e(n[r]);return t}return n}},function(e,n,t){"use strict";e.exports=function(e){var n=new Map,t=jest.fn((function(e){var t,r=null!==(t=n.get(e))&&void 0!==t?t:NaN;1===r?n.delete(e):n.set(e,r-1)}));return e.retain=jest.fn((function(e){var r,o=e.request.identifier,i=null!==(r=n.get(o))&&void 0!==r?r:0;n.set(o,i+1);var c=!1;return{dispose:function(){c||t(o),c=!0}}})),{release_DEPRECATED:t,isOperationRetained:function(e){var t,r=e.request.identifier;return(null!==(t=n.get(r))&&void 0!==t?t:0)>0}}}},function(e,n,t){"use strict";var r=(0,t(1).createConsoleInterceptionSystem)("warning","expectToWarn",(function(e){jest.mock("fbjs/lib/warning",(function(){return jest.fn((function(n,t){for(var r=arguments.length,o=new Array(r>2?r-2:0),i=2;i<r;i++)o[i-2]=arguments[i];if(!n){var c=0,a=t.replace(/%s/g,(function(){return String(o[c++])}));e(a)}}))}))}));e.exports={disallowWarnings:function(){r.disallowMessages()},expectWarningWillFire:function(e,n){r.expectMessageWillFire(e,n)},expectToWarn:function(e,n){return r.expectMessage(e,n)},expectToWarnMany:function(e,n){return r.expectMessageMany(e,n)}}},function(e,n){e.exports=require("relay-test-utils")}]);
@@ -1,9 +1,9 @@
1
1
  /**
2
- * Relay v13.2.0
2
+ * Relay v14.0.0
3
3
  *
4
4
  * Copyright (c) Meta Platforms, Inc. and affiliates.
5
5
  *
6
6
  * This source code is licensed under the MIT license found in the
7
7
  * LICENSE file in the root directory of this source tree.
8
8
  */
9
- module.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=3)}([function(e,t){e.exports=require("@babel/runtime/helpers/interopRequireDefault")},function(e,t,n){"use strict";var r=n(0)(n(5)),o=console.error;e.exports={createConsoleInterceptionSystem:function(e,t,n){var c=!1,i=[],a=[],s=e.charAt(0).toUpperCase()+e.slice(1),u=s+"s",l="disallow".concat(s,"s");function f(e){var t=i.findIndex((function(t){return e.startsWith(t)}));if(a.length>0&&a[0]===e)a.shift();else{if(!(t>=0))throw o("Unexpected ".concat(s,": ")+e),new Error("".concat(s,": ")+e);i.splice(t,1)}}function p(n,o){if(a.length>0)throw new Error("Cannot nest ".concat(t,"() calls."));a.push.apply(a,(0,r.default)(n));var c=o();if(a.length>0){var i=a.toString();throw a.length=0,new Error("Expected ".concat(e," in callback: ").concat(i))}return c}return{disallowMessages:function(){if(c)throw new Error("".concat(l," should be called only once."));c=!0,n(f),afterEach((function(){if(a.length=0,i.length>0){var t=new Error("Some expected ".concat(e,"s where not triggered:\n\n")+Array.from(i,(function(e){return" * ".concat(e)})).join("\n")+"\n");throw i.length=0,t}}))},expectMessageWillFire:function(e){if(!c)throw new Error("".concat(l," needs to be called before expect").concat(u,"WillFire"));i.push(e)},expectMessage:function(e,t){return p([e],t)},expectMessageMany:p}}}},function(e,t){e.exports=require("relay-runtime")},function(e,t,n){"use strict";var r=n(4),o=r.disallowConsoleErrors,c=r.expectConsoleError,i=r.expectConsoleErrorsMany,a=r.expectConsoleErrorWillFire,s=n(6),u=n(8),l=u.FIXTURE_TAG,f=u.generateTestsFromFixtures,p=n(13),d=n(15),g=n(17),x=n(18),h=x.disallowWarnings,y=x.expectToWarn,v=x.expectToWarnMany,b=x.expectWarningWillFire,w=n(19),m=w.createMockEnvironment,E=w.unwrapContainer;e.exports={cannotReadPropertyOfUndefined__DEPRECATED:function(e){return process.version.match(/^v16\.(.+)$/)?"Cannot read properties of undefined (reading '".concat(e,"')"):"Cannot read property '".concat(e,"' of undefined")},createMockEnvironment:m,describeWithFeatureFlags:s,disallowConsoleErrors:o,disallowWarnings:h,expectConsoleError:c,expectConsoleErrorsMany:i,expectConsoleErrorWillFire:a,expectToWarn:y,expectToWarnMany:v,expectWarningWillFire:b,FIXTURE_TAG:l,generateTestsFromFixtures:f,matchers:p,printAST:d,simpleClone:g,unwrapContainer:E}},function(e,t,n){"use strict";var r=(0,n(1).createConsoleInterceptionSystem)("error","expectConsoleError",(function(e){jest.spyOn(console,"error").mockImplementation(e)}));e.exports={disallowConsoleErrors:function(){r.disallowMessages()},expectConsoleErrorWillFire:function(e){r.expectMessageWillFire(e)},expectConsoleError:function(e,t){return r.expectMessage(e,t)},expectConsoleErrorsMany:function(e,t){return r.expectMessageMany(e,t)}}},function(e,t){e.exports=require("@babel/runtime/helpers/toConsumableArray")},function(e,t,n){"use strict";var r=n(0)(n(7));e.exports=function(e,t,o){describe.each(e)("".concat(t," - Feature flags: %o"),(function(e){var t;beforeEach((function(){var o=n(2).RelayFeatureFlags;t=(0,r.default)({},o),Object.assign(o,e)})),afterEach((function(){var e=n(2).RelayFeatureFlags;Object.assign(e,t)})),o()}))}},function(e,t){e.exports=require("@babel/runtime/helpers/objectSpread2")},function(e,t,n){"use strict";var r=n(0)(n(9)),o=n(10),c=n(11),i=n(12),a=Symbol.for("FIXTURE_TAG");expect.addSnapshotSerializer({print:function(e){return Object.keys(e).map((function(t){return"~~~~~~~~~~ ".concat(t.toUpperCase()," ~~~~~~~~~~\n").concat(e[t])})).join("\n")},test:function(e){return e&&!0===e[a]}}),e.exports={generateTestsFromFixtures:function(e,t){var n=c.readdirSync(e);test("has fixtures in ".concat(e),(function(){expect(n.length>0).toBe(!0)}));var s=n.filter((function(e){return e.startsWith("only.")}));s.length&&(test.skip.each(n.filter((function(e){return!e.startsWith("only.")})))("matches expected output: %s",(function(){})),n=s),test.each(n)("matches expected output: %s",(function(n){var s,u=c.readFileSync(i.join(e,n),"utf8"),l=o(u,t,n);expect((s={},(0,r.default)(s,a,!0),(0,r.default)(s,"input",u),(0,r.default)(s,"output",l),s)).toMatchSnapshot()}))},FIXTURE_TAG:a}},function(e,t){e.exports=require("@babel/runtime/helpers/defineProperty")},function(e,t,n){"use strict";e.exports=function(e,t,n){if(/^# *expected-to-throw/.test(e)||/\.error\.\w+$/.test(n)){var r;try{r=t(e)}catch(e){return"THROWN EXCEPTION:\n\n".concat(e.toString())}throw new Error("Expected test file '".concat(n,"' to throw, but it passed:\n").concat(r))}return t(e)}},function(e,t){e.exports=require("fs")},function(e,t){e.exports=require("path")},function(e,t,n){"use strict";e.exports={toBeDeeplyFrozen:function(e){return function e(t){if(expect(Object.isFrozen(t)).toBe(!0),Array.isArray(t))t.forEach((function(t){return e(t)}));else if("object"==typeof t&&null!==t)for(var n in t)e(t[n])}(e),{pass:!0}},toWarn:function(e,t){var r=this.isNot;function o(e){return e instanceof RegExp?e.toString():JSON.stringify(e)}function c(e){return"["+e.map(o).join(", ")+"]"}function i(e){return e.length?e.map((function(e){return c([!!e[0]].concat(e.slice(1)))})).join(", "):"[]"}var a=n(14);if(!a.mock)throw new Error("toWarn(): Requires `jest.mock('warning')`.");var s=a.mock.calls.length;e();var u=a.mock.calls.slice(s);return t?(Array.isArray(t)||(t=[t]),{pass:!!u.find((function(e){return e.length===t.length+1&&e.every((function(e,n){if(!n)return!e;var r=t[n-1];return r instanceof RegExp?r.test(e):e===r}))})),message:function(){return"Expected ".concat(r?"not ":"","to warn: ")+"".concat(c([!1].concat(t))," but ")+"`warning` received the following calls: "+"".concat(i(u),".")}}):{pass:!!u.filter((function(e){return!e[0]})).length,message:function(){return"Expected ".concat(r?"not ":"","to warn but ")+"`warning` received the following calls: "+"".concat(i(u),".")}}}}},function(e,t){e.exports=require("fbjs/lib/warning")},function(e,t,n){"use strict";var r=n(0)(n(16));e.exports=function(e){return function e(t,n){switch(typeof t){case"undefined":return"undefined";case"object":if(null===t)return"null";if(Array.isArray(t)){if(0===t.length)return"[]";var o,c="[\n",i=n+" ",a=(0,r.default)(t);try{for(a.s();!(o=a.n()).done;){var s=o.value;c+=i+e(s,i)+",\n"}}catch(e){a.e(e)}finally{a.f()}return c+=n+"]"}if("string"==typeof t.kind){for(var u="".concat(t.kind," {\n"),l=n+" ",f=0,p=Object.entries(t);f<p.length;f++){var d=p[f],g=d[0],x=d[1];"kind"!==g&&(u+="".concat(l).concat(g,": ").concat(e(x,l),",\n"))}return u+=n+"}"}if("function"==typeof t.toJSON)return e(t.toJSON(),n);for(var h="{\n",y=n+" ",v=0,b=Object.entries(t);v<b.length;v++){var w=b[v],m=w[0],E=w[1];h+="".concat(y).concat(JSON.stringify(m),": ").concat(e(E,y),",\n")}return h+=n+"}";case"string":case"number":case"boolean":return JSON.stringify(t,null,2).replace("\n","\n"+n);default:throw new Error("printAST doesn't handle values where "+"typeof value === '".concat(typeof t,"'."))}}(e,"")}},function(e,t){e.exports=require("@babel/runtime/helpers/createForOfIteratorHelper")},function(e,t,n){"use strict";e.exports=function e(t){if(Array.isArray(t))return t.map(e);if(null!=t&&"object"==typeof t){var n={};for(var r in t)n[r]=e(t[r]);return n}return t}},function(e,t,n){"use strict";var r=(0,n(1).createConsoleInterceptionSystem)("warning","expectToWarn",(function(e){jest.mock("fbjs/lib/warning",(function(){return jest.fn((function(t,n){for(var r=arguments.length,o=new Array(r>2?r-2:0),c=2;c<r;c++)o[c-2]=arguments[c];if(!t){var i=0,a=n.replace(/%s/g,(function(){return String(o[i++])}));e(a)}}))}))}));e.exports={disallowWarnings:function(){r.disallowMessages()},expectWarningWillFire:function(e){r.expectMessageWillFire(e)},expectToWarn:function(e,t){return r.expectMessage(e,t)},expectToWarnMany:function(e,t){return r.expectMessageMany(e,t)}}},function(e,t){e.exports=require("relay-test-utils")}]);
9
+ module.exports=function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=3)}([function(e,n){e.exports=require("@babel/runtime/helpers/interopRequireDefault")},function(e,n,t){"use strict";var r=t(0)(t(5)),o=console.error;e.exports={createConsoleInterceptionSystem:function(e,n,t){var i=!1,c=[],a=[],s=[],u=e.charAt(0).toUpperCase()+e.slice(1),l=u+"s",f="disallow".concat(u,"s");function p(e){var n=c.findIndex((function(n){return e.startsWith(n)})),t=a.findIndex((function(n){return e.startsWith(n)}));if(s.length>0&&e.startsWith(s[0]))s.shift();else if(n>=0)c.splice(n,1);else{if(!(t>=0))throw o("Unexpected ".concat(u,": ")+e),new Error("".concat(u,": ")+e);a.splice(t,1)}}function d(t,o){if(s.length>0)throw new Error("Cannot nest ".concat(n,"() calls."));s.push.apply(s,(0,r.default)(t));var i=o();if(s.length>0){var c=s.toString();throw s.length=0,new Error("Expected ".concat(e," in callback: ").concat(c))}return i}return{disallowMessages:function(){if(i)throw new Error("".concat(f," should be called only once."));i=!0,t(p),afterEach((function(){if(a.length=0,s.length=0,c.length>0){var n=new Error("Some ".concat(c.length," expected ").concat(e,"s where not triggered:\n\n")+Array.from(c,(function(e){return" * ".concat(e)})).join("\n")+"\n");throw c.length=0,n}}))},expectMessageWillFire:function(e,n){if(!i)throw new Error("".concat(f," needs to be called before expect").concat(l,"WillFire"));for(var t=!0===(null==n?void 0:n.optional),r=0;r<(null!==(o=null==n?void 0:n.count)&&void 0!==o?o:1);r++){var o;(t?a:c).push(e)}},expectMessage:function(e,n){return d([e],n)},expectMessageMany:d}}}},function(e,n){e.exports=require("relay-runtime")},function(e,n,t){"use strict";var r=t(4),o=r.disallowConsoleErrors,i=r.expectConsoleError,c=r.expectConsoleErrorsMany,a=r.expectConsoleErrorWillFire,s=t(6),u=s.disallowConsoleWarnings,l=s.expectConsoleWarning,f=s.expectConsoleWarningsMany,p=s.expectConsoleWarningWillFire,d=t(7),g=t(9),x=g.FIXTURE_TAG,h=g.generateTestsFromFixtures,y=t(14),v=t(16),w=t(18),b=t(19),m=t(20),W=m.disallowWarnings,E=m.expectToWarn,C=m.expectToWarnMany,M=m.expectWarningWillFire,F=t(21),j=F.createMockEnvironment,S=F.unwrapContainer;e.exports={cannotReadPropertyOfUndefined__DEPRECATED:function(e){return process.version.match(/^v16\.(.+)$/)?"Cannot read properties of undefined (reading '".concat(e,"')"):"Cannot read property '".concat(e,"' of undefined")},createMockEnvironment:j,describeWithFeatureFlags:d,disallowConsoleErrors:o,disallowConsoleWarnings:u,disallowWarnings:W,expectConsoleError:i,expectConsoleErrorsMany:c,expectConsoleErrorWillFire:a,expectConsoleWarningWillFire:p,expectConsoleWarning:l,expectConsoleWarningsMany:f,expectToWarn:E,expectToWarnMany:C,expectWarningWillFire:M,FIXTURE_TAG:x,generateTestsFromFixtures:h,matchers:y,printAST:v,simpleClone:w,trackRetentionForEnvironment:b,unwrapContainer:S}},function(e,n,t){"use strict";var r=(0,t(1).createConsoleInterceptionSystem)("error","expectConsoleError",(function(e){jest.spyOn(console,"error").mockImplementation(e)}));e.exports={disallowConsoleErrors:function(){r.disallowMessages()},expectConsoleErrorWillFire:function(e,n){r.expectMessageWillFire(e,n)},expectConsoleError:function(e,n){return r.expectMessage(e,n)},expectConsoleErrorsMany:function(e,n){return r.expectMessageMany(e,n)}}},function(e,n){e.exports=require("@babel/runtime/helpers/toConsumableArray")},function(e,n,t){"use strict";var r=(0,t(1).createConsoleInterceptionSystem)("warning","expectConsoleWarning",(function(e){jest.spyOn(console,"warn").mockImplementation(e)}));e.exports={disallowConsoleWarnings:function(){r.disallowMessages()},expectConsoleWarningWillFire:function(e,n){r.expectMessageWillFire(e,n)},expectConsoleWarning:function(e,n){return r.expectMessage(e,n)},expectConsoleWarningsMany:function(e,n){return r.expectMessageMany(e,n)}}},function(e,n,t){"use strict";var r=t(0)(t(8));e.exports=function(e,n,o){describe.each(e)("".concat(n," - Feature flags: %o"),(function(e){var n;beforeEach((function(){var o=t(2).RelayFeatureFlags;n=(0,r.default)({},o),Object.assign(o,e)})),afterEach((function(){var e=t(2).RelayFeatureFlags;Object.assign(e,n)})),o()}))}},function(e,n){e.exports=require("@babel/runtime/helpers/objectSpread2")},function(e,n,t){"use strict";var r=t(0)(t(10)),o=t(11),i=t(12),c=t(13),a=Symbol.for("FIXTURE_TAG");expect.addSnapshotSerializer({print:function(e){return Object.keys(e).map((function(n){return"~~~~~~~~~~ ".concat(n.toUpperCase()," ~~~~~~~~~~\n").concat(e[n])})).join("\n")},test:function(e){return e&&!0===e[a]}}),e.exports={generateTestsFromFixtures:function(e,n){var t=i.readdirSync(e);test("has fixtures in ".concat(e),(function(){expect(t.length>0).toBe(!0)}));var s=t.filter((function(e){return e.startsWith("only.")}));s.length&&(test.skip.each(t.filter((function(e){return!e.startsWith("only.")})))("matches expected output: %s",(function(){})),t=s),test.each(t)("matches expected output: %s",(function(t){var s,u=i.readFileSync(c.join(e,t),"utf8"),l=o(u,n,t);expect((s={},(0,r.default)(s,a,!0),(0,r.default)(s,"input",u),(0,r.default)(s,"output",l),s)).toMatchSnapshot()}))},FIXTURE_TAG:a}},function(e,n){e.exports=require("@babel/runtime/helpers/defineProperty")},function(e,n,t){"use strict";e.exports=function(e,n,t){if(/^# *expected-to-throw/.test(e)||/\.error\.\w+$/.test(t)){var r;try{r=n(e)}catch(e){return"THROWN EXCEPTION:\n\n".concat(e.toString())}throw new Error("Expected test file '".concat(t,"' to throw, but it passed:\n").concat(r))}return n(e)}},function(e,n){e.exports=require("fs")},function(e,n){e.exports=require("path")},function(e,n,t){"use strict";e.exports={toBeDeeplyFrozen:function(e){return function e(n){if(expect(Object.isFrozen(n)).toBe(!0),Array.isArray(n))n.forEach((function(n){return e(n)}));else if("object"==typeof n&&null!==n)for(var t in n)e(n[t])}(e),{pass:!0}},toWarn:function(e,n){var r=this.isNot;function o(e){return e instanceof RegExp?e.toString():JSON.stringify(e)}function i(e){return"["+e.map(o).join(", ")+"]"}function c(e){return e.length?e.map((function(e){return i([!!e[0]].concat(e.slice(1)))})).join(", "):"[]"}var a=t(15);if(!a.mock)throw new Error("toWarn(): Requires `jest.mock('warning')`.");var s=a.mock.calls.length;e();var u=a.mock.calls.slice(s);return n?(Array.isArray(n)||(n=[n]),{pass:!!u.find((function(e){return e.length===n.length+1&&e.every((function(e,t){if(!t)return!e;var r=n[t-1];return r instanceof RegExp?r.test(e):e===r}))})),message:function(){return"Expected ".concat(r?"not ":"","to warn: ")+"".concat(i([!1].concat(n))," but ")+"`warning` received the following calls: "+"".concat(c(u),".")}}):{pass:!!u.filter((function(e){return!e[0]})).length,message:function(){return"Expected ".concat(r?"not ":"","to warn but ")+"`warning` received the following calls: "+"".concat(c(u),".")}}}}},function(e,n){e.exports=require("fbjs/lib/warning")},function(e,n,t){"use strict";var r=t(0)(t(17));e.exports=function(e){return function e(n,t){switch(typeof n){case"undefined":return"undefined";case"object":if(null===n)return"null";if(Array.isArray(n)){if(0===n.length)return"[]";var o,i="[\n",c=t+" ",a=(0,r.default)(n);try{for(a.s();!(o=a.n()).done;){var s=o.value;i+=c+e(s,c)+",\n"}}catch(e){a.e(e)}finally{a.f()}return i+=t+"]"}if("string"==typeof n.kind){for(var u="".concat(n.kind," {\n"),l=t+" ",f=0,p=Object.entries(n);f<p.length;f++){var d=p[f],g=d[0],x=d[1];"kind"!==g&&(u+="".concat(l).concat(g,": ").concat(e(x,l),",\n"))}return u+=t+"}"}if("function"==typeof n.toJSON)return e(n.toJSON(),t);for(var h="{\n",y=t+" ",v=0,w=Object.entries(n);v<w.length;v++){var b=w[v],m=b[0],W=b[1];h+="".concat(y).concat(JSON.stringify(m),": ").concat(e(W,y),",\n")}return h+=t+"}";case"string":case"number":case"boolean":return JSON.stringify(n,null,2).replace("\n","\n"+t);default:throw new Error("printAST doesn't handle values where "+"typeof value === '".concat(typeof n,"'."))}}(e,"")}},function(e,n){e.exports=require("@babel/runtime/helpers/createForOfIteratorHelper")},function(e,n,t){"use strict";e.exports=function e(n){if(Array.isArray(n))return n.map(e);if(null!=n&&"object"==typeof n){var t={};for(var r in n)t[r]=e(n[r]);return t}return n}},function(e,n,t){"use strict";e.exports=function(e){var n=new Map,t=jest.fn((function(e){var t,r=null!==(t=n.get(e))&&void 0!==t?t:NaN;1===r?n.delete(e):n.set(e,r-1)}));return e.retain=jest.fn((function(e){var r,o=e.request.identifier,i=null!==(r=n.get(o))&&void 0!==r?r:0;n.set(o,i+1);var c=!1;return{dispose:function(){c||t(o),c=!0}}})),{release_DEPRECATED:t,isOperationRetained:function(e){var t,r=e.request.identifier;return(null!==(t=n.get(r))&&void 0!==t?t:0)>0}}}},function(e,n,t){"use strict";var r=(0,t(1).createConsoleInterceptionSystem)("warning","expectToWarn",(function(e){jest.mock("fbjs/lib/warning",(function(){return jest.fn((function(n,t){for(var r=arguments.length,o=new Array(r>2?r-2:0),i=2;i<r;i++)o[i-2]=arguments[i];if(!n){var c=0,a=t.replace(/%s/g,(function(){return String(o[c++])}));e(a)}}))}))}));e.exports={disallowWarnings:function(){r.disallowMessages()},expectWarningWillFire:function(e,n){r.expectMessageWillFire(e,n)},expectToWarn:function(e,n){return r.expectMessage(e,n)},expectToWarnMany:function(e,n){return r.expectMessageMany(e,n)}}},function(e,n){e.exports=require("relay-test-utils")}]);
@@ -22,7 +22,7 @@ function simpleClone<T>(value: T): T {
22
22
  // $FlowFixMe[incompatible-return]
23
23
  return value.map(simpleClone);
24
24
  } else if (value != null && typeof value === 'object') {
25
- const result = {};
25
+ const result: {[string]: mixed} = {};
26
26
  for (const key in value) {
27
27
  result[key] = simpleClone(value[key]);
28
28
  }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ * @flow
8
+ * @format
9
+ */
10
+
11
+ // flowlint ambiguous-object-type:error
12
+
13
+ 'use strict';
14
+
15
+ /* global jest */
16
+
17
+ import type {IEnvironment} from '../relay-runtime';
18
+ import type {OperationDescriptor} from '../relay-runtime/store/RelayStoreTypes';
19
+
20
+ /**
21
+ * Takes an environment and augments it with a mock implementation of `retain`
22
+ * that tracks what operations are currently retained. Also returns the Jest mock
23
+ * `release` function for backwards-compatibility with existing tests, but you
24
+ * should use `isOperationRetained` for new tests as it is much less error-prone.
25
+ */
26
+ function trackRetentionForEnvironment(environment: IEnvironment): {|
27
+ release_DEPRECATED: JestMockFn<[mixed], void>,
28
+ isOperationRetained: OperationDescriptor => boolean,
29
+ |} {
30
+ const retainCountsByOperation = new Map();
31
+
32
+ const release = jest.fn(id => {
33
+ const existing = retainCountsByOperation.get(id) ?? NaN;
34
+ if (existing === 1) {
35
+ retainCountsByOperation.delete(id);
36
+ } else {
37
+ retainCountsByOperation.set(id, existing - 1);
38
+ }
39
+ });
40
+
41
+ // $FlowFixMe[cannot-write] safe to do for mocking
42
+ environment.retain = jest.fn(operation => {
43
+ const id = operation.request.identifier;
44
+ const existing = retainCountsByOperation.get(id) ?? 0;
45
+ retainCountsByOperation.set(id, existing + 1);
46
+ let released = false;
47
+ return {
48
+ dispose: () => {
49
+ if (!released) {
50
+ release(id);
51
+ }
52
+ released = true;
53
+ },
54
+ };
55
+ });
56
+
57
+ function isOperationRetained(operation: OperationDescriptor) {
58
+ const id = operation.request.identifier;
59
+ return (retainCountsByOperation.get(id) ?? 0) > 0;
60
+ }
61
+
62
+ return {release_DEPRECATED: release, isOperationRetained};
63
+ }
64
+
65
+ module.exports = trackRetentionForEnvironment;
package/warnings.js.flow CHANGED
@@ -13,6 +13,8 @@
13
13
 
14
14
  /* global jest */
15
15
 
16
+ import type {WillFireOptions} from './consoleErrorsAndWarnings';
17
+
16
18
  const {createConsoleInterceptionSystem} = require('./consoleErrorsAndWarnings');
17
19
 
18
20
  const warningsSystem = createConsoleInterceptionSystem(
@@ -46,8 +48,11 @@ function disallowWarnings(): void {
46
48
  * Expect a warning with the given message. If the message isn't fired in the
47
49
  * current test, the test will fail.
48
50
  */
49
- function expectWarningWillFire(message: string): void {
50
- warningsSystem.expectMessageWillFire(message);
51
+ function expectWarningWillFire(
52
+ message: string,
53
+ options?: WillFireOptions,
54
+ ): void {
55
+ warningsSystem.expectMessageWillFire(message, options);
51
56
  }
52
57
 
53
58
  /**