zip-writer 1.0.1 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -2,11 +2,11 @@ import { writeZipEntry } from "./write-entry.js";
2
2
  import { getCDFH, getEOCDZip64, getEOCDStandard, } from "./write-central-directory.js";
3
3
  import { ZIP64_LIMIT } from "./constants.js";
4
4
  import { noop } from "./utils.js";
5
+ import { crc32 as crc32Default } from "#crc32";
5
6
  const BUFFER_SIZE = 16 * 1024; // 16 KB
6
7
  const bufferedQueue = new ByteLengthQueuingStrategy({
7
8
  highWaterMark: BUFFER_SIZE,
8
9
  });
9
- const unbufferedQueue = { highWaterMark: 0 };
10
10
  export class ZipWriter {
11
11
  #offset = BigInt(0);
12
12
  #zipStream = new TransformStream({
@@ -15,8 +15,8 @@ export class ZipWriter {
15
15
  this.#offset += BigInt(chunk.byteLength);
16
16
  },
17
17
  },
18
- // Unbuffered on the writable side, we already queue entries
19
- unbufferedQueue,
18
+ // default buffer on the writable side, we already queue entries
19
+ bufferedQueue,
20
20
  // Readable buffer, so that temporary delays on writable consumers don't
21
21
  // block the zip writing.
22
22
  bufferedQueue);
@@ -24,6 +24,13 @@ export class ZipWriter {
24
24
  #queued = Promise.resolve();
25
25
  #entryCount = 0;
26
26
  #finalized = false;
27
+ #crc32;
28
+ /**
29
+ * @param crc Optional CRC32 function to use. Defaults to zlib.crc32 on Node and a pure JS implementation in browsers.
30
+ */
31
+ constructor({ crc32 = crc32Default, } = {}) {
32
+ this.#crc32 = crc32;
33
+ }
27
34
  get readable() {
28
35
  return this.#zipStream.readable;
29
36
  }
@@ -38,10 +45,38 @@ export class ZipWriter {
38
45
  await this.#queued;
39
46
  }
40
47
  }
48
+ /**
49
+ * Convenience wrapper around `createEntryStream` to write all data at once.
50
+ * Use `createEntryStream` for more efficient streaming writes. Calls to
51
+ * createEntry() will be queued internally and each will resolve once it's
52
+ * written to the archive.
53
+ *
54
+ * @example
55
+ * ```ts
56
+ * const data = new TextEncoder().encode("Hello, World!");
57
+ * const entryInfo = await zipWriter.createEntry(data, { name: "hello.txt" });
58
+ * console.log(entryInfo);
59
+ * ```
60
+ *
61
+ * @param data Entry data
62
+ * @param options Entry filename, comment, compression method, etc.
63
+ * @returns Entry information once the entry has been written.
64
+ */
65
+ async createEntry(data, options) {
66
+ const entryWriter = this.createEntryStream(options);
67
+ const writer = entryWriter.writable.getWriter();
68
+ try {
69
+ await writer.write(data);
70
+ }
71
+ finally {
72
+ await writer.close();
73
+ }
74
+ return entryWriter.getEntryInfo();
75
+ }
41
76
  /**
42
77
  * Create a new entry in the Zip archive. Use the returned
43
78
  * entryWriter.writable to write data to the entry. You can await
44
- * entryWriter.entry() to get the entry info once all data has been written.
79
+ * entryWriter.getEntryInfo() to get the entry info once all data has been written.
45
80
  *
46
81
  * @example
47
82
  * ```ts
@@ -59,12 +94,12 @@ export class ZipWriter {
59
94
  * new TextEncoder().encode("Hello, World!")
60
95
  * );
61
96
  * await writer.close();
62
- * console.log(await entryWriter.entry()); // Entry info
97
+ * console.log(await entryWriter.getEntryInfo()); // Entry info
63
98
  * ```
64
99
  *
65
100
  * @param options Entry options
66
101
  */
67
- entry(options) {
102
+ createEntryStream(options) {
68
103
  if (this.#finalized) {
69
104
  throw new TypeError("Cannot add entry after finalize() has been called");
70
105
  }
@@ -88,6 +123,7 @@ export class ZipWriter {
88
123
  const reader = readable.getReader();
89
124
  try {
90
125
  const entryInfo = await writeZipEntry({
126
+ crc32: this.#crc32,
91
127
  writer,
92
128
  reader,
93
129
  entryOptions: options,
@@ -120,7 +156,7 @@ export class ZipWriter {
120
156
  *
121
157
  * @param entries New entries array
122
158
  */
123
- setEntries(entries) {
159
+ #setEntries(entries) {
124
160
  const currentEntriesByOffset = new Map();
125
161
  for (const entry of this.#entries) {
126
162
  currentEntriesByOffset.set(BigInt(entry.startOffset), entry);
@@ -145,11 +181,29 @@ export class ZipWriter {
145
181
  }
146
182
  this.#entries = entries.map((entry) => ({ ...entry }));
147
183
  }
148
- async finalize() {
184
+ /**
185
+ * Finalize the ZIP archive by writing the central directory and end of
186
+ * central directory records. You may not add any more entries after calling
187
+ * this method. This will await any pending entries to finish writing before
188
+ * finalizing.
189
+ *
190
+ * @param options.entries (Advanced) Optionally override the entries to write
191
+ * in the central directory. This can be used to reorder, remove, or rename
192
+ * entries before finalizing the archive, however you cannot add invalid
193
+ * entries, add additional entries, or modify their crc32, offsets or sizes.
194
+ * Use zipWriter.entries or entryWriter.getEntryInfo() to get the current
195
+ * entries for sorting or filtering.
196
+ *
197
+ * @returns Information about the finalized archive.
198
+ */
199
+ async finalize({ entries, } = {}) {
149
200
  if (this.#finalized) {
150
201
  throw new TypeError("finalize() has already been called");
151
202
  }
152
203
  this.#finalized = true;
204
+ if (entries) {
205
+ this.#setEntries(entries);
206
+ }
153
207
  // We do this as an IIFE to avoid an unhandled error, so that a user can
154
208
  // call finalize() without needing to await and catch an error. Any error
155
209
  // will be propagated to the stream output, but the user can optionally
@@ -206,8 +260,7 @@ export class ZipWriter {
206
260
  }
207
261
  }
208
262
  class EntryWriter {
209
- // Unbuffered stream to directly pipe to the zip writer
210
- #entryStream = new TransformStream(undefined, unbufferedQueue, unbufferedQueue);
263
+ #entryStream = new TransformStream(undefined, bufferedQueue, bufferedQueue);
211
264
  #written;
212
265
  /**
213
266
  * @param enqueueAndPipe Function that enqueues the entry data readable, pipes it to the Zip stream, and returns a promise that resolves to the entry info once done.
@@ -238,7 +291,7 @@ class EntryWriter {
238
291
  /**
239
292
  * Get entry info. Resolves once all data has been written to the Zip stream.
240
293
  */
241
- async entry() {
294
+ async getEntryInfo() {
242
295
  return this.#written;
243
296
  }
244
297
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/utils.d.ts CHANGED
@@ -1,4 +1,15 @@
1
1
  export declare function getDosTime(date: Date): number;
2
2
  export declare function getDosDate(date: Date): number;
3
3
  export declare function noop(): void;
4
+ type DataViewValue<T extends keyof typeof OFFSETS = keyof typeof OFFSETS> = T extends "setBigUint64" ? [T, bigint, boolean] : [T, number, boolean];
5
+ export declare const UINT16 = "setUint16";
6
+ export declare const UINT32 = "setUint32";
7
+ export declare const UINT64 = "setBigUint64";
8
+ declare const OFFSETS: {
9
+ setUint16: number;
10
+ setUint32: number;
11
+ setBigUint64: number;
12
+ };
13
+ export declare function writeDataView(view: DataView, values: DataViewValue[], offset?: number): number;
14
+ export {};
4
15
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAM7C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAM7C;AAED,wBAAgB,IAAI,SAAK"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAM7C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAM7C;AAED,wBAAgB,IAAI,SAAK;AAEzB,KAAK,aAAa,CAAC,CAAC,SAAS,MAAM,OAAO,OAAO,GAAG,MAAM,OAAO,OAAO,IACtE,CAAC,SAAS,cAAc,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAEzE,eAAO,MAAM,MAAM,cAAc,CAAC;AAClC,eAAO,MAAM,MAAM,cAAc,CAAC;AAClC,eAAO,MAAM,MAAM,iBAAiB,CAAC;AAGrC,QAAA,MAAM,OAAO;;;;CAImB,CAAC;AAEjC,wBAAgB,aAAa,CAC3B,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,aAAa,EAAE,EACvB,MAAM,GAAE,MAAU,GACjB,MAAM,CAOR"}
package/dist/utils.js CHANGED
@@ -9,4 +9,20 @@ export function getDosDate(date) {
9
9
  date.getDate());
10
10
  }
11
11
  export function noop() { }
12
+ export const UINT16 = "setUint16";
13
+ export const UINT32 = "setUint32";
14
+ export const UINT64 = "setBigUint64";
15
+ const OFFSETS = {
16
+ setUint16: 2,
17
+ setUint32: 4,
18
+ setBigUint64: 8,
19
+ };
20
+ export function writeDataView(view, values, offset = 0) {
21
+ for (const [method, value, littleEndian] of values) {
22
+ // @ts-expect-error
23
+ view[method](offset, value, littleEndian);
24
+ offset += OFFSETS[method];
25
+ }
26
+ return offset;
27
+ }
12
28
  //# sourceMappingURL=utils.js.map
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,IAAU;IACnC,OAAO,CACL,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;QACvB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACxB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CACzB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAU;IACnC,OAAO,CACL,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,OAAO,EAAE,CACf,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,IAAI,KAAI,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,IAAU;IACnC,OAAO,CACL,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;QACvB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACxB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CACzB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAU;IACnC,OAAO,CACL,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,OAAO,EAAE,CACf,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,IAAI,KAAI,CAAC;AAKzB,MAAM,CAAC,MAAM,MAAM,GAAG,WAAW,CAAC;AAClC,MAAM,CAAC,MAAM,MAAM,GAAG,WAAW,CAAC;AAClC,MAAM,CAAC,MAAM,MAAM,GAAG,cAAc,CAAC;AAGrC,MAAM,OAAO,GAAG;IACd,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,CAAC;IACZ,YAAY,EAAE,CAAC;CACe,CAAC;AAEjC,MAAM,UAAU,aAAa,CAC3B,IAAc,EACd,MAAuB,EACvB,SAAiB,CAAC;IAElB,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,IAAI,MAAM,EAAE,CAAC;QACnD,mBAAmB;QACnB,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;QAC1C,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"write-central-directory.d.ts","sourceRoot":"","sources":["../src/write-central-directory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAqC,MAAM,YAAY,CAAC;AAsB/E;;GAEG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,CAMrE;AAsND;;GAEG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EACpB,sBAAsB,EAAE,MAAM,EAC9B,oBAAoB,EAAE,MAAM,GAC3B,UAAU,CAAC,WAAW,CAAC,CAsCzB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,YAAY,EAAE,MAAM,EACpB,sBAAsB,EAAE,MAAM,EAC9B,oBAAoB,EAAE,MAAM,GAC3B,UAAU,CAAC,WAAW,CAAC,CAyGzB"}
1
+ {"version":3,"file":"write-central-directory.d.ts","sourceRoot":"","sources":["../src/write-central-directory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAqC,MAAM,YAAY,CAAC;AA+B/E;;GAEG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,CAMrE;AA2JD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EACpB,sBAAsB,EAAE,MAAM,EAC9B,oBAAoB,EAAE,MAAM,GAC3B,UAAU,CAAC,WAAW,CAAC,CAwBzB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,YAAY,EAAE,MAAM,EACpB,sBAAsB,EAAE,MAAM,EAC9B,oBAAoB,EAAE,MAAM,GAC3B,UAAU,CAAC,WAAW,CAAC,CA6DzB"}
@@ -1,5 +1,5 @@
1
- import { CENTRAL_DIRECTORY_SIGNATURE, END_OF_CENTRAL_DIR_SIGNATURE, ZIP64_END_OF_CENTRAL_DIR_SIGNATURE, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE, VERSION_MADE_BY, VERSION_NEEDED_STANDARD, VERSION_NEEDED_ZIP64, GENERAL_PURPOSE_FLAGS, COMPRESSION_METHOD_STORE, COMPRESSION_METHOD_DEFLATE, ZIP64_LIMIT, CENTRAL_DIRECTORY_HEADER_SIZE, EOCD_SIZE, EOCD64_SIZE, EOCD64_LOCATOR_SIZE, } from "./constants.js";
2
- import { getDosTime, getDosDate } from "./utils.js";
1
+ import { CENTRAL_DIRECTORY_SIGNATURE, END_OF_CENTRAL_DIR_SIGNATURE, ZIP64_END_OF_CENTRAL_DIR_SIGNATURE, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE, VERSION_MADE_BY, VERSION_NEEDED_STANDARD, VERSION_NEEDED_ZIP64, GENERAL_PURPOSE_FLAGS, COMPRESSION_METHOD_STORE, COMPRESSION_METHOD_DEFLATE, ZIP64_LIMIT, CENTRAL_DIRECTORY_HEADER_SIZE, EOCD_SIZE, EOCD64_SIZE, EOCD64_LOCATOR_SIZE, BIG_ENDIAN, LITTLE_ENDIAN, } from "./constants.js";
2
+ import { getDosTime, getDosDate, writeDataView, UINT16, UINT32, UINT64, } from "./utils.js";
3
3
  const textEncoder = new TextEncoder();
4
4
  /**
5
5
  * Generate the Central Directory File Header for the given entry info.
@@ -20,59 +20,46 @@ function getCDFHStandard(entryInfo) {
20
20
  const headerSize = CENTRAL_DIRECTORY_HEADER_SIZE + nameBytes.length + commentBytes.length;
21
21
  const header = new Uint8Array(headerSize);
22
22
  const view = new DataView(header.buffer);
23
- let offset = 0;
24
- // Central directory file header signature
25
- view.setUint32(offset, CENTRAL_DIRECTORY_SIGNATURE);
26
- offset += 4;
27
- // Version made by
28
- view.setUint16(offset, VERSION_MADE_BY, true);
29
- offset += 2;
30
- // Version needed to extract
31
- view.setUint16(offset, VERSION_NEEDED_STANDARD, true);
32
- offset += 2;
33
- // General purpose bit flag
34
- view.setUint16(offset, GENERAL_PURPOSE_FLAGS);
35
- offset += 2;
36
- // Compression method
37
- view.setUint16(offset, entryInfo.store ? COMPRESSION_METHOD_STORE : COMPRESSION_METHOD_DEFLATE, true);
38
- offset += 2;
39
- // Last mod file time & date
40
23
  const date = entryInfo.date || new Date();
41
- view.setUint16(offset, getDosTime(date), true);
42
- offset += 2;
43
- view.setUint16(offset, getDosDate(date), true);
44
- offset += 2;
45
- // CRC-32
46
- view.setUint32(offset, entryInfo.crc32, true);
47
- offset += 4;
48
- // Compressed size
49
- view.setUint32(offset, entryInfo.compressedSize, true);
50
- offset += 4;
51
- // Uncompressed size
52
- view.setUint32(offset, entryInfo.uncompressedSize, true);
53
- offset += 4;
54
- // File name length
55
- view.setUint16(offset, nameBytes.length, true);
56
- offset += 2;
57
- // Extra field length
58
- view.setUint16(offset, 0, true);
59
- offset += 2;
60
- // File comment length
61
- view.setUint16(offset, commentBytes.length, true);
62
- offset += 2;
63
- // Disk number start
64
- view.setUint16(offset, 0, true);
65
- offset += 2;
66
- // Internal file attributes
67
- view.setUint16(offset, 0, true);
68
- offset += 2;
69
- // External file attributes (Unix permissions if provided)
70
24
  const externalAttrs = entryInfo.mode ? entryInfo.mode << 16 : 0;
71
- view.setUint32(offset, externalAttrs, true);
72
- offset += 4;
73
- // Relative offset of local header
74
- view.setUint32(offset, entryInfo.startOffset, true);
75
- offset += 4;
25
+ const compressionMethod = entryInfo.store
26
+ ? COMPRESSION_METHOD_STORE
27
+ : COMPRESSION_METHOD_DEFLATE;
28
+ let offset = writeDataView(view, [
29
+ // Central directory file header signature
30
+ [UINT32, CENTRAL_DIRECTORY_SIGNATURE, BIG_ENDIAN],
31
+ // Version made by
32
+ [UINT16, VERSION_MADE_BY, LITTLE_ENDIAN],
33
+ // Version needed to extract
34
+ [UINT16, VERSION_NEEDED_STANDARD, LITTLE_ENDIAN],
35
+ // General purpose bit flag
36
+ [UINT16, GENERAL_PURPOSE_FLAGS, LITTLE_ENDIAN],
37
+ // Compression method
38
+ [UINT16, compressionMethod, LITTLE_ENDIAN],
39
+ // Last mod file time & date
40
+ [UINT16, getDosTime(date), LITTLE_ENDIAN],
41
+ [UINT16, getDosDate(date), LITTLE_ENDIAN],
42
+ // CRC-32
43
+ [UINT32, entryInfo.crc32, LITTLE_ENDIAN],
44
+ // Compressed size
45
+ [UINT32, entryInfo.compressedSize, LITTLE_ENDIAN],
46
+ // Uncompressed size
47
+ [UINT32, entryInfo.uncompressedSize, LITTLE_ENDIAN],
48
+ // File name length
49
+ [UINT16, nameBytes.length, LITTLE_ENDIAN],
50
+ // Extra field length
51
+ [UINT16, 0, LITTLE_ENDIAN],
52
+ // File comment length
53
+ [UINT16, commentBytes.length, LITTLE_ENDIAN],
54
+ // Disk number start
55
+ [UINT16, 0, LITTLE_ENDIAN],
56
+ // Internal file attributes
57
+ [UINT16, 0, LITTLE_ENDIAN],
58
+ // External file attributes (Unix permissions if provided)
59
+ [UINT32, externalAttrs, LITTLE_ENDIAN],
60
+ // Relative offset of local header
61
+ [UINT32, entryInfo.startOffset, LITTLE_ENDIAN],
62
+ ]);
76
63
  // File name
77
64
  header.set(nameBytes, offset);
78
65
  offset += nameBytes.length;
@@ -90,70 +77,64 @@ function getCDFHZip64(entryInfo) {
90
77
  // Extra field for ZIP64
91
78
  const extraField = new Uint8Array(28); // ZIP64 extra field
92
79
  const extraView = new DataView(extraField.buffer);
93
- extraView.setUint16(0, 0x0001, true); // ZIP64 extra field tag
94
- extraView.setUint16(2, 24, true); // Size of extra field data (3x 8-byte fields)
95
- extraView.setBigUint64(4, entryInfo.uncompressedSize, true); // Original size
96
- extraView.setBigUint64(12, entryInfo.compressedSize, true); // Compressed size
97
- extraView.setBigUint64(20, entryInfo.startOffset, true); // Relative header offset
80
+ writeDataView(extraView, [
81
+ // ZIP64 extra field tag
82
+ [UINT16, 0x0001, LITTLE_ENDIAN],
83
+ // Size of extra field data (3x 8-byte fields)
84
+ [UINT16, 24, LITTLE_ENDIAN],
85
+ // Original size
86
+ [UINT64, entryInfo.uncompressedSize, LITTLE_ENDIAN],
87
+ // Compressed size
88
+ [UINT64, entryInfo.compressedSize, LITTLE_ENDIAN],
89
+ // Relative header offset
90
+ [UINT64, entryInfo.startOffset, LITTLE_ENDIAN],
91
+ ]);
98
92
  const headerSize = CENTRAL_DIRECTORY_HEADER_SIZE +
99
93
  nameBytes.length +
100
94
  extraField.length +
101
95
  commentBytes.length;
102
96
  const header = new Uint8Array(headerSize);
103
97
  const view = new DataView(header.buffer);
104
- let offset = 0;
105
- // Central directory file header signature
106
- view.setUint32(offset, CENTRAL_DIRECTORY_SIGNATURE);
107
- offset += 4;
108
- // Version made by
109
- view.setUint16(offset, VERSION_MADE_BY, true);
110
- offset += 2;
111
- // Version needed to extract
112
- view.setUint16(offset, VERSION_NEEDED_ZIP64, true);
113
- offset += 2;
114
- // General purpose bit flag
115
- view.setUint16(offset, GENERAL_PURPOSE_FLAGS);
116
- offset += 2;
117
- // Compression method
118
- view.setUint16(offset, entryInfo.store ? COMPRESSION_METHOD_STORE : COMPRESSION_METHOD_DEFLATE, true);
119
- offset += 2;
120
- // Last mod file time & date
98
+ const compressionMethod = entryInfo.store
99
+ ? COMPRESSION_METHOD_STORE
100
+ : COMPRESSION_METHOD_DEFLATE;
121
101
  const date = entryInfo.date || new Date();
122
- view.setUint16(offset, getDosTime(date), true);
123
- offset += 2;
124
- view.setUint16(offset, getDosDate(date), true);
125
- offset += 2;
126
- // CRC-32
127
- view.setUint32(offset, entryInfo.crc32, true);
128
- offset += 4;
129
- // Compressed size (0xFFFFFFFF for ZIP64)
130
- view.setUint32(offset, 0xffffffff, true);
131
- offset += 4;
132
- // Uncompressed size (0xFFFFFFFF for ZIP64)
133
- view.setUint32(offset, 0xffffffff, true);
134
- offset += 4;
135
- // File name length
136
- view.setUint16(offset, nameBytes.length, true);
137
- offset += 2;
138
- // Extra field length
139
- view.setUint16(offset, extraField.length, true);
140
- offset += 2;
141
- // File comment length
142
- view.setUint16(offset, commentBytes.length, true);
143
- offset += 2;
144
- // Disk number start
145
- view.setUint16(offset, 0, true);
146
- offset += 2;
147
- // Internal file attributes
148
- view.setUint16(offset, 0, true);
149
- offset += 2;
150
- // External file attributes (Unix permissions if provided)
151
102
  const externalAttrs = entryInfo.mode ? entryInfo.mode << 16 : 0;
152
- view.setUint32(offset, externalAttrs, true);
153
- offset += 4;
154
- // Relative offset of local header (0xFFFFFFFF for ZIP64)
155
- view.setUint32(offset, 0xffffffff, true);
156
- offset += 4;
103
+ let offset = writeDataView(view, [
104
+ // Central directory file header signature
105
+ [UINT32, CENTRAL_DIRECTORY_SIGNATURE, BIG_ENDIAN],
106
+ // Version made by
107
+ [UINT16, VERSION_MADE_BY, LITTLE_ENDIAN],
108
+ // Version needed to extract
109
+ [UINT16, VERSION_NEEDED_ZIP64, LITTLE_ENDIAN],
110
+ // General purpose bit flag
111
+ [UINT16, GENERAL_PURPOSE_FLAGS, LITTLE_ENDIAN],
112
+ // Compression method
113
+ [UINT16, compressionMethod, LITTLE_ENDIAN],
114
+ // Last mod file time & date
115
+ [UINT16, getDosTime(date), LITTLE_ENDIAN],
116
+ [UINT16, getDosDate(date), LITTLE_ENDIAN],
117
+ // CRC-32
118
+ [UINT32, entryInfo.crc32, LITTLE_ENDIAN],
119
+ // Compressed size (0xFFFFFFFF for ZIP64)
120
+ [UINT32, 0xffffffff, LITTLE_ENDIAN],
121
+ // Uncompressed size (0xFFFFFFFF for ZIP64)
122
+ [UINT32, 0xffffffff, LITTLE_ENDIAN],
123
+ // File name length
124
+ [UINT16, nameBytes.length, LITTLE_ENDIAN],
125
+ // Extra field length
126
+ [UINT16, extraField.length, LITTLE_ENDIAN],
127
+ // File comment length
128
+ [UINT16, commentBytes.length, LITTLE_ENDIAN],
129
+ // Disk number start
130
+ [UINT16, 0, LITTLE_ENDIAN],
131
+ // Internal file attributes
132
+ [UINT16, 0, LITTLE_ENDIAN],
133
+ // External file attributes (Unix permissions if provided)
134
+ [UINT32, externalAttrs, LITTLE_ENDIAN],
135
+ // Relative offset of local header (0xFFFFFFFF for ZIP64)
136
+ [UINT32, 0xffffffff, LITTLE_ENDIAN],
137
+ ]);
157
138
  // File name
158
139
  header.set(nameBytes, offset);
159
140
  offset += nameBytes.length;
@@ -172,30 +153,24 @@ function getCDFHZip64(entryInfo) {
172
153
  export function getEOCDStandard(entriesCount, centralDirectoryOffset, centralDirectorySize) {
173
154
  const eocd = new Uint8Array(EOCD_SIZE);
174
155
  const view = new DataView(eocd.buffer);
175
- let offset = 0;
176
- // End of central dir signature
177
- view.setUint32(offset, END_OF_CENTRAL_DIR_SIGNATURE);
178
- offset += 4;
179
- // Number of this disk
180
- view.setUint16(offset, 0, true);
181
- offset += 2;
182
- // Disk where central directory starts
183
- view.setUint16(offset, 0, true);
184
- offset += 2;
185
- // Number of central directory records on this disk
186
- view.setUint16(offset, entriesCount, true);
187
- offset += 2;
188
- // Total number of central directory records
189
- view.setUint16(offset, entriesCount, true);
190
- offset += 2;
191
- // Size of central directory
192
- view.setUint32(offset, Number(centralDirectorySize), true);
193
- offset += 4;
194
- // Offset of start of central directory
195
- view.setUint32(offset, Number(centralDirectoryOffset), true);
196
- offset += 4;
197
- // ZIP file comment length
198
- view.setUint16(offset, 0, true);
156
+ writeDataView(view, [
157
+ // End of central dir signature
158
+ [UINT32, END_OF_CENTRAL_DIR_SIGNATURE, BIG_ENDIAN],
159
+ // Number of this disk
160
+ [UINT16, 0, LITTLE_ENDIAN],
161
+ // Disk where central directory starts
162
+ [UINT16, 0, LITTLE_ENDIAN],
163
+ // Number of central directory records on this disk
164
+ [UINT16, entriesCount, LITTLE_ENDIAN],
165
+ // Total number of central directory records
166
+ [UINT16, entriesCount, LITTLE_ENDIAN],
167
+ // Size of central directory
168
+ [UINT32, centralDirectorySize, LITTLE_ENDIAN],
169
+ // Offset of start of central directory
170
+ [UINT32, centralDirectoryOffset, LITTLE_ENDIAN],
171
+ // ZIP file comment length
172
+ [UINT16, 0, LITTLE_ENDIAN],
173
+ ]);
199
174
  return eocd;
200
175
  }
201
176
  /**
@@ -205,75 +180,55 @@ export function getEOCDZip64(entriesCount, centralDirectoryOffset, centralDirect
205
180
  const totalSize = EOCD64_SIZE + EOCD64_LOCATOR_SIZE + EOCD_SIZE;
206
181
  const buffer = new Uint8Array(totalSize);
207
182
  const view = new DataView(buffer.buffer);
208
- let offset = 0;
209
- // === ZIP64 End of Central Directory Record ===
210
- // Signature
211
- view.setUint32(offset, ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
212
- offset += 4;
213
- // Size of zip64 end of central directory record excluding the leading 12 bytes
214
- view.setBigUint64(offset, BigInt(EOCD64_SIZE - 12), true);
215
- offset += 8;
216
- // Version made by
217
- view.setUint16(offset, VERSION_MADE_BY, true);
218
- offset += 2;
219
- // Version needed to extract
220
- view.setUint16(offset, VERSION_NEEDED_ZIP64, true);
221
- offset += 2;
222
- // Number of this disk
223
- view.setUint32(offset, 0, true);
224
- offset += 4;
225
- // Disk where central directory starts
226
- view.setUint32(offset, 0, true);
227
- offset += 4;
228
- // Number of central directory records on this disk
229
- view.setBigUint64(offset, entriesCount, true);
230
- offset += 8;
231
- // Total number of central directory records
232
- view.setBigUint64(offset, entriesCount, true);
233
- offset += 8;
234
- // Size of central directory
235
- view.setBigUint64(offset, centralDirectorySize, true);
236
- offset += 8;
237
- // Offset of start of central directory
238
- view.setBigUint64(offset, centralDirectoryOffset, true);
239
- offset += 8;
240
- // === ZIP64 End of Central Directory Locator ===
241
- // Signature
242
- view.setUint32(offset, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
243
- offset += 4;
244
- // Number of the disk with the start of the zip64 end of central directory
245
- view.setUint32(offset, 0, true);
246
- offset += 4;
247
- // Relative offset of the zip64 end of central directory record
248
- view.setBigUint64(offset, centralDirectoryOffset + centralDirectorySize, true);
249
- offset += 8;
250
- // Total number of disks
251
- view.setUint32(offset, 1, true);
252
- offset += 4;
253
- // === Standard End of Central Directory Record ===
254
- // Signature
255
- view.setUint32(offset, END_OF_CENTRAL_DIR_SIGNATURE);
256
- offset += 4;
257
- // Number of this disk
258
- view.setUint16(offset, 0xffff, true);
259
- offset += 2;
260
- // Disk where central directory starts
261
- view.setUint16(offset, 0xffff, true);
262
- offset += 2;
263
- // Number of central directory records on this disk
264
- view.setUint16(offset, 0xffff, true);
265
- offset += 2;
266
- // Total number of central directory records
267
- view.setUint16(offset, 0xffff, true);
268
- offset += 2;
269
- // Size of central directory
270
- view.setUint32(offset, 0xffffffff, true);
271
- offset += 4;
272
- // Offset of start of central directory
273
- view.setUint32(offset, 0xffffffff, true);
274
- offset += 4;
275
- // ZIP file comment length
276
- view.setUint16(offset, 0, true);
183
+ let offset = writeDataView(view, [
184
+ // === ZIP64 End of Central Directory Record ===
185
+ // End of central dir signature
186
+ [UINT32, ZIP64_END_OF_CENTRAL_DIR_SIGNATURE, BIG_ENDIAN],
187
+ // Size of zip64 end of central directory record excluding the leading 12 bytes
188
+ [UINT64, BigInt(EOCD64_SIZE - 12), LITTLE_ENDIAN],
189
+ // Version made by
190
+ [UINT16, VERSION_MADE_BY, LITTLE_ENDIAN],
191
+ // Version needed to extract
192
+ [UINT16, VERSION_NEEDED_ZIP64, LITTLE_ENDIAN],
193
+ // Number of this disk
194
+ [UINT32, 0, LITTLE_ENDIAN],
195
+ // Disk where central directory starts
196
+ [UINT32, 0, LITTLE_ENDIAN],
197
+ // Number of central directory records on this disk
198
+ [UINT64, entriesCount, LITTLE_ENDIAN],
199
+ // Total number of central directory records
200
+ [UINT64, entriesCount, LITTLE_ENDIAN],
201
+ // Size of central directory
202
+ [UINT64, centralDirectorySize, LITTLE_ENDIAN],
203
+ // Offset of start of central directory
204
+ [UINT64, centralDirectoryOffset, LITTLE_ENDIAN],
205
+ // === ZIP64 End of Central Directory Locator ===
206
+ // Zip64 end of central dir locator signature
207
+ [UINT32, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE, BIG_ENDIAN],
208
+ // Number of the disk with the start of the zip64 end of central directory
209
+ [UINT32, 0, LITTLE_ENDIAN],
210
+ // Relative offset of the zip64 end of central directory record
211
+ [UINT64, centralDirectoryOffset + centralDirectorySize, LITTLE_ENDIAN],
212
+ // Total number of disks
213
+ [UINT32, 1, LITTLE_ENDIAN],
214
+ // === Standard End of Central Directory Record ===
215
+ // End of central dir signature
216
+ [UINT32, END_OF_CENTRAL_DIR_SIGNATURE, BIG_ENDIAN],
217
+ // Number of this disk
218
+ [UINT16, 0, LITTLE_ENDIAN],
219
+ // Disk where central directory starts
220
+ [UINT16, 0, LITTLE_ENDIAN],
221
+ // Number of central directory records on this disk
222
+ [UINT16, 0xffff, LITTLE_ENDIAN],
223
+ // Total number of central directory records
224
+ [UINT16, 0xffff, LITTLE_ENDIAN],
225
+ // Size of central directory
226
+ [UINT32, 0xffffffff, LITTLE_ENDIAN],
227
+ // Offset of start of central directory
228
+ [UINT32, 0xffffffff, LITTLE_ENDIAN],
229
+ // ZIP file comment length
230
+ [UINT16, 0, LITTLE_ENDIAN],
231
+ ]);
277
232
  return buffer;
278
233
  }
279
234
  //# sourceMappingURL=write-central-directory.js.map