@gftdcojp/weblate-nextjs-sdk
Version:
A Next.js SDK for integrating with Weblate translation management system
96 lines (95 loc) • 3.92 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.WeblateApiError = exports.WeblateClient = void 0;
const axios_1 = __importDefault(require("axios"));
class WeblateClient {
constructor(config) {
this.config = config;
this.axios = axios_1.default.create({
baseURL: `${config.baseUrl}/api/`,
timeout: config.timeout || 10000,
headers: {
'Authorization': `Token ${config.apiKey}`,
'Content-Type': 'application/json',
},
});
// Add request interceptor for retries
this.axios.interceptors.response.use((response) => response, async (error) => {
const retries = config.retries || 3;
const shouldRetry = error.response?.status >= 500 && error.config.retryCount < retries;
if (shouldRetry) {
error.config.retryCount = error.config.retryCount || 0;
error.config.retryCount++;
await new Promise(resolve => setTimeout(resolve, 1000 * error.config.retryCount));
return this.axios(error.config);
}
return Promise.reject(error);
});
}
async handleRequest(request) {
try {
const response = await request;
return response.data;
}
catch (error) {
if (error.response) {
throw new WeblateApiError(error.response.data.error || 'API Error', error.response.data.message || error.message, error.response.status);
}
throw new WeblateApiError('Network Error', error.message);
}
}
async getProjects() {
const response = await this.handleRequest(this.axios.get('projects/'));
return response.data || response;
}
async getProject(slug) {
return this.handleRequest(this.axios.get(`projects/${slug}/`));
}
async getComponents(projectSlug) {
const response = await this.handleRequest(this.axios.get(`projects/${projectSlug}/components/`));
return response.data || response;
}
async getTranslations(componentSlug) {
const response = await this.handleRequest(this.axios.get(`components/${componentSlug}/translations/`));
return response.data || response;
}
async getTranslation(componentSlug, languageCode) {
return this.handleRequest(this.axios.get(`translations/${componentSlug}/${languageCode}/`));
}
async getUnits(translationId) {
const response = await this.handleRequest(this.axios.get(`translations/${translationId}/units/`));
return response.data || response;
}
async updateUnit(unitId, target) {
return this.handleRequest(this.axios.patch(`units/${unitId}/`, { target }));
}
async getStatistics(componentSlug, languageCode) {
return this.handleRequest(this.axios.get(`translations/${componentSlug}/${languageCode}/statistics/`));
}
async searchUnits(query, component, language) {
const params = { q: query };
if (component)
params.component = component;
if (language)
params.language = language;
const response = await this.handleRequest(this.axios.get('units/', { params }));
return response.data || response;
}
async getLanguages() {
const response = await this.handleRequest(this.axios.get('languages/'));
return response.data || response;
}
}
exports.WeblateClient = WeblateClient;
class WeblateApiError extends Error {
constructor(error, message, code) {
super(message);
this.error = error;
this.code = code;
this.name = 'WeblateApiError';
}
}
exports.WeblateApiError = WeblateApiError;