{"version":3,"file":"getOwnPropertyDescriptorsRecursively.mjs","names":[],"sources":["../../../src/utils/reflection/getOwnPropertyDescriptorsRecursively.ts"],"sourcesContent":["import type { Increment } from '../GracefulRecursion.d.ts';\nimport type { InstanceOrStatic, Integer } from '../miscTypes.ts';\nimport { getOwnPropertyDescriptors } from './getOwnPropertyDescriptors.ts';\nimport { getPrototypesChainOf } from './getPrototypeChainOf.ts';\nimport type {\n  BaseClass,\n  BaseClassProto as BaseClassPrototype,\n  ClassLike,\n  ConstructorConstraint,\n  ConstructorLike,\n  ProtoChainOfClass as PrototypeChainOfClass,\n  SuperClassLike,\n  WithProto as WithPrototype,\n} from './inheritance.ts';\nimport type { InstanceTypeOrSelfPropertyDescriptorMap } from './InstanceTypeOrSelfPropertyDescriptorMap.d.ts';\nimport type { OwnPropertyDescriptorMap } from './OwnPropertyDescriptorMap.d.ts';\n/**\n * JSDoc type imports\n */\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport type { getPrototypeOf as _getPrototypeOf } from './getPrototypeOf.ts';\nimport type { listOwnGetters as _listOwnGetters } from './listOwnGetters.ts';\nimport type { InstancePropertyDescriptorMap as _InstancePropertyDescriptorMap } from './InstancePropertyDescriptorMap.d.ts';\n/* eslint-enable @typescript-eslint/no-unused-vars */\n\n/**\n * A conditional wrapper for {@link InstanceTypeOrSelfPropertyDescriptorMap} and\n * {@link OwnPropertyDescriptorMap}.\n *\n * If {@link _InstanceOrStatic} is 'Instance', {@link InstanceTypeOrSelfPropertyDescriptorMap}.\\\n * Else if {@link _InstanceOrStatic} is 'Static',\n * {@link OwnPropertyDescriptorMap }.\\\n * Else, `never`.\n * @template {ConstructorConstraint<Class> & WithProto<SuperClassLike | BaseClassProto>} Class\n * A class definition cast to {@link ClassLike}.\n * @template {InstanceOrStatic} _InstanceOrStatic\n * 'Instance' or 'Static'. Determines the return type.\n * @since 3.0.0\n */\nexport type RecursedPropertyDescriptorMap<\n  Class extends ConstructorConstraint<Class> & WithPrototype<SuperClassLike | BaseClassPrototype>,\n  _InstanceOrStatic extends InstanceOrStatic,\n> = [_InstanceOrStatic] extends ['Instance'] ? InstanceTypeOrSelfPropertyDescriptorMap<Class, Class['__proto__']>\n  : [_InstanceOrStatic] extends ['Static'] ? OwnPropertyDescriptorMap<Class>\n      : never;\n\n/**\n * An\n * ordered array of {@link OwnPropertyDescriptorMap} or\n * {@link InstancePropertyDescriptorMap} starting with {@link classDefinition}\n * and ending with a {@link BaseClass}.\n * @template {ConstructorConstraint<Class> & WithProto<SuperClassLike | BaseClassProto>} Class\n * @template {'Instance' | 'Static'} InstanceOrStatic\n * @template {Integer<number>} [Limit=16]\n * @template {Integer<number>} [CurrentLevel=0]\n */\nexport type RecursedPropertyDescriptorMapArray<\n  Class extends ConstructorConstraint<Class> & WithPrototype<SuperClassLike | BaseClassPrototype>,\n  InstanceOrStatic extends 'Instance' | 'Static',\n  Limit extends Integer<number> = 16,\n  CurrentLevel extends Integer<number> = 0,\n> = Class['__proto__'] extends BaseClassPrototype['__proto__'] | BaseClassPrototype['__proto__']['__proto__'] ? never\n  : Class['__proto__'] extends BaseClassPrototype ? [RecursedPropertyDescriptorMap<BaseClass<Class>, InstanceOrStatic>]\n    : Class['__proto__'] extends ConstructorLike<Class['__proto__']>\n      ? [\n          RecursedPropertyDescriptorMap<Class, InstanceOrStatic>,\n          ...RecursedPropertyDescriptorMapArray<\n            ClassLike<Exclude<Class['__proto__'], BaseClassPrototype> & WithPrototype<SuperClassLike | BaseClassPrototype>>,\n            InstanceOrStatic,\n            Limit,\n            Increment<CurrentLevel>\n          >,\n        ]\n      : never;\n/**\n * Walks the class inheritance chain to get a PropertyDescriptorMap of each class.\n *\n * While you _can_ use this to get an array of getter names/keys, you should use {@link getPrototypeOf} and {@link listOwnGetters}, instead!\n * @template Class Any class definition type-cast to {@link ClassLike}\n * @template _InstanceOrStatic\n * @param classDefinition Any class definition type-cast to {@link ClassLike}\n * @param instanceOrStatic 'Instance' or 'Static'. Determines the return type.\n * @returns An\n * ordered array of {@link OwnPropertyDescriptorMap} or\n * {@link InstancePropertyDescriptorMap} starting with {@link classDefinition}\n * and ending with a {@link BaseClass}.\n * @since 3.0.0\n */\nexport function getOwnPropertyDescriptorsRecursively<\n  // Class extends ClassLike<ConstructorConstraint<Class> & WithProto<SuperClassLike | BaseClassProto>>,\n  Class extends ClassLike<ConstructorConstraint<Class> & WithPrototype<SuperClassLike | BaseClassPrototype>>,\n  _InstanceOrStatic extends InstanceOrStatic,\n  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n  Limit extends Integer<number> = 16,\n>(\n  classDefinition: Class,\n  instanceOrStatic: _InstanceOrStatic,\n): RecursedPropertyDescriptorMapArray<Class, _InstanceOrStatic> {\n  const staticPrototypeChain: PrototypeChainOfClass<Class> = getPrototypesChainOf(classDefinition, 'classes');\n  if (isSingleTuple(staticPrototypeChain)) {\n    return [\n      getOwnPropertyDescriptors(\n        staticPrototypeChain[0],\n        instanceOrStatic,\n      ) as RecursedPropertyDescriptorMap<Class, _InstanceOrStatic>,\n    ] as unknown as RecursedPropertyDescriptorMapArray<Class, _InstanceOrStatic, Limit>;\n  }\n\n  const recursedPropertyDescriptorMapArray = staticPrototypeChain.map(classDefinition =>\n    getOwnPropertyDescriptors(\n      classDefinition,\n      instanceOrStatic,\n    ),\n  );\n\n  return recursedPropertyDescriptorMapArray as RecursedPropertyDescriptorMapArray<Class, _InstanceOrStatic>;\n}\n\n/**\n * Simple utility for single-tuple type assertion\n * @template {T} T T in T[]\n * @param array an array\n * @returns array is [T]\n */\nfunction isSingleTuple<T>(array: T[]): array is [T] {\n  return Array.isArray(array) && array.length === 1;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAwFA,SAAgB,qCAOd,iBACA,kBAC8D;CAC9D,MAAM,uBAAqD,qBAAqB,iBAAiB,SAAS;CAC1G,IAAI,cAAc,oBAAoB,GACpC,OAAO,CACL,0BACE,qBAAqB,IACrB,gBACF,CACF;CAUF,OAP2C,qBAAqB,KAAI,oBAClE,0BACE,iBACA,gBACF,CAGsC;AAC1C;;;;;;;AAQA,SAAS,cAAiB,OAA0B;CAClD,OAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW;AAClD"}