/** * File Utilities * * Функции для работы с файлами (загрузка, сохранение). */ /** * Скачать данные как JSON файл * @param {object} data - Данные для экспорта * @param {string} filename - Имя файла */ export function downloadJSON(data, filename) { const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' }) const url = URL.createObjectURL(blob) const a = document.createElement('a') a.href = url a.download = filename document.body.appendChild(a) a.click() document.body.removeChild(a) URL.revokeObjectURL(url) } /** * Загрузить файл как JSON * @param {File} file - Файл для загрузки * @returns {Promise} Распарсенный JSON объект */ export async function loadFileAsJSON(file) { return new Promise((resolve, reject) => { const reader = new FileReader() reader.onload = (e) => { try { const data = JSON.parse(e.target.result) resolve(data) } catch (error) { reject(new Error('Невалидный JSON формат')) } } reader.onerror = () => { reject(new Error('Ошибка чтения файла')) } reader.readAsText(file) }) } /** * Загрузить файл как текст * @param {File} file - Файл для загрузки * @returns {Promise} Содержимое файла */ export async function loadFileAsText(file) { return new Promise((resolve, reject) => { const reader = new FileReader() reader.onload = (e) => { resolve(e.target.result) } reader.onerror = () => { reject(new Error('Ошибка чтения файла')) } reader.readAsText(file) }) } /** * Создать input для выбора файла и вернуть выбранный файл * @param {string} accept - MIME типы (например, 'application/json') * @returns {Promise} Выбранный файл или null */ export async function selectFile(accept = '*') { return new Promise((resolve) => { const input = document.createElement('input') input.type = 'file' input.accept = accept input.onchange = (e) => { const file = e.target.files[0] resolve(file || null) } input.oncancel = () => { resolve(null) } input.click() }) } /** * Скачать текст как файл * @param {string} text - Текст для сохранения * @param {string} filename - Имя файла * @param {string} mimeType - MIME тип (по умолчанию text/plain) */ export function downloadText(text, filename, mimeType = 'text/plain') { const blob = new Blob([text], { type: mimeType }) const url = URL.createObjectURL(blob) const a = document.createElement('a') a.href = url a.download = filename document.body.appendChild(a) a.click() document.body.removeChild(a) URL.revokeObjectURL(url) }