| 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 | 1×
1×
1×
1×
49×
49×
49×
1×
883×
883×
1×
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×
1×
883×
883×
883×
883×
883×
883×
883×
883×
883×
883×
883×
883×
883×
883×
883×
883×
883×
1×
883×
883×
883×
883×
883×
883×
883×
883×
883×
883×
883×
883×
883×
883×
883×
883×
883×
883×
883×
883×
883×
883×
883×
1×
49×
49×
49×
49×
49×
49×
49×
49×
49×
49×
49×
1×
1766×
1766×
1766×
1766×
1×
1766×
1766×
1766×
1766×
1×
1×
| 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;
});
|