init
This commit is contained in:
94
.opencode/skills/docs-seeker/scripts/utils/env-loader.js
Executable file
94
.opencode/skills/docs-seeker/scripts/utils/env-loader.js
Executable file
@@ -0,0 +1,94 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Environment variable loader for docs-seeker skill
|
||||
* Respects order: process.env > skill/.env > skills/.env > .claude/.env
|
||||
*/
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
/**
|
||||
* Parse .env file content into key-value pairs
|
||||
* @param {string} content - .env file content
|
||||
* @returns {Object} Parsed environment variables
|
||||
*/
|
||||
function parseEnvFile(content) {
|
||||
const env = {};
|
||||
const lines = content.split('\n');
|
||||
|
||||
for (const line of lines) {
|
||||
// Skip comments and empty lines
|
||||
if (!line || line.trim().startsWith('#')) continue;
|
||||
|
||||
const match = line.match(/^\s*([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/);
|
||||
if (match) {
|
||||
const key = match[1];
|
||||
let value = match[2].trim();
|
||||
|
||||
// Remove quotes if present
|
||||
if ((value.startsWith('"') && value.endsWith('"')) ||
|
||||
(value.startsWith("'") && value.endsWith("'"))) {
|
||||
value = value.slice(1, -1);
|
||||
}
|
||||
|
||||
env[key] = value;
|
||||
}
|
||||
}
|
||||
|
||||
return env;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load environment variables from .env files in priority order
|
||||
* Priority: process.env > skill/.env > skills/.env > .claude/.env
|
||||
* @returns {Object} Merged environment variables
|
||||
*/
|
||||
function loadEnv() {
|
||||
const skillDir = path.resolve(__dirname, '../..');
|
||||
const skillsDir = path.resolve(skillDir, '..');
|
||||
const claudeDir = path.resolve(skillsDir, '..');
|
||||
|
||||
const envPaths = [
|
||||
path.join(claudeDir, '.env'), // Lowest priority
|
||||
path.join(skillsDir, '.env'),
|
||||
path.join(skillDir, '.env'), // Highest priority (file)
|
||||
];
|
||||
|
||||
let mergedEnv = {};
|
||||
|
||||
// Load .env files in order (lowest to highest priority)
|
||||
for (const envPath of envPaths) {
|
||||
if (fs.existsSync(envPath)) {
|
||||
try {
|
||||
const content = fs.readFileSync(envPath, 'utf8');
|
||||
const parsed = parseEnvFile(content);
|
||||
mergedEnv = { ...mergedEnv, ...parsed };
|
||||
} catch (error) {
|
||||
// Silently skip unreadable files
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// process.env has highest priority
|
||||
mergedEnv = { ...mergedEnv, ...process.env };
|
||||
|
||||
return mergedEnv;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get environment variable with fallback
|
||||
* @param {string} key - Environment variable key
|
||||
* @param {string} defaultValue - Default value if not found
|
||||
* @returns {string} Environment variable value
|
||||
*/
|
||||
function getEnv(key, defaultValue = '') {
|
||||
const env = loadEnv();
|
||||
return env[key] || defaultValue;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
loadEnv,
|
||||
getEnv,
|
||||
parseEnvFile,
|
||||
};
|
||||
Reference in New Issue
Block a user