@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.
@@ -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 (checker.isArrayType(type)) {
328
- const arrayType = type as ts.TypeReference
329
- const typeArgs = checker.getTypeArguments(arrayType)
330
- if (typeArgs.length > 0) {
331
- return {
332
- kind: 'array',
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
- return undefined
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 {