Update
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
import test from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import zlib from 'node:zlib';
|
||||
import zipModule from '../src/shared/zip-writer.cjs';
|
||||
|
||||
const { createZip, crc32 } = zipModule;
|
||||
|
||||
function unzipLocalEntries(buffer) {
|
||||
const entries = new Map();
|
||||
let offset = 0;
|
||||
while (offset + 4 <= buffer.length && buffer.readUInt32LE(offset) === 0x04034b50) {
|
||||
const method = buffer.readUInt16LE(offset + 8);
|
||||
const expectedCrc = buffer.readUInt32LE(offset + 14);
|
||||
const compressedSize = buffer.readUInt32LE(offset + 18);
|
||||
const nameLength = buffer.readUInt16LE(offset + 26);
|
||||
const extraLength = buffer.readUInt16LE(offset + 28);
|
||||
const nameStart = offset + 30;
|
||||
const dataStart = nameStart + nameLength + extraLength;
|
||||
const name = buffer.subarray(nameStart, nameStart + nameLength).toString('utf8');
|
||||
const compressed = buffer.subarray(dataStart, dataStart + compressedSize);
|
||||
const data = method === 8 ? zlib.inflateRawSync(compressed) : compressed;
|
||||
assert.equal(crc32(data), expectedCrc);
|
||||
entries.set(name, data);
|
||||
offset = dataStart + compressedSize;
|
||||
}
|
||||
return entries;
|
||||
}
|
||||
|
||||
test('creates a valid deflated ZIP with UTF-8 entry names and CRCs', () => {
|
||||
const archive = createZip([
|
||||
{ name: 'manifest.json', data: '{"ok":true}\n' },
|
||||
{ name: 'logs/diagnostics.jsonl', data: Buffer.from('hello diagnostics\n') },
|
||||
{ name: 'unicode/één.txt', data: 'veilig' }
|
||||
]);
|
||||
assert.equal(archive.readUInt32LE(0), 0x04034b50);
|
||||
assert.equal(archive.readUInt32LE(archive.length - 22), 0x06054b50);
|
||||
const entries = unzipLocalEntries(archive);
|
||||
assert.equal(entries.size, 3);
|
||||
assert.equal(entries.get('manifest.json').toString(), '{"ok":true}\n');
|
||||
assert.equal(entries.get('unicode/één.txt').toString(), 'veilig');
|
||||
});
|
||||
Reference in New Issue
Block a user