"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());
    });
};
Object.defineProperty(exports, "__esModule", { value: true });
const AdmZip = require("adm-zip");
const fs_extra_1 = require("fs-extra");
const multimatch = require("multimatch");
const match = (file, patterns) => !patterns || !!multimatch(file, patterns, { dot: true }).length;
class Unzipper {
    constructor(archivePath) {
        this.archivePath = archivePath;
        this.unzipper = new AdmZip(archivePath);
        this.files = this.getArchivedFiles(this.unzipper);
        this.totallSize = this.getTotallSize();
    }
    getArchivedFiles(unzipper) {
        return unzipper.getEntries();
    }
    getTotallSize() {
        let totallSize = 0;
        this.files.forEach((file) => {
            totallSize += file.header.size;
        });
        return totallSize;
    }
    unzip(dest, { clean, patterns } = {}, onProgressCallback = () => { }) {
        return __awaiter(this, void 0, void 0, function* () {
            if (clean)
                yield fs_extra_1.emptyDir(dest);
            return new Promise((resolve, reject) => {
                this.files.forEach((file, index) => {
                    try {
                        if (file.isDirectory || !match(file.entryName, patterns))
                            return;
                        this.unzipper.extractEntryTo(file, dest, true, true);
                        onProgressCallback((index + 1) / this.files.length * 100);
                    }
                    catch (err) {
                        console.log(file.entryName);
                        return reject(err);
                    }
                });
                return resolve();
            });
        });
    }
}
exports.default = Unzipper;
//# sourceMappingURL=Unzipper.js.map