{"version":3,"sources":["jsdelivr-header.js","/npm/@testingrequired/ioc@0.1.0/src/index.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,qpBCNwD,gBAAzC,iCAAU,mCAAW,6BAAQ,+BAE/B,QAAU,SAEV,SAAW,SAExB,SAAgB,gB,IACR,EAAY,IAAI,IAChB,EAAY,IAAI,IAChB,EAAU,IAAI,IAEd,EAAW,SAAC,EAAc,EAAS,G,IAuEjB,EAtEtB,EAAU,IAAI,EAAc,IAsEN,EAtEgC,EAuE/C,W,OAAM,IAAI,C,IAtEjB,EAAU,IAAI,EAAc,EAAe,IAC3C,EAAQ,IAAI,EAAc,E,EAGtB,EAAY,W,IAAC,EAA6B,UAAA,OAAA,QAAA,IAAA,UAAA,GAAA,UAAA,GAAP,GACjC,EAAe,SAAA,G,OAAW,SAAA,G,OAC9B,EAAS,EAAW,KAAM,E,MA4DO,eA1DlB,EA0DN,OAAO,aA1DqB,C,GACJ,UAA7B,EAAoB,KACtB,MAAM,IAAI,MAAM,yC,wBAEC,EAEnB,CAAwB,SAAU,K,KAE5B,EAAU,E,OAET,SAAA,G,GACmB,UAApB,EAAW,KACb,MAAM,IAAI,MAAM,yC,wBAGb,EADL,CAEE,SAAU,EAAa,I,GAM/B,EAAU,QAAU,SAAA,G,OAAQ,EAAU,CAAE,SAAU,SAAtB,CAAiC,E,EAC7D,EAAU,SAAW,SAAA,G,OAAQ,EAAU,CAAE,SAAU,UAAtB,CAAkC,E,MAEzD,EAAU,SAAA,G,IACR,EAAO,EAAQ,IAAI,IAAiB,CAAE,SAAU,S,OAE9C,EAAK,U,KACN,Q,OACI,EAAU,IAAI,GACjB,EAAU,IAAI,GACd,EAAe,G,KAChB,S,OACI,EAAe,G,cAEhB,IAAI,MAAJ,4BAAA,OAAsC,EAAK,W,WA6B9C,EAAe,G,QAEd,EAAY,EAAU,IAAI,GAAc,KAAK,M,OAC5C,EAAU,MAAQ,EAAU,MAAQ,C,CAC3C,MAAO,G,MACD,IAAI,MAAJ,iCAAA,OAA2C,EAA3C,MAAA,OAA4D,G,QAI/D,CAAE,WAAU,YAAW,OAlCf,SAAA,G,OAAgB,SAAA,G,IACrB,EAA2B,EAA3B,KAAM,EAAqB,EAArB,IAAK,EAAgB,EAAhB,Y,GAEN,UAAT,EAAkB,MAAM,IAAI,MAAM,qC,MAE/B,CACL,MACA,cACA,KAAM,SACN,UAAW,MACX,WAAY,CACV,YAAY,EACZ,IAAK,W,OAAM,EAAQ,E,MAsBa,U","file":"/npm/@testingrequired/ioc@0.1.0/dist/ioc.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@testingrequired/ioc@0.1.0/dist/ioc.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 const { register, component, inject, resolve } = makeContainer();\r\n\r\nexport const session = Symbol();\r\n\r\nexport const instance = Symbol();\r\n\r\nexport function makeContainer() {\r\n  const instances = new Map();\r\n  const factories = new Map();\r\n  const options = new Map();\r\n\r\n  const register = (componentKey, factory, opts) => {\r\n    factories.set(componentKey, factory || defaultFactory(componentKey));\r\n    instances.set(componentKey, createInstance(componentKey));\r\n    options.set(componentKey, opts);\r\n  };\r\n\r\n  const component = (optionsOrDescriptor = {}) => {\r\n    const makeFinisher = options => Component =>\r\n      register(Component, null, options);\r\n\r\n    if (isDescriptor(optionsOrDescriptor)) {\r\n      if (optionsOrDescriptor.kind !== \"class\")\r\n        throw new Error(\"component can only be used on classes\");\r\n\r\n      const descriptor = optionsOrDescriptor;\r\n\r\n      return { ...descriptor, finisher: makeFinisher() };\r\n    } else {\r\n      const options = optionsOrDescriptor;\r\n\r\n      return descriptor => {\r\n        if (descriptor.kind !== \"class\")\r\n          throw new Error(\"component can only be used on classes\");\r\n\r\n        return {\r\n          ...descriptor,\r\n          finisher: makeFinisher(options)\r\n        };\r\n      };\r\n    }\r\n  };\r\n\r\n  component.session = desc => component({ lifetime: session })(desc);\r\n  component.instance = desc => component({ lifetime: instance })(desc);\r\n\r\n  const resolve = componentKey => {\r\n    const opts = options.get(componentKey) || { lifetime: session };\r\n\r\n    switch (opts.lifetime) {\r\n      case session:\r\n        return instances.has(componentKey)\r\n          ? instances.get(componentKey)\r\n          : createInstance(componentKey);\r\n      case instance:\r\n        return createInstance(componentKey);\r\n      default:\r\n        throw new Error(`Invalid lifetime option: ${opts.lifetime}`);\r\n    }\r\n  };\r\n\r\n  const inject = componentKey => element => {\r\n    const { kind, key, initializer } = element;\r\n\r\n    if (kind !== \"field\") throw new Error(\"Inject can only be used on fields\");\r\n\r\n    return {\r\n      key,\r\n      initializer,\r\n      kind: \"method\",\r\n      placement: \"own\",\r\n      descriptor: {\r\n        enumerable: true,\r\n        get: () => resolve(componentKey)\r\n      }\r\n    };\r\n  };\r\n\r\n  function isDescriptor(obj) {\r\n    return obj[Symbol.toStringTag] === \"Descriptor\";\r\n  }\r\n\r\n  function defaultFactory(Component) {\r\n    return () => new Component();\r\n  }\r\n\r\n  function createInstance(componentKey) {\r\n    try {\r\n      const component = factories.get(componentKey).call(null);\r\n      return component.value ? component.value : component;\r\n    } catch (e) {\r\n      throw new Error(`Error when creating instance: ${componentKey}\\n${e}`);\r\n    }\r\n  }\r\n\r\n  return { register, component, inject, resolve };\r\n}\r\n"]}