config.ts•3.51 kB
import dotenv from 'dotenv';
import { type Dict } from '../types.js';
// Load environment variables from .env file
dotenv.config();
/**
* Parse command line arguments to find a specific flag and its value
* @param flag The flag to search for (e.g., '--token')
* @returns The value of the flag or undefined if not found
*/
export function getCommandLineArg(flag: string): string | undefined {
const args = process.argv.slice(2);
for (let i = 0; i < args.length; i++) {
if (args[i] === flag && i + 1 < args.length) {
return args[i + 1];
}
}
return undefined;
}
/**
* Get credentials from Nango
* @returns The credentials object from Nango
*/
export async function getConnectionCredentials(): Promise<Dict> {
const connectionId = process.env.NANGO_CONNECTION_ID;
const integrationId = process.env.NANGO_INTEGRATION_ID;
const baseUrl = process.env.NANGO_BASE_URL;
const secretKey = process.env.NANGO_SECRET_KEY;
if (!connectionId || !integrationId || !baseUrl || !secretKey) {
throw new Error(
'Missing required Nango environment variables: NANGO_CONNECTION_ID, NANGO_INTEGRATION_ID, NANGO_BASE_URL, NANGO_SECRET_KEY'
);
}
const url = `${baseUrl}/connection/${connectionId}`;
const params = new URLSearchParams({
provider_config_key: integrationId,
refresh_token: 'true',
});
const headers = {
'Authorization': `Bearer ${secretKey}`,
'Content-Type': 'application/json',
};
try {
const response = await fetch(`${url}?${params}`, {
method: 'GET',
headers,
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching Nango credentials:', error);
throw error;
}
}
/**
* Get access token from Nango credentials
* @returns The access token
*/
export async function getAccessToken(): Promise<string> {
const credentials = await getConnectionCredentials();
const accessToken = credentials?.credentials?.access_token;
if (!accessToken) {
throw new Error('Access token not found in Nango credentials');
}
return accessToken;
}
/**
* Get the Linear API token from Nango or fallback to environment variable
* @returns The API token or undefined if not found
*/
export async function getLinearApiToken(): Promise<string | undefined> {
try {
// First try to get the token from Nango
const nangoToken = await getAccessToken();
if (nangoToken) {
return nangoToken;
}
} catch (error) {
console.warn('Failed to get token from Nango, falling back to environment variables:', error);
}
// Fallback to command line arguments
const tokenFromArgs = getCommandLineArg('--token');
if (tokenFromArgs) {
return tokenFromArgs;
}
// Log for debugging
console.error('API token not found in Nango or command line args');
console.error(
'Environment variables:',
Object.keys(process.env).filter((key) => key.includes('NANGO')),
);
return undefined;
}
/**
* Log initialization information
* @param message The message to log
*/
export function logInfo(message: string): void {
console.error(message);
}
/**
* Log error information
* @param message The error message
* @param error The error object (optional)
*/
export function logError(message: string, error?: unknown): void {
if (error) {
console.error(message, error);
} else {
console.error(message);
}
}