{"version":3,"file":"kyosho--ng-config.mjs","sources":["../../../projects/ng-config/src/lib/config-options.ts","../../../projects/ng-config/src/lib/config-provider.ts","../../../projects/ng-config/src/lib/logger.ts","../../../projects/ng-config/src/lib/util.ts","../../../projects/ng-config/src/lib/config.service.ts","../../../projects/ng-config/src/lib/config.module.ts","../../../projects/ng-config/src/lib/config-value.ts","../../../projects/ng-config/src/public-api.ts","../../../projects/ng-config/src/kyosho--ng-config.ts"],"sourcesContent":["/**\n * @license\n * Copyright DagonMetric. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found under the LICENSE file in the root directory of this source tree.\n */\n\nimport { InjectionToken } from '@angular/core';\n\n/**\n * Options interface for `ConfigService`.\n */\nexport interface ConfigOptions {\n    /**\n     * Set true to log debug information.\n     */\n    debug?: boolean;\n}\n\nexport const CONFIG_OPTIONS = new InjectionToken<ConfigOptions>('ConfigOptions');\n","/**\n * @license\n * Copyright DagonMetric. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found under the LICENSE file in the root directory of this source tree.\n */\n\nimport { InjectionToken } from '@angular/core';\n\nimport { Observable } from 'rxjs';\n\nimport { ConfigSection } from './config-value';\n\n/**\n * The ConfigProvider interface.\n */\nexport interface ConfigProvider {\n    /**\n     * The name of the provider.\n     */\n    readonly name: string;\n    /**\n     * Fetch method for loading configuration.\n     */\n    load(): Observable<ConfigSection>;\n}\n\nexport const CONFIG_PROVIDER = new InjectionToken<ConfigProvider>('ConfigProvider');\n","/**\n * @license\n * Copyright DagonMetric. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found under the LICENSE file in the root directory of this source tree.\n */\n\nimport { InjectionToken } from '@angular/core';\n\n/**\n * Custom logger interface for debug information.\n */\nexport interface Logger {\n    debug(message: string, data?: { [key: string]: unknown }): void;\n}\n\nexport const NG_CONFIG_LOGGER = new InjectionToken<Logger>('NG-CONFIG Logger');\n","import { ConfigSection, ConfigValue } from './config-value';\n\nexport function mapOptionValues(options: ConfigSection, configSection: ConfigSection): void {\n    const keys = Object.keys(options);\n    for (const key of keys) {\n        if (!Object.prototype.hasOwnProperty.call(configSection, key)) {\n            continue;\n        }\n\n        // const popDescriptor = Object.getOwnPropertyDescriptor(options, key);\n        // if (!popDescriptor?.writable) {\n        //     continue;\n        // }\n\n        const optionsValue = options[key];\n        const configValue = configSection[key];\n\n        if (configValue == null) {\n            options[key] = null;\n            continue;\n        }\n\n        if (optionsValue == null) {\n            options[key] = configValue;\n            continue;\n        }\n\n        if (optionsValue === configValue) {\n            continue;\n        }\n\n        if (typeof optionsValue === 'string') {\n            if (typeof configValue === 'string') {\n                options[key] = configValue;\n            } else {\n                options[key] = JSON.stringify(configValue);\n            }\n        } else if (typeof optionsValue === 'boolean') {\n            if (typeof configValue === 'boolean') {\n                options[key] = configValue;\n            } else if (typeof configValue === 'string') {\n                options[key] = ['true', '1', 'on', 'yes'].indexOf(configValue.toLowerCase()) > -1;\n            } else if (typeof configValue === 'number') {\n                options[key] = configValue === 1;\n            } else {\n                options[key] = false;\n            }\n        } else if (typeof optionsValue === 'number') {\n            options[key] = Number(configValue) || 0;\n        } else if (Array.isArray(optionsValue)) {\n            if (Array.isArray(configValue)) {\n                if (\n                    configValue.length > 0 &&\n                    configValue.filter((v) => typeof v == 'string').length === configValue.length\n                ) {\n                    options[key] = [...configValue];\n                } else {\n                    options[key] = [];\n                }\n            } else if (typeof configValue === 'string') {\n                options[key] = configValue\n                    .split(';')\n                    .map((s) => s.trim())\n                    .filter((s) => s.length > 0);\n            }\n        } else if (\n            typeof optionsValue === 'object' &&\n            Object.prototype.toString.call(optionsValue) !== '[object Date]'\n        ) {\n            if (!Array.isArray(configValue) && typeof configValue === 'object') {\n                mapOptionValues(optionsValue, configValue);\n            }\n        }\n    }\n}\n\nexport function equalDeep(a: ConfigValue, b: ConfigValue): boolean {\n    if (a === null && b === null) {\n        return true;\n    }\n\n    if (Array.isArray(a)) {\n        if (!b || !Array.isArray(b)) {\n            return false;\n        }\n\n        if (a.length !== b.length) {\n            return false;\n        }\n\n        for (let i = a.length - 1; i >= 0; i--) {\n            if (!equalDeep(a[i], b[i])) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    if (Array.isArray(b)) {\n        return false;\n    }\n\n    if (a && b && typeof a == 'object' && typeof b == 'object') {\n        const keys = Object.keys(a);\n        if (keys.length !== Object.keys(b).length) {\n            return false;\n        }\n\n        for (const key of keys) {\n            if (!equalDeep(a[key], b[key])) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    return a === b;\n}\n","/**\n * @license\n * Copyright DagonMetric. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found under the LICENSE file in the root directory of this source tree.\n */\n\nimport {\n  EventEmitter,\n  Inject,\n  Injectable,\n  Injector,\n  Optional,\n} from '@angular/core';\n\nimport { Observable, Subscription, forkJoin, of } from 'rxjs';\nimport { map, mapTo, share, take, tap } from 'rxjs/operators';\n\nimport { CONFIG_PROVIDER, ConfigProvider } from './config-provider';\nimport { CONFIG_OPTIONS, ConfigOptions } from './config-options';\nimport { ConfigSection, ConfigValue } from './config-value';\nimport { Logger, NG_CONFIG_LOGGER } from './logger';\nimport { equalDeep, mapOptionValues } from './util';\n\n/**\n * The core service for loading and getting configuration value the from configuration providers.\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class ConfigService {\n  /**\n   * Use this property to subscribe the configuration value changes event.\n   */\n  readonly valueChanges: Observable<ConfigSection>;\n\n  private readonly options: ConfigOptions;\n\n  private loading = false;\n  private activated = false;\n\n  private currentLoad = new Observable<ConfigSection>();\n  private currentLoadSubscription?: Subscription | null;\n  private loadedConfig: ConfigSection = {};\n  private optionsRecord = new Map<string, unknown>();\n\n  get providers(): ConfigProvider[] {\n    return this.sortedConfigProviders;\n  }\n\n  private readonly sortedConfigProviders: ConfigProvider[];\n  private readonly logger: Logger;\n\n  constructor(\n    @Inject(CONFIG_PROVIDER) configProviders: ConfigProvider[],\n    private readonly injector: Injector,\n    @Optional() @Inject(CONFIG_OPTIONS) options?: ConfigOptions,\n    @Optional() @Inject(NG_CONFIG_LOGGER) logger?: Logger\n  ) {\n    this.sortedConfigProviders = configProviders.reverse();\n    this.options = options || {};\n    this.valueChanges = new EventEmitter<ConfigSection>();\n\n    if (logger) {\n      this.logger = logger;\n    } else {\n      this.logger = {\n        debug: (message: string, data: { [key: string]: unknown }) => {\n          if (data) {\n            // eslint-disable-next-line no-console\n            console.log(`${message}, data: `, data);\n          } else {\n            // eslint-disable-next-line no-console\n            console.log(message);\n          }\n        },\n      };\n    }\n\n    this.currentLoad = this.initLoad();\n    this.subscribeCurrentLoad(false);\n  }\n\n  /**\n   * Call this method to ensure configurations are fetched and activated.\n   */\n  ensureInitialized(): Observable<boolean> {\n    if (this.activated) {\n      return of(this.activated);\n    }\n\n    return this.currentLoad.pipe(\n      tap((config) => {\n        this.activateConfig(config, false);\n      }),\n      map(() => this.activated)\n    );\n  }\n\n  /**\n   * Call this method to reload fresh configuration values from config providers.\n   */\n  reload(): Observable<void> {\n    this.currentLoad = this.initLoad();\n    this.subscribeCurrentLoad(true);\n\n    return this.currentLoad.pipe(mapTo(void 0));\n  }\n\n  /**\n   * Use this method to get loaded configuration value with a given string key.\n   * @param key The config key string.\n   */\n  getValue(key: string): ConfigValue {\n    return this.getConfigValue(key, this.loadedConfig);\n  }\n\n  /**\n   * Use this method to map loaded configuration values to the instance of options class type.\n   * @param key The config key string.\n   * @param optionsClass The options class type to be mapped.\n   */\n  mapType<T>(key: string, optionsClass: new () => T): T {\n    const optionsObj = this.injector.get<T>(optionsClass, new optionsClass());\n    this.mapObject(key, optionsObj);\n\n    return optionsObj;\n  }\n\n  /**\n   * Use this method to map loaded configuration values to the options object.\n   * @param key The config key string.\n   * @param optionsObj The options object to be mapped with configuration values.\n   */\n  mapObject<T>(key: string, optionsObj: T): T {\n    const cachedOptions = this.optionsRecord.get(key) as T;\n\n    if (cachedOptions != null) {\n      if (cachedOptions === optionsObj) {\n        return cachedOptions;\n      }\n\n      this.optionsRecord.delete(key);\n    }\n\n    const configValue = this.getValue(key);\n\n    if (\n      configValue == null ||\n      Array.isArray(configValue) ||\n      typeof configValue !== 'object'\n    ) {\n      return optionsObj;\n    }\n\n    mapOptionValues(optionsObj as never, configValue);\n\n    this.optionsRecord.set(key, optionsObj);\n\n    return optionsObj;\n  }\n\n  private initLoad(): Observable<ConfigSection> {\n    if (this.currentLoadSubscription) {\n      this.currentLoadSubscription.unsubscribe();\n      this.currentLoadSubscription = null;\n    }\n\n    if (!this.loading) {\n      this.log('Cconfiguration loading started.');\n\n      this.loading = true;\n    }\n\n    return forkJoin(\n      this.providers.map((configProvider) => {\n        const providerName = configProvider.name;\n\n        const loadObs = configProvider.load().pipe(\n          tap((config) => {\n            this.log(providerName, config);\n          }),\n          share()\n        );\n\n        return loadObs.pipe(take(1), share());\n      })\n    ).pipe(\n      map((configs) => {\n        let mergedConfig: ConfigSection = {};\n\n        configs.forEach((config) => {\n          mergedConfig = { ...mergedConfig, ...config };\n        });\n\n        return mergedConfig;\n      })\n    );\n  }\n\n  private subscribeCurrentLoad(reActivate: boolean): void {\n    this.currentLoadSubscription = this.currentLoad.subscribe(\n      (config) => {\n        this.activateConfig(config, reActivate);\n      },\n      () => {\n        this.loading = false;\n      }\n    );\n  }\n\n  private activateConfig(config: ConfigSection, reActivate: boolean): void {\n    this.loading = false;\n\n    if (this.activated && !reActivate) {\n      return;\n    }\n\n    if (!equalDeep(config, this.loadedConfig)) {\n      this.optionsRecord.clear();\n      this.loadedConfig = config;\n\n      this.activated = true;\n      this.log('Configuration loading completed.');\n\n      (this.valueChanges as EventEmitter<ConfigSection>).emit(config);\n    } else {\n      this.activated = true;\n      this.log('Configuration loading completed.');\n    }\n  }\n\n  private getConfigValue(key: string, config: ConfigSection): ConfigValue {\n    const keyArray = key.split(/:/);\n    const result = keyArray.reduce(\n      (acc: any, current: string) => acc && acc[current],\n      config\n    );\n    if (result === undefined) {\n      return null;\n    }\n\n    return result;\n  }\n\n  private log(msg: string, data?: { [key: string]: unknown }): void {\n    if (!this.options.debug) {\n      return;\n    }\n\n    this.logger.debug(`[ConfigService] ${msg}`, data);\n  }\n}\n","/**\n * @license\n * Copyright DagonMetric. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found under the LICENSE file in the root directory of this source tree.\n */\n\nimport { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core';\n\nimport { ConfigService } from './config.service';\nimport { CONFIG_OPTIONS, ConfigOptions } from './config-options';\n\nexport function configAppInitializerFactory(\n  configService: ConfigService\n): () => Promise<boolean | undefined> {\n  const res = async () => configService.ensureInitialized().toPromise();\n\n  return res;\n}\n\n/**\n * The `NGMODULE` for providing `ConfigService`. Call `configure` method to provide options for `ConfigService`.\n */\n@NgModule({\n  providers: [ConfigService],\n})\nexport class ConfigModule {\n  /**\n   * Call this method in root module to provide options for `ConfigService`.\n   * @param loadOnStartUp If `true` configuration values are loaded at app starts. Default is `true`.\n   * @param options Option object for `ConfigService`.\n   */\n  static configure(\n    loadOnStartUp = true,\n    options: ConfigOptions = {}\n  ): ModuleWithProviders<ConfigModule> {\n    return {\n      ngModule: ConfigModule,\n      providers: [\n        {\n          provide: CONFIG_OPTIONS,\n          useValue: options,\n        },\n        loadOnStartUp\n          ? {\n              provide: APP_INITIALIZER,\n              useFactory: configAppInitializerFactory,\n              deps: [ConfigService],\n              multi: true,\n            }\n          : [],\n      ],\n    };\n  }\n}\n","/**\n * @license\n * Copyright DagonMetric. All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found under the LICENSE file in the root directory of this source tree.\n */\n\nexport type ConfigValueBasic = string | string[] | number | boolean;\n\nexport interface ConfigSection {\n    [key: string]: ConfigValueBasic | ConfigSection | null;\n}\n\nexport type ConfigValue = ConfigValueBasic | ConfigSection | null;\n","/*\n * Public API Surface of ng-config\n */\n\nexport * from './lib/config-options';\nexport * from './lib/config-provider';\nexport * from './lib/config.module';\nexport * from './lib/config.service';\nexport * from './lib/config-value';\nexport * from './lib/logger';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}