auto-translatr
Version:
An automatic translation library
187 lines (186 loc) ⢠9.23 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.loadSettings = exports.initializeSettings = exports.createDefaultSettingsFile = exports.readSettingsFile = exports.getDefaultSettings = void 0;
const fs = __importStar(require("fs"));
const path = __importStar(require("path"));
const readline = __importStar(require("readline"));
const utils_1 = require("./utils");
const SETTINGS_FILE = 'auto-translatr.settings.json';
// Helper function to validate and fix settings
const validateAndFixSettings = (settings) => {
// Check if default language is in supported array
if (!settings.supported.includes(settings.default)) {
console.warn(`ā ļø Default language '${settings.default}' not found in supported languages. Adding it automatically.`);
return Object.assign(Object.assign({}, settings), { supported: [settings.default, ...settings.supported] });
}
return settings;
};
// Helper function to get the default settings
const getDefaultSettings = () => ({
default: 'en',
supported: ['en', 'fr', 'de'],
output: 'i18n',
include: ['.js', '.jsx', '.ts', '.tsx', '.vue', '.svelte'],
ignore: ['node_modules', '.git', 'dist', 'build', '.next', 'coverage'],
openai: {
model: 'gpt-4o-mini',
apiKey: process.env.OPENAI_API_KEY || ''
}
});
exports.getDefaultSettings = getDefaultSettings;
// Helper function to read settings from file
const readSettingsFile = () => {
try {
const settingsPath = path.join(process.cwd(), SETTINGS_FILE);
if (!fs.existsSync(settingsPath)) {
return (0, utils_1.left)(new Error(`Settings file ${SETTINGS_FILE} not found`));
}
const fileContent = fs.readFileSync(settingsPath, 'utf-8');
const rawSettings = JSON.parse(fileContent);
// Validate required fields
if (!rawSettings.default) {
return (0, utils_1.left)(new Error('Settings file is missing required field: default'));
}
if (!rawSettings.supported || !Array.isArray(rawSettings.supported) || rawSettings.supported.length === 0) {
return (0, utils_1.left)(new Error('Settings file is missing required field: supported (must be a non-empty array)'));
}
if (!rawSettings.openai || !rawSettings.openai.model) {
return (0, utils_1.left)(new Error('Settings file is missing required field: openai.model. Please set your OpenAI model in the file or as OPENAI_MODEL environment variable.'));
}
// Set defaults for new optional fields if missing
if (!rawSettings.output) {
rawSettings.output = 'i18n';
}
if (!rawSettings.include || !Array.isArray(rawSettings.include)) {
rawSettings.include = ['.js', '.jsx', '.ts', '.tsx', '.vue', '.svelte'];
}
if (!rawSettings.ignore || !Array.isArray(rawSettings.ignore)) {
rawSettings.ignore = ['node_modules', '.git', 'dist', 'build', '.next', 'coverage'];
}
// Merge with environment variables for API key if not provided
if (rawSettings.openai && !rawSettings.openai.apiKey && process.env.OPENAI_API_KEY) {
rawSettings.openai.apiKey = process.env.OPENAI_API_KEY;
}
if (!rawSettings.openai || !rawSettings.openai.apiKey) {
return (0, utils_1.left)(new Error('Settings file is missing required field: openai.apiKey. Please set your OpenAI API key in the file or as OPENAI_API_KEY environment variable.'));
}
// Validate and fix settings (ensure default is in supported array)
const validatedSettings = validateAndFixSettings(rawSettings);
return (0, utils_1.right)(validatedSettings);
}
catch (error) {
return (0, utils_1.left)(error);
}
};
exports.readSettingsFile = readSettingsFile;
// Helper function to prompt user input
const promptUser = (question) => {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
return new Promise((resolve) => {
rl.question(question, (answer) => {
rl.close();
resolve(answer.trim().toLowerCase());
});
});
};
// Helper function to create default settings file
const createDefaultSettingsFile = () => __awaiter(void 0, void 0, void 0, function* () {
try {
const settingsPath = path.join(process.cwd(), SETTINGS_FILE);
const defaultSettings = (0, exports.getDefaultSettings)();
// Don't include the API key in the file for security
const settingsToWrite = Object.assign(Object.assign({}, defaultSettings), { openai: Object.assign(Object.assign({}, defaultSettings.openai), { apiKey: '' }) });
const fileContent = JSON.stringify(settingsToWrite, null, 2);
fs.writeFileSync(settingsPath, fileContent, 'utf-8');
console.log(`š Created ${SETTINGS_FILE} with default settings`);
if (!process.env.OPENAI_API_KEY)
return (0, utils_1.left)(new Error('Settings file is missing required field: openai.apiKey. Please set your OpenAI API key in the file or as OPENAI_API_KEY environment variable.'));
else
defaultSettings.openai.apiKey = process.env.OPENAI_API_KEY;
// Ask user about default languages
console.log(`\nš Default supported languages: ${defaultSettings.supported.join(', ')}`);
const userResponse = yield promptUser('Do you want to use these default languages? (Y/N): ');
if (userResponse === 'n' || userResponse === 'no') {
console.log(`\nš Please edit the 'supported' property in ${SETTINGS_FILE} to include your desired languages, then run the command again.`);
process.exit(0);
}
else if (userResponse === 'y' || userResponse === 'yes') {
console.log('ā
Using default languages. Continuing...');
}
else {
console.log('ā Invalid response. Please edit the settings file manually if needed.');
process.exit(0);
}
return (0, utils_1.right)(defaultSettings);
}
catch (error) {
return (0, utils_1.left)(error);
}
});
exports.createDefaultSettingsFile = createDefaultSettingsFile;
// Helper function to initialize settings (creates defaults if none exist)
const initializeSettings = () => __awaiter(void 0, void 0, void 0, function* () {
const readResult = (0, exports.readSettingsFile)();
if (readResult.type === 'left') {
console.log(`āļø ${readResult.value.message}, creating default settings...`);
return yield (0, exports.createDefaultSettingsFile)();
}
console.log(`āļø Loaded settings from ${SETTINGS_FILE}`);
return readResult;
});
exports.initializeSettings = initializeSettings;
// Helper function to load or create settings
const loadSettings = () => {
const readResult = (0, exports.readSettingsFile)();
if (readResult.type === 'left') {
return readResult; // Return the error immediately, don't create defaults
}
console.log(`āļø Loaded settings from ${SETTINGS_FILE}`);
return readResult;
};
exports.loadSettings = loadSettings;