UNPKG

@synstack/enhance

Version:

Type-safe object enhancement with proxy-based method extension

1 lines 2.48 kB
{"version":3,"sources":["../src/enhance.index.ts","../src/enhance.lib.ts"],"sourcesContent":["export * from \"./enhance.lib.ts\";\n","export const ENHANCER_NAME = Symbol(\"EnhancerName\");\n\n// The order of the types is important as it affects overriding\nexport type Enhanced<\n TName extends string,\n TBaseObject extends object,\n TExtension extends object,\n> = { $: TBaseObject; [ENHANCER_NAME]: TName } & TExtension & TBaseObject;\n\nexport const enhance = <\n TName extends string,\n TBaseObject extends object | (object & { [ENHANCER_NAME]: TName; $: object }),\n TExtension extends object,\n>(\n name: TName,\n obj: TBaseObject,\n extendObj: TExtension,\n) => {\n // If the object is already enhanced, we use the original object\n const _obj =\n ENHANCER_NAME in obj && obj[ENHANCER_NAME] === name ? obj.$ : obj;\n return new Proxy(_obj, {\n get(target: TBaseObject, prop: string | number | symbol, receiver: any) {\n // We add a $ property to the base object to allow access to the original object\n if (prop === \"$\" || prop === \"valueOf\" || prop === Symbol.toPrimitive)\n return () => _obj;\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n if (prop === \"toString\") return () => obj.toString();\n if (prop === ENHANCER_NAME) return name;\n if (prop in extendObj)\n // @ts-expect-error - We know that the property exists\n return extendObj[prop].bind(target);\n\n return Reflect.get(target, prop, receiver);\n },\n }) as unknown as Enhanced<TName, TBaseObject, TExtension>;\n};\n\nexport const enhanceFactory =\n <TName extends string, TExtension extends object>(\n name: TName,\n extendObj: TExtension,\n ) =>\n <\n TBaseObject extends\n | object\n | (object & { [ENHANCER_NAME]: TName; $: object }),\n >(\n obj: TBaseObject,\n ) =>\n enhance(name, obj, extendObj);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,gBAAgB,OAAO,cAAc;AAS3C,IAAM,UAAU,CAKrB,MACA,KACA,cACG;AAEH,QAAM,OACJ,iBAAiB,OAAO,IAAI,aAAa,MAAM,OAAO,IAAI,IAAI;AAChE,SAAO,IAAI,MAAM,MAAM;AAAA,IACrB,IAAI,QAAqB,MAAgC,UAAe;AAEtE,UAAI,SAAS,OAAO,SAAS,aAAa,SAAS,OAAO;AACxD,eAAO,MAAM;AAEf,UAAI,SAAS,WAAY,QAAO,MAAM,IAAI,SAAS;AACnD,UAAI,SAAS,cAAe,QAAO;AACnC,UAAI,QAAQ;AAEV,eAAO,UAAU,IAAI,EAAE,KAAK,MAAM;AAEpC,aAAO,QAAQ,IAAI,QAAQ,MAAM,QAAQ;AAAA,IAC3C;AAAA,EACF,CAAC;AACH;AAEO,IAAM,iBACX,CACE,MACA,cAEF,CAKE,QAEA,QAAQ,MAAM,KAAK,SAAS;","names":[]}