{ "version": 3, "sources": ["src/utils/builders/builder.ts"], "sourcesContent": ["export type IBuilder = {\n [k in keyof T]-?: ((arg: T[k]) => IBuilder) & (() => T[k]);\n}\n& {\n build(): T;\n};\n\ntype BuilderClass = new(...args: unknown[]) => T;\n\n/**\n * Create a Builder for a class. Returned objects will be of the class type.\n *\n * e.g. let obj: MyClass = Builder(MyClass).setA(5).setB(\"str\").build();\n *\n * @param type the name of the class to instantiate.\n * @param template optional class partial which the builder will derive initial params from.\n * @param override optional class partial which the builder will override params from when calling build().\n */\nexport function Builder(type: BuilderClass, template?: Partial | null, override?: Partial | null): IBuilder;\n\n/**\n * Create a Builder for an interface. Returned objects will be untyped.\n *\n * e.g. let obj: Interface = Builder().setA(5).setB(\"str\").build();\n *\n * @param template optional partial object which the builder will derive initial params from.\n * @param override optional partial object which the builder will override params from when calling build().\n */\nexport function Builder(template?: Partial | null, override?: Partial | null): IBuilder;\n\nexport function Builder(typeOrTemplate?: BuilderClass | Partial | null,\n templateOrOverride?: Partial | null,\n override?: Partial | null): IBuilder {\n let type: BuilderClass | undefined;\n let template: Partial | null | undefined;\n let overrideValues: Partial | null | undefined;\n\n if (typeOrTemplate instanceof Function) {\n type = typeOrTemplate;\n template = templateOrOverride;\n overrideValues = override;\n } else {\n template = typeOrTemplate;\n overrideValues = templateOrOverride;\n }\n\n const built: Record = template ? Object.assign({}, template) : {};\n\n const builder = new Proxy(\n {},\n {\n get(target, prop) {\n if ('build' === prop) {\n if (overrideValues) {\n Object.assign(built, overrideValues);\n }\n\n if (type) {\n // A class name (identified by the constructor) was passed. Instantiate it with props.\n const obj: T = new type();\n return () => Object.assign(obj as T & Record, {...built});\n } else {\n // No type information - just return the object.\n return () => built;\n }\n }\n\n return (...args: unknown[]): unknown => {\n // If no arguments passed return current value.\n if (0 === args.length) {\n return built[prop.toString()];\n }\n\n built[prop.toString()] = args[0];\n return builder;\n };\n }\n }\n );\n\n return builder as IBuilder;\n}\n"], "mappings": "wCA8BM,SAAUA,EAAWC,EACvBC,EACAC,EAA4B,CAC5B,IAAIC,EACAC,EACAC,EAEAL,aAA0BM,UAC1BH,EAAOH,EACPI,EAAWH,EACXI,EAAiBH,IAEjBE,EAAWJ,EACXK,EAAiBJ,GAGrB,IAAMM,EAAiCH,EAAWI,OAAOC,OAAO,CAAA,EAAIL,CAAQ,EAAI,CAAA,EAE1EM,EAAU,IAAIC,MAChB,CAAA,EACA,CACIC,IAAIC,EAAQC,EAAI,CACZ,GAAgBA,IAAZ,QAKA,GAJIT,GACAG,OAAOC,OAAOF,EAAOF,CAAc,EAGnCF,EAAM,CAEN,IAAMY,EAAS,IAAIZ,EACnB,MAAO,IAAMK,OAAOC,OAAOM,EAAoCC,EAAA,GAAIT,EAAM,CAC7E,KAEI,OAAO,IAAMA,EAIrB,MAAO,IAAIU,IAEGA,EAAKC,SAAX,EACOX,EAAMO,EAAKK,SAAQ,CAAE,GAGhCZ,EAAMO,EAAKK,SAAQ,CAAE,EAAIF,EAAK,CAAC,EACxBP,EAEf,EACH,EAGL,OAAOA,CACX", "names": ["Builder", "typeOrTemplate", "templateOrOverride", "override", "type", "template", "overrideValues", "Function", "built", "Object", "assign", "builder", "Proxy", "get", "target", "prop", "obj", "__spreadValues", "args", "length", "toString"] }