@wix/zero-config-implementation 1.87.0 → 1.88.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.
- package/dist/index.js +4969 -4954
- package/package.json +2 -2
- package/src/information-extractors/ts/__snapshots__/components.test.ts.snap +601 -0
- package/src/information-extractors/ts/components.test.ts +31 -0
- package/src/information-extractors/ts/components.ts +13 -0
- package/src/information-extractors/ts/utils/semantic-type-resolver.ts +40 -11
|
@@ -212,8 +212,8 @@ function resolveTypeBody({
|
|
|
212
212
|
() => resolvePrimitiveType(type),
|
|
213
213
|
() => resolveLiteralType(type, checker),
|
|
214
214
|
() => resolveUnionType(type, checker, depth, seenTypes),
|
|
215
|
-
() => resolveIntersectionType(type, checker, depth, seenTypes),
|
|
216
215
|
() => resolveArrayType(type, checker, depth, seenTypes),
|
|
216
|
+
() => resolveIntersectionType(type, checker, depth, seenTypes),
|
|
217
217
|
() => resolveFunctionType(type, checker),
|
|
218
218
|
() => resolveObjectType(type, checker, depth, seenTypes),
|
|
219
219
|
]
|
|
@@ -324,18 +324,47 @@ function resolveArrayType(
|
|
|
324
324
|
depth: number,
|
|
325
325
|
seenTypes: Set<ts.Type>,
|
|
326
326
|
): ResolvedType | undefined {
|
|
327
|
-
if (
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
elementType: resolveType({ type: typeArgs[0], checker, depth: depth + 1, seenTypes }),
|
|
334
|
-
}
|
|
335
|
-
}
|
|
327
|
+
if (!isArrayLikeType(type, checker)) {
|
|
328
|
+
return undefined
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
const elementType = getArrayElementType(type, checker)
|
|
332
|
+
if (!elementType) {
|
|
336
333
|
return { kind: 'array', elementType: { kind: 'primitive', value: 'any' } }
|
|
337
334
|
}
|
|
338
|
-
|
|
335
|
+
|
|
336
|
+
return {
|
|
337
|
+
kind: 'array',
|
|
338
|
+
elementType: resolveType({ type: elementType, checker, depth: depth + 1, seenTypes }),
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
function isArrayLikeType(type: ts.Type, checker: ts.TypeChecker): boolean {
|
|
343
|
+
if (type.flags & ts.TypeFlags.Intersection) {
|
|
344
|
+
return (type as ts.IntersectionType).types.some((memberType) => isArrayLikeType(memberType, checker))
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
return checker.isArrayType(type) || checker.isTupleType(type)
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
function getArrayElementType(type: ts.Type, checker: ts.TypeChecker): ts.Type | undefined {
|
|
351
|
+
if (type.flags & ts.TypeFlags.Intersection) {
|
|
352
|
+
const intersectionType = type as ts.IntersectionType
|
|
353
|
+
|
|
354
|
+
// Prefer a declared array type over a const tuple. Intersections produced by
|
|
355
|
+
// default-prop helpers commonly look like `Item[] & readonly [{ ... }]`;
|
|
356
|
+
// the declared array carries the reusable item schema while the tuple only
|
|
357
|
+
// narrows it to the particular default values.
|
|
358
|
+
const declaredArrayMember = intersectionType.types.find((memberType) => checker.isArrayType(memberType))
|
|
359
|
+
if (declaredArrayMember) {
|
|
360
|
+
return checker.getIndexTypeOfType(declaredArrayMember, ts.IndexKind.Number)
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
const tupleMember = intersectionType.types.find((memberType) => checker.isTupleType(memberType))
|
|
364
|
+
return tupleMember ? checker.getIndexTypeOfType(tupleMember, ts.IndexKind.Number) : undefined
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
return checker.getIndexTypeOfType(type, ts.IndexKind.Number)
|
|
339
368
|
}
|
|
340
369
|
|
|
341
370
|
function resolveFunctionType(type: ts.Type, checker: ts.TypeChecker): ResolvedType | undefined {
|