diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index 1fb98c9..1663520 100644 --- a/ts/00_commitinfo_data.ts +++ b/ts/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@push.rocks/npmextra', - version: '5.0.22', + version: '5.0.23', description: 'A utility to enhance npm with additional configuration, tool management capabilities, and a key-value store for project setups.' } diff --git a/ts/npmextra.classes.appdata.ts b/ts/npmextra.classes.appdata.ts index 1fd4806..f4f8192 100644 --- a/ts/npmextra.classes.appdata.ts +++ b/ts/npmextra.classes.appdata.ts @@ -2,7 +2,6 @@ import * as plugins from './npmextra.plugins.js'; import * as paths from './npmextra.paths.js'; import { KeyValueStore } from './npmextra.classes.keyvaluestore.js'; - export interface IAppDataOptions { dirPath?: string; requiredKeys?: Array; @@ -15,7 +14,7 @@ export interface IAppDataOptions { /** * kvStoreKey: 'MY_ENV_VAR' */ - envMapping?: plugins.tsclass.typeFest.PartialDeep + envMapping?: plugins.tsclass.typeFest.PartialDeep; } export class AppData { @@ -25,7 +24,9 @@ export class AppData { * @param pathArg * @returns */ - public static async createAndInit(optionsArg: IAppDataOptions = {}): Promise> { + public static async createAndInit( + optionsArg: IAppDataOptions = {} + ): Promise> { const appData = new AppData(optionsArg); await appData.readyDeferred.promise; return appData; @@ -68,41 +69,81 @@ export class AppData { typeArg: this.options.ephermal ? 'ephemeral' : 'custom', identityArg: 'appkv', customPath: this.options.dirPath, - mandatoryKeys: this.options.requiredKeys as Array + mandatoryKeys: this.options.requiredKeys as Array, }); if (this.options.envMapping) { - const qenvInstance = new plugins.qenv.Qenv(process.cwd(), plugins.path.join(process.cwd(), '.nogit')); + const qenvInstance = new plugins.qenv.Qenv( + process.cwd(), + plugins.path.join(process.cwd(), '.nogit') + ); // Recursive function to handle nested objects, now includes key parameter - const processEnvMapping = async (key: keyof T, mappingValue: any, parentKey: keyof T | '' = ''): Promise => { + const processEnvMapping = async ( + key: keyof T, + mappingValue: any, + parentKey: keyof T | '' = '' + ): Promise => { if (typeof mappingValue === 'string') { let envValue: string | boolean | T[keyof T]; - let convert: 'none' | 'json' | 'base64' | 'boolean' = 'none' - if (mappingValue.startsWith('hard:')) { - envValue = mappingValue.replace('hard:', '') as T[keyof T]; - } else if (mappingValue.startsWith('boolean:')) { - envValue = await qenvInstance.getEnvVarOnDemand(mappingValue.replace('boolean:', '')) as T[keyof T]; - convert = 'boolean'; - } else if(mappingValue.startsWith('json')) { - envValue = await qenvInstance.getEnvVarOnDemand(mappingValue.replace('json:', '')) as T[keyof T]; - convert = 'json'; - } else if (mappingValue.startsWith('base64')) { - envValue = await qenvInstance.getEnvVarOnDemand(mappingValue.replace('base64:', '')) as T[keyof T]; - convert = 'base64'; - } else { - envValue = await qenvInstance.getEnvVarOnDemand(mappingValue) as T[keyof T]; + let convert: 'none' | 'json' | 'base64' | 'boolean' = 'none'; + switch (true) { + case mappingValue.startsWith('hard:'): + envValue = mappingValue.replace('hard:', '') as T[keyof T]; + break; + case mappingValue.startsWith('hard_boolean:'): + envValue = mappingValue.replace('hard_boolean:', '') === 'true'; + convert = 'boolean'; + break; + case mappingValue.startsWith('hard_json:'): + envValue = JSON.parse(mappingValue.replace('hard_json:', '')) as T[keyof T]; + convert = 'json'; + break; + case mappingValue.startsWith('hard_base64:'): + envValue = Buffer.from( + mappingValue.replace('hard_base64:', ''), + 'base64' + ).toString() as T[keyof T]; + convert = 'base64'; + break; + case mappingValue.startsWith('boolean:'): + envValue = (await qenvInstance.getEnvVarOnDemand( + mappingValue.replace('boolean:', '') + )) as T[keyof T]; + convert = 'boolean'; + break; + case mappingValue.startsWith('json:'): + envValue = (await qenvInstance.getEnvVarOnDemand( + mappingValue.replace('json:', '') + )) as T[keyof T]; + convert = 'json'; + break; + case mappingValue.startsWith('base64:'): + envValue = (await qenvInstance.getEnvVarOnDemand( + mappingValue.replace('base64:', '') + )) as T[keyof T]; + convert = 'base64'; + break; + default: + envValue = (await qenvInstance.getEnvVarOnDemand(mappingValue)) as T[keyof T]; + break; } // lets format the env value if (envValue) { - if (convert === 'boolean') { + if (typeof envValue === 'string' && convert === 'boolean') { envValue = envValue === 'true'; } - if (typeof envValue === 'string' && (mappingValue.endsWith('_JSON') || convert === 'json')) { + if ( + typeof envValue === 'string' && + (mappingValue.endsWith('_JSON') || convert === 'json') + ) { envValue = JSON.parse(envValue as string) as T[keyof T]; } - if (typeof envValue === 'string' && (mappingValue.endsWith('_BASE64') || convert === 'base64')) { + if ( + typeof envValue === 'string' && + (mappingValue.endsWith('_BASE64') || convert === 'base64') + ) { envValue = Buffer.from(envValue as string, 'base64').toString(); } if (!parentKey) { @@ -167,4 +208,4 @@ export class AppData { await this.kvStore.waitForKeysPresent([keyArg]); return this.kvStore.readKey(keyArg); } -} \ No newline at end of file +}