@arkstack/common 0.7.12 → 0.7.13
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/utils/index.d.ts +14 -8
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -1
- package/package.json +1 -1
package/dist/utils/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { a as perPage, i as getModel, n as ModelConstructor, o as Hash, r as ModelRegistry, s as Encryption, t as AbstractModelConstructor } from "../helpers-P7NkVB6R.js";
|
|
2
|
+
import { Model } from "arkormx";
|
|
2
3
|
|
|
3
4
|
//#region src/utils/traits.d.ts
|
|
4
5
|
declare const crc32: (str: string) => number;
|
|
@@ -17,6 +18,9 @@ type CombineClasses<T extends Array<(new () => any) & {
|
|
|
17
18
|
};
|
|
18
19
|
type ResolveTraitLikeArray<T extends Array<Trait | TypeFactory<Trait>>> = CombineClasses<{ [K in keyof T]: ResolveTraitLike<T[K]> }>;
|
|
19
20
|
type Cons<T = any> = new (...args: any[]) => T;
|
|
21
|
+
type ArkormModelCons<T extends Model = Model> = abstract new (...args: any[]) => T;
|
|
22
|
+
type DirectCons<T = any> = Cons<T> | ArkormModelCons<Model>;
|
|
23
|
+
type DirectBase = DirectCons | Model;
|
|
20
24
|
type ConsFactory<T extends Cons = Cons, B = any> = (base: B) => T;
|
|
21
25
|
type TypeFactory<T = any> = () => T;
|
|
22
26
|
type Explode<T = any> = { [P in keyof T]: T[P] };
|
|
@@ -34,21 +38,23 @@ declare function trait<const ST extends (Trait | TypeFactory<Trait>)[], T extend
|
|
|
34
38
|
type ExtractFactory<T extends Trait> = T extends Trait<ConsFactory<infer C>, TraitDefTypeST> ? C : never;
|
|
35
39
|
type ExtractSuperTrait<T extends Trait> = T extends Trait<TraitDefTypeT, infer ST extends TraitDefTypeST> ? ST : never;
|
|
36
40
|
type DeriveTraitsConsConsMerge<A extends Cons, B extends Cons> = A extends (new (...args: infer ArgsA) => infer RetA) ? (B extends (new (...args: infer ArgsB) => infer RetB) ? (new (...args: MixParams<ArgsA, ArgsB>) => RetA & RetB) : never) : never;
|
|
37
|
-
type DeriveTraitsConsCons<T extends
|
|
41
|
+
type DeriveTraitsConsCons<T extends DirectCons> = new (...args: ConstructorParameters<T>) => InstanceType<T>;
|
|
42
|
+
type DeriveTraitsConsDirectBase<T extends DirectBase> = T extends Model ? new (...args: any[]) => T : T extends DirectCons ? DeriveTraitsConsCons<T> : never;
|
|
38
43
|
type DeriveTraitsConsTraitParts<C extends Cons, ST extends ((Trait | TypeFactory<Trait>)[] | undefined)> = ST extends undefined ? DeriveTraitsConsCons<C> : ST extends [] ? DeriveTraitsConsCons<C> : DeriveTraitsConsConsMerge<DeriveTraitsConsCons<C>, DeriveTraitsConsAll<ST>>;
|
|
39
44
|
type DeriveTraitsConsTrait<T extends Trait> = DeriveTraitsConsTraitParts<ExtractFactory<T>, ExtractSuperTrait<T>>;
|
|
40
45
|
type DeriveTraitsConsOne<T extends (Trait | TypeFactory<Trait>)> = T extends Trait ? DeriveTraitsConsTrait<T> : T extends TypeFactory<Trait> ? DeriveTraitsConsTrait<ReturnType<T>> : never;
|
|
41
|
-
type DeriveTraitsConsAll<T extends (((Trait | TypeFactory<Trait>)[] | [...(Trait | TypeFactory<Trait>)[],
|
|
42
|
-
type DeriveTraitsCons<T extends ((Trait | TypeFactory<Trait>)[] | [...(Trait | TypeFactory<Trait>)[],
|
|
46
|
+
type DeriveTraitsConsAll<T extends (((Trait | TypeFactory<Trait>)[] | [...(Trait | TypeFactory<Trait>)[], DirectBase]) | undefined)> = T extends [infer Only extends DirectBase] ? DeriveTraitsConsDirectBase<Only> : T extends [...infer Others extends (Trait | TypeFactory<Trait>)[], infer Last extends DirectBase] ? (Others extends [] ? DeriveTraitsConsDirectBase<Last> : DeriveTraitsConsConsMerge<DeriveTraitsConsAll<Others>, DeriveTraitsConsDirectBase<Last>>) : T extends (Trait | TypeFactory<Trait>)[] ? (T extends [infer First extends (Trait | TypeFactory<Trait>)] ? (DeriveTraitsConsOne<First>) : (T extends [infer First extends (Trait | TypeFactory<Trait>), ...infer Rest extends (Trait | TypeFactory<Trait>)[]] ? (DeriveTraitsConsConsMerge<DeriveTraitsConsOne<First>, DeriveTraitsConsAll<Rest>>) : never)) : never;
|
|
47
|
+
type DeriveTraitsCons<T extends ((Trait | TypeFactory<Trait>)[] | [...(Trait | TypeFactory<Trait>)[], DirectBase])> = DeriveTraitsConsAll<T>;
|
|
43
48
|
type DeriveTraitsStatsConsMerge<T1 extends object, T2 extends object> = T1 & T2;
|
|
44
|
-
type DeriveTraitsStatsCons<T extends
|
|
49
|
+
type DeriveTraitsStatsCons<T extends DirectCons> = Explode<T>;
|
|
50
|
+
type DeriveTraitsStatsDirectBase<T extends DirectBase> = T extends Model ? object : T extends DirectCons ? DeriveTraitsStatsCons<T> : never;
|
|
45
51
|
type DeriveTraitsStatsTraitParts<C extends Cons, ST extends ((Trait | TypeFactory<Trait>)[] | undefined)> = ST extends undefined ? DeriveTraitsStatsCons<C> : ST extends [] ? DeriveTraitsStatsCons<C> : DeriveTraitsStatsConsMerge<DeriveTraitsStatsCons<C>, DeriveTraitsStatsAll<ST>>;
|
|
46
52
|
type DeriveTraitsStatsTrait<T extends Trait> = DeriveTraitsStatsTraitParts<ExtractFactory<T>, ExtractSuperTrait<T>>;
|
|
47
53
|
type DeriveTraitsStatsOne<T extends (Trait | TypeFactory<Trait>)> = T extends Trait ? DeriveTraitsStatsTrait<T> : T extends TypeFactory<Trait> ? DeriveTraitsStatsTrait<ReturnType<T>> : never;
|
|
48
|
-
type DeriveTraitsStatsAll<T extends (((Trait | TypeFactory<Trait>)[] | [...(Trait | TypeFactory<Trait>)[],
|
|
49
|
-
type DeriveTraitsStats<T extends ((Trait | TypeFactory<Trait>)[] | [...(Trait | TypeFactory<Trait>)[],
|
|
50
|
-
type DeriveTraits<T extends ((Trait | TypeFactory<Trait>)[] | [...(Trait | TypeFactory<Trait>)[],
|
|
51
|
-
declare function use<T extends ([Trait | TypeFactory<Trait>, ...(Trait | TypeFactory<Trait>)[]] | [...(Trait | TypeFactory<Trait>)[],
|
|
54
|
+
type DeriveTraitsStatsAll<T extends (((Trait | TypeFactory<Trait>)[] | [...(Trait | TypeFactory<Trait>)[], DirectBase]) | undefined)> = T extends [infer Only extends DirectBase] ? DeriveTraitsStatsDirectBase<Only> : T extends [...infer Others extends (Trait | TypeFactory<Trait>)[], infer Last extends DirectBase] ? (Others extends [] ? DeriveTraitsStatsDirectBase<Last> : DeriveTraitsStatsConsMerge<DeriveTraitsStatsAll<Others>, DeriveTraitsStatsDirectBase<Last>>) : T extends (Trait | TypeFactory<Trait>)[] ? (T extends [infer First extends (Trait | TypeFactory<Trait>)] ? (DeriveTraitsStatsOne<First>) : (T extends [infer First extends (Trait | TypeFactory<Trait>), ...infer Rest extends (Trait | TypeFactory<Trait>)[]] ? (DeriveTraitsStatsConsMerge<DeriveTraitsStatsOne<First>, DeriveTraitsStatsAll<Rest>>) : never)) : never;
|
|
55
|
+
type DeriveTraitsStats<T extends ((Trait | TypeFactory<Trait>)[] | [...(Trait | TypeFactory<Trait>)[], DirectBase])> = DeriveTraitsStatsAll<T>;
|
|
56
|
+
type DeriveTraits<T extends ((Trait | TypeFactory<Trait>)[] | [...(Trait | TypeFactory<Trait>)[], DirectBase])> = DeriveTraitsCons<T> & DeriveTraitsStats<T>;
|
|
57
|
+
declare function use<T extends ([Trait | TypeFactory<Trait>, ...(Trait | TypeFactory<Trait>)[]] | [...(Trait | TypeFactory<Trait>)[], DirectBase])>(...traits: T): DeriveTraits<T>;
|
|
52
58
|
type DerivedType<T extends Trait> = InstanceType<ExtractFactory<T>>;
|
|
53
59
|
type Derived<T extends (Trait | TypeFactory<Trait> | Cons)> = T extends TypeFactory<Trait> ? DerivedType<ReturnType<T>> : T extends Trait ? DerivedType<T> : T extends Cons ? T : never;
|
|
54
60
|
declare function uses<T extends (Trait | TypeFactory<Trait> | Cons)>(instance: unknown, trait: T): instance is Derived<T>;
|
package/dist/utils/index.js
CHANGED
|
@@ -17,6 +17,7 @@ const crc32 = (str) => {
|
|
|
17
17
|
return (crc ^ -1) >>> 0;
|
|
18
18
|
};
|
|
19
19
|
const isCons = (fn) => typeof fn === "function" && !!fn.prototype && !!fn.prototype.constructor;
|
|
20
|
+
const isArkormModelInstance = (value) => typeof value === "object" && value !== null && typeof value.constructor === "function" && typeof value.getAttribute === "function" && typeof value.setAttribute === "function";
|
|
20
21
|
const isTypeFactory = (fn) => typeof fn === "function" && !fn.prototype && fn.length === 0;
|
|
21
22
|
/**
|
|
22
23
|
* API: generate trait (technical implementation)
|
|
@@ -94,6 +95,9 @@ function use(...traits) {
|
|
|
94
95
|
if (isCons(last) && !isTypeFactory(last)) {
|
|
95
96
|
clz = last;
|
|
96
97
|
lot = traits.slice(0, -1);
|
|
98
|
+
} else if (isArkormModelInstance(last)) {
|
|
99
|
+
clz = last.constructor;
|
|
100
|
+
lot = traits.slice(0, -1);
|
|
97
101
|
} else {
|
|
98
102
|
clz = class ROOT {};
|
|
99
103
|
lot = traits;
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/utils/traits.ts"],"sourcesContent":["/*\n** Extracted from @traits-ts/core - Traits for TypeScript Classes\n** Copyright (c) 2025 Dr. Ralf S. Engelschall <rse@engelschall.com>\n** Licensed under MIT license <https://spdx.org/licenses/MIT>\n*/\n\n/**\n * CRC32 implementation in TypeScript, adapted from https://stackoverflow.com/a/18639999\n * Note: This implementation is not cryptographically secure and is only used for generating \n * unique identifiers for traits based on their factory function's string representation. \n */\nconst crcTable = [] as number[]\nfor (let n = 0; n < 256; n++) {\n let c = n\n for (let k = 0; k < 8; k++)\n c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1))\n crcTable[n] = c\n}\nexport const crc32 = (str: string) => {\n let crc = 0 ^ (-1)\n for (let i = 0; i < str.length; i++)\n crc = (crc >>> 8) ^ crcTable[(crc ^ str.charCodeAt(i)) & 0xFF]\n\n return (crc ^ (-1)) >>> 0\n}\n\ntype ResolveTraitLike<T extends Trait | TypeFactory<Trait>> =\n T extends TypeFactory<Trait>\n ? ExtractFactory<ReturnType<T>>\n : T extends Trait\n ? ExtractFactory<T>\n : unknown;\n\ntype Combine<T extends any[]> =\n T extends [infer Head, ...infer Tail]\n ? Head & Combine<Tail>\n : object;\n\ntype MapClassesToPrototypes<T extends Array<(new () => any) & { prototype: any }>> = {\n [K in keyof T]: T[K]['prototype'];\n}\n\ntype MapClassesToInstances<T extends Array<(new () => any) & { prototype: any }>> = {\n [K in keyof T]: InstanceType<T[K]>;\n}\n\ntype CombineClasses<T extends Array<(new () => any) & { prototype: any }>> =\n (new () => Combine<MapClassesToInstances<T>>) & { prototype: Combine<MapClassesToPrototypes<T>> };\n\ntype ResolveTraitLikeArray<T extends Array<Trait | TypeFactory<Trait>>> = CombineClasses<{\n [K in keyof T]: ResolveTraitLike<T[K]>;\n}>;\n\n/**\n * utility type and function: constructor (function)\n */\ntype Cons<T = any> =\n new (...args: any[]) => T\nconst isCons =\n <T = any>\n (fn: unknown): fn is Cons<T> =>\n typeof fn === 'function' && !!fn.prototype && !!fn.prototype.constructor\n\n/**\n * utility type and function: constructor factory (function)\n */\ntype ConsFactory<T extends Cons = Cons, B = any> =\n (base: B) => T\n\n/**\n * utility type and function: type factory (function)\n */\ntype TypeFactory<T = any> =\n () => T\nconst isTypeFactory =\n <T = any>\n (fn: unknown): fn is TypeFactory<T> =>\n typeof fn === 'function' && !fn.prototype && fn.length === 0\n\n/**\n * utility type: map an object type into a bare properties type\n */\ntype Explode<T = any> =\n { [P in keyof T]: T[P] }\n\n/**\n * utility type: convert two arrays of types into an array of union types\n */\ntype MixParams<T1 extends any[], T2 extends any[]> =\n T1 extends [] ? (\n T2 extends [] ? [] : T2\n ) : (\n T2 extends [] ? T1 : (\n T1 extends [infer H1, ...infer R1] ? (\n T2 extends [infer H2, ...infer R2] ?\n [H1 & H2, ...MixParams<R1, R2>]\n : []\n ) : []\n )\n )\n\n/**\n * API: trait type\n */\ntype TraitDefTypeT = ConsFactory<Cons>\ntype TraitDefTypeST = (Trait | TypeFactory<Trait>)[] | undefined\nexport type Trait<\n T extends TraitDefTypeT = TraitDefTypeT,\n ST extends TraitDefTypeST = TraitDefTypeST\n> = {\n id: number /* unique id (primary, for hasTrait) */\n symbol: symbol /* unique id (secondary, currently unused) */\n factory: T\n superTraits: ST\n}\n\n/**\n * API: generate trait (regular variant)\n * \n * @param factory \n */\nexport function trait<\n T extends ConsFactory<Cons>\n> (factory: T): Trait<T, undefined>\n\n/**\n * API: generate trait (super-trait variant)\n * \n * @param superTraits \n * @param factory \n */\nexport function trait<\n const ST extends (Trait | TypeFactory<Trait>)[],\n T extends ConsFactory<Cons, ResolveTraitLikeArray<ST>>\n> (superTraits: ST, factory: T): Trait<T, ST>\n\n/**\n * API: generate trait (technical implementation)\n * \n * @param args \n */\nexport function trait (...args: any[]): Trait<any, any> {\n const factory: ConsFactory<any, any> = (args.length === 2 ? args[1] : args[0])\n const superTraits: (Trait | TypeFactory<Trait>)[] = (args.length === 2 ? args[0] : undefined)\n\n return {\n id: crc32(factory.toString()),\n symbol: Symbol('trait'),\n factory,\n superTraits\n }\n}\n\n/**\n * utility types: extract factory from a trait\n */\ntype ExtractFactory<\n T extends Trait\n> =\n T extends Trait<\n ConsFactory<infer C>,\n TraitDefTypeST\n > ? C : never\n\n/**\n * utility types: extract supertraits from a trait\n */\ntype ExtractSuperTrait<\n T extends Trait\n> =\n T extends Trait<\n TraitDefTypeT,\n infer ST extends TraitDefTypeST\n > ? ST : never\n\n/**\n * utility type: derive type constructor: merge two constructors\n */\ntype DeriveTraitsConsConsMerge<\n A extends Cons,\n B extends Cons\n> =\n A extends (new (...args: infer ArgsA) => infer RetA) ? (\n B extends (new (...args: infer ArgsB) => infer RetB) ? (\n new (...args: MixParams<ArgsA, ArgsB>) => RetA & RetB\n ) : never\n ) : never\n\n/**\n * utility type: derive type constructor: extract plain constructor\n */\ntype DeriveTraitsConsCons<\n T extends Cons\n> =\n new (...args: ConstructorParameters<T>) => InstanceType<T>\n\n/**\n * utility type: derive type constructor: from trait parts\n */\ntype DeriveTraitsConsTraitParts<\n C extends Cons,\n ST extends ((Trait | TypeFactory<Trait>)[] | undefined)\n> =\n ST extends undefined ? DeriveTraitsConsCons<C> :\n ST extends [] ? DeriveTraitsConsCons<C> :\n DeriveTraitsConsConsMerge<\n DeriveTraitsConsCons<C>,\n DeriveTraitsConsAll<ST>> /* RECURSION */\n\n/**\n * utility type: derive type constructor: from single trait\n */\ntype DeriveTraitsConsTrait<\n T extends Trait\n> =\n DeriveTraitsConsTraitParts<\n ExtractFactory<T>,\n ExtractSuperTrait<T>>\n\n/**\n * utility type: derive type constructor: from single trait or trait factory\n */\ntype DeriveTraitsConsOne<\n T extends (Trait | TypeFactory<Trait>)\n> =\n T extends Trait ? DeriveTraitsConsTrait<T> :\n T extends TypeFactory<Trait> ? DeriveTraitsConsTrait<ReturnType<T>> :\n never\n\n/**\n * utility type: derive type constructor: from one or more traits or trait factories\n */\ntype DeriveTraitsConsAll<\n T extends (((Trait | TypeFactory<Trait>)[] | [...(Trait | TypeFactory<Trait>)[], Cons]) | undefined)\n> =\n T extends [infer Only extends Cons] ? DeriveTraitsConsCons<Only> :\n T extends [...infer Others extends (Trait | TypeFactory<Trait>)[], infer Last extends Cons] ? (\n Others extends [] ? DeriveTraitsConsCons<Last> :\n DeriveTraitsConsConsMerge<\n DeriveTraitsConsAll<Others>, /* RECURSION */\n DeriveTraitsConsCons<Last>>\n ) :\n T extends (Trait | TypeFactory<Trait>)[] ? (\n T extends [infer First extends (Trait | TypeFactory<Trait>)] ? (\n DeriveTraitsConsOne<First>\n ) : (\n T extends [\n infer First extends (Trait | TypeFactory<Trait>),\n ...infer Rest extends (Trait | TypeFactory<Trait>)[]] ? (\n DeriveTraitsConsConsMerge<\n DeriveTraitsConsOne<First>,\n DeriveTraitsConsAll<Rest>> /* RECURSION */\n ) : never\n )\n ) : never\n\n/**\n * utility type: derive type constructor\n */\ntype DeriveTraitsCons<\n T extends ((Trait | TypeFactory<Trait>)[] | [...(Trait | TypeFactory<Trait>)[], Cons])\n> =\n DeriveTraitsConsAll<T>\n\n/**\n * utility type: derive type statics: merge two objects with statics\n */\ntype DeriveTraitsStatsConsMerge<\n T1 extends object,\n T2 extends object\n> =\n T1 & T2\n\n/**\n * utility type: derive type statics: extract plain statics\n */\ntype DeriveTraitsStatsCons<\n T extends Cons\n> =\n Explode<T>\n\n/**\n * utility type: derive type statics: from trait parts\n */\ntype DeriveTraitsStatsTraitParts<\n C extends Cons,\n ST extends ((Trait | TypeFactory<Trait>)[] | undefined)\n> =\n ST extends undefined ? DeriveTraitsStatsCons<C> :\n ST extends [] ? DeriveTraitsStatsCons<C> :\n DeriveTraitsStatsConsMerge<\n DeriveTraitsStatsCons<C>,\n DeriveTraitsStatsAll<ST>> /* RECURSION */\n\n/**\n * utility type: derive type statics: from single trait\n */\ntype DeriveTraitsStatsTrait<\n T extends Trait\n> =\n DeriveTraitsStatsTraitParts<\n ExtractFactory<T>,\n ExtractSuperTrait<T>>\n\n/**\n * utility type: derive type statics: from single trait or trait factory\n */\ntype DeriveTraitsStatsOne<\n T extends (Trait | TypeFactory<Trait>)\n> =\n T extends Trait ? DeriveTraitsStatsTrait<T> :\n T extends TypeFactory<Trait> ? DeriveTraitsStatsTrait<ReturnType<T>> :\n never\n\n/**\n * utility type: derive type statics: from one or more traits or trait factories\n */\ntype DeriveTraitsStatsAll<\n T extends (((Trait | TypeFactory<Trait>)[] | [...(Trait | TypeFactory<Trait>)[], Cons]) | undefined)\n> =\n T extends [infer Only extends Cons] ? DeriveTraitsStatsCons<Only> :\n T extends [...infer Others extends (Trait | TypeFactory<Trait>)[], infer Last extends Cons] ? (\n Others extends [] ? DeriveTraitsStatsCons<Last> :\n DeriveTraitsStatsConsMerge<\n DeriveTraitsStatsAll<Others>, /* RECURSION */\n DeriveTraitsStatsCons<Last>>\n ) :\n T extends (Trait | TypeFactory<Trait>)[] ? (\n T extends [infer First extends (Trait | TypeFactory<Trait>)] ? (\n DeriveTraitsStatsOne<First>\n ) : (\n T extends [\n infer First extends (Trait | TypeFactory<Trait>),\n ...infer Rest extends (Trait | TypeFactory<Trait>)[]] ? (\n DeriveTraitsStatsConsMerge<\n DeriveTraitsStatsOne<First>,\n DeriveTraitsStatsAll<Rest>> /* RECURSION */\n ) : never\n )\n ) : never\n\n/**\n * utility type: derive type statics\n */\ntype DeriveTraitsStats<\n T extends ((Trait | TypeFactory<Trait>)[] | [...(Trait | TypeFactory<Trait>)[], Cons])\n> =\n DeriveTraitsStatsAll<T>\n\n/**\n * utility type: derive type from one or more traits or trait type factories\n */\ntype DeriveTraits<\n T extends ((Trait | TypeFactory<Trait>)[] | [...(Trait | TypeFactory<Trait>)[], Cons])\n> =\n DeriveTraitsCons<T> &\n DeriveTraitsStats<T>\n\n/**\n * utility function: add an additional invisible property to an object\n * \n * @param cons \n * @param field \n * @param value \n * @returns \n */\nconst extendProperties =\n (cons: Cons, field: string | symbol, value: any) =>\n Object.defineProperty(cons, field, { value, enumerable: false, writable: false })\n\n/**\n * utility function: get raw trait\n * \n * @param x \n * @returns \n */\nconst rawTrait = (x: (Trait | TypeFactory<Trait>)) =>\n isTypeFactory(x) ? x() : x\n\n/**\n * utility function: derive a trait\n * \n * @param trait$ \n * @param baseClz \n * @param derived \n * @returns \n */\nconst deriveTrait = (\n trait$: Trait | TypeFactory<Trait>,\n baseClz: Cons<any>,\n derived: Map<number, boolean>\n) => {\n /* get real trait */\n const trait = rawTrait(trait$)\n\n /* start with base class */\n let clz = baseClz\n\n /* in case we still have not derived this trait... */\n if (!derived.has(trait.id)) {\n derived.set(trait.id, true)\n\n /* iterate over all of its super traits */\n if (trait.superTraits !== undefined)\n for (const superTrait of reverseTraitList(trait.superTraits))\n clz = deriveTrait(superTrait, clz, derived) /* RECURSION */\n\n /* derive this trait */\n clz = trait.factory(clz)\n extendProperties(clz, 'id', crc32(trait.factory.toString()))\n extendProperties(clz, trait.symbol, true)\n }\n\n return clz\n}\n\n/**\n * utility function: get reversed trait list\n * \n * @param traits \n * @returns \n */\nconst reverseTraitList = (traits: (Trait | TypeFactory<Trait>)[]) =>\n traits.slice().reverse() as (Trait | TypeFactory<Trait>)[]\n\n/**\n * API: derive a class from one or more traits or trait type factories\n * \n * @param traits \n * @returns \n */\nexport function use\n <T extends (\n [Trait | TypeFactory<Trait>, ...(Trait | TypeFactory<Trait>)[]] |\n [...(Trait | TypeFactory<Trait>)[], Cons]\n )>\n (...traits: T): DeriveTraits<T> {\n /* run-time sanity check */\n if (traits.length === 0)\n throw new Error('invalid number of parameters (expected one or more traits)')\n\n /* determine the base class (clz) and the list of traits (lot) */\n let clz: Cons<any>\n let lot: (Trait | TypeFactory<Trait>)[]\n const last = traits[traits.length - 1]\n if (isCons(last) && !isTypeFactory(last)) {\n /* case 1: with trailing regular class */\n clz = last\n lot = traits.slice(0, -1) as (Trait | TypeFactory<Trait>)[]\n } else {\n /* case 2: just regular traits or trait type factories */\n clz = class ROOT { }\n lot = traits as (Trait | TypeFactory<Trait>)[]\n }\n\n /* track already derived traits */\n const derived = new Map<number, boolean>()\n\n /* iterate over all traits */\n for (const trait of reverseTraitList(lot))\n clz = deriveTrait(trait, clz, derived)\n\n return clz as DeriveTraits<T>\n}\n\n/**\n * internal type: implements trait type\n */\ntype DerivedType<T extends Trait> =\n InstanceType<ExtractFactory<T>>\n\n/**\n * internal type: implements trait type or trait type factory\n */\nexport type Derived<T extends (Trait | TypeFactory<Trait> | Cons)> =\n T extends TypeFactory<Trait> ? DerivedType<ReturnType<T>> :\n T extends Trait ? DerivedType<T> :\n T extends Cons ? T :\n never\n\n/**\n * API: type guard for checking whether class instance is derived from a trait\n * \n * @param instance \n * @param trait \n * @returns \n */\nexport function uses\n <T extends (Trait | TypeFactory<Trait> | Cons)>\n (instance: unknown, trait: T): instance is Derived<T> {\n /* ensure the class instance is really an object */\n if (typeof instance !== 'object' || instance === null)\n return false\n let obj = instance\n\n /* special case: regular class */\n if (isCons(trait) && !isTypeFactory(trait))\n return (instance instanceof trait)\n\n /* regular case: trait or trait type factory... */\n const t = (isTypeFactory(trait) ? trait() : trait) as Trait\n const idTrait = t['id']\n while (obj) {\n if (Object.hasOwn(obj, 'constructor')) {\n const id = ((obj.constructor as any)['id'] as number) ?? 0\n if (id === idTrait)\n return true\n }\n obj = Object.getPrototypeOf(obj)\n }\n\n return false\n}\n"],"mappings":";;;;;;;AAWA,MAAM,WAAW,EAAE;AACnB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;CAC1B,IAAI,IAAI;CACR,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KACnB,IAAM,IAAI,IAAM,aAAc,MAAM,IAAO,MAAM;CACrD,SAAS,KAAK;;AAElB,MAAa,SAAS,QAAgB;CAClC,IAAI,MAAM;CACV,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAC5B,MAAO,QAAQ,IAAK,UAAU,MAAM,IAAI,WAAW,EAAE,IAAI;CAE7D,QAAQ,MAAO,QAAS;;AAmC5B,MAAM,UAEG,OACD,OAAO,OAAO,cAAc,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,GAAG,UAAU;AAarE,MAAM,iBAEG,OACD,OAAO,OAAO,cAAc,CAAC,GAAG,aAAa,GAAG,WAAW;;;;;;AAgEnE,SAAgB,MAAO,GAAG,MAA8B;CACpD,MAAM,UAAkC,KAAK,WAAW,IAAI,KAAK,KAAK,KAAK;CAC3E,MAAM,cAA+C,KAAK,WAAW,IAAI,KAAK,KAAK,KAAA;CAEnF,OAAO;EACH,IAAI,MAAM,QAAQ,UAAU,CAAC;EAC7B,QAAQ,OAAO,QAAQ;EACvB;EACA;EACH;;;;;;;;;;AAwNL,MAAM,oBACD,MAAY,OAAwB,UACjC,OAAO,eAAe,MAAM,OAAO;CAAE;CAAO,YAAY;CAAO,UAAU;CAAO,CAAC;;;;;;;AAQzF,MAAM,YAAY,MACd,cAAc,EAAE,GAAG,GAAG,GAAG;;;;;;;;;AAU7B,MAAM,eACF,QACA,SACA,YACC;CAED,MAAM,QAAQ,SAAS,OAAO;CAG9B,IAAI,MAAM;CAGV,IAAI,CAAC,QAAQ,IAAI,MAAM,GAAG,EAAE;EACxB,QAAQ,IAAI,MAAM,IAAI,KAAK;EAG3B,IAAI,MAAM,gBAAgB,KAAA,GACtB,KAAK,MAAM,cAAc,iBAAiB,MAAM,YAAY,EACxD,MAAM,YAAY,YAAY,KAAK,QAAQ;EAGnD,MAAM,MAAM,QAAQ,IAAI;EACxB,iBAAiB,KAAK,MAAM,MAAM,MAAM,QAAQ,UAAU,CAAC,CAAC;EAC5D,iBAAiB,KAAK,MAAM,QAAQ,KAAK;;CAG7C,OAAO;;;;;;;;AASX,MAAM,oBAAoB,WACtB,OAAO,OAAO,CAAC,SAAS;;;;;;;AAQ5B,SAAgB,IAKX,GAAG,QAA4B;CAEhC,IAAI,OAAO,WAAW,GAClB,MAAM,IAAI,MAAM,6DAA6D;CAGjF,IAAI;CACJ,IAAI;CACJ,MAAM,OAAO,OAAO,OAAO,SAAS;CACpC,IAAI,OAAO,KAAK,IAAI,CAAC,cAAc,KAAK,EAAE;EAEtC,MAAM;EACN,MAAM,OAAO,MAAM,GAAG,GAAG;QACtB;EAEH,MAAM,MAAM,KAAK;EACjB,MAAM;;CAIV,MAAM,0BAAU,IAAI,KAAsB;CAG1C,KAAK,MAAM,SAAS,iBAAiB,IAAI,EACrC,MAAM,YAAY,OAAO,KAAK,QAAQ;CAE1C,OAAO;;;;;;;;;AAyBX,SAAgB,KAEX,UAAmB,OAAkC;CAEtD,IAAI,OAAO,aAAa,YAAY,aAAa,MAC7C,OAAO;CACX,IAAI,MAAM;CAGV,IAAI,OAAO,MAAM,IAAI,CAAC,cAAc,MAAM,EACtC,OAAQ,oBAAoB;CAIhC,MAAM,WADK,cAAc,MAAM,GAAG,OAAO,GAAG,OAC1B;CAClB,OAAO,KAAK;EACR,IAAI,OAAO,OAAO,KAAK,cAAc;QACpB,IAAI,YAAoB,SAAoB,OAC9C,SACP,OAAO;;EAEf,MAAM,OAAO,eAAe,IAAI;;CAGpC,OAAO"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/utils/traits.ts"],"sourcesContent":["/*\n** Extracted from @traits-ts/core - Traits for TypeScript Classes\n** Copyright (c) 2025 Dr. Ralf S. Engelschall <rse@engelschall.com>\n** Licensed under MIT license <https://spdx.org/licenses/MIT>\n*/\n\nimport type { Model as ArkormModel } from 'arkormx'\n\n/**\n * CRC32 implementation in TypeScript, adapted from https://stackoverflow.com/a/18639999\n * Note: This implementation is not cryptographically secure and is only used for generating \n * unique identifiers for traits based on their factory function's string representation. \n */\nconst crcTable = [] as number[]\nfor (let n = 0; n < 256; n++) {\n let c = n\n for (let k = 0; k < 8; k++)\n c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1))\n crcTable[n] = c\n}\nexport const crc32 = (str: string) => {\n let crc = 0 ^ (-1)\n for (let i = 0; i < str.length; i++)\n crc = (crc >>> 8) ^ crcTable[(crc ^ str.charCodeAt(i)) & 0xFF]\n\n return (crc ^ (-1)) >>> 0\n}\n\ntype ResolveTraitLike<T extends Trait | TypeFactory<Trait>> =\n T extends TypeFactory<Trait>\n ? ExtractFactory<ReturnType<T>>\n : T extends Trait\n ? ExtractFactory<T>\n : unknown;\n\ntype Combine<T extends any[]> =\n T extends [infer Head, ...infer Tail]\n ? Head & Combine<Tail>\n : object;\n\ntype MapClassesToPrototypes<T extends Array<(new () => any) & { prototype: any }>> = {\n [K in keyof T]: T[K]['prototype'];\n}\n\ntype MapClassesToInstances<T extends Array<(new () => any) & { prototype: any }>> = {\n [K in keyof T]: InstanceType<T[K]>;\n}\n\ntype CombineClasses<T extends Array<(new () => any) & { prototype: any }>> =\n (new () => Combine<MapClassesToInstances<T>>) & { prototype: Combine<MapClassesToPrototypes<T>> };\n\ntype ResolveTraitLikeArray<T extends Array<Trait | TypeFactory<Trait>>> = CombineClasses<{\n [K in keyof T]: ResolveTraitLike<T[K]>;\n}>;\n\n/**\n * utility type and function: constructor (function)\n */\ntype Cons<T = any> =\n new (...args: any[]) => T\nconst isCons =\n <T = any>\n (fn: unknown): fn is Cons<T> =>\n typeof fn === 'function' && !!fn.prototype && !!fn.prototype.constructor\n\ntype ArkormModelCons<T extends ArkormModel = ArkormModel> =\n abstract new (...args: any[]) => T\n\ntype DirectCons<T = any> =\n Cons<T> | ArkormModelCons<ArkormModel>\n\ntype DirectBase =\n DirectCons | ArkormModel\n\nconst isArkormModelInstance =\n (value: unknown): value is ArkormModel =>\n typeof value === 'object' &&\n value !== null &&\n typeof (value as { constructor?: unknown }).constructor === 'function' &&\n typeof (value as { getAttribute?: unknown }).getAttribute === 'function' &&\n typeof (value as { setAttribute?: unknown }).setAttribute === 'function'\n\n/**\n * utility type and function: constructor factory (function)\n */\ntype ConsFactory<T extends Cons = Cons, B = any> =\n (base: B) => T\n\n/**\n * utility type and function: type factory (function)\n */\ntype TypeFactory<T = any> =\n () => T\nconst isTypeFactory =\n <T = any>\n (fn: unknown): fn is TypeFactory<T> =>\n typeof fn === 'function' && !fn.prototype && fn.length === 0\n\n/**\n * utility type: map an object type into a bare properties type\n */\ntype Explode<T = any> =\n { [P in keyof T]: T[P] }\n\n/**\n * utility type: convert two arrays of types into an array of union types\n */\ntype MixParams<T1 extends any[], T2 extends any[]> =\n T1 extends [] ? (\n T2 extends [] ? [] : T2\n ) : (\n T2 extends [] ? T1 : (\n T1 extends [infer H1, ...infer R1] ? (\n T2 extends [infer H2, ...infer R2] ?\n [H1 & H2, ...MixParams<R1, R2>]\n : []\n ) : []\n )\n )\n\n/**\n * API: trait type\n */\ntype TraitDefTypeT = ConsFactory<Cons>\ntype TraitDefTypeST = (Trait | TypeFactory<Trait>)[] | undefined\nexport type Trait<\n T extends TraitDefTypeT = TraitDefTypeT,\n ST extends TraitDefTypeST = TraitDefTypeST\n> = {\n id: number /* unique id (primary, for hasTrait) */\n symbol: symbol /* unique id (secondary, currently unused) */\n factory: T\n superTraits: ST\n}\n\n/**\n * API: generate trait (regular variant)\n * \n * @param factory \n */\nexport function trait<\n T extends ConsFactory<Cons>\n> (factory: T): Trait<T, undefined>\n\n/**\n * API: generate trait (super-trait variant)\n * \n * @param superTraits \n * @param factory \n */\nexport function trait<\n const ST extends (Trait | TypeFactory<Trait>)[],\n T extends ConsFactory<Cons, ResolveTraitLikeArray<ST>>\n> (superTraits: ST, factory: T): Trait<T, ST>\n\n/**\n * API: generate trait (technical implementation)\n * \n * @param args \n */\nexport function trait (...args: any[]): Trait<any, any> {\n const factory: ConsFactory<any, any> = (args.length === 2 ? args[1] : args[0])\n const superTraits: (Trait | TypeFactory<Trait>)[] = (args.length === 2 ? args[0] : undefined)\n\n return {\n id: crc32(factory.toString()),\n symbol: Symbol('trait'),\n factory,\n superTraits\n }\n}\n\n/**\n * utility types: extract factory from a trait\n */\ntype ExtractFactory<\n T extends Trait\n> =\n T extends Trait<\n ConsFactory<infer C>,\n TraitDefTypeST\n > ? C : never\n\n/**\n * utility types: extract supertraits from a trait\n */\ntype ExtractSuperTrait<\n T extends Trait\n> =\n T extends Trait<\n TraitDefTypeT,\n infer ST extends TraitDefTypeST\n > ? ST : never\n\n/**\n * utility type: derive type constructor: merge two constructors\n */\ntype DeriveTraitsConsConsMerge<\n A extends Cons,\n B extends Cons\n> =\n A extends (new (...args: infer ArgsA) => infer RetA) ? (\n B extends (new (...args: infer ArgsB) => infer RetB) ? (\n new (...args: MixParams<ArgsA, ArgsB>) => RetA & RetB\n ) : never\n ) : never\n\n/**\n * utility type: derive type constructor: extract plain constructor\n */\ntype DeriveTraitsConsCons<\n T extends DirectCons\n> =\n new (...args: ConstructorParameters<T>) => InstanceType<T>\n\ntype DeriveTraitsConsDirectBase<\n T extends DirectBase\n> =\n T extends ArkormModel ? new (...args: any[]) => T :\n T extends DirectCons ? DeriveTraitsConsCons<T> :\n never\n\n/**\n * utility type: derive type constructor: from trait parts\n */\ntype DeriveTraitsConsTraitParts<\n C extends Cons,\n ST extends ((Trait | TypeFactory<Trait>)[] | undefined)\n> =\n ST extends undefined ? DeriveTraitsConsCons<C> :\n ST extends [] ? DeriveTraitsConsCons<C> :\n DeriveTraitsConsConsMerge<\n DeriveTraitsConsCons<C>,\n DeriveTraitsConsAll<ST>> /* RECURSION */\n\n/**\n * utility type: derive type constructor: from single trait\n */\ntype DeriveTraitsConsTrait<\n T extends Trait\n> =\n DeriveTraitsConsTraitParts<\n ExtractFactory<T>,\n ExtractSuperTrait<T>>\n\n/**\n * utility type: derive type constructor: from single trait or trait factory\n */\ntype DeriveTraitsConsOne<\n T extends (Trait | TypeFactory<Trait>)\n> =\n T extends Trait ? DeriveTraitsConsTrait<T> :\n T extends TypeFactory<Trait> ? DeriveTraitsConsTrait<ReturnType<T>> :\n never\n\n/**\n * utility type: derive type constructor: from one or more traits or trait factories\n */\ntype DeriveTraitsConsAll<\n T extends (((Trait | TypeFactory<Trait>)[] | [...(Trait | TypeFactory<Trait>)[], DirectBase]) | undefined)\n> =\n T extends [infer Only extends DirectBase] ? DeriveTraitsConsDirectBase<Only> :\n T extends [...infer Others extends (Trait | TypeFactory<Trait>)[], infer Last extends DirectBase] ? (\n Others extends [] ? DeriveTraitsConsDirectBase<Last> :\n DeriveTraitsConsConsMerge<\n DeriveTraitsConsAll<Others>, /* RECURSION */\n DeriveTraitsConsDirectBase<Last>>\n ) :\n T extends (Trait | TypeFactory<Trait>)[] ? (\n T extends [infer First extends (Trait | TypeFactory<Trait>)] ? (\n DeriveTraitsConsOne<First>\n ) : (\n T extends [\n infer First extends (Trait | TypeFactory<Trait>),\n ...infer Rest extends (Trait | TypeFactory<Trait>)[]] ? (\n DeriveTraitsConsConsMerge<\n DeriveTraitsConsOne<First>,\n DeriveTraitsConsAll<Rest>> /* RECURSION */\n ) : never\n )\n ) : never\n\n/**\n * utility type: derive type constructor\n */\ntype DeriveTraitsCons<\n T extends ((Trait | TypeFactory<Trait>)[] | [...(Trait | TypeFactory<Trait>)[], DirectBase])\n> =\n DeriveTraitsConsAll<T>\n\n/**\n * utility type: derive type statics: merge two objects with statics\n */\ntype DeriveTraitsStatsConsMerge<\n T1 extends object,\n T2 extends object\n> =\n T1 & T2\n\n/**\n * utility type: derive type statics: extract plain statics\n */\ntype DeriveTraitsStatsCons<\n T extends DirectCons\n> =\n Explode<T>\n\ntype DeriveTraitsStatsDirectBase<\n T extends DirectBase\n> =\n T extends ArkormModel ? object :\n T extends DirectCons ? DeriveTraitsStatsCons<T> :\n never\n\n/**\n * utility type: derive type statics: from trait parts\n */\ntype DeriveTraitsStatsTraitParts<\n C extends Cons,\n ST extends ((Trait | TypeFactory<Trait>)[] | undefined)\n> =\n ST extends undefined ? DeriveTraitsStatsCons<C> :\n ST extends [] ? DeriveTraitsStatsCons<C> :\n DeriveTraitsStatsConsMerge<\n DeriveTraitsStatsCons<C>,\n DeriveTraitsStatsAll<ST>> /* RECURSION */\n\n/**\n * utility type: derive type statics: from single trait\n */\ntype DeriveTraitsStatsTrait<\n T extends Trait\n> =\n DeriveTraitsStatsTraitParts<\n ExtractFactory<T>,\n ExtractSuperTrait<T>>\n\n/**\n * utility type: derive type statics: from single trait or trait factory\n */\ntype DeriveTraitsStatsOne<\n T extends (Trait | TypeFactory<Trait>)\n> =\n T extends Trait ? DeriveTraitsStatsTrait<T> :\n T extends TypeFactory<Trait> ? DeriveTraitsStatsTrait<ReturnType<T>> :\n never\n\n/**\n * utility type: derive type statics: from one or more traits or trait factories\n */\ntype DeriveTraitsStatsAll<\n T extends (((Trait | TypeFactory<Trait>)[] | [...(Trait | TypeFactory<Trait>)[], DirectBase]) | undefined)\n> =\n T extends [infer Only extends DirectBase] ? DeriveTraitsStatsDirectBase<Only> :\n T extends [...infer Others extends (Trait | TypeFactory<Trait>)[], infer Last extends DirectBase] ? (\n Others extends [] ? DeriveTraitsStatsDirectBase<Last> :\n DeriveTraitsStatsConsMerge<\n DeriveTraitsStatsAll<Others>, /* RECURSION */\n DeriveTraitsStatsDirectBase<Last>>\n ) :\n T extends (Trait | TypeFactory<Trait>)[] ? (\n T extends [infer First extends (Trait | TypeFactory<Trait>)] ? (\n DeriveTraitsStatsOne<First>\n ) : (\n T extends [\n infer First extends (Trait | TypeFactory<Trait>),\n ...infer Rest extends (Trait | TypeFactory<Trait>)[]] ? (\n DeriveTraitsStatsConsMerge<\n DeriveTraitsStatsOne<First>,\n DeriveTraitsStatsAll<Rest>> /* RECURSION */\n ) : never\n )\n ) : never\n\n/**\n * utility type: derive type statics\n */\ntype DeriveTraitsStats<\n T extends ((Trait | TypeFactory<Trait>)[] | [...(Trait | TypeFactory<Trait>)[], DirectBase])\n> =\n DeriveTraitsStatsAll<T>\n\n/**\n * utility type: derive type from one or more traits or trait type factories\n */\ntype DeriveTraits<\n T extends ((Trait | TypeFactory<Trait>)[] | [...(Trait | TypeFactory<Trait>)[], DirectBase])\n> =\n DeriveTraitsCons<T> &\n DeriveTraitsStats<T>\n\n/**\n * utility function: add an additional invisible property to an object\n * \n * @param cons \n * @param field \n * @param value \n * @returns \n */\nconst extendProperties =\n (cons: Cons, field: string | symbol, value: any) =>\n Object.defineProperty(cons, field, { value, enumerable: false, writable: false })\n\n/**\n * utility function: get raw trait\n * \n * @param x \n * @returns \n */\nconst rawTrait = (x: (Trait | TypeFactory<Trait>)) =>\n isTypeFactory(x) ? x() : x\n\n/**\n * utility function: derive a trait\n * \n * @param trait$ \n * @param baseClz \n * @param derived \n * @returns \n */\nconst deriveTrait = (\n trait$: Trait | TypeFactory<Trait>,\n baseClz: Cons<any>,\n derived: Map<number, boolean>\n) => {\n /* get real trait */\n const trait = rawTrait(trait$)\n\n /* start with base class */\n let clz = baseClz\n\n /* in case we still have not derived this trait... */\n if (!derived.has(trait.id)) {\n derived.set(trait.id, true)\n\n /* iterate over all of its super traits */\n if (trait.superTraits !== undefined)\n for (const superTrait of reverseTraitList(trait.superTraits))\n clz = deriveTrait(superTrait, clz, derived) /* RECURSION */\n\n /* derive this trait */\n clz = trait.factory(clz)\n extendProperties(clz, 'id', crc32(trait.factory.toString()))\n extendProperties(clz, trait.symbol, true)\n }\n\n return clz\n}\n\n/**\n * utility function: get reversed trait list\n * \n * @param traits \n * @returns \n */\nconst reverseTraitList = (traits: (Trait | TypeFactory<Trait>)[]) =>\n traits.slice().reverse() as (Trait | TypeFactory<Trait>)[]\n\n/**\n * API: derive a class from one or more traits or trait type factories\n * \n * @param traits \n * @returns \n */\nexport function use\n <T extends (\n [Trait | TypeFactory<Trait>, ...(Trait | TypeFactory<Trait>)[]] |\n [...(Trait | TypeFactory<Trait>)[], DirectBase]\n )>\n (...traits: T): DeriveTraits<T> {\n /* run-time sanity check */\n if (traits.length === 0)\n throw new Error('invalid number of parameters (expected one or more traits)')\n\n /* determine the base class (clz) and the list of traits (lot) */\n let clz: Cons<any>\n let lot: (Trait | TypeFactory<Trait>)[]\n const last = traits[traits.length - 1]\n if (isCons(last) && !isTypeFactory(last)) {\n /* case 1: with trailing regular class */\n clz = last\n lot = traits.slice(0, -1) as (Trait | TypeFactory<Trait>)[]\n } else if (isArkormModelInstance(last)) {\n /* case 2: with trailing Arkorm model instance */\n clz = last.constructor as Cons<any>\n lot = traits.slice(0, -1) as (Trait | TypeFactory<Trait>)[]\n } else {\n /* case 3: just regular traits or trait type factories */\n clz = class ROOT { }\n lot = traits as (Trait | TypeFactory<Trait>)[]\n }\n\n /* track already derived traits */\n const derived = new Map<number, boolean>()\n\n /* iterate over all traits */\n for (const trait of reverseTraitList(lot))\n clz = deriveTrait(trait, clz, derived)\n\n return clz as DeriveTraits<T>\n}\n\n/**\n * internal type: implements trait type\n */\ntype DerivedType<T extends Trait> =\n InstanceType<ExtractFactory<T>>\n\n/**\n * internal type: implements trait type or trait type factory\n */\nexport type Derived<T extends (Trait | TypeFactory<Trait> | Cons)> =\n T extends TypeFactory<Trait> ? DerivedType<ReturnType<T>> :\n T extends Trait ? DerivedType<T> :\n T extends Cons ? T :\n never\n\n/**\n * API: type guard for checking whether class instance is derived from a trait\n * \n * @param instance \n * @param trait \n * @returns \n */\nexport function uses\n <T extends (Trait | TypeFactory<Trait> | Cons)>\n (instance: unknown, trait: T): instance is Derived<T> {\n /* ensure the class instance is really an object */\n if (typeof instance !== 'object' || instance === null)\n return false\n let obj = instance\n\n /* special case: regular class */\n if (isCons(trait) && !isTypeFactory(trait))\n return (instance instanceof trait)\n\n /* regular case: trait or trait type factory... */\n const t = (isTypeFactory(trait) ? trait() : trait) as Trait\n const idTrait = t['id']\n while (obj) {\n if (Object.hasOwn(obj, 'constructor')) {\n const id = ((obj.constructor as any)['id'] as number) ?? 0\n if (id === idTrait)\n return true\n }\n obj = Object.getPrototypeOf(obj)\n }\n\n return false\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED