mirror of
https://github.com/evgene-kopylov/fsrs_plugin.git
synced 2026-07-22 06:53:49 +00:00
86 lines
2.8 KiB
JavaScript
86 lines
2.8 KiB
JavaScript
import fs from "fs";
|
||
import path from "path";
|
||
|
||
const wasmFilePath = path.resolve(
|
||
process.cwd(),
|
||
"wasm-lib/pkg/wasm_lib_bg.wasm",
|
||
);
|
||
const outputFilePath = path.resolve(
|
||
process.cwd(),
|
||
"wasm-lib/pkg/wasm_lib_base64.ts",
|
||
);
|
||
|
||
/**
|
||
* Разбивает длинную строку на чанки фиксированного размера
|
||
* @param {string} str Исходная строка
|
||
* @param {number} chunkSize Размер чанка (по умолчанию 4096)
|
||
* @returns {string[]} Массив чанков
|
||
*/
|
||
function chunkString(str, chunkSize = 4096) {
|
||
const chunks = [];
|
||
for (let i = 0; i < str.length; i += chunkSize) {
|
||
chunks.push(str.slice(i, i + chunkSize));
|
||
}
|
||
return chunks;
|
||
}
|
||
|
||
/**
|
||
* Генерирует TypeScript код с разбитой на чанки строкой
|
||
* @param {string} base64String Base64 строка
|
||
* @returns {string} TypeScript код
|
||
*/
|
||
function generateTsContent(base64String) {
|
||
const chunks = chunkString(base64String, 4096);
|
||
|
||
if (chunks.length === 1) {
|
||
// Если строка короткая, используем шаблонный литерал
|
||
return `export const WASM_BASE64 = "${base64String}";`;
|
||
}
|
||
|
||
// Для длинных строк используем конкатенацию чанков с шаблонными литералами
|
||
let tsContent = "export const WASM_BASE64 = ";
|
||
|
||
for (let i = 0; i < chunks.length; i++) {
|
||
const chunk = chunks[i];
|
||
if (i === 0) {
|
||
tsContent += `"${chunk}"`;
|
||
} else {
|
||
tsContent += `\n + "${chunk}"`;
|
||
}
|
||
}
|
||
|
||
tsContent += ";\n";
|
||
return tsContent;
|
||
}
|
||
|
||
try {
|
||
// Проверяем существование входного файла
|
||
if (!fs.existsSync(wasmFilePath)) {
|
||
console.error(`WASM файл не найден: ${wasmFilePath}`);
|
||
console.error("Сначала выполните сборку WASM: npm run build-wasm");
|
||
process.exit(1);
|
||
}
|
||
|
||
// Читаем WASM файл как бинарные данные
|
||
const wasmBuffer = fs.readFileSync(wasmFilePath);
|
||
|
||
// Кодируем в base64
|
||
const base64String = wasmBuffer.toString("base64");
|
||
|
||
// Генерируем содержимое TypeScript файла
|
||
const tsContent = generateTsContent(base64String);
|
||
|
||
// Убеждаемся, что директория существует
|
||
const outputDir = path.dirname(outputFilePath);
|
||
if (!fs.existsSync(outputDir)) {
|
||
fs.mkdirSync(outputDir, { recursive: true });
|
||
}
|
||
|
||
// Записываем файл
|
||
fs.writeFileSync(outputFilePath, tsContent);
|
||
|
||
console.log("WASM encoded ✅");
|
||
} catch (error) {
|
||
console.error("Ошибка при кодировании WASM:", error.message);
|
||
process.exit(1);
|
||
}
|