UNPKG

mp70-pptx-automizer

Version:
151 lines 6.43 kB
"use strict"; 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()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createZipFromBase64 = exports.createZipFromBlobs = exports.compressFolder = void 0; const path_1 = __importDefault(require("path")); const jszip_1 = __importDefault(require("jszip")); const isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined'; let fs; let fsp; if (!isBrowser) { fs = require('fs'); fsp = fs.promises; } /** * Returns a flat list of all files and subfolders for a directory (recursively). * Note: Only works in Node.js environment * @param {string} dir Directory path * @throws {Error} If called in browser environment * @returns {Promise<string[]>} Array of file paths */ const getFilePathsRecursively = (dir) => __awaiter(void 0, void 0, void 0, function* () { if (isBrowser) { throw new Error('getFilePathsRecursively is not supported in browser environment'); } const list = yield fsp.readdir(dir); const statPromises = list.map((file) => __awaiter(void 0, void 0, void 0, function* () { const fullPath = path_1.default.resolve(dir, file); const stat = yield fsp.stat(fullPath); if (stat && stat.isDirectory()) { return getFilePathsRecursively(fullPath); } return fullPath; })); const results = yield Promise.all(statPromises); return results.flat(); }); /** * Creates an in-memory zip from a folder in the file system * Note: Only works in Node.js environment * @param {string} dir Directory path * @throws {Error} If called in browser environment * @returns {Promise<JSZip>} */ const createZipFromFolder = (dir) => __awaiter(void 0, void 0, void 0, function* () { if (isBrowser) { throw new Error('createZipFromFolder is not supported in browser environment'); } const absRoot = path_1.default.resolve(dir); const filePaths = yield getFilePathsRecursively(dir); return filePaths.reduce((z, filePath) => { const relative = filePath.replace(absRoot, ''); const zipFolder = path_1.default .dirname(relative) .split(path_1.default.sep) .reduce((zf, dirName) => zf.folder(dirName), z); zipFolder.file(path_1.default.basename(filePath), fs.createReadStream(filePath)); return z; }, new jszip_1.default()); }); /** * Compresses a folder to a zip file. * For Node.js: Compresses a directory to a zip file on disk * For Browser: Use the alternative browser methods below * * Browser alternatives: * - Use `createZipFromBlobs()` if you have file blobs * - Use `createZipFromBase64()` if you have base64 encoded files * * @param {string} srcDir Source directory path * @param {string} destFile Destination zip file path * @param {JSZipGeneratorOptions<'nodebuffer'>} [options] JSZip options * @throws {Error} If called in browser environment */ const compressFolder = (srcDir, destFile, options) => __awaiter(void 0, void 0, void 0, function* () { if (isBrowser) { throw new Error('compressFolder is not supported in browser environment.\n' + 'For browsers, use createZipFromBlobs() or createZipFromBase64() instead.'); } const start = Date.now(); try { const zip = yield createZipFromFolder(srcDir); yield new Promise((resolve, reject) => { zip .generateNodeStream(Object.assign({ type: 'nodebuffer', streamFiles: true, compression: 'DEFLATE' }, options)) .pipe(fs.createWriteStream(destFile)) .on('error', (err) => { console.error('Error writing zip file:', err); reject(err); }) .on('finish', () => { console.log('Zip written successfully:', Date.now() - start, 'ms'); resolve(); }); }); } catch (ex) { console.error('Error creating zip:', ex); throw ex; } }); exports.compressFolder = compressFolder; /** * Creates a zip file from blobs (works in both Node.js and Browser) * @param {Record<string, Blob>} files Object with filenames as keys and blobs as values * @returns {Promise<Blob>} Zip file as blob */ const createZipFromBlobs = (files) => __awaiter(void 0, void 0, void 0, function* () { const zip = new jszip_1.default(); for (const [filepath, blob] of Object.entries(files)) { const dirs = filepath.split('/'); const filename = dirs.pop(); let currentFolder = zip; for (const dir of dirs) { currentFolder = currentFolder.folder(dir); } currentFolder.file(filename, blob); } return zip.generateAsync({ type: 'blob' }); }); exports.createZipFromBlobs = createZipFromBlobs; /** * Creates a zip file from base64 encoded files (works in both Node.js and Browser) * @param {Record<string, string>} files Object with filenames as keys and base64 strings as values * @returns {Promise<Blob>} Zip file as blob */ const createZipFromBase64 = (files) => __awaiter(void 0, void 0, void 0, function* () { const zip = new jszip_1.default(); for (const [filepath, base64] of Object.entries(files)) { const dirs = filepath.split('/'); const filename = dirs.pop(); let currentFolder = zip; for (const dir of dirs) { currentFolder = currentFolder.folder(dir); } currentFolder.file(filename, base64, { base64: true }); } return zip.generateAsync({ type: 'blob' }); }); exports.createZipFromBase64 = createZipFromBase64; //# sourceMappingURL=jszip-helper.js.map