Skip to content

Commit

Permalink
feat: added dinamic types to get method #152
Browse files Browse the repository at this point in the history
  • Loading branch information
4lessandrodev committed May 2, 2024
1 parent 590fc49 commit 9cfb437
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 12 deletions.
20 changes: 19 additions & 1 deletion lib/core/base-getters-and-setters.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { ICreateManyDomain, IBaseGettersAndSetters, ISettings, UID, IVoSettings } from "../types";
import { BuiltIns } from "../types-util";
import util, { Utils } from "../utils/util";
import validator, { Validator } from "../utils/validator";
import createManyDomainInstances from "./create-many-domain-instance";
Expand Down Expand Up @@ -56,7 +57,22 @@ export class BaseGettersAndSetters<Props> implements IBaseGettersAndSetters<Prop
* @param key the property key you want to get
* @returns the value of property
*/
get<Key extends keyof Props>(key: Props extends object ? (Props extends { [k in Key]: Date } ? Key : 'value') : 'value'): Readonly<Props extends { [k in keyof Props]: Props[k] } ? Readonly<Props[Key]> : Readonly<Props>> {
get<Key extends keyof Props>(
key: Props extends BuiltIns ?
'value' :
Props extends Symbol ?
'value' :
Props extends any[] ?
'value' :
Key
): Props extends BuiltIns ?
Props :
Props extends Symbol ?
string :
Props extends any[] ?
Readonly<Props> :
Props extends {} ?
Readonly<Props[Key]> : Props {
if (this.config.disableGetters) {
const instance = Reflect.getPrototypeOf(this);
throw new Error(`Trying to get key: "${String(key)}" but the getters are deactivated on ${instance?.constructor.name}`);
Expand All @@ -69,6 +85,8 @@ export class BaseGettersAndSetters<Props> implements IBaseGettersAndSetters<Prop
this.validator.isNumber(this.props) ||
this.validator.isString(this.props)

if (this.validator.isSymbol(this.props)) return (this.props as Symbol).description as any;

if (isSimpleValue) return this.props as any;

const isID = this.validator.isID(this.props);
Expand Down
5 changes: 3 additions & 2 deletions lib/types-util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,16 @@ type ReadonlyObjectDeep<ObjectType extends object> = {
readonly [KeyType in keyof ObjectType]: ReadonlyDeep<ObjectType[KeyType]>
};

type Primitive =
export type Primitive =
| null
| undefined
| string
| number
| boolean
| symbol
| bigint;
type BuiltIns = Primitive | void | Date | RegExp;
export type BuiltIns = Primitive | void | Date | RegExp;

/**
* @description Deeply readonly object.
* @link https://github.com/sindresorhus/type-fest/blob/main/source/readonly-deep.d.ts
Expand Down
33 changes: 24 additions & 9 deletions lib/types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Entity, ValueObject } from "./core";
import { ReadonlyDeep } from "./types-util";
import { BuiltIns, ReadonlyDeep } from "./types-util";

export type Event = { detail: any[] };

Expand Down Expand Up @@ -225,7 +225,22 @@ export interface IEntityGettersAndSetters<Props> {
}

export interface IBaseGettersAndSetters<Props> {
get<Key extends keyof Props>(key: Props extends object ? (Props extends { [k in Key]: Date } ? Key : 'value'): 'value'): Readonly<Props extends { [k in keyof Props]: Props[k] } ? Readonly<Props[Key]> : Readonly<Props>>
get<Key extends keyof Props>(
key: Props extends BuiltIns ?
'value' :
Props extends Symbol ?
'value' :
Props extends any[] ?
'value' :
Key
): Props extends BuiltIns ?
Props :
Props extends Symbol ?
string :
Props extends any[] ?
Readonly<Props> :
Props extends {} ?
Readonly<Props[Key]> : Props
getRaw(): Props;
}

Expand Down Expand Up @@ -256,13 +271,13 @@ export type AutoMapperSerializer<Props> = {
? AutoMapperSerializer<SerializerEntityReturnType<Props[key]>> & EntityMapperPayload
: Props[key] extends Array<any>
? Array<
AutoMapperSerializer<ReturnType<Props[key][0]['getRaw']>>
& (
Props[key][0] extends Entity<any>
? EntityMapperPayload
: {}
)
>
AutoMapperSerializer<ReturnType<Props[key][0]['getRaw']>>
& (
Props[key][0] extends Entity<any>
? EntityMapperPayload
: {}
)
>
: Props[key]
}
export interface IAutoMapper<Props> {
Expand Down

0 comments on commit 9cfb437

Please sign in to comment.