@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.
- package/README.md +245 -1
- package/dist/ComparisonResult.d.ts +135 -0
- package/dist/ComparisonResult.js +88 -0
- package/dist/ComparisonResult.js.flow +188 -0
- package/dist/DiffResults.d.ts +137 -0
- package/dist/DiffResults.js +52 -0
- package/dist/DiffResults.js.flow +160 -0
- package/dist/ErrorFormatting.d.ts +31 -0
- package/dist/ErrorFormatting.js +272 -0
- package/dist/ErrorFormatting.js.flow +34 -0
- package/dist/SortTypeAnnotations.d.ts +18 -0
- package/dist/SortTypeAnnotations.js +300 -0
- package/dist/SortTypeAnnotations.js.flow +20 -0
- package/dist/TypeDiffing.d.ts +86 -0
- package/dist/TypeDiffing.js +1253 -0
- package/dist/TypeDiffing.js.flow +99 -0
- package/dist/VersionDiffing.d.ts +59 -0
- package/dist/VersionDiffing.js +1235 -0
- package/dist/VersionDiffing.js.flow +71 -0
- package/dist/convertPropToBasicTypes.d.ts +20 -0
- package/dist/convertPropToBasicTypes.js +86 -0
- package/dist/convertPropToBasicTypes.js.flow +20 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +12 -0
- package/dist/index.js.flow +12 -0
- package/package.json +31 -3
|
@@ -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
|
+
}
|