fix(qenv): Handle falsy environment values correctly, improve env source resolution, add tests and update test script

This commit is contained in:
2025-08-16 12:35:35 +00:00
parent a7e3bf1223
commit 5a81caa7bb
5 changed files with 168 additions and 18 deletions

View File

@@ -3,6 +3,6 @@
*/
export const commitinfo = {
name: '@push.rocks/qenv',
version: '6.1.2',
version: '6.1.3',
description: 'A module for easily handling environment variables in Node.js projects with support for .yml and .json configuration.'
}

View File

@@ -71,7 +71,7 @@ export class Qenv {
private loadAvailableEnvVars() {
for (const envVar of this.requiredEnvVars) {
const value = this.getEnvVarOnDemand(envVar);
if (value) {
if (value !== undefined) {
this.availableEnvVars.push(envVar);
this.keyValueObject[envVar] = value;
}
@@ -101,7 +101,7 @@ export class Qenv {
if (Array.isArray(envVarNameOrNames)) {
for (const envVarName of envVarNameOrNames) {
const value = await this.tryGetEnvVar(envVarName);
if (value) {
if (value !== undefined) {
return value;
}
}
@@ -120,7 +120,7 @@ export class Qenv {
envVarNameOrNames: TEnvVarRef | TEnvVarRef[]
): Promise<string> {
const value = await this.getEnvVarOnDemand(envVarNameOrNames);
if (!value) {
if (value === undefined) {
throw new Error(`Env var ${envVarNameOrNames} is not set!`);
}
return value;
@@ -132,7 +132,7 @@ export class Qenv {
if (Array.isArray(envVarNameOrNames)) {
for (const envVarName of envVarNameOrNames) {
const value = this.tryGetEnvVarSync(envVarName);
if (value) {
if (value !== undefined) {
return value;
}
}
@@ -156,21 +156,37 @@ export class Qenv {
return await envVarRefArg();
}
return (
this.getFromEnvironmentVariable(envVarRefArg) ||
this.getFromEnvYamlOrJsonFile(envVarRefArg) ||
this.getFromDockerSecret(envVarRefArg) ||
const sources = [
this.getFromEnvironmentVariable(envVarRefArg),
this.getFromEnvYamlOrJsonFile(envVarRefArg),
this.getFromDockerSecret(envVarRefArg),
this.getFromDockerSecretJson(envVarRefArg)
);
];
for (const value of sources) {
if (value !== undefined) {
return value;
}
}
return undefined;
}
private tryGetEnvVarSync(envVarName: string): string | undefined {
return (
this.getFromEnvironmentVariable(envVarName) ||
this.getFromEnvYamlOrJsonFile(envVarName) ||
this.getFromDockerSecret(envVarName) ||
const sources = [
this.getFromEnvironmentVariable(envVarName),
this.getFromEnvYamlOrJsonFile(envVarName),
this.getFromDockerSecret(envVarName),
this.getFromDockerSecretJson(envVarName)
);
];
for (const value of sources) {
if (value !== undefined) {
return value;
}
}
return undefined;
}
private getFromEnvironmentVariable(envVarName: string): string | undefined {
@@ -184,10 +200,13 @@ export class Qenv {
try {
const envJson = plugins.smartfile.fs.toObjectSync(this.envFilePathAbsolute);
const value = envJson[envVarName];
if (value === undefined) {
return undefined;
}
if (typeof value === 'object') {
return 'base64Object:' + this.encodeBase64(value);
}
return value;
return String(value);
} catch (error) {
return undefined;
}
@@ -208,10 +227,13 @@ export class Qenv {
if (secret.includes('secret.json')) {
const secretObject = plugins.smartfile.fs.toObjectSync(`/run/secrets/${secret}`);
const value = secretObject[envVarName];
if (value === undefined) {
continue;
}
if (typeof value === 'object') {
return 'base64Object:' + this.encodeBase64(value);
}
return value;
return String(value);
}
}
}