UNPKG

@kyosho-/ng-config

Version:

Configuration and options service for Angular applications.

1 lines 25.8 kB
{"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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"}