hugo-extended
Version:
✏️ Plug-and-play binary wrapper for Hugo Extended, the awesomest static-site generator.
138 lines (137 loc) • 4.15 kB
JavaScript
//#region src/lib/env.ts
/**
* Parses a boolean environment variable.
* Truthy values: "1", "true", "yes", "on" (case-insensitive)
* Falsy values: "0", "false", "no", "off", undefined, empty string
*/
function parseBoolean(value) {
if (!value) return false;
const normalized = value.toLowerCase().trim();
return [
"1",
"true",
"yes",
"on"
].includes(normalized);
}
/**
* Parses a string environment variable (returns undefined if empty).
*/
function parseString(value) {
if (!value || value.trim() === "") return void 0;
return value.trim();
}
/**
* Parses a version string, stripping any leading "v" prefix.
*/
function parseVersion(value) {
const str = parseString(value);
if (!str) return void 0;
return str.startsWith("v") ? str.slice(1) : str;
}
/**
* Gets the first defined value from a list of environment variable names.
*/
function getFirstDefined(names) {
for (const name of names) {
const value = process.env[name];
if (value !== void 0 && value !== "") return value;
}
}
/**
* All supported environment variable configurations.
*/
const ENV_VARS = {
overrideVersion: {
name: "HUGO_OVERRIDE_VERSION",
aliases: [],
description: "Override the Hugo version to install",
parse: parseVersion,
defaultValue: void 0
},
forceStandard: {
name: "HUGO_NO_EXTENDED",
aliases: ["HUGO_FORCE_STANDARD"],
description: "Force vanilla Hugo instead of Extended edition",
parse: parseBoolean,
defaultValue: false
},
skipInstall: {
name: "HUGO_SKIP_DOWNLOAD",
aliases: [],
description: "Skip the postinstall binary download",
parse: parseBoolean,
defaultValue: false
},
binPath: {
name: "HUGO_BIN_PATH",
aliases: [],
description: "Path to a pre-existing Hugo binary",
parse: parseString,
defaultValue: void 0
},
downloadBaseUrl: {
name: "HUGO_MIRROR_BASE_URL",
aliases: [],
description: "Custom base URL for Hugo release downloads",
parse: parseString,
defaultValue: void 0
},
skipChecksum: {
name: "HUGO_SKIP_CHECKSUM",
aliases: ["HUGO_SKIP_VERIFY"],
description: "Skip SHA-256 checksum verification",
parse: parseBoolean,
defaultValue: false
},
quiet: {
name: "HUGO_QUIET",
aliases: ["HUGO_SILENT"],
description: "Suppress installation progress output",
parse: parseBoolean,
defaultValue: false
}
};
/**
* Reads and parses all Hugo environment variables.
*
* This function reads from `process.env` each time it's called,
* so it will pick up any runtime changes to environment variables.
*
* @returns Parsed environment configuration
*
* @example
* ```typescript
* import { getEnvConfig } from './lib/env';
*
* const config = getEnvConfig();
* if (config.skipInstall) {
* console.log('Skipping installation');
* }
* ```
*/
function getEnvConfig() {
return {
overrideVersion: ENV_VARS.overrideVersion.parse(getFirstDefined([ENV_VARS.overrideVersion.name, ...ENV_VARS.overrideVersion.aliases ?? []])),
forceStandard: ENV_VARS.forceStandard.parse(getFirstDefined([ENV_VARS.forceStandard.name, ...ENV_VARS.forceStandard.aliases ?? []])),
skipInstall: ENV_VARS.skipInstall.parse(getFirstDefined([ENV_VARS.skipInstall.name, ...ENV_VARS.skipInstall.aliases ?? []])),
binPath: ENV_VARS.binPath.parse(getFirstDefined([ENV_VARS.binPath.name, ...ENV_VARS.binPath.aliases ?? []])),
downloadBaseUrl: ENV_VARS.downloadBaseUrl.parse(getFirstDefined([ENV_VARS.downloadBaseUrl.name, ...ENV_VARS.downloadBaseUrl.aliases ?? []])),
skipChecksum: ENV_VARS.skipChecksum.parse(getFirstDefined([ENV_VARS.skipChecksum.name, ...ENV_VARS.skipChecksum.aliases ?? []])),
quiet: ENV_VARS.quiet.parse(getFirstDefined([ENV_VARS.quiet.name, ...ENV_VARS.quiet.aliases ?? []]))
};
}
/**
* Metadata about all supported environment variables.
* Useful for documentation generation or help output.
*/
const ENV_VAR_DOCS = Object.entries(ENV_VARS).map(([key, config]) => ({
key,
name: config.name,
aliases: config.aliases ?? [],
description: config.description,
type: config.defaultValue === void 0 ? "string" : typeof config.defaultValue === "boolean" ? "boolean" : "string",
default: config.defaultValue
}));
//#endregion
export { ENV_VAR_DOCS, getEnvConfig };