@thisisagile/easy
Version:
Straightforward library for building domain-driven microservice architectures
1 lines • 3.85 kB
Source Map (JSON)
{"version":3,"sources":["../src/types/Meta.ts"],"sourcesContent":["import 'reflect-metadata';\nimport { List, toList } from './List';\nimport { isDefined } from './Is';\nimport { on, use } from './Constructor';\nimport { Optional } from './Types';\nimport { Entry, entries, values } from './Object';\n\ntype MetaParseOptions = { initial?: any; skipUndefined?: boolean };\n\nclass ClassMeta {\n constructor(\n readonly subject: any,\n private readonly data: any = (subject.prototype ?? subject).constructor\n ) {}\n\n get = <T>(key: string): T => Reflect.getMetadata(key, this.data) as T;\n\n set = <T>(key: string, value: T): T => {\n Reflect.defineMetadata(key, value, this.data);\n return value;\n };\n\n entries = <T = unknown>(): List<Entry<T>> => entries<T>(this.subject);\n\n parse = <Out, Value>(f: (v: Value) => Out, options: MetaParseOptions = {}): Record<string, Out> => {\n const { initial = {}, skipUndefined = false } = options;\n return this.entries<Value>().reduce((a, [k, val]) => use(f(val), v => (isDefined(v) || !skipUndefined ? on(a, a => (a[k] = v)) : a)), initial);\n };\n\n properties = (key?: string): List<PropertyMeta> =>\n toList([...Object.getOwnPropertyNames(this.subject), ...Object.getOwnPropertyNames(Object.getPrototypeOf(this.subject))])\n .map(p => this.property(p))\n .filter(p => (key ? p.get(key) : p));\n\n keys = <T = any>(key: string): List<T> =>\n this.properties()\n .map(p => p.get<T>(key))\n .reduce((list, u) => (u ? list.add(u) : list), toList<T>());\n\n values = <T = unknown>(): List<T> => values<T>(this.subject);\n\n property = (property: string | symbol): PropertyMeta => new PropertyMeta(this.subject, property);\n}\n\nclass PropertyMeta {\n constructor(\n readonly subject: any,\n readonly property: string | symbol,\n private readonly data = Reflect.getMetadata(property, subject)\n ) {}\n\n get value(): any {\n return this.subject[this.property];\n }\n\n get = <T>(key: string): Optional<T> => (isDefined(this.data) && isDefined(this.data[key]) ? (this.data[key] as T) : undefined);\n\n set = <T>(key: string, value: T): T => {\n Reflect.defineMetadata(this.property, { ...this.data, [key]: value }, this.subject);\n return value;\n };\n}\n\nexport const meta = (subject: unknown): ClassMeta => new ClassMeta(subject ?? {});\n"],"mappings":";;;;;;;;;;;;;;;;AAAA,OAAO;AASP,IAAM,YAAN,MAAgB;AAAA,EACd,YACW,SACQ,QAAa,QAAQ,aAAa,SAAS,aAC5D;AAFS;AACQ;AAAA,EAChB;AAAA,EAEH,MAAM,CAAI,QAAmB,QAAQ,YAAY,KAAK,KAAK,IAAI;AAAA,EAE/D,MAAM,CAAI,KAAa,UAAgB;AACrC,YAAQ,eAAe,KAAK,OAAO,KAAK,IAAI;AAC5C,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,MAAmC,QAAW,KAAK,OAAO;AAAA,EAEpE,QAAQ,CAAa,GAAsB,UAA4B,CAAC,MAA2B;AACjG,UAAM,EAAE,UAAU,CAAC,GAAG,gBAAgB,MAAM,IAAI;AAChD,WAAO,KAAK,QAAe,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,MAAM,IAAI,EAAE,GAAG,GAAG,OAAM,UAAU,CAAC,KAAK,CAAC,gBAAgB,GAAG,GAAG,CAAAA,OAAMA,GAAE,CAAC,IAAI,CAAE,IAAI,CAAE,GAAG,OAAO;AAAA,EAC/I;AAAA,EAEA,aAAa,CAAC,QACZ,OAAO,CAAC,GAAG,OAAO,oBAAoB,KAAK,OAAO,GAAG,GAAG,OAAO,oBAAoB,OAAO,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,EACrH,IAAI,OAAK,KAAK,SAAS,CAAC,CAAC,EACzB,OAAO,OAAM,MAAM,EAAE,IAAI,GAAG,IAAI,CAAE;AAAA,EAEvC,OAAO,CAAU,QACf,KAAK,WAAW,EACb,IAAI,OAAK,EAAE,IAAO,GAAG,CAAC,EACtB,OAAO,CAAC,MAAM,MAAO,IAAI,KAAK,IAAI,CAAC,IAAI,MAAO,OAAU,CAAC;AAAA,EAE9D,SAAS,MAA4B,OAAU,KAAK,OAAO;AAAA,EAE3D,WAAW,CAAC,aAA4C,IAAI,aAAa,KAAK,SAAS,QAAQ;AACjG;AAEA,IAAM,eAAN,MAAmB;AAAA,EACjB,YACW,SACA,UACQ,OAAO,QAAQ,YAAY,UAAU,OAAO,GAC7D;AAHS;AACA;AACQ;AAAA,EAChB;AAAA,EAEH,IAAI,QAAa;AACf,WAAO,KAAK,QAAQ,KAAK,QAAQ;AAAA,EACnC;AAAA,EAEA,MAAM,CAAI,QAA8B,UAAU,KAAK,IAAI,KAAK,UAAU,KAAK,KAAK,GAAG,CAAC,IAAK,KAAK,KAAK,GAAG,IAAU;AAAA,EAEpH,MAAM,CAAI,KAAa,UAAgB;AACrC,YAAQ,eAAe,KAAK,UAAU,EAAE,GAAG,KAAK,MAAM,CAAC,GAAG,GAAG,MAAM,GAAG,KAAK,OAAO;AAClF,WAAO;AAAA,EACT;AACF;AAEO,IAAM,OAAO,CAAC,YAAgC,IAAI,UAAU,WAAW,CAAC,CAAC;","names":["a"]}