@papavault/cli
Version:
CLI tool for Papa Vault Secret Manager
202 lines (201 loc) • 7.08 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.PapaVaultAPI = void 0;
exports.createApiInstance = createApiInstance;
exports.validateToken = validateToken;
exports.getProjects = getProjects;
exports.getProject = getProject;
exports.getCredentialFiles = getCredentialFiles;
exports.getCredentialFile = getCredentialFile;
exports.downloadCredentialFile = downloadCredentialFile;
const axios_1 = __importDefault(require("axios"));
const config_1 = require("../config");
const error_1 = require("./error");
const logger_1 = require("./logger");
const config_2 = require("./config");
// Base URL for the API
const API_BASE_URL = process.env.API_BASE_URL || 'https://app.papavault.com/api';
// Create an axios instance with default configuration
const api = axios_1.default.create({
baseURL: API_BASE_URL,
timeout: 10000,
headers: {
'Content-Type': 'application/json'
}
});
// Add a request interceptor to add the token to the request
api.interceptors.request.use((config) => {
// Get token from config or global state
const token = config.headers['X-PapaVault-Token'] || (0, config_2.getToken)();
if (token) {
config.headers['Authorization'] = `Bearer ${token}`;
}
return config;
});
// Helper function to create an API instance with a custom token
function createApiInstance(token) {
const instance = axios_1.default.create({
baseURL: API_BASE_URL,
timeout: 10000,
headers: {
'Content-Type': 'application/json',
...(token ? { 'X-PapaVault-Token': token } : {})
}
});
return instance;
}
// Validate the token
async function validateToken(token) {
try {
const response = await createApiInstance(token).get('/apikeys/validate');
return response.status === 200;
}
catch (error) {
return false;
}
}
// Get all projects
async function getProjects(token) {
try {
const response = await createApiInstance(token).get('/cli/projects');
return response.data.projects;
}
catch (error) {
console.error('Error fetching projects:', error);
throw error;
}
}
// Get a project by ID
async function getProject(projectId, token) {
try {
const response = await createApiInstance(token).get(`/cli/projects/${projectId}`);
return response.data.project;
}
catch (error) {
console.error(`Error fetching project ${projectId}:`, error);
throw error;
}
}
// Get all credential files for a project environment
async function getCredentialFiles(projectId, environmentId, token) {
try {
const response = await createApiInstance(token).get(`/cli/projects/${projectId}/environments/${environmentId}/credentials`);
return response.data.credentialFiles;
}
catch (error) {
console.error(`Error fetching credential files for project ${projectId}, environment ${environmentId}:`, error);
throw error;
}
}
// Get a credential file by ID
async function getCredentialFile(projectId, environmentId, fileId, token) {
try {
const response = await createApiInstance(token).get(`/cli/projects/${projectId}/environments/${environmentId}/credentials/${fileId}`);
return response.data;
}
catch (error) {
console.error(`Error fetching credential file ${fileId}:`, error);
throw error;
}
}
// Download a credential file
async function downloadCredentialFile(downloadUrl, token) {
try {
const response = await createApiInstance(token).get(downloadUrl);
return response.data;
}
catch (error) {
console.error('Error downloading credential file:', error);
throw error;
}
}
const emptyConfig = {};
class PapaVaultAPI {
constructor(options = {}) {
const token = options.token || config_1.config.get('token');
const baseUrl = options.baseUrl || config_1.config.get('baseUrl') || 'https://api.papavault.com';
if (!token) {
throw new error_1.PapaVaultError('API token is required');
}
this.client = axios_1.default.create({
baseURL: baseUrl,
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
},
});
// Add request interceptor for debug logging
this.client.interceptors.request.use((config) => {
(0, logger_1.debugLog)('Request:', {
method: config.method,
url: config.url,
params: config.params,
data: config.data,
});
return config;
});
// Add response interceptor for debug logging
this.client.interceptors.response.use((response) => {
(0, logger_1.debugLog)('Response:', {
status: response.status,
data: response.data,
});
return response;
}, (error) => {
(0, logger_1.debugLog)('Error:', {
status: error.response?.status,
data: error.response?.data,
message: error.message,
});
return Promise.reject(error);
});
}
async get(url, config = emptyConfig) {
try {
return await this.client.get(url, config);
}
catch (error) {
if (error instanceof Error) {
throw new error_1.PapaVaultError(`API request failed: ${error.message}`, error);
}
throw new error_1.PapaVaultError('API request failed: Unknown error');
}
}
async post(url, data = {}, config = emptyConfig) {
try {
return await this.client.post(url, data, config);
}
catch (error) {
if (error instanceof Error) {
throw new error_1.PapaVaultError(`API request failed: ${error.message}`, error);
}
throw new error_1.PapaVaultError('API request failed: Unknown error');
}
}
async put(url, data = {}, config = emptyConfig) {
try {
return await this.client.put(url, data, config);
}
catch (error) {
if (error instanceof Error) {
throw new error_1.PapaVaultError(`API request failed: ${error.message}`, error);
}
throw new error_1.PapaVaultError('API request failed: Unknown error');
}
}
async delete(url, config = emptyConfig) {
try {
return await this.client.delete(url, config);
}
catch (error) {
if (error instanceof Error) {
throw new error_1.PapaVaultError(`API request failed: ${error.message}`, error);
}
throw new error_1.PapaVaultError('API request failed: Unknown error');
}
}
}
exports.PapaVaultAPI = PapaVaultAPI;