all files / diagram/load-utility/visio-import-export/ zipWriter.js

100% Statements 105/105
100% Branches 2/2
100% Functions 11/11
100% Lines 104/104
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121   49× 49× 49×   883×     883×   49× 49× 49× 49× 883× 883× 883× 883× 883× 883× 883× 883×   49× 49× 883× 883× 883×   49× 49× 2698× 49× 49× 49× 2698× 2698× 2698×   49×   883× 883× 883× 883× 883× 883× 883× 883× 883× 883× 883× 883× 883× 883× 883× 883× 883×   883× 883× 883× 883× 883× 883× 883× 883× 883× 883× 883× 883× 883× 883× 883× 883× 883× 883× 883× 883× 883× 883× 883×   49× 49× 49× 49× 49× 49× 49× 49× 49× 49× 49×   1766× 1766× 1766× 1766×   1766× 1766× 1766× 1766×        
define(["require", "exports"], function (require, exports) {
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    var MinimalZipWriter = (function () {
        function MinimalZipWriter() {
            this.files = [];
            this.centralDirOffset = 0;
            this.date = new Date();
        }
        MinimalZipWriter.prototype.addFile = function (filename, data) {
            var dataArray = typeof data === 'string'
                ? new TextEncoder().encode(data)
                : data;
            this.files.push({ name: filename, data: dataArray });
        };
        MinimalZipWriter.prototype.generate = function () {
            var fileData = [];
            var centralDir = [];
            var offset = 0;
            for (var _i = 0, _a = this.files; _i < _a.length; _i++) {
                var file = _a[_i];
                var filenameBytes = new TextEncoder().encode(file.name);
                var header = this.createLocalFileHeader(filenameBytes, file.data);
                fileData.push(header);
                fileData.push(file.data);
                var cdEntry = this.createCentralDirEntry(filenameBytes, file.data, offset);
                centralDir.push(cdEntry);
                offset += header.length + file.data.length;
            }
            this.centralDirOffset = offset;
            for (var _b = 0, centralDir_1 = centralDir; _b < centralDir_1.length; _b++) {
                var entry = centralDir_1[_b];
                fileData.push(entry);
                offset += entry.length;
            }
            var eocd = this.createEndOfCentralDirRecord(centralDir.length, this.centralDirOffset, offset - this.centralDirOffset);
            fileData.push(eocd);
            var totalLength = fileData.reduce(function (sum, arr) { return sum + arr.length; }, 0);
            var result = new Uint8Array(totalLength);
            var pos = 0;
            for (var _c = 0, fileData_1 = fileData; _c < fileData_1.length; _c++) {
                var arr = fileData_1[_c];
                result.set(arr, pos);
                pos += arr.length;
            }
            return result.buffer;
        };
        MinimalZipWriter.prototype.createLocalFileHeader = function (filenameBytes, data) {
            var header = new Uint8Array(30 + filenameBytes.length);
            var view = new DataView(header.buffer);
            view.setUint32(0, 0x04034b50, true);
            view.setUint16(4, 20, true);
            view.setUint16(6, 0, true);
            view.setUint16(8, 0, true);
            var time = this.dosTime(this.date);
            view.setUint16(10, time, true);
            var date = this.dosDate(this.date);
            view.setUint16(12, date, true);
            view.setUint32(14, 0, true);
            view.setUint32(18, data.length, true);
            view.setUint32(22, data.length, true);
            view.setUint16(26, filenameBytes.length, true);
            view.setUint16(28, 0, true);
            header.set(filenameBytes, 30);
            return header;
        };
        MinimalZipWriter.prototype.createCentralDirEntry = function (filenameBytes, data, offset) {
            var entry = new Uint8Array(46 + filenameBytes.length);
            var view = new DataView(entry.buffer);
            view.setUint32(0, 0x02014b50, true);
            view.setUint16(4, 20, true);
            view.setUint16(6, 20, true);
            view.setUint16(8, 0, true);
            view.setUint16(10, 0, true);
            var time = this.dosTime(this.date);
            view.setUint16(12, time, true);
            var date = this.dosDate(this.date);
            view.setUint16(14, date, true);
            view.setUint32(16, 0, true);
            view.setUint32(20, data.length, true);
            view.setUint32(24, data.length, true);
            view.setUint16(28, filenameBytes.length, true);
            view.setUint16(30, 0, true);
            view.setUint16(32, 0, true);
            view.setUint16(34, 0, true);
            view.setUint16(36, 0, true);
            view.setUint32(38, 0, true);
            view.setUint32(42, offset, true);
            entry.set(filenameBytes, 46);
            return entry;
        };
        MinimalZipWriter.prototype.createEndOfCentralDirRecord = function (entries, cdOffset, cdSize) {
            var eocd = new Uint8Array(22);
            var view = new DataView(eocd.buffer);
            view.setUint32(0, 0x06054b50, true);
            view.setUint16(4, 0, true);
            view.setUint16(6, 0, true);
            view.setUint16(8, entries, true);
            view.setUint16(10, entries, true);
            view.setUint32(12, cdSize, true);
            view.setUint32(16, cdOffset, true);
            view.setUint16(20, 0, true);
            return eocd;
        };
        MinimalZipWriter.prototype.dosTime = function (date) {
            var hours = date.getHours();
            var minutes = date.getMinutes();
            var seconds = date.getSeconds();
            return (hours << 11) | (minutes << 5) | (seconds >> 1);
        };
        MinimalZipWriter.prototype.dosDate = function (date) {
            var year = date.getFullYear() - 1980;
            var month = date.getMonth() + 1;
            var day = date.getDate();
            return (year << 9) | (month << 5) | day;
        };
        return MinimalZipWriter;
    }());
    exports.MinimalZipWriter = MinimalZipWriter;
});