@lineai/gov-deals
Version:
Explore Federal contracts for government building renovations, city hall renovations, courthouse updates, library modernizations, federal building improvement contracts, base housing and facilities upgrades.
63 lines • 6.31 kB
JavaScript
/**
* Configuration management for the gov-deals package
*/
import { z } from 'zod';
import dotenv from 'dotenv';
// Load environment variables
dotenv.config();
/**
* Configuration schema for validation
*/
export const ConfigSchema = z.object({
samGov: z.object({
apiKey: z.string().min(1, 'SAM.gov API key is required'),
baseUrl: z.string().url().default('https://api.sam.gov'),
timeout: z.number().int().positive().default(30000),
retryAttempts: z.number().int().nonnegative().default(3),
retryDelay: z.number().int().positive().default(1000),
}),
cache: z.object({
enabled: z.boolean().default(true),
ttlSeconds: z.number().int().positive().default(300),
maxSize: z.number().int().positive().default(100),
}),
debug: z.boolean().default(false),
});
/**
* Create configuration from environment variables and options
*/
export function createConfig(options = {}) {
// Build final config with fallbacks
const config = {
samGov: {
apiKey: options.samGov?.apiKey || process.env.SAM_GOV_API_KEY || '',
baseUrl: options.samGov?.baseUrl || process.env.SAM_GOV_BASE_URL || 'https://api.sam.gov',
timeout: options.samGov?.timeout ||
(process.env.SAM_GOV_TIMEOUT ? parseInt(process.env.SAM_GOV_TIMEOUT) : 30000),
retryAttempts: options.samGov?.retryAttempts ||
(process.env.SAM_GOV_RETRY_ATTEMPTS ? parseInt(process.env.SAM_GOV_RETRY_ATTEMPTS) : 3),
retryDelay: options.samGov?.retryDelay ||
(process.env.SAM_GOV_RETRY_DELAY ? parseInt(process.env.SAM_GOV_RETRY_DELAY) : 1000),
},
cache: {
enabled: options.cache?.enabled ??
(process.env.CACHE_ENABLED ? process.env.CACHE_ENABLED === 'true' : true),
ttlSeconds: options.cache?.ttlSeconds ||
(process.env.CACHE_TTL_SECONDS ? parseInt(process.env.CACHE_TTL_SECONDS) : 300),
maxSize: options.cache?.maxSize ||
(process.env.CACHE_MAX_SIZE ? parseInt(process.env.CACHE_MAX_SIZE) : 100),
},
debug: options.debug ?? (process.env.DEBUG === 'true') ?? (process.env.NODE_ENV === 'development'),
};
// Validate the final configuration
return ConfigSchema.parse(config);
}
/**
* Validate that required configuration is present
*/
export function validateConfig(config) {
if (!config.samGov.apiKey) {
throw new Error('SAM.gov API key is required. Set SAM_GOV_API_KEY environment variable or pass it in configuration.');
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvcmUvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUN4QixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFNUIsNkJBQTZCO0FBQzdCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUVoQjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ25DLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ2YsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLDZCQUE2QixDQUFDO1FBQ3hELE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDO1FBQ3hELE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNuRCxhQUFhLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDeEQsVUFBVSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0tBQ3RELENBQUM7SUFDRixLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNkLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUNsQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFB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