{"version":3,"file":"provider-factory.mjs","sources":["../src/provider-factory.ts"],"sourcesContent":["import { cloneDeep } from 'lodash/fp';\nimport {\n  createAsyncSeriesHook,\n  createAsyncParallelHook,\n  AsyncSeriesHook,\n  AsyncParallelHook,\n} from './hooks';\n\nexport interface ProviderHooksMap {\n  willRegister: AsyncSeriesHook;\n  didRegister: AsyncParallelHook;\n  willDelete: AsyncParallelHook;\n  didDelete: AsyncParallelHook;\n}\n\n/**\n * Creates a new object containing various hooks used by the providers\n */\nconst createProviderHooksMap = (): ProviderHooksMap => ({\n  // Register events\n  willRegister: createAsyncSeriesHook(),\n  didRegister: createAsyncParallelHook(),\n  // Delete events\n  willDelete: createAsyncParallelHook(),\n  didDelete: createAsyncParallelHook(),\n});\n\nexport interface Options {\n  throwOnDuplicates?: boolean;\n}\n\ntype Item = Record<string, unknown>;\n\nexport interface Provider<T = unknown> {\n  hooks: ProviderHooksMap;\n  register(key: string, item: T): Promise<Provider>;\n  delete(key: string): Promise<Provider>;\n  get(key: string): T | undefined;\n  values(): T[];\n  keys(): string[];\n  has(key: string): boolean;\n  size(): number;\n  clear(): Promise<Provider<T>>;\n}\n\nexport type ProviderFactory<T> = (options?: Options) => Provider<T>;\n\n/**\n * A Provider factory\n */\nconst providerFactory = <T = Item>(options: Options = {}): Provider<T> => {\n  const { throwOnDuplicates = true } = options;\n\n  const state = {\n    hooks: createProviderHooksMap(),\n    registry: new Map<string, T>(),\n  };\n\n  return {\n    hooks: state.hooks,\n\n    async register(key: string, item: T) {\n      if (throwOnDuplicates && this.has(key)) {\n        throw new Error(`Duplicated item key: ${key}`);\n      }\n\n      await state.hooks.willRegister.call({ key, value: item });\n\n      state.registry.set(key, item);\n\n      await state.hooks.didRegister.call({ key, value: cloneDeep(item) });\n\n      return this;\n    },\n\n    async delete(key: string) {\n      if (this.has(key)) {\n        const item = this.get(key);\n\n        await state.hooks.willDelete.call({ key, value: cloneDeep(item) });\n\n        state.registry.delete(key);\n\n        await state.hooks.didDelete.call({ key, value: cloneDeep(item) });\n      }\n\n      return this;\n    },\n\n    get(key: string) {\n      return state.registry.get(key);\n    },\n\n    values() {\n      return Array.from(state.registry.values());\n    },\n\n    keys() {\n      return Array.from(state.registry.keys());\n    },\n\n    has(key: string) {\n      return state.registry.has(key);\n    },\n\n    size() {\n      return state.registry.size;\n    },\n\n    async clear() {\n      const keys = this.keys();\n\n      for (const key of keys) {\n        await this.delete(key);\n      }\n\n      return this;\n    },\n  };\n};\n\nexport default providerFactory;\n"],"names":["createProviderHooksMap","willRegister","createAsyncSeriesHook","didRegister","createAsyncParallelHook","willDelete","didDelete","providerFactory","options","throwOnDuplicates","state","hooks","registry","Map","register","key","item","has","Error","call","value","set","cloneDeep","delete","get","values","Array","from","keys","size","clear"],"mappings":"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"}