@react-native/compatibility-check 0.0.0 → 0.0.1

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.
@@ -0,0 +1,1235 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true,
5
+ });
6
+ exports.addedUnionMessage =
7
+ exports.addedPropertiesMessage =
8
+ exports.addedIntersectionMessage =
9
+ exports.addedEnumMessage =
10
+ void 0;
11
+ exports.assessComparisonResult = assessComparisonResult;
12
+ exports.buildSchemaDiff = buildSchemaDiff;
13
+ exports.fromNativeVoidChangeMessage = void 0;
14
+ exports.hasCodegenUpdatesTypes = hasCodegenUpdatesTypes;
15
+ exports.hasUpdatesTypes = hasUpdatesTypes;
16
+ exports.stricterPropertiesMessage =
17
+ exports.removedUnionMessage =
18
+ exports.removedPropertiesMessage =
19
+ exports.removedIntersectionMessage =
20
+ exports.removedEnumMessage =
21
+ void 0;
22
+ exports.summarizeDiffSet = summarizeDiffSet;
23
+ exports.typeNullableChangeMessage =
24
+ exports.typeNonNullableChangeMessage =
25
+ exports.tooOptionalPropertiesMessage =
26
+ exports.toNativeVoidChangeMessage =
27
+ void 0;
28
+ var _ComparisonResult = require("./ComparisonResult.js");
29
+ var _convertPropToBasicTypes = _interopRequireDefault(
30
+ require("./convertPropToBasicTypes")
31
+ );
32
+ var codegenTypeDiffing = _interopRequireWildcard(require("./TypeDiffing"));
33
+ function _getRequireWildcardCache(e) {
34
+ if ("function" != typeof WeakMap) return null;
35
+ var r = new WeakMap(),
36
+ t = new WeakMap();
37
+ return (_getRequireWildcardCache = function (e) {
38
+ return e ? t : r;
39
+ })(e);
40
+ }
41
+ function _interopRequireWildcard(e, r) {
42
+ if (!r && e && e.__esModule) return e;
43
+ if (null === e || ("object" != typeof e && "function" != typeof e))
44
+ return { default: e };
45
+ var t = _getRequireWildcardCache(r);
46
+ if (t && t.has(e)) return t.get(e);
47
+ var n = { __proto__: null },
48
+ a = Object.defineProperty && Object.getOwnPropertyDescriptor;
49
+ for (var u in e)
50
+ if ("default" !== u && {}.hasOwnProperty.call(e, u)) {
51
+ var i = a ? Object.getOwnPropertyDescriptor(e, u) : null;
52
+ i && (i.get || i.set) ? Object.defineProperty(n, u, i) : (n[u] = e[u]);
53
+ }
54
+ return (n.default = e), t && t.set(e, n), n;
55
+ }
56
+ function _interopRequireDefault(e) {
57
+ return e && e.__esModule ? e : { default: e };
58
+ }
59
+ function nestedPropertiesCheck(typeName, result, check, inverseCheck) {
60
+ const nestedMap =
61
+ (mid, end) =>
62
+ ([propertyName, comparisonResult]) =>
63
+ nestedPropertiesCheck(
64
+ typeName + mid + propertyName + end,
65
+ comparisonResult,
66
+ check,
67
+ inverseCheck
68
+ );
69
+ switch (result.status) {
70
+ case "error":
71
+ case "matching":
72
+ case "skipped":
73
+ throw new Error(
74
+ "Internal error: nested property change " + result.status
75
+ );
76
+ case "properties":
77
+ let finalResult = check(result.propertyLog, null, null, null, typeName);
78
+ if (result.propertyLog.nestedPropertyChanges) {
79
+ finalResult = combine(
80
+ finalResult,
81
+ result.propertyLog.nestedPropertyChanges.map(nestedMap(".", ""))
82
+ );
83
+ }
84
+ if (result.propertyLog.madeOptional) {
85
+ const furtherNestedProps = result.propertyLog.madeOptional.filter(
86
+ (optionalProp) => optionalProp.furtherChanges
87
+ );
88
+ if (furtherNestedProps && furtherNestedProps.length > 0) {
89
+ const localNestedMap = nestedMap(".", "");
90
+ const mappedProps = furtherNestedProps.map((optionalProp) => {
91
+ if (optionalProp.furtherChanges) {
92
+ return localNestedMap([
93
+ optionalProp.property,
94
+ optionalProp.furtherChanges,
95
+ ]);
96
+ }
97
+ throw new Error("Internal error, filter failed");
98
+ });
99
+ finalResult = combine(finalResult, mappedProps);
100
+ }
101
+ }
102
+ return finalResult;
103
+ case "members":
104
+ return check(null, null, null, result.memberLog, typeName);
105
+ case "functionChange":
106
+ let returnTypeResult = [];
107
+ if (result.functionChangeLog.returnType) {
108
+ returnTypeResult = nestedPropertiesCheck(
109
+ typeName,
110
+ result.functionChangeLog.returnType,
111
+ check,
112
+ inverseCheck
113
+ );
114
+ }
115
+ if (result.functionChangeLog.parameterTypes) {
116
+ return combine(
117
+ returnTypeResult,
118
+ result.functionChangeLog.parameterTypes.nestedChanges.map(
119
+ ([_oldParameterNumber, newParameterNumber, comparisonResult]) =>
120
+ nestedPropertiesCheck(
121
+ typeName + " parameter " + newParameterNumber,
122
+ comparisonResult,
123
+ inverseCheck,
124
+ check
125
+ )
126
+ )
127
+ );
128
+ }
129
+ return returnTypeResult;
130
+ case "positionalTypeChange":
131
+ const changeLog = result.changeLog;
132
+ const currentPositionalCheck = check(
133
+ null,
134
+ changeLog,
135
+ null,
136
+ null,
137
+ typeName
138
+ );
139
+ return combine(
140
+ currentPositionalCheck,
141
+ changeLog.nestedChanges.map(([_oldIndex, newIndex, nestedChange]) =>
142
+ nestedMap(
143
+ " element ",
144
+ " of " + changeLog.typeKind
145
+ )([newIndex.toString(), nestedChange])
146
+ )
147
+ );
148
+ case "nullableChange":
149
+ const currentCheck = check(
150
+ null,
151
+ null,
152
+ result.nullableLog,
153
+ null,
154
+ typeName
155
+ );
156
+ if (result.nullableLog.interiorLog) {
157
+ const interiorLog = result.nullableLog.interiorLog;
158
+ switch (interiorLog.status) {
159
+ case "matching":
160
+ return currentCheck;
161
+ case "properties":
162
+ case "functionChange":
163
+ case "positionalTypeChange":
164
+ case "nullableChange":
165
+ return combine(currentCheck, [
166
+ nestedPropertiesCheck(typeName, interiorLog, check, inverseCheck),
167
+ ]);
168
+ default:
169
+ throw new Error(
170
+ "Internal error: nested with error or skipped status"
171
+ );
172
+ }
173
+ }
174
+ return currentCheck;
175
+ default:
176
+ result.status;
177
+ return [];
178
+ }
179
+ }
180
+ function checkOptionalityAndSetError(typeName, properties, msg, errorCode) {
181
+ const requiredProperties = properties.filter(
182
+ (objectTypeProperty) => !objectTypeProperty.optional
183
+ );
184
+ if (requiredProperties.length > 0) {
185
+ return [
186
+ {
187
+ typeName,
188
+ errorCode,
189
+ errorInformation: (0, _ComparisonResult.propertyComparisonError)(
190
+ msg,
191
+ requiredProperties.map((property) => ({
192
+ property: property.name,
193
+ }))
194
+ ),
195
+ },
196
+ ];
197
+ }
198
+ return [];
199
+ }
200
+ const removedPropertiesMessage = (exports.removedPropertiesMessage =
201
+ "Object removed required properties expected by native");
202
+ function checkForUnsafeRemovedProperties(
203
+ propertyChange,
204
+ _postionalChange,
205
+ _nullableChange,
206
+ _memberChange,
207
+ typeName
208
+ ) {
209
+ if (propertyChange && propertyChange.missingProperties) {
210
+ return checkOptionalityAndSetError(
211
+ typeName,
212
+ propertyChange.missingProperties,
213
+ removedPropertiesMessage,
214
+ "removedProps"
215
+ );
216
+ }
217
+ return [];
218
+ }
219
+ const addedPropertiesMessage = (exports.addedPropertiesMessage =
220
+ "Object added required properties, which native will not provide");
221
+ function checkForUnsafeAddedProperties(
222
+ propertyChange,
223
+ _positionalChange,
224
+ _nullableChange,
225
+ _memberChange,
226
+ typeName
227
+ ) {
228
+ if (propertyChange && propertyChange.addedProperties) {
229
+ return checkOptionalityAndSetError(
230
+ typeName,
231
+ propertyChange.addedProperties,
232
+ addedPropertiesMessage,
233
+ "addedProps"
234
+ );
235
+ }
236
+ return [];
237
+ }
238
+ const stricterPropertiesMessage = (exports.stricterPropertiesMessage =
239
+ "Property made strict, but native may not provide it");
240
+ function checkForUnSafeMadeStrictProperties(
241
+ propertyChange,
242
+ _positionalChange,
243
+ _nullableChange,
244
+ _memberChange,
245
+ typeName
246
+ ) {
247
+ if (
248
+ propertyChange &&
249
+ propertyChange.madeStrict &&
250
+ propertyChange.madeStrict.length > 0
251
+ ) {
252
+ const err = (0, _ComparisonResult.propertyComparisonError)(
253
+ stricterPropertiesMessage,
254
+ propertyChange.madeStrict.map((property) => ({
255
+ property: property.property,
256
+ }))
257
+ );
258
+ return [
259
+ {
260
+ typeName,
261
+ errorCode: "requiredProps",
262
+ errorInformation: err,
263
+ },
264
+ ];
265
+ }
266
+ return [];
267
+ }
268
+ const tooOptionalPropertiesMessage = (exports.tooOptionalPropertiesMessage =
269
+ "Property made optional, but native requires it");
270
+ function checkForUnSafeMadeOptionalProperties(
271
+ propertyChange,
272
+ _positionalChange,
273
+ _nullableChange,
274
+ _memberChange,
275
+ typeName
276
+ ) {
277
+ if (
278
+ propertyChange &&
279
+ propertyChange.madeOptional &&
280
+ propertyChange.madeOptional.length > 0
281
+ ) {
282
+ const err = (0, _ComparisonResult.propertyComparisonError)(
283
+ tooOptionalPropertiesMessage,
284
+ propertyChange.madeOptional.map((property) => ({
285
+ property: property.property,
286
+ }))
287
+ );
288
+ return [
289
+ {
290
+ typeName,
291
+ errorCode: "optionalProps",
292
+ errorInformation: err,
293
+ },
294
+ ];
295
+ }
296
+ return [];
297
+ }
298
+ const removedUnionMessage = (exports.removedUnionMessage =
299
+ "Union removed items, but native may still provide them");
300
+ function checkForUnsafeRemovedUnionItems(
301
+ _propertyChange,
302
+ positionalChange,
303
+ _nullableChange,
304
+ _memberChange,
305
+ typeName
306
+ ) {
307
+ if (
308
+ positionalChange &&
309
+ (positionalChange.typeKind === "union" ||
310
+ positionalChange.typeKind === "stringUnion") &&
311
+ positionalChange.removedElements &&
312
+ positionalChange.removedElements.length > 0
313
+ ) {
314
+ return [
315
+ {
316
+ typeName,
317
+ errorCode: "removedUnionCases",
318
+ errorInformation: (0, _ComparisonResult.positionalComparisonError)(
319
+ removedUnionMessage,
320
+ positionalChange.removedElements
321
+ ),
322
+ },
323
+ ];
324
+ }
325
+ return [];
326
+ }
327
+ const addedUnionMessage = (exports.addedUnionMessage =
328
+ "Union added items, but native will not expect/support them");
329
+ function checkForUnsafeAddedUnionItems(
330
+ _propertyChange,
331
+ positionalChange,
332
+ _nullableChange,
333
+ _memberChange,
334
+ typeName
335
+ ) {
336
+ if (
337
+ positionalChange &&
338
+ (positionalChange.typeKind === "union" ||
339
+ positionalChange.typeKind === "stringUnion") &&
340
+ positionalChange.addedElements &&
341
+ positionalChange.addedElements.length > 0
342
+ ) {
343
+ return [
344
+ {
345
+ typeName,
346
+ errorCode: "addedUnionCases",
347
+ errorInformation: (0, _ComparisonResult.positionalComparisonError)(
348
+ addedUnionMessage,
349
+ positionalChange.addedElements
350
+ ),
351
+ },
352
+ ];
353
+ }
354
+ return [];
355
+ }
356
+ const removedEnumMessage = (exports.removedEnumMessage =
357
+ "Enum removed items, but native may still provide them");
358
+ function checkForUnsafeRemovedEnumItems(
359
+ _propertyChange,
360
+ _positionalChange,
361
+ _nullableChange,
362
+ memberChange,
363
+ typeName
364
+ ) {
365
+ if (memberChange?.missingMembers && memberChange?.missingMembers.length > 0) {
366
+ return [
367
+ {
368
+ typeName,
369
+ errorCode: "removedEnumCases",
370
+ errorInformation: (0, _ComparisonResult.memberComparisonError)(
371
+ removedEnumMessage,
372
+ memberChange.missingMembers.map((member) => ({
373
+ member: member.name,
374
+ }))
375
+ ),
376
+ },
377
+ ];
378
+ }
379
+ return [];
380
+ }
381
+ const addedEnumMessage = (exports.addedEnumMessage =
382
+ "Enum added items, but native will not expect/support them");
383
+ function checkForUnsafeAddedEnumItems(
384
+ _propertyChange,
385
+ _positionalChange,
386
+ _nullableChange,
387
+ memberChange,
388
+ typeName
389
+ ) {
390
+ if (memberChange?.addedMembers && memberChange?.addedMembers.length > 0) {
391
+ return [
392
+ {
393
+ typeName,
394
+ errorCode: "addedEnumCases",
395
+ errorInformation: (0, _ComparisonResult.memberComparisonError)(
396
+ addedEnumMessage,
397
+ memberChange.addedMembers.map((member) => ({
398
+ member: member.name,
399
+ }))
400
+ ),
401
+ },
402
+ ];
403
+ }
404
+ return [];
405
+ }
406
+ const removedIntersectionMessage = (exports.removedIntersectionMessage =
407
+ "Intersection removed items, but native may still require properties contained in them");
408
+ function checkForUnsafeRemovedIntersectionItems(
409
+ _propertyChange,
410
+ positionalChange,
411
+ _nullableChange,
412
+ _memberChange,
413
+ typeName
414
+ ) {
415
+ if (
416
+ positionalChange &&
417
+ positionalChange.typeKind === "intersection" &&
418
+ positionalChange.removedElements &&
419
+ positionalChange.removedElements.length > 0
420
+ ) {
421
+ return [
422
+ {
423
+ typeName,
424
+ errorCode: "removedIntersectCases",
425
+ errorInformation: (0, _ComparisonResult.positionalComparisonError)(
426
+ removedIntersectionMessage,
427
+ positionalChange.removedElements
428
+ ),
429
+ },
430
+ ];
431
+ }
432
+ return [];
433
+ }
434
+ const addedIntersectionMessage = (exports.addedIntersectionMessage =
435
+ "Intersection added items, but native may not provide all required attributes");
436
+ function checkForUnsafeAddedIntersectionItems(
437
+ _propertyChange,
438
+ positionalChange,
439
+ _nullableChange,
440
+ _memberChange,
441
+ typeName
442
+ ) {
443
+ if (
444
+ positionalChange &&
445
+ positionalChange.typeKind === "intersection" &&
446
+ positionalChange.addedElements &&
447
+ positionalChange.addedElements.length > 0
448
+ ) {
449
+ return [
450
+ {
451
+ typeName,
452
+ errorCode: "addedIntersectCases",
453
+ errorInformation: (0, _ComparisonResult.positionalComparisonError)(
454
+ addedIntersectionMessage,
455
+ positionalChange.addedElements
456
+ ),
457
+ },
458
+ ];
459
+ }
460
+ return [];
461
+ }
462
+ const toNativeVoidChangeMessage = (exports.toNativeVoidChangeMessage =
463
+ "Native may not be able to safely handle presence of type");
464
+ const typeNullableChangeMessage = (exports.typeNullableChangeMessage =
465
+ "Type made nullable, but native requires it");
466
+ function checkForUnsafeNullableToNativeChange(
467
+ _propertyChange,
468
+ _positionalChange,
469
+ nullableChange,
470
+ _memberChange,
471
+ typeName
472
+ ) {
473
+ if (
474
+ nullableChange &&
475
+ !nullableChange.optionsReduced &&
476
+ nullableChange.newType &&
477
+ nullableChange.oldType
478
+ ) {
479
+ return [
480
+ {
481
+ typeName,
482
+ errorCode: "nullableOfNonNull",
483
+ errorInformation: (0, _ComparisonResult.typeAnnotationComparisonError)(
484
+ nullableChange.typeRefined
485
+ ? toNativeVoidChangeMessage
486
+ : typeNullableChangeMessage,
487
+ nullableChange.newType,
488
+ nullableChange.oldType
489
+ ),
490
+ },
491
+ ];
492
+ }
493
+ return [];
494
+ }
495
+ const fromNativeVoidChangeMessage = (exports.fromNativeVoidChangeMessage =
496
+ "Type set to void but native may still provide a value");
497
+ const typeNonNullableChangeMessage = (exports.typeNonNullableChangeMessage =
498
+ "Type made non-nullable, but native might provide null still");
499
+ function checkForUnsafeNullableFromNativeChange(
500
+ _propertyChange,
501
+ _positionalChange,
502
+ nullableChange,
503
+ _memberChange,
504
+ typeName
505
+ ) {
506
+ if (
507
+ nullableChange &&
508
+ nullableChange.optionsReduced &&
509
+ nullableChange.newType &&
510
+ nullableChange.oldType
511
+ ) {
512
+ return [
513
+ {
514
+ typeName,
515
+ errorCode: "nonNullableOfNull",
516
+ errorInformation: (0, _ComparisonResult.typeAnnotationComparisonError)(
517
+ nullableChange.typeRefined
518
+ ? fromNativeVoidChangeMessage
519
+ : typeNonNullableChangeMessage,
520
+ nullableChange.newType,
521
+ nullableChange.oldType
522
+ ),
523
+ },
524
+ ];
525
+ }
526
+ return [];
527
+ }
528
+ function chainPropertiesChecks(checks) {
529
+ return (
530
+ propertyChange,
531
+ positionalChange,
532
+ nullableChange,
533
+ memberChange,
534
+ typeName
535
+ ) =>
536
+ checks.reduce(
537
+ (errorStore, checker) =>
538
+ errorStore.concat(
539
+ checker(
540
+ propertyChange,
541
+ positionalChange,
542
+ nullableChange,
543
+ memberChange,
544
+ typeName
545
+ )
546
+ ),
547
+ []
548
+ );
549
+ }
550
+ function combine(singleton, arrayOf) {
551
+ if (arrayOf.length > 0) {
552
+ return arrayOf.reduce(
553
+ (finalErrorArray, current) => finalErrorArray.concat(current),
554
+ singleton
555
+ );
556
+ }
557
+ return singleton;
558
+ }
559
+ function compareFunctionTypesInContext(
560
+ typeName,
561
+ functionLog,
562
+ check,
563
+ inversecheck,
564
+ result
565
+ ) {
566
+ if (functionLog.returnType) {
567
+ result = combine(result, [
568
+ nestedPropertiesCheck(
569
+ typeName,
570
+ functionLog.returnType,
571
+ check,
572
+ inversecheck
573
+ ),
574
+ ]);
575
+ }
576
+ if (
577
+ functionLog.parameterTypes &&
578
+ functionLog.parameterTypes.nestedChanges.length > 0
579
+ ) {
580
+ result = combine(
581
+ result,
582
+ functionLog.parameterTypes.nestedChanges.map(
583
+ ([_oldPropertyNum, newPropertyNum, comparisonResult]) =>
584
+ nestedPropertiesCheck(
585
+ typeName + " parameter " + newPropertyNum,
586
+ comparisonResult,
587
+ inversecheck,
588
+ check
589
+ )
590
+ )
591
+ );
592
+ }
593
+ return result;
594
+ }
595
+ const checksForTypesFlowingToNative = chainPropertiesChecks([
596
+ checkForUnsafeRemovedProperties,
597
+ checkForUnSafeMadeOptionalProperties,
598
+ checkForUnsafeAddedUnionItems,
599
+ checkForUnsafeAddedEnumItems,
600
+ checkForUnsafeRemovedIntersectionItems,
601
+ checkForUnsafeNullableToNativeChange,
602
+ ]);
603
+ const checksForTypesFlowingFromNative = chainPropertiesChecks([
604
+ checkForUnsafeAddedProperties,
605
+ checkForUnSafeMadeStrictProperties,
606
+ checkForUnsafeRemovedUnionItems,
607
+ checkForUnsafeRemovedEnumItems,
608
+ checkForUnsafeAddedIntersectionItems,
609
+ checkForUnsafeNullableFromNativeChange,
610
+ ]);
611
+ function assessComparisonResult(
612
+ newTypes,
613
+ deprecatedTypes,
614
+ incompatibleChanges,
615
+ objectTypeChanges
616
+ ) {
617
+ return (typeName, newType, oldType, difference, oldDirection) => {
618
+ switch (difference.status) {
619
+ case "matching":
620
+ break;
621
+ case "skipped":
622
+ newTypes.add({
623
+ typeName,
624
+ typeInformation: newType,
625
+ });
626
+ break;
627
+ case "members":
628
+ {
629
+ const memberChange = difference.memberLog;
630
+ const toNativeErrorResult = checksForTypesFlowingToNative(
631
+ null,
632
+ null,
633
+ null,
634
+ memberChange,
635
+ typeName
636
+ );
637
+ const fromNativeErrorResult = checksForTypesFlowingFromNative(
638
+ null,
639
+ null,
640
+ null,
641
+ memberChange,
642
+ typeName
643
+ );
644
+ switch (oldDirection) {
645
+ case "toNative":
646
+ toNativeErrorResult.forEach((error) =>
647
+ incompatibleChanges.add(error)
648
+ );
649
+ break;
650
+ case "fromNative":
651
+ fromNativeErrorResult.forEach((error) =>
652
+ incompatibleChanges.add(error)
653
+ );
654
+ break;
655
+ case "both":
656
+ toNativeErrorResult.forEach((error) =>
657
+ incompatibleChanges.add(error)
658
+ );
659
+ fromNativeErrorResult.forEach((error) =>
660
+ incompatibleChanges.add(error)
661
+ );
662
+ break;
663
+ }
664
+ }
665
+ break;
666
+ case "properties":
667
+ const propertyChange = difference.propertyLog;
668
+ const unsafeForToNative = nestedPropertiesCheck(
669
+ typeName,
670
+ difference,
671
+ checksForTypesFlowingToNative,
672
+ checksForTypesFlowingFromNative
673
+ );
674
+ const unsafeForFromNative = nestedPropertiesCheck(
675
+ typeName,
676
+ difference,
677
+ checksForTypesFlowingFromNative,
678
+ checksForTypesFlowingToNative
679
+ );
680
+ switch (oldDirection) {
681
+ case "toNative":
682
+ unsafeForToNative.forEach((error) =>
683
+ incompatibleChanges.add(error)
684
+ );
685
+ break;
686
+ case "fromNative":
687
+ unsafeForFromNative.forEach((error) =>
688
+ incompatibleChanges.add(error)
689
+ );
690
+ break;
691
+ case "both":
692
+ unsafeForToNative.forEach((error) =>
693
+ incompatibleChanges.add(error)
694
+ );
695
+ unsafeForFromNative.forEach((error) =>
696
+ incompatibleChanges.add(error)
697
+ );
698
+ break;
699
+ }
700
+ if (!oldType) {
701
+ throw new Error("Internal error: properties change with no old type");
702
+ }
703
+ objectTypeChanges.add({
704
+ typeName,
705
+ newType,
706
+ oldType,
707
+ propertyChange,
708
+ });
709
+ break;
710
+ case "error":
711
+ incompatibleChanges.add({
712
+ typeName,
713
+ errorCode: "incompatibleTypes",
714
+ errorInformation: difference.errorLog,
715
+ });
716
+ break;
717
+ case "functionChange":
718
+ const functionLog = difference.functionChangeLog;
719
+ let propertyErrors = [];
720
+ switch (oldDirection) {
721
+ case "toNative":
722
+ propertyErrors = compareFunctionTypesInContext(
723
+ typeName,
724
+ functionLog,
725
+ checksForTypesFlowingToNative,
726
+ checksForTypesFlowingFromNative,
727
+ propertyErrors
728
+ );
729
+ break;
730
+ case "fromNative":
731
+ propertyErrors = compareFunctionTypesInContext(
732
+ typeName,
733
+ functionLog,
734
+ checksForTypesFlowingFromNative,
735
+ checksForTypesFlowingToNative,
736
+ propertyErrors
737
+ );
738
+ break;
739
+ case "both":
740
+ propertyErrors = compareFunctionTypesInContext(
741
+ typeName,
742
+ functionLog,
743
+ checksForTypesFlowingToNative,
744
+ checksForTypesFlowingFromNative,
745
+ propertyErrors
746
+ );
747
+ propertyErrors = compareFunctionTypesInContext(
748
+ typeName,
749
+ functionLog,
750
+ checksForTypesFlowingFromNative,
751
+ checksForTypesFlowingToNative,
752
+ propertyErrors
753
+ );
754
+ break;
755
+ default:
756
+ throw new Error(
757
+ "Unsupported native boundary direction " + oldDirection
758
+ );
759
+ }
760
+ propertyErrors.forEach((error) => incompatibleChanges.add(error));
761
+ break;
762
+ case "positionalTypeChange":
763
+ const changeLog = difference.changeLog;
764
+ if (
765
+ changeLog.nestedChanges.length > 0 ||
766
+ changeLog.addedElements ||
767
+ changeLog.removedElements
768
+ ) {
769
+ const changes = changeLog.nestedChanges;
770
+ const toNativeBase = checksForTypesFlowingToNative(
771
+ null,
772
+ changeLog,
773
+ null,
774
+ null,
775
+ typeName
776
+ );
777
+ const toNativeResult = combine(
778
+ toNativeBase,
779
+ changes.map(([_oldIndex, newIndex, comparisonResult]) =>
780
+ nestedPropertiesCheck(
781
+ `${typeName} element ${newIndex} of ${changeLog.typeKind}`,
782
+ comparisonResult,
783
+ checksForTypesFlowingToNative,
784
+ checksForTypesFlowingFromNative
785
+ )
786
+ )
787
+ );
788
+ const fromNativeBase = checksForTypesFlowingFromNative(
789
+ null,
790
+ changeLog,
791
+ null,
792
+ null,
793
+ typeName
794
+ );
795
+ const fromNativeResult = combine(
796
+ fromNativeBase,
797
+ changes.map(([_oldIndex, newIndex, comparisonResult]) =>
798
+ nestedPropertiesCheck(
799
+ `${typeName} element ${newIndex} of ${changeLog.typeKind}`,
800
+ comparisonResult,
801
+ checksForTypesFlowingFromNative,
802
+ checksForTypesFlowingToNative
803
+ )
804
+ )
805
+ );
806
+ switch (oldDirection) {
807
+ case "toNative":
808
+ toNativeResult.forEach((error) => incompatibleChanges.add(error));
809
+ break;
810
+ case "fromNative":
811
+ fromNativeResult.forEach((error) =>
812
+ incompatibleChanges.add(error)
813
+ );
814
+ break;
815
+ case "both":
816
+ toNativeResult.forEach((error) => incompatibleChanges.add(error));
817
+ fromNativeResult.forEach((error) =>
818
+ incompatibleChanges.add(error)
819
+ );
820
+ break;
821
+ }
822
+ }
823
+ break;
824
+ case "nullableChange":
825
+ if (!oldType) {
826
+ throw new Error(
827
+ "Internal error: old type null or undefined, after nullableChange"
828
+ );
829
+ }
830
+ switch (oldDirection) {
831
+ case "toNative":
832
+ checkForUnsafeNullableToNativeChange(
833
+ null,
834
+ null,
835
+ difference.nullableLog,
836
+ null,
837
+ typeName
838
+ ).forEach((error) => incompatibleChanges.add(error));
839
+ break;
840
+ case "fromNative":
841
+ checkForUnsafeNullableFromNativeChange(
842
+ null,
843
+ null,
844
+ difference.nullableLog,
845
+ null,
846
+ typeName
847
+ ).forEach((error) => incompatibleChanges.add(error));
848
+ break;
849
+ case "both":
850
+ const err = (0, _ComparisonResult.typeInformationComparisonError)(
851
+ "Type may not change nullability, due to flowing to and from native",
852
+ newType,
853
+ oldType
854
+ );
855
+ incompatibleChanges.add({
856
+ typeName,
857
+ errorCode: "incompatibleTypes",
858
+ errorInformation: err,
859
+ });
860
+ break;
861
+ default:
862
+ throw new Error("Unknown direction : " + oldDirection);
863
+ }
864
+ if (difference.interiorLog) {
865
+ const log = difference.interiorLog;
866
+ assessComparisonResult(
867
+ newTypes,
868
+ deprecatedTypes,
869
+ incompatibleChanges,
870
+ objectTypeChanges
871
+ )(typeName, newType, oldType, log, oldDirection);
872
+ }
873
+ break;
874
+ default:
875
+ difference.status;
876
+ throw new Error("Unsupported status: " + difference.status);
877
+ }
878
+ };
879
+ }
880
+ function buildNativeModulesDiff(newerNativeModule, olderNativeModule) {
881
+ const moduleErrors = new Set();
882
+ const nativeModuleName = newerNativeModule.moduleName;
883
+ if (olderNativeModule.moduleName !== newerNativeModule.moduleName) {
884
+ moduleErrors.add({
885
+ nativeSpecName: olderNativeModule.moduleName,
886
+ omitted: true,
887
+ errorCode: "removedModule",
888
+ });
889
+ }
890
+ const newTypes = new Set();
891
+ const deprecatedTypes = new Set();
892
+ const incompatibleChanges = new Set();
893
+ const objectTypeChanges = new Set();
894
+ const localAssessComparison = assessComparisonResult(
895
+ newTypes,
896
+ deprecatedTypes,
897
+ incompatibleChanges,
898
+ objectTypeChanges
899
+ );
900
+ const newType = {
901
+ type: "ObjectTypeAnnotation",
902
+ properties: [
903
+ ...newerNativeModule.spec.methods,
904
+ ...newerNativeModule.spec.eventEmitters,
905
+ ],
906
+ };
907
+ const oldType = {
908
+ type: "ObjectTypeAnnotation",
909
+ properties: [
910
+ ...olderNativeModule.spec.methods,
911
+ ...olderNativeModule.spec.eventEmitters,
912
+ ],
913
+ };
914
+ const difference = codegenTypeDiffing.compareTypes(
915
+ newType,
916
+ olderNativeModule.moduleName === newerNativeModule.moduleName
917
+ ? oldType
918
+ : null,
919
+ newerNativeModule.aliasMap,
920
+ olderNativeModule.aliasMap,
921
+ newerNativeModule.enumMap,
922
+ olderNativeModule.enumMap
923
+ );
924
+ localAssessComparison(
925
+ nativeModuleName,
926
+ newType,
927
+ oldType,
928
+ difference,
929
+ "fromNative"
930
+ );
931
+ const typeUpdate = {
932
+ newTypes,
933
+ deprecatedTypes,
934
+ incompatibleChanges,
935
+ objectTypeChanges,
936
+ };
937
+ if (hasCodegenUpdatesTypes(typeUpdate)) {
938
+ moduleErrors.add({
939
+ nativeSpecName: nativeModuleName,
940
+ omitted: false,
941
+ errorCode: "incompatibleTypes",
942
+ changeInformation: typeUpdate,
943
+ });
944
+ }
945
+ return moduleErrors;
946
+ }
947
+ function buildNativeComponentsDiff(newerNativeSchema, olderNativeSchema) {
948
+ const componentErrors = new Set();
949
+ Object.entries(newerNativeSchema.components).forEach(
950
+ ([newerComponentName, newerComponent]) => {
951
+ const olderComponent = olderNativeSchema.components[newerComponentName];
952
+ const newTypes = new Set();
953
+ const deprecatedTypes = new Set();
954
+ const incompatibleChanges = new Set();
955
+ const objectTypeChanges = new Set();
956
+ const localAssessComparison = assessComparisonResult(
957
+ newTypes,
958
+ deprecatedTypes,
959
+ incompatibleChanges,
960
+ objectTypeChanges
961
+ );
962
+ newerComponent.commands.forEach((command) => {
963
+ const oldCommand = olderComponent.commands?.find(
964
+ (olderCommand) => olderCommand.name === command.name
965
+ );
966
+ const newCommands = {
967
+ type: "ObjectTypeAnnotation",
968
+ properties: [command],
969
+ };
970
+ const oldCommands =
971
+ oldCommand != null
972
+ ? {
973
+ type: "ObjectTypeAnnotation",
974
+ properties: [oldCommand],
975
+ }
976
+ : null;
977
+ const difference = codegenTypeDiffing.compareTypes(
978
+ newCommands,
979
+ oldCommands,
980
+ {},
981
+ {},
982
+ {},
983
+ {}
984
+ );
985
+ localAssessComparison(
986
+ newerComponentName,
987
+ newCommands,
988
+ oldCommands,
989
+ difference,
990
+ "fromNative"
991
+ );
992
+ });
993
+ olderComponent.commands?.forEach((command) => {
994
+ const newCommand = newerComponent.commands.find(
995
+ (newerCommand) => newerCommand.name === command.name
996
+ );
997
+ if (newCommand == null) {
998
+ deprecatedTypes.add({
999
+ typeName: command.name,
1000
+ typeInformation: {
1001
+ type: "ObjectTypeAnnotation",
1002
+ properties: [command],
1003
+ },
1004
+ });
1005
+ }
1006
+ });
1007
+ const newConvertedProps = {
1008
+ type: "ObjectTypeAnnotation",
1009
+ properties: newerComponent.props.map((prop) => ({
1010
+ name: prop.name,
1011
+ optional: prop.optional,
1012
+ typeAnnotation: (0, _convertPropToBasicTypes.default)(
1013
+ prop.typeAnnotation
1014
+ ),
1015
+ })),
1016
+ };
1017
+ const oldConvertedProps = {
1018
+ type: "ObjectTypeAnnotation",
1019
+ properties: olderComponent.props.map((prop) => ({
1020
+ name: prop.name,
1021
+ optional: prop.optional,
1022
+ typeAnnotation: (0, _convertPropToBasicTypes.default)(
1023
+ prop.typeAnnotation
1024
+ ),
1025
+ })),
1026
+ };
1027
+ const propDifference = codegenTypeDiffing.compareTypes(
1028
+ newConvertedProps,
1029
+ oldConvertedProps,
1030
+ {},
1031
+ {},
1032
+ {},
1033
+ {}
1034
+ );
1035
+ localAssessComparison(
1036
+ newerComponentName,
1037
+ newConvertedProps,
1038
+ oldConvertedProps,
1039
+ propDifference,
1040
+ "toNative"
1041
+ );
1042
+ const typeUpdate = {
1043
+ newTypes,
1044
+ deprecatedTypes,
1045
+ incompatibleChanges,
1046
+ objectTypeChanges,
1047
+ };
1048
+ if (hasCodegenUpdatesTypes(typeUpdate)) {
1049
+ componentErrors.add({
1050
+ nativeSpecName: newerComponentName,
1051
+ omitted: false,
1052
+ errorCode: "incompatibleTypes",
1053
+ changeInformation: typeUpdate,
1054
+ });
1055
+ }
1056
+ }
1057
+ );
1058
+ Object.keys(olderNativeSchema.components).forEach((olderComponentName) => {
1059
+ const newerComponent = newerNativeSchema.components[olderComponentName];
1060
+ if (newerComponent == null) {
1061
+ componentErrors.add({
1062
+ nativeSpecName: olderComponentName,
1063
+ omitted: true,
1064
+ errorCode: "removedComponent",
1065
+ });
1066
+ }
1067
+ });
1068
+ return componentErrors;
1069
+ }
1070
+ function hasUpdatesTypes(diff) {
1071
+ return (
1072
+ diff.newTypes.size > 0 ||
1073
+ diff.deprecatedTypes.size > 0 ||
1074
+ diff.objectTypeChanges.size > 0 ||
1075
+ diff.incompatibleChanges.size > 0
1076
+ );
1077
+ }
1078
+ function hasCodegenUpdatesTypes(diff) {
1079
+ return (
1080
+ diff.newTypes.size > 0 ||
1081
+ diff.deprecatedTypes.size > 0 ||
1082
+ diff.objectTypeChanges.size > 0 ||
1083
+ diff.incompatibleChanges.size > 0
1084
+ );
1085
+ }
1086
+ function buildSchemaDiff(newerSchemaSet, olderSchemaSet) {
1087
+ const diff = new Set();
1088
+ const newerSchema = newerSchemaSet.modules;
1089
+ const olderSchema = olderSchemaSet.modules;
1090
+ Object.keys(newerSchema).forEach((hasteModuleName) => {
1091
+ const schemaEntry = newerSchema[hasteModuleName];
1092
+ const olderSchemaEntry = olderSchema[hasteModuleName];
1093
+ const framework = "ReactNative";
1094
+ if (schemaEntry.type === "Component") {
1095
+ if (olderSchemaEntry?.type === "Component") {
1096
+ const incompatibleComponents = buildNativeComponentsDiff(
1097
+ schemaEntry,
1098
+ olderSchemaEntry
1099
+ );
1100
+ const hasIncompatibleComponents = incompatibleComponents?.size > 0;
1101
+ if (hasIncompatibleComponents) {
1102
+ diff.add({
1103
+ name: hasteModuleName,
1104
+ framework: framework,
1105
+ status: {
1106
+ incompatibleSpecs: incompatibleComponents,
1107
+ },
1108
+ });
1109
+ }
1110
+ }
1111
+ }
1112
+ if (schemaEntry.type === "NativeModule") {
1113
+ if (olderSchemaEntry?.type === "NativeModule") {
1114
+ const incompatibleModules = buildNativeModulesDiff(
1115
+ schemaEntry,
1116
+ olderSchemaEntry
1117
+ );
1118
+ const hasIncompatibleModules =
1119
+ incompatibleModules != null && incompatibleModules.size;
1120
+ if (hasIncompatibleModules) {
1121
+ diff.add({
1122
+ name: hasteModuleName,
1123
+ framework: framework,
1124
+ status: {
1125
+ incompatibleSpecs: incompatibleModules,
1126
+ },
1127
+ });
1128
+ }
1129
+ }
1130
+ }
1131
+ if (olderSchemaEntry == null) {
1132
+ diff.add({
1133
+ name: hasteModuleName,
1134
+ framework: framework,
1135
+ status: "new",
1136
+ });
1137
+ }
1138
+ });
1139
+ Object.keys(olderSchema).forEach((hasteModuleName) => {
1140
+ const newSchemaEntry = newerSchema[hasteModuleName];
1141
+ const oldSchemaEntry = olderSchema[hasteModuleName];
1142
+ if (oldSchemaEntry != null && newSchemaEntry == null) {
1143
+ diff.add({
1144
+ name: hasteModuleName,
1145
+ framework: "ReactNative",
1146
+ status: "deprecated",
1147
+ });
1148
+ }
1149
+ });
1150
+ return diff;
1151
+ }
1152
+ function summarizeSchemaDiff(diff) {
1153
+ switch (diff.status) {
1154
+ case "new":
1155
+ return {
1156
+ status: "patchable",
1157
+ incompatibilityReport: {},
1158
+ };
1159
+ case "deprecated":
1160
+ return {
1161
+ status: "ok",
1162
+ incompatibilityReport: {},
1163
+ };
1164
+ default:
1165
+ const differs = diff.status;
1166
+ if (!differs.incompatibleSpecs) {
1167
+ return {
1168
+ status: "patchable",
1169
+ incompatibilityReport: {},
1170
+ };
1171
+ } else {
1172
+ const incompatibleObject = {};
1173
+ if (differs.incompatibleSpecs) {
1174
+ const withErrors = Array.from(differs.incompatibleSpecs).filter(
1175
+ (specError) =>
1176
+ specError.errorInformation ||
1177
+ (specError.changeInformation &&
1178
+ specError.changeInformation.incompatibleChanges.size > 0)
1179
+ );
1180
+ if (withErrors.length > 0) {
1181
+ if (incompatibleObject[diff.name]) {
1182
+ incompatibleObject[diff.name].incompatibleSpecs = withErrors;
1183
+ } else {
1184
+ incompatibleObject[diff.name] = {
1185
+ framework: diff.framework,
1186
+ incompatibleSpecs: withErrors,
1187
+ };
1188
+ }
1189
+ }
1190
+ }
1191
+ const incompatibleUnchanged =
1192
+ Object.keys(incompatibleObject).length === 0;
1193
+ return {
1194
+ status: incompatibleUnchanged ? "ok" : "incompatible",
1195
+ incompatibilityReport: incompatibleObject,
1196
+ };
1197
+ }
1198
+ }
1199
+ }
1200
+ function combineSummaries(finalSummary, setSummary) {
1201
+ switch (setSummary.status) {
1202
+ case "ok":
1203
+ return finalSummary;
1204
+ case "patchable":
1205
+ if (finalSummary.status === "ok") {
1206
+ return setSummary;
1207
+ } else {
1208
+ return finalSummary;
1209
+ }
1210
+ default:
1211
+ switch (finalSummary.status) {
1212
+ case "ok":
1213
+ case "patchable":
1214
+ return setSummary;
1215
+ default:
1216
+ Object.keys(setSummary.incompatibilityReport).forEach(
1217
+ (differingSchemaName) =>
1218
+ (finalSummary.incompatibilityReport[differingSchemaName] =
1219
+ setSummary.incompatibilityReport[differingSchemaName])
1220
+ );
1221
+ return finalSummary;
1222
+ }
1223
+ }
1224
+ }
1225
+ function summarizeDiffSet(diffs) {
1226
+ if (diffs.size === 0) {
1227
+ return {
1228
+ status: "ok",
1229
+ incompatibilityReport: {},
1230
+ };
1231
+ }
1232
+ const summary = [];
1233
+ diffs.forEach((schemaDiff) => summary.push(summarizeSchemaDiff(schemaDiff)));
1234
+ return summary.reduce(combineSummaries, summary[0]);
1235
+ }