mp70-pptx-automizer
Version:
A template based pptx generator
151 lines • 6.43 kB
JavaScript
;
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