{"version":3,"sources":["jsdelivr-header.js","/npm/builder-pattern@2.2.0/src/index.ts","/npm/builder-pattern@2.2.0/src/Builder.ts","/npm/builder-pattern@2.2.0/src/StrictBuilder.ts"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,8iBCNA,YAAA,GC8BO,SAAS,QAAW,EACA,EACA,GACzB,IAAI,EACA,EACA,EAEA,aAA0B,UAC5B,EAAO,EACP,EAAW,EACX,EAAiB,IAEjB,EAAW,EACX,EAAiB,GAGnB,MAAM,EAAiC,EAAW,OAAO,OAAO,CAAC,EAAG,GAAY,CAAC,EAE3E,EAAU,IAAI,MAClB,CAAC,EACD,CACE,GAAA,CAAI,EAAQ,GACV,GAAI,UAAY,EAAM,CAKpB,GAJI,GACF,OAAO,OAAO,EAAO,GAGnB,EAAM,CAER,MAAM,EAAS,IAAI,EACnB,MAAO,IAAM,OAAO,OAAO,EAAoC,IAAI,GACrE,CAEE,MAAO,IAAM,CAEjB,CAEA,MAAO,IAAI,IAEL,IAAM,EAAK,OACN,EAAM,EAAK,aAGpB,EAAM,EAAK,YAAc,EAAK,GACvB,EAEX,IAIJ,OAAO,CACT,CCpEO,SAAS,gBAEd,MAAM,EAAiC,CAAC,EAElC,EAAgB,IAAI,MACxB,CAAC,EACD,CACE,IAAA,CAAI,EAAQ,IACN,UAAY,EACP,IAAM,EAGR,IAAI,IAEL,IAAM,EAAK,OACN,EAAM,EAAK,aAGpB,EAAM,EAAK,YAAc,EAAK,GACvB,KAMf,OAAO,CACT,CFvCA,SAAA,YAAA,CAAA,QAAA,IAAA,QAAA,cAAA,IAAA,gBAAA,OAAA,QAAA,aAAA","file":"/npm/builder-pattern@2.2.0/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/builder-pattern@2.2.0/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","export * from './Builder';\r\nexport * from './StrictBuilder';\r\n","export type IBuilder<T> = {\r\n  [k in keyof T]-?: ((arg: T[k]) => IBuilder<T>) & (() => T[k]);\r\n}\r\n& {\r\n  build(): T;\r\n};\r\n\r\ntype Clazz<T> = new(...args: unknown[]) => T;\r\n\r\n/**\r\n * Create a Builder for a class. Returned objects will be of the class type.\r\n *\r\n * e.g. let obj: MyClass = Builder(MyClass).setA(5).setB(\"str\").build();\r\n *\r\n * @param type the name of the class to instantiate.\r\n * @param template optional class partial which the builder will derive initial params from.\r\n * @param override optional class partial which the builder will override params from when calling build().\r\n */\r\nexport function Builder<T>(type: Clazz<T>, template?: Partial<T> | null, override?: Partial<T> | null): IBuilder<T>;\r\n\r\n/**\r\n * Create a Builder for an interface. Returned objects will be untyped.\r\n *\r\n * e.g. let obj: Interface = Builder<Interface>().setA(5).setB(\"str\").build();\r\n *\r\n * @param template optional partial object which the builder will derive initial params from.\r\n * @param override optional partial object which the builder will override params from when calling build().\r\n */\r\nexport function Builder<T>(template?: Partial<T> | null, override?: Partial<T> | null): IBuilder<T>;\r\n\r\nexport function Builder<T>(typeOrTemplate?: Clazz<T> | Partial<T> | null,\r\n                           templateOrOverride?: Partial<T> | null,\r\n                           override?: Partial<T> | null): IBuilder<T> {\r\n  let type: Clazz<T> | undefined;\r\n  let template: Partial<T> | null | undefined;\r\n  let overrideValues: Partial<T> | null | undefined;\r\n\r\n  if (typeOrTemplate instanceof Function) {\r\n    type = typeOrTemplate;\r\n    template = templateOrOverride;\r\n    overrideValues = override;\r\n  } else {\r\n    template = typeOrTemplate;\r\n    overrideValues = templateOrOverride;\r\n  }\r\n\r\n  const built: Record<string, unknown> = template ? Object.assign({}, template) : {};\r\n\r\n  const builder = new Proxy(\r\n    {},\r\n    {\r\n      get(target, prop) {\r\n        if ('build' === prop) {\r\n          if (overrideValues) {\r\n            Object.assign(built, overrideValues);\r\n          }\r\n\r\n          if (type) {\r\n            // A class name (identified by the constructor) was passed. Instantiate it with props.\r\n            const obj: T = new type();\r\n            return () => Object.assign(obj as T & Record<string, unknown>, {...built});\r\n          } else {\r\n            // No type information - just return the object.\r\n            return () => built;\r\n          }\r\n        }\r\n\r\n        return (...args: unknown[]): unknown => {\r\n          // If no arguments passed return current value.\r\n          if (0 === args.length) {\r\n            return built[prop.toString()];\r\n          }\r\n          \r\n          built[prop.toString()] = args[0];\r\n          return builder;\r\n        };\r\n      }\r\n    }\r\n  );\r\n\r\n  return builder as IBuilder<T>;\r\n}\r\n","export type IStrictBuilder<T, B = Record<string, unknown>> = {\r\n  [k in keyof T]-?: ((arg: T[k]) => IStrictBuilder<T, B & Record<k, T[k]>>) & (() => T[k]);\r\n}\r\n& {\r\n  build: B extends T ? () => T : never\r\n};\r\n\r\n/**\r\n * Create a StrictBuilder for an interface. Returned objects will be untyped.\r\n *\r\n * e.g. let obj: Interface = StrictBuilder<Interface>().setA(5).setB(\"str\").build();\r\n *\r\n */\r\nexport function StrictBuilder<T>(): IStrictBuilder<T> {\r\n\r\n  const built: Record<string, unknown> = {};\r\n\r\n  const strictbuilder = new Proxy(\r\n    {},\r\n    {\r\n      get(target, prop) {\r\n        if ('build' === prop) {\r\n          return () => built;\r\n        }\r\n\r\n        return (...args: unknown[]): unknown => {\r\n          // If no arguments passed return current value.\r\n          if (0 === args.length) {\r\n            return built[prop.toString()];\r\n          }\r\n          \r\n          built[prop.toString()] = args[0];\r\n          return strictbuilder as IStrictBuilder<T>;\r\n        };\r\n      }\r\n    }\r\n  );\r\n\r\n  return strictbuilder as IStrictBuilder<T>;\r\n}\r\n"]}