spaps
Version:
Sweet Potato Authentication & Payment Service CLI - Docker Compose orchestrator for local Python/FastAPI SPAPS server with built-in admin middleware
122 lines (103 loc) • 2.58 kB
JavaScript
const fs = require('node:fs');
const path = require('node:path');
const API_KEY_ENV_VARS = [
'SPAPS_API_KEY',
'NEXT_PUBLIC_SPAPS_PUBLISHABLE_KEY',
'VITE_SPAPS_PUBLISHABLE_KEY',
'NEXT_PUBLIC_SPAPS_API_KEY',
'VITE_SPAPS_API_KEY',
];
const API_KEY_ENV_FILES = ['.env.local', '.env'];
function stripWrappingQuotes(value) {
if (value.length >= 2) {
const first = value[0];
const last = value[value.length - 1];
if ((first === '"' && last === '"') || (first === '\'' && last === '\'')) {
return value.slice(1, -1);
}
}
return value;
}
function parseEnvAssignments(content) {
const values = {};
for (const rawLine of String(content || '').split(/\r?\n/)) {
const line = rawLine.trim();
if (!line || line.startsWith('#')) {
continue;
}
const separator = line.indexOf('=');
if (separator <= 0) {
continue;
}
const key = line.slice(0, separator).trim();
const value = stripWrappingQuotes(line.slice(separator + 1).trim());
values[key] = value;
}
return values;
}
function readApiKeyFromFile(filePath) {
if (!fs.existsSync(filePath)) {
return null;
}
try {
const values = parseEnvAssignments(fs.readFileSync(filePath, 'utf8'));
for (const envVar of API_KEY_ENV_VARS) {
if (typeof values[envVar] === 'string' && values[envVar].trim()) {
return {
apiKey: values[envVar].trim(),
envVar,
path: filePath,
source: path.basename(filePath),
};
}
}
} catch {
return null;
}
return null;
}
function findUpApiKey(startDir = process.cwd()) {
let current = path.resolve(startDir);
while (true) {
for (const envFile of API_KEY_ENV_FILES) {
const hit = readApiKeyFromFile(path.join(current, envFile));
if (hit) {
return hit;
}
}
const parent = path.dirname(current);
if (parent === current) {
return null;
}
current = parent;
}
}
function resolveAuthApiKey({ cwd = process.cwd(), env = process.env } = {}) {
for (const envVar of API_KEY_ENV_VARS) {
if (typeof env[envVar] === 'string' && env[envVar].trim()) {
return {
apiKey: env[envVar].trim(),
envVar,
path: null,
source: envVar,
};
}
}
const fileHit = findUpApiKey(cwd);
if (fileHit) {
return fileHit;
}
return {
apiKey: null,
envVar: null,
path: null,
source: null,
};
}
module.exports = {
API_KEY_ENV_FILES,
API_KEY_ENV_VARS,
findUpApiKey,
parseEnvAssignments,
resolveAuthApiKey,
};