zip-writer 1.1.2 → 2.1.0

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
@@ -1,12 +1,13 @@
1
- import { writeZipEntry } from "./write-entry.js";
2
- import { getCDFH, getEOCDZip64, getEOCDStandard, } from "./write-central-directory.js";
3
- import { ZIP64_LIMIT } from "./constants.js";
4
- import { noop } from "./utils.js";
1
+ import { getDataDescriptor, getLocalFileHeader } from "./write-entry.js";
2
+ import { getCDFH, getEOCD } from "./write-central-directory.js";
3
+ import { entryNeedsZip64, eocdNeedsZip64, getPublicEntryInfo, noop, validateEntryOptions, } from "./utils.js";
5
4
  import { crc32 as crc32Default } from "#crc32";
5
+ import Mutex from "p-mutex";
6
6
  const BUFFER_SIZE = 16 * 1024; // 16 KB
7
7
  const bufferedQueue = new ByteLengthQueuingStrategy({
8
8
  highWaterMark: BUFFER_SIZE,
9
9
  });
10
+ const textEncoder = new TextEncoder();
10
11
  export class ZipWriter {
11
12
  #offset = BigInt(0);
12
13
  #zipStream = new TransformStream({
@@ -21,10 +22,9 @@ export class ZipWriter {
21
22
  // block the zip writing.
22
23
  bufferedQueue);
23
24
  #entries = [];
24
- #queued = Promise.resolve();
25
- #entryCount = 0;
26
- #finalized = false;
27
25
  #crc32;
26
+ #mutex = new Mutex();
27
+ #finalized = false;
28
28
  /**
29
29
  * @param crc Optional CRC32 function to use. Defaults to zlib.crc32 on Node and a pure JS implementation in browsers.
30
30
  */
@@ -34,44 +34,11 @@ export class ZipWriter {
34
34
  get readable() {
35
35
  return this.#zipStream.readable;
36
36
  }
37
- get entries() {
38
- return this.#entries;
39
- }
40
- /**
41
- * Wait until all currently queued entries have been written.
42
- */
43
- async onceQueueEmpty() {
44
- while (this.#entries.length < this.#entryCount) {
45
- await this.#queued;
46
- }
47
- }
48
37
  /**
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.
38
+ * Get an array of entry information for all entries added so far to the ZIP archive.
64
39
  */
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();
40
+ entries() {
41
+ return this.#mutex.withLock(() => this.#entries.map((entry) => getPublicEntryInfo(entry)));
75
42
  }
76
43
  /**
77
44
  * Create a new entry in the Zip archive. Use the returned
@@ -99,56 +66,104 @@ export class ZipWriter {
99
66
  *
100
67
  * @param options Entry options
101
68
  */
102
- createEntryStream(options) {
69
+ addEntry({ readable, ...entryOptions }) {
103
70
  if (this.#finalized) {
104
71
  throw new TypeError("Cannot add entry after finalize() has been called");
105
72
  }
106
- this.#entryCount++;
107
- // Capture the previous queue position
108
- const prevQueued = this.#queued;
109
- // Create a promise that will be resolved when this entry completes
110
- let entryDone;
111
- let entryError;
112
- this.#queued = new Promise((resolve, reject) => {
113
- entryDone = resolve;
114
- entryError = reject;
115
- });
116
- // prevent unhandled rejection, but we still want this.#queued to reject
117
- // when awaited if there's an error
118
- this.#queued.catch(noop);
119
- return new EntryWriter(async (readable) => {
120
- // Wait for previous entry to complete
121
- await prevQueued;
122
- const writer = this.#zipStream.writable.getWriter();
123
- const reader = readable.getReader();
73
+ // Encode now to catch range errors synchronously
74
+ const entryOptionsInternal = {
75
+ ...entryOptions,
76
+ nameBytes: textEncoder.encode(entryOptions.name),
77
+ commentBytes: entryOptions.comment
78
+ ? textEncoder.encode(entryOptions.comment)
79
+ : new Uint8Array(),
80
+ };
81
+ validateEntryOptions(entryOptionsInternal);
82
+ const entryInfoPromise = this.#mutex.withLock(async () => {
83
+ // -- Write local file header --
84
+ let writer = this.#zipStream.writable.getWriter();
85
+ await writer.ready;
86
+ const startOffset = this.#offset;
124
87
  try {
125
- const entryInfo = await writeZipEntry({
126
- crc32: this.#crc32,
127
- writer,
128
- reader,
129
- entryOptions: options,
130
- startOffset: this.#offset,
131
- });
132
- this.#entries.push(entryInfo);
133
- entryDone();
134
- return entryInfo;
88
+ // This is in a try...catch because if writing the local file header
89
+ // fails, we want to abort the output zip readable stream.
90
+ await writer.write(getLocalFileHeader(entryOptionsInternal));
91
+ // Await all data has been written before we releaseLock and read the offset
92
+ await writer.ready;
135
93
  }
136
94
  catch (err) {
137
- entryError(err);
138
- await reader.cancel(err);
139
- // Abort the zip stream - it's corrupted after a partial entry write
140
- this.#zipStream.writable.abort(err);
141
- // Don't call entryDone() - leave subsequent entries waiting forever
142
- // since the zip stream is corrupted
143
- // This error is handled in the EntryWriter constructor, and used to
144
- // abort the entry writable stream
95
+ // Let the readable size know we are no longer consuming data
96
+ /* istanbul ignore next -- @preserve */
97
+ readable.cancel(err);
98
+ // Put the zip stream writable into an error state, which will propogate
99
+ // to the readable side and anything consuming it
100
+ /* istanbul ignore next -- @preserve */
101
+ await writer.abort(err);
102
+ /* istanbul ignore next -- @preserve */
103
+ writer.releaseLock();
104
+ /* istanbul ignore next -- @preserve */
145
105
  throw err;
146
106
  }
147
- finally {
148
- reader.releaseLock();
107
+ writer.releaseLock();
108
+ const fileStartOffset = this.#offset;
109
+ // -- Write file data --
110
+ let uncompressedSize = BigInt(0);
111
+ let checksum = 0;
112
+ const crcAndSizeStream = new TransformStream({
113
+ transform: async (chunk, controller) => {
114
+ const byteLength = BigInt(chunk.byteLength);
115
+ uncompressedSize += byteLength;
116
+ checksum = this.#crc32(chunk, checksum);
117
+ controller.enqueue(chunk);
118
+ },
119
+ });
120
+ const compressionStream = entryOptions.store
121
+ ? new TransformStream()
122
+ : new CompressionStream("deflate-raw");
123
+ await readable
124
+ .pipeThrough(crcAndSizeStream)
125
+ .pipeThrough(compressionStream)
126
+ .pipeTo(this.#zipStream.writable, { preventClose: true });
127
+ // -- Write data descriptor --
128
+ writer = this.#zipStream.writable.getWriter();
129
+ // Await here to ensure all data has been written, so we know this.#offset is accurate
130
+ await writer.ready;
131
+ const compressedSize = this.#offset - fileStartOffset;
132
+ const needsZip64 = entryNeedsZip64({
133
+ uncompressedSize,
134
+ compressedSize,
135
+ startOffset,
136
+ });
137
+ const entryInfo = {
138
+ ...entryOptionsInternal,
139
+ startOffset,
140
+ crc32: checksum,
141
+ uncompressedSize,
142
+ compressedSize,
143
+ zip64: needsZip64,
144
+ };
145
+ try {
146
+ // This is in a try...catch because writing the data descriptor could fail,
147
+ // and we want to abort the output zip readable stream if that happens.
148
+ await writer.write(getDataDescriptor(entryInfo));
149
+ }
150
+ catch (err) {
151
+ /* istanbul ignore next -- @preserve */
152
+ await writer.abort(err);
153
+ /* istanbul ignore next -- @preserve */
149
154
  writer.releaseLock();
155
+ // The readable has already been fully consumed at this point, so no need to cancel it
156
+ /* istanbul ignore next -- @preserve */
157
+ throw err;
150
158
  }
159
+ writer.releaseLock();
160
+ this.#entries.push(entryInfo);
161
+ return getPublicEntryInfo(entryInfo);
151
162
  });
163
+ // Avoid an uncaught rejection if the user doesn't await entryInfoPromise
164
+ // - error handling can be done on the readable stream
165
+ entryInfoPromise.catch(noop);
166
+ return entryInfoPromise;
152
167
  }
153
168
  /**
154
169
  * Set the entries of the Zip archive. This can be used to reorder,
@@ -159,7 +174,7 @@ export class ZipWriter {
159
174
  #setEntries(entries) {
160
175
  const currentEntriesByOffset = new Map();
161
176
  for (const entry of this.#entries) {
162
- currentEntriesByOffset.set(BigInt(entry.startOffset), entry);
177
+ currentEntriesByOffset.set(entry.startOffset, entry);
163
178
  }
164
179
  // Entries can't have their offset, crc32, compressed size, or uncompressed
165
180
  // size changed, but they can be removed, reordered, or have the name and
@@ -172,14 +187,24 @@ export class ZipWriter {
172
187
  if (existingEntry.crc32 !== entry.crc32) {
173
188
  throw new Error(`Cannot set entries: entry at offset ${entry.startOffset} has different CRC32`);
174
189
  }
175
- if (existingEntry.uncompressedSize !== entry.uncompressedSize) {
190
+ if (existingEntry.uncompressedSize !== BigInt(entry.uncompressedSize)) {
176
191
  throw new Error(`Cannot set entries: entry at offset ${entry.startOffset} has different uncompressed size`);
177
192
  }
178
- if (existingEntry.compressedSize !== entry.compressedSize) {
193
+ if (existingEntry.compressedSize !== BigInt(entry.compressedSize)) {
179
194
  throw new Error(`Cannot set entries: entry at offset ${entry.startOffset} has different compressed size`);
180
195
  }
181
196
  }
182
- this.#entries = entries.map((entry) => ({ ...entry }));
197
+ // TODO: edge-case a user could pass an entry with an invalid zip64 flag
198
+ this.#entries = entries.map((entry) => ({
199
+ ...entry,
200
+ uncompressedSize: BigInt(entry.uncompressedSize),
201
+ compressedSize: BigInt(entry.compressedSize),
202
+ startOffset: BigInt(entry.startOffset),
203
+ nameBytes: textEncoder.encode(entry.name),
204
+ commentBytes: entry.comment
205
+ ? textEncoder.encode(entry.comment)
206
+ : new Uint8Array(0),
207
+ }));
183
208
  }
184
209
  /**
185
210
  * Finalize the ZIP archive by writing the central directory and end of
@@ -196,23 +221,27 @@ export class ZipWriter {
196
221
  *
197
222
  * @returns Information about the finalized archive.
198
223
  */
199
- async finalize({ entries, } = {}) {
224
+ finalize({ entries } = {}) {
200
225
  if (this.#finalized) {
201
226
  throw new TypeError("finalize() has already been called");
202
227
  }
203
228
  this.#finalized = true;
204
- if (entries) {
205
- this.#setEntries(entries);
206
- }
207
- // We do this as an IIFE to avoid an unhandled error, so that a user can
208
- // call finalize() without needing to await and catch an error. Any error
209
- // will be propagated to the stream output, but the user can optionally
210
- // await finalize() to also see the error.
211
- const finalizePromise = (async () => {
212
- await this.onceQueueEmpty();
229
+ const zipInfoPromise = this.#mutex.withLock(async () => {
230
+ if (entries) {
231
+ try {
232
+ this.#setEntries(entries);
233
+ }
234
+ catch (err) {
235
+ // If setting entries fails, we still want to finalize the zip stream
236
+ // so that consumers don't hang waiting for data that will never come.
237
+ this.#zipStream.writable.abort(err);
238
+ throw err;
239
+ }
240
+ }
213
241
  // Write central directory headers for all entries
214
- const centralDirectoryStart = this.#offset;
215
242
  const writer = this.#zipStream.writable.getWriter();
243
+ await writer.ready;
244
+ const centralDirectoryStart = this.#offset;
216
245
  try {
217
246
  let entryUsesZip64 = false;
218
247
  let uncompressedEntriesSize = BigInt(0);
@@ -223,25 +252,21 @@ export class ZipWriter {
223
252
  }
224
253
  uncompressedEntriesSize += BigInt(entry.uncompressedSize);
225
254
  compressedEntriesSize += BigInt(entry.compressedSize);
255
+ await writer.ready;
226
256
  await writer.write(getCDFH(entry));
227
257
  }
258
+ await writer.ready;
228
259
  const centralDirectorySize = this.#offset - centralDirectoryStart;
229
- // Determine if the archive needs ZIP64 based on entries or central directory
230
- const eocdNeedsZip64 = this.#entries.length > 0xffff ||
231
- centralDirectoryStart > ZIP64_LIMIT ||
232
- centralDirectorySize > ZIP64_LIMIT;
233
- let eocd;
234
- if (eocdNeedsZip64) {
235
- eocd = getEOCDZip64(BigInt(this.#entries.length), centralDirectoryStart, centralDirectorySize);
236
- }
237
- else {
238
- eocd = getEOCDStandard(this.#entries.length, Number(centralDirectoryStart), Number(centralDirectorySize));
239
- }
260
+ const eocdOptions = {
261
+ centralDirectoryStart,
262
+ centralDirectorySize,
263
+ entriesCount: this.#entries.length,
264
+ };
265
+ const eocd = getEOCD(eocdOptions);
240
266
  await writer.write(eocd);
241
- // Close the zip stream
242
267
  await writer.close();
243
268
  return {
244
- zip64: eocdNeedsZip64 || entryUsesZip64,
269
+ zip64: eocdNeedsZip64(eocdOptions) || entryUsesZip64,
245
270
  uncompressedEntriesSize,
246
271
  compressedEntriesSize,
247
272
  fileSize: this.#offset,
@@ -254,45 +279,11 @@ export class ZipWriter {
254
279
  finally {
255
280
  writer.releaseLock();
256
281
  }
257
- })();
258
- finalizePromise.catch(noop); // prevent unhandled rejection
259
- return finalizePromise;
260
- }
261
- }
262
- class EntryWriter {
263
- #entryStream = new TransformStream(undefined, bufferedQueue, bufferedQueue);
264
- #written;
265
- /**
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.
267
- */
268
- constructor(enqueueAndPipe) {
269
- // We could try to pass the zipstream writable to EntryWriter, but then
270
- // EntryWriter would not know when the entry has finished writing, and would
271
- // not have a way to get the entry info.
272
- this.#written = enqueueAndPipe(this.#entryStream.readable);
273
- // abort the writable quickly if there is an error, and ensure we don't
274
- // throw an uncaught error.
275
- this.#written.catch((reason) => {
276
- this.#entryStream.writable.abort(reason);
277
282
  });
278
- }
279
- /**
280
- * Writable stream to write entry data to.
281
- *
282
- * @example
283
- * ```ts
284
- * ReadableStream.from([new TextEncoder().encode("Hello, World!")])
285
- * .pipeTo(entryWriter.writable);
286
- * ```
287
- */
288
- get writable() {
289
- return this.#entryStream.writable;
290
- }
291
- /**
292
- * Get entry info. Resolves once all data has been written to the Zip stream.
293
- */
294
- async getEntryInfo() {
295
- return this.#written;
283
+ // Avoid an uncaught rejection if the user doesn't await finalize() - error
284
+ // handling can be done on the readable stream
285
+ zipInfoPromise.catch(noop);
286
+ return zipInfoPromise;
296
287
  }
297
288
  }
298
289
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EACL,OAAO,EACP,YAAY,EACZ,eAAe,GAChB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,QAAQ,CAAC;AAE/C,MAAM,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,QAAQ;AACvC,MAAM,aAAa,GAAG,IAAI,yBAAyB,CAAC;IAClD,aAAa,EAAE,WAAW;CAC3B,CAAC,CAAC;AAsCH,MAAM,OAAO,SAAS;IACpB,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACpB,UAAU,GAAG,IAAI,eAAe,CAC9B;QACE,SAAS,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;YAC/B,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC3C,CAAC;KACF;IACD,gEAAgE;IAChE,aAAa;IACb,wEAAwE;IACxE,yBAAyB;IACzB,aAAa,CACd,CAAC;IACF,QAAQ,GAAgB,EAAE,CAAC;IAC3B,OAAO,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IAC9C,WAAW,GAAG,CAAC,CAAC;IAChB,UAAU,GAAG,KAAK,CAAC;IACnB,MAAM,CAAC;IAEP;;OAEG;IACH,YAAY,EACV,KAAK,GAAG,YAAY,MAGlB,EAAE;QACJ,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;IAClC,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/C,MAAM,IAAI,CAAC,OAAO,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,CAAC,WAAW,CAAC,IAA6B,EAAE,OAAqB;QACpE,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QACD,OAAO,WAAW,CAAC,YAAY,EAAE,CAAC;IACpC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,iBAAiB,CAAC,OAAqB;QACrC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,sCAAsC;QACtC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC;QAEhC,mEAAmE;QACnE,IAAI,SAAqB,CAAC;QAC1B,IAAI,UAAqC,CAAC;QAC1C,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnD,SAAS,GAAG,OAAO,CAAC;YACpB,UAAU,GAAG,MAAM,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,wEAAwE;QACxE,mCAAmC;QACnC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEzB,OAAO,IAAI,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YACxC,sCAAsC;YACtC,MAAM,UAAU,CAAC;YAEjB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YACpD,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC;oBACpC,KAAK,EAAE,IAAI,CAAC,MAAM;oBAClB,MAAM;oBACN,MAAM;oBACN,YAAY,EAAE,OAAO;oBACrB,WAAW,EAAE,IAAI,CAAC,OAAO;iBAC1B,CAAC,CAAC;gBACH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC9B,SAAS,EAAE,CAAC;gBACZ,OAAO,SAAS,CAAC;YACnB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,UAAU,CAAC,GAAG,CAAC,CAAC;gBAChB,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACzB,oEAAoE;gBACpE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACpC,oEAAoE;gBACpE,oCAAoC;gBACpC,oEAAoE;gBACpE,kCAAkC;gBAClC,MAAM,GAAG,CAAC;YACZ,CAAC;oBAAS,CAAC;gBACT,MAAM,CAAC,WAAW,EAAE,CAAC;gBACrB,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,WAAW,CAAC,OAA2C;QACrD,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAqB,CAAC;QAC5D,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC;QAC/D,CAAC;QACD,2EAA2E;QAC3E,yEAAyE;QACzE,mBAAmB;QACnB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,aAAa,GAAG,sBAAsB,CAAC,GAAG,CAC9C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAC1B,CAAC;YACF,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CACb,uCAAuC,KAAK,CAAC,WAAW,iBAAiB,CAC1E,CAAC;YACJ,CAAC;YACD,IAAI,aAAa,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CACb,uCAAuC,KAAK,CAAC,WAAW,sBAAsB,CAC/E,CAAC;YACJ,CAAC;YACD,IAAI,aAAa,CAAC,gBAAgB,KAAK,KAAK,CAAC,gBAAgB,EAAE,CAAC;gBAC9D,MAAM,IAAI,KAAK,CACb,uCAAuC,KAAK,CAAC,WAAW,kCAAkC,CAC3F,CAAC;YACJ,CAAC;YACD,IAAI,aAAa,CAAC,cAAc,KAAK,KAAK,CAAC,cAAc,EAAE,CAAC;gBAC1D,MAAM,IAAI,KAAK,CACb,uCAAuC,KAAK,CAAC,WAAW,gCAAgC,CACzF,CAAC;YACJ,CAAC;QACH,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,QAAQ,CAAC,EACb,OAAO,MAC6C,EAAE;QAUtD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QAED,wEAAwE;QACxE,yEAAyE;QACzE,uEAAuE;QACvE,0CAA0C;QAC1C,MAAM,eAAe,GAAG,CAAC,KAAK,IAAI,EAAE;YAClC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAE5B,kDAAkD;YAClD,MAAM,qBAAqB,GAAG,IAAI,CAAC,OAAO,CAAC;YAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YAEpD,IAAI,CAAC;gBACH,IAAI,cAAc,GAAG,KAAK,CAAC;gBAC3B,IAAI,uBAAuB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBACxC,IAAI,qBAAqB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBACtC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAClC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;wBAChB,cAAc,GAAG,IAAI,CAAC;oBACxB,CAAC;oBACD,uBAAuB,IAAI,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;oBAC1D,qBAAqB,IAAI,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;oBACtD,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrC,CAAC;gBAED,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,GAAG,qBAAqB,CAAC;gBAElE,6EAA6E;gBAC7E,MAAM,cAAc,GAClB,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM;oBAC7B,qBAAqB,GAAG,WAAW;oBACnC,oBAAoB,GAAG,WAAW,CAAC;gBAErC,IAAI,IAA6B,CAAC;gBAClC,IAAI,cAAc,EAAE,CAAC;oBACnB,IAAI,GAAG,YAAY,CACjB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAC5B,qBAAqB,EACrB,oBAAoB,CACrB,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,IAAI,GAAG,eAAe,CACpB,IAAI,CAAC,QAAQ,CAAC,MAAM,EACpB,MAAM,CAAC,qBAAqB,CAAC,EAC7B,MAAM,CAAC,oBAAoB,CAAC,CAC7B,CAAC;gBACJ,CAAC;gBAED,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAEzB,uBAAuB;gBACvB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;gBAErB,OAAO;oBACL,KAAK,EAAE,cAAc,IAAI,cAAc;oBACvC,uBAAuB;oBACvB,qBAAqB;oBACrB,QAAQ,EAAE,IAAI,CAAC,OAAO;iBACvB,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACxB,MAAM,GAAG,CAAC;YACZ,CAAC;oBAAS,CAAC;gBACT,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QACL,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,8BAA8B;QAC3D,OAAO,eAAe,CAAC;IACzB,CAAC;CACF;AAED,MAAM,WAAW;IACf,YAAY,GAAG,IAAI,eAAe,CAChC,SAAS,EACT,aAAa,EACb,aAAa,CACd,CAAC;IACF,QAAQ,CAAqB;IAE7B;;OAEG;IACH,YACE,cAEuB;QAEvB,uEAAuE;QACvE,4EAA4E;QAC5E,wCAAwC;QACxC,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC3D,uEAAuE;QACvE,2BAA2B;QAC3B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE;YAC7B,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;OAQG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Helper for creating a ReadableStream from a Uint8Array
3
+ * with proper backpressure handling.
4
+ *
5
+ * @param data The input Uint8Array
6
+ */
7
+ export declare function readableFromBytes(data: Uint8Array<ArrayBuffer>): ReadableStream<ArrayBufferView<ArrayBufferLike>>;
8
+ //# sourceMappingURL=readable-from-bytes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readable-from-bytes.d.ts","sourceRoot":"","sources":["../src/readable-from-bytes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,oDAsB9D"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Helper for creating a ReadableStream from a Uint8Array
3
+ * with proper backpressure handling.
4
+ *
5
+ * @param data The input Uint8Array
6
+ */
7
+ export function readableFromBytes(data) {
8
+ let offset = 0;
9
+ return new ReadableStream({
10
+ pull(controller) {
11
+ if (offset >= data.byteLength) {
12
+ controller.close();
13
+ return;
14
+ }
15
+ const chunkSize = Math.min(
16
+ // desiredSize can't be null here - it's only null after close()
17
+ // It could be <=0 under some circumstances, so ensure at least 1 byte is read
18
+ Math.max(controller.desiredSize, 1), data.byteLength - offset);
19
+ const chunk = data.subarray(offset, offset + chunkSize);
20
+ controller.enqueue(chunk);
21
+ offset += chunkSize;
22
+ },
23
+ }, new ByteLengthQueuingStrategy({ highWaterMark: 16 * 1024 }));
24
+ }
25
+ //# sourceMappingURL=readable-from-bytes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readable-from-bytes.js","sourceRoot":"","sources":["../src/readable-from-bytes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAA6B;IAC7D,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,IAAI,cAAc,CACvB;QACE,IAAI,CAAC,UAAU;YACb,IAAI,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC9B,UAAU,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO;YACT,CAAC;YACD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG;YACxB,gEAAgE;YAChE,8EAA8E;YAC9E,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,WAAY,EAAE,CAAC,CAAC,EACpC,IAAI,CAAC,UAAU,GAAG,MAAM,CACzB,CAAC;YACF,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;YACxD,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,IAAI,SAAS,CAAC;QACtB,CAAC;KACF,EACD,IAAI,yBAAyB,CAAC,EAAE,aAAa,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAC5D,CAAC;AACJ,CAAC"}
package/dist/utils.d.ts CHANGED
@@ -1,6 +1,16 @@
1
+ import type { EntryInfo, EntryInfoInternal } from "./index.js";
1
2
  export declare function getDosTime(date: Date): number;
2
3
  export declare function getDosDate(date: Date): number;
3
4
  export declare function noop(): void;
5
+ /**
6
+ * Validates EntryOptions to ensure they are within the limits of our encoding.
7
+ * Throws an error if any field exceeds the maximum allowed size.
8
+ */
9
+ export declare function validateEntryOptions({ nameBytes, commentBytes, mode, }: {
10
+ nameBytes: Uint8Array;
11
+ commentBytes: Uint8Array;
12
+ mode?: number;
13
+ }): void;
4
14
  type DataViewValue<T extends keyof typeof OFFSETS = keyof typeof OFFSETS> = T extends "setBigUint64" ? [T, bigint, boolean] : [T, number, boolean];
5
15
  export declare const UINT16 = "setUint16";
6
16
  export declare const UINT32 = "setUint32";
@@ -11,5 +21,12 @@ declare const OFFSETS: {
11
21
  setBigUint64: number;
12
22
  };
13
23
  export declare function writeDataView(view: DataView, values: DataViewValue[], offset?: number): number;
24
+ export declare function entryNeedsZip64({ uncompressedSize, compressedSize, startOffset, }: Pick<EntryInfoInternal, "uncompressedSize" | "compressedSize" | "startOffset">): boolean;
25
+ export declare function eocdNeedsZip64(options: {
26
+ centralDirectoryStart: bigint;
27
+ centralDirectorySize: bigint;
28
+ entriesCount: number;
29
+ }): boolean;
30
+ export declare function getPublicEntryInfo(entryInfo: EntryInfoInternal): EntryInfo;
14
31
  export {};
15
32
  //# 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;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"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,SAAS,EACT,iBAAiB,EAGlB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAM7C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAM7C;AAED,wBAAgB,IAAI,SAAK;AAEzB;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,SAAS,EACT,YAAY,EACZ,IAAI,GACL,EAAE;IACD,SAAS,EAAE,UAAU,CAAC;IACtB,YAAY,EAAE,UAAU,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,IAAI,CAuBP;AAED,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;AAED,wBAAgB,eAAe,CAAC,EAC9B,gBAAgB,EAChB,cAAc,EACd,WAAW,GACZ,EAAE,IAAI,CACL,iBAAiB,EACjB,kBAAkB,GAAG,gBAAgB,GAAG,aAAa,CACtD,GAAG,OAAO,CAMV;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE;IACtC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAMV;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,GAAG,SAAS,CAgB1E"}
package/dist/utils.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { ZIP64_LIMIT } from "./constants.js";
1
2
  export function getDosTime(date) {
2
3
  return ((date.getHours() << 11) |
3
4
  (date.getMinutes() << 5) |
@@ -9,6 +10,26 @@ export function getDosDate(date) {
9
10
  date.getDate());
10
11
  }
11
12
  export function noop() { }
13
+ /**
14
+ * Validates EntryOptions to ensure they are within the limits of our encoding.
15
+ * Throws an error if any field exceeds the maximum allowed size.
16
+ */
17
+ export function validateEntryOptions({ nameBytes, commentBytes, mode, }) {
18
+ // Validate name
19
+ if (nameBytes.length > 0xffff) {
20
+ throw new RangeError(`File name exceeds maximum length of 65535 bytes (got ${nameBytes.length} bytes)`);
21
+ }
22
+ // Validate comment
23
+ if (commentBytes.length > 0xffff) {
24
+ throw new RangeError(`File comment exceeds maximum length of 65535 bytes (got ${commentBytes.length} bytes)`);
25
+ }
26
+ // Validate mode (Unix file mode is 16 bits, stored in upper 16 bits of external attributes)
27
+ if (mode !== undefined) {
28
+ if (!Number.isInteger(mode) || mode < 0 || mode > 0xffff) {
29
+ throw new RangeError(`File mode must be an integer between 0 and 65535 (got ${mode})`);
30
+ }
31
+ }
32
+ }
12
33
  export const UINT16 = "setUint16";
13
34
  export const UINT32 = "setUint32";
14
35
  export const UINT64 = "setBigUint64";
@@ -25,4 +46,32 @@ export function writeDataView(view, values, offset = 0) {
25
46
  }
26
47
  return offset;
27
48
  }
49
+ export function entryNeedsZip64({ uncompressedSize, compressedSize, startOffset, }) {
50
+ return (uncompressedSize >= ZIP64_LIMIT ||
51
+ compressedSize >= ZIP64_LIMIT ||
52
+ startOffset >= ZIP64_LIMIT);
53
+ }
54
+ export function eocdNeedsZip64(options) {
55
+ return (options.centralDirectoryStart >= ZIP64_LIMIT ||
56
+ options.centralDirectorySize >= ZIP64_LIMIT ||
57
+ options.entriesCount >= 0xffff);
58
+ }
59
+ export function getPublicEntryInfo(entryInfo) {
60
+ const { nameBytes, commentBytes, ...rest } = entryInfo;
61
+ if (rest.zip64) {
62
+ return {
63
+ ...rest,
64
+ zip64: true,
65
+ };
66
+ }
67
+ else {
68
+ return {
69
+ ...rest,
70
+ zip64: false,
71
+ uncompressedSize: Number(rest.uncompressedSize),
72
+ compressedSize: Number(rest.compressedSize),
73
+ startOffset: Number(rest.startOffset),
74
+ };
75
+ }
76
+ }
28
77
  //# 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;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
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import type { EntryInfo } from "./index.js";
1
+ import type { EntryInfoInternal } from "./index.js";
2
2
  /**
3
3
  * Generate the Central Directory File Header for the given entry info.
4
4
  */
5
- export declare function getCDFH(entryInfo: EntryInfo): Uint8Array<ArrayBuffer>;
5
+ export declare function getCDFH(entryInfo: EntryInfoInternal): Uint8Array<ArrayBuffer>;
6
6
  /**
7
7
  * Generate the End of Central Directory record with zip64 support.
8
8
  */
@@ -10,5 +10,9 @@ export declare function getEOCDStandard(entriesCount: number, centralDirectoryOf
10
10
  /**
11
11
  * Generate the ZIP64 End of Central Directory record.
12
12
  */
13
- export declare function getEOCDZip64(entriesCount: bigint, centralDirectoryOffset: bigint, centralDirectorySize: bigint): Uint8Array<ArrayBuffer>;
13
+ export declare function getEOCD(options: {
14
+ entriesCount: number;
15
+ centralDirectoryStart: bigint;
16
+ centralDirectorySize: bigint;
17
+ }): Uint8Array<ArrayBuffer>;
14
18
  //# sourceMappingURL=write-central-directory.d.ts.map
@@ -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;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
+ {"version":3,"file":"write-central-directory.d.ts","sourceRoot":"","sources":["../src/write-central-directory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EAGlB,MAAM,YAAY,CAAC;AAiCpB;;GAEG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,iBAAiB,GAAG,UAAU,CAAC,WAAW,CAAC,CAoG7E;AAED;;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,OAAO,CAAC,OAAO,EAAE;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,oBAAoB,EAAE,MAAM,CAAC;CAC9B,GAAG,UAAU,CAAC,WAAW,CAAC,CAkF1B"}