{"version":3,"sources":["../src/service/resolve-file.service.ts","../src/utils/function/is-object.ts","../src/definition/guard/is-dynamic-provider-options.ts","../src/definition/guard/is-pattern.ts","../src/decorator/inject-dynamic-providers.ts"],"sourcesContent":["import { DynamicProviderOptions } from '../definition/dynamic-provider-options';\nimport { ResolvedTypeProviders } from '../definition/resolved-type-providers';\nimport { SCOPE_OPTIONS_METADATA } from '@nestjs/common/constants';\nimport { Type } from '@nestjs/common';\nimport { glob } from 'glob';\nimport { IsObject } from '../utils/function/is-object';\nimport * as path from 'path';\n\nexport class ResolveFileService {\n  async resolveByGlobPattern(\n    startupPath: string,\n    options: DynamicProviderOptions[],\n  ): Promise<ResolvedTypeProviders[]> {\n    const classesList = await Promise.all(\n      options.map(({ pattern, exportProviders, filterPredicate, scope }) =>\n        glob(pattern, { cwd: startupPath }).then(async (pathToFiles) => {\n          const types = (\n            await this.getClasses(startupPath, pathToFiles)\n          ).flat();\n\n          if (!filterPredicate)\n            filterPredicate = (type) =>\n              IsObject(type) &&\n              Reflect.hasOwnMetadata(SCOPE_OPTIONS_METADATA, type);\n\n          return {\n            types: types.filter(filterPredicate),\n            exportProviders,\n            scope,\n          };\n        }),\n      ),\n    );\n\n    return classesList.flat();\n  }\n\n  private getClasses(\n    startupPath: string,\n    pathToFiles: string[],\n  ): Promise<Type[][]> {\n    return Promise.all(\n      pathToFiles.map(async (pathToFile: string) => {\n        const resolvedPath = path.resolve(startupPath, pathToFile);\n        const resolvedClass = await import(resolvedPath);\n\n        return Object.values<Type>(resolvedClass);\n      }),\n    );\n  }\n}\n","export function IsObject(instance: any): instance is object {\n  return typeof instance === 'object'\n    ? instance !== null\n    : typeof instance === 'function';\n}\n","import { DynamicProviderOptions } from '../dynamic-provider-options';\n\nexport function isDynamicProviderOptions(\n  param: any[],\n): param is DynamicProviderOptions[] {\n  return typeof param[0] === 'object';\n}\n","import { Pattern } from '../pattern';\n\nexport function isPattern(param: any[]): param is Pattern[] {\n  return typeof param[0] === 'string';\n}\n","import { Provider, Scope, Type, ClassProvider } from '@nestjs/common';\nimport { Pattern } from '../definition/pattern';\nimport { StoreValue } from '../definition/store-value';\nimport { DynamicProviderOptions } from '../definition/dynamic-provider-options';\nimport { ResolveFileService } from '../service/resolve-file.service';\nimport { isDynamicProviderOptions } from '../definition/guard/is-dynamic-provider-options';\nimport { isPattern } from '../definition/guard/is-pattern';\nimport * as process from 'process';\n\nconst store: StoreValue[] = [];\n\n/**\n * Add providers into module by glob pattern.\n */\nexport function InjectDynamicProviders(\n  ...options: DynamicProviderOptions[]\n): ClassDecorator;\nexport function InjectDynamicProviders(...patterns: Pattern[]): ClassDecorator;\nexport function InjectDynamicProviders(...options: any[]): ClassDecorator {\n  return <TFunction extends Function>(target: TFunction): TFunction => {\n    if (isDynamicProviderOptions(options)) store.push({ target, options });\n    if (isPattern(options))\n      store.push({ target, options: options.map((pattern) => ({ pattern })) });\n\n    return target;\n  };\n}\n\n/**\n * Init function.\n */\nexport async function resolveDynamicProviders(\n  startupPath = process.cwd(),\n): Promise<void> {\n  const resolveFileService = new ResolveFileService();\n\n  await Promise.all(\n    store.map(async ({ target, options }) => {\n      const resolvedProviders = await resolveFileService.resolveByGlobPattern(\n        startupPath,\n        options,\n      );\n\n      resolvedProviders.forEach(({ types, exportProviders, scope }) => {\n        mergeProviders(target, types, scope);\n        if (exportProviders) {\n          mergeExportedProviders(target, types);\n        }\n      });\n    }),\n  );\n}\n\nfunction mergeProviders(\n  target: Function,\n  newProviderTypes: Type[],\n  scope?: Scope,\n): void {\n  const currentProviders = Reflect.getMetadata('providers', target) ?? [];\n  const newProviders: (Provider | ClassProvider)[] = scope\n    ? newProviderTypes.map<ClassProvider>((newClassType) => ({\n        provide: newClassType,\n        useClass: newClassType,\n        scope,\n      }))\n    : newProviderTypes;\n\n  Reflect.defineMetadata(\n    'providers',\n    [...currentProviders, ...newProviders],\n    target,\n  );\n}\n\nfunction mergeExportedProviders(\n  target: Function,\n  newExportedProviders: Type[],\n): void {\n  const currentExportedProviders = Reflect.getMetadata('exports', target) ?? [];\n  Reflect.defineMetadata(\n    'exports',\n    [...currentExportedProviders, ...newExportedProviders],\n    target,\n  );\n}\n"],"mappings":"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","names":["SCOPE_OPTIONS_METADATA","glob","IsObject","instance","path","ResolveFileService","resolveByGlobPattern","startupPath","options","classesList","Promise","all","map","pattern","exportProviders","filterPredicate","scope","glob","cwd","then","pathToFiles","types","getClasses","flat","type","IsObject","Reflect","hasOwnMetadata","SCOPE_OPTIONS_METADATA","filter","pathToFile","resolvedPath","resolve","resolvedClass","Object","values","isDynamicProviderOptions","param","isPattern","param","process","store","InjectDynamicProviders","options","target","isDynamicProviderOptions","push","isPattern","map","pattern","resolveDynamicProviders","startupPath","cwd","resolveFileService","ResolveFileService","Promise","all","resolvedProviders","resolveByGlobPattern","forEach","types","exportProviders","scope","mergeProviders","mergeExportedProviders","newProviderTypes","currentProviders","Reflect","getMetadata","newProviders","newClassType","provide","useClass","defineMetadata","newExportedProviders","currentExportedProviders"]}