@t4h.framework/zip 0.0.0-experimental-20260907231524
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/.ai/skills/framework-zip/SKILL.md +154 -0
- package/CHANGELOG.md +34 -0
- package/README.md +208 -0
- package/dist/activities/ZipExtractActivity.d.ts +20 -0
- package/dist/activities/ZipExtractActivity.d.ts.map +1 -0
- package/dist/activities/ZipExtractActivity.js +40 -0
- package/dist/activities/ZipExtractActivity.js.map +1 -0
- package/dist/activities/ZipListActivity.d.ts +19 -0
- package/dist/activities/ZipListActivity.d.ts.map +1 -0
- package/dist/activities/ZipListActivity.js +27 -0
- package/dist/activities/ZipListActivity.js.map +1 -0
- package/dist/helpers/ZipChecksum.d.ts +15 -0
- package/dist/helpers/ZipChecksum.d.ts.map +1 -0
- package/dist/helpers/ZipChecksum.js +28 -0
- package/dist/helpers/ZipChecksum.js.map +1 -0
- package/dist/helpers/ZipSource.d.ts +17 -0
- package/dist/helpers/ZipSource.d.ts.map +1 -0
- package/dist/helpers/ZipSource.js +40 -0
- package/dist/helpers/ZipSource.js.map +1 -0
- package/dist/helpers/extract-entry.d.ts +10 -0
- package/dist/helpers/extract-entry.d.ts.map +1 -0
- package/dist/helpers/extract-entry.js +30 -0
- package/dist/helpers/extract-entry.js.map +1 -0
- package/dist/helpers/open-archive.d.ts +14 -0
- package/dist/helpers/open-archive.d.ts.map +1 -0
- package/dist/helpers/open-archive.js +57 -0
- package/dist/helpers/open-archive.js.map +1 -0
- package/dist/tools/assert-entry-path.d.ts +2 -0
- package/dist/tools/assert-entry-path.d.ts.map +1 -0
- package/dist/tools/assert-entry-path.js +11 -0
- package/dist/tools/assert-entry-path.js.map +1 -0
- package/dist/tools/match-path.d.ts +2 -0
- package/dist/tools/match-path.d.ts.map +1 -0
- package/dist/tools/match-path.js +31 -0
- package/dist/tools/match-path.js.map +1 -0
- package/dist/tools/select-entries.d.ts +7 -0
- package/dist/tools/select-entries.d.ts.map +1 -0
- package/dist/tools/select-entries.js +20 -0
- package/dist/tools/select-entries.js.map +1 -0
- package/dist/tools/to-entry-info.d.ts +4 -0
- package/dist/tools/to-entry-info.d.ts.map +1 -0
- package/dist/tools/to-entry-info.js +12 -0
- package/dist/tools/to-entry-info.js.map +1 -0
- package/dist/tools/zip-format.d.ts +52 -0
- package/dist/tools/zip-format.d.ts.map +1 -0
- package/dist/tools/zip-format.js +178 -0
- package/dist/tools/zip-format.js.map +1 -0
- package/dist/typings/ZipEntry.d.ts +14 -0
- package/dist/typings/ZipEntry.d.ts.map +1 -0
- package/dist/typings/ZipEntry.js +2 -0
- package/dist/typings/ZipEntry.js.map +1 -0
- package/dist/zip.d.ts +5 -0
- package/dist/zip.d.ts.map +1 -0
- package/dist/zip.js +5 -0
- package/dist/zip.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Binary } from '@t4h.framework/core';
|
|
2
|
+
import type { FileSystemClaim } from '@t4h.framework/fs';
|
|
3
|
+
import type { ZipSource } from './ZipSource.js';
|
|
4
|
+
import { type ZipCentralHeader } from '../tools/zip-format.js';
|
|
5
|
+
export type ExtractEntryOptions = {
|
|
6
|
+
path: string;
|
|
7
|
+
contentType?: string | undefined;
|
|
8
|
+
};
|
|
9
|
+
export declare function extractEntry(fs: FileSystemClaim, source: ZipSource, entry: ZipCentralHeader, options: ExtractEntryOptions): Promise<Binary>;
|
|
10
|
+
//# sourceMappingURL=extract-entry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-entry.d.ts","sourceRoot":"","sources":["../../src/helpers/extract-entry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAGxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAML,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAA;AAE/B,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACjC,CAAA;AAED,wBAAsB,YAAY,CAChC,EAAE,EAAE,eAAe,EACnB,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CAsBjB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { PassThrough, pipeline } from 'node:stream';
|
|
2
|
+
import { createInflateRaw } from 'node:zlib';
|
|
3
|
+
import { ZipChecksum } from './ZipChecksum.js';
|
|
4
|
+
import { parseLocalHeader, ZIP_COMPRESSION_DEFLATE, ZIP_COMPRESSION_STORED, ZIP_FLAG_ENCRYPTED, ZIP_LOCAL_HEADER_LENGTH, } from '../tools/zip-format.js';
|
|
5
|
+
export async function extractEntry(fs, source, entry, options) {
|
|
6
|
+
assertReadable(entry);
|
|
7
|
+
if (entry.contentLength === 0)
|
|
8
|
+
return await fs.write(options.path, Buffer.alloc(0), options.contentType);
|
|
9
|
+
const header = parseLocalHeader(await source.read(entry.localHeaderOffset, entry.localHeaderOffset + ZIP_LOCAL_HEADER_LENGTH));
|
|
10
|
+
const start = entry.localHeaderOffset + header.length;
|
|
11
|
+
const compressed = await source.stream(start, start + entry.compressedLength);
|
|
12
|
+
return await fs.write(options.path, content(compressed, entry), options.contentType);
|
|
13
|
+
}
|
|
14
|
+
function content(compressed, entry) {
|
|
15
|
+
const checksum = new ZipChecksum(entry);
|
|
16
|
+
const output = new PassThrough();
|
|
17
|
+
const stages = entry.compressionMethod === ZIP_COMPRESSION_STORED
|
|
18
|
+
? [compressed, checksum, output]
|
|
19
|
+
: [compressed, createInflateRaw(), checksum, output];
|
|
20
|
+
pipeline(stages, () => { });
|
|
21
|
+
return output;
|
|
22
|
+
}
|
|
23
|
+
function assertReadable(entry) {
|
|
24
|
+
if (entry.flags & ZIP_FLAG_ENCRYPTED)
|
|
25
|
+
throw new TypeError(`ZIP entry "${entry.path}" is encrypted; encrypted archives are not supported`);
|
|
26
|
+
if (entry.compressionMethod !== ZIP_COMPRESSION_STORED &&
|
|
27
|
+
entry.compressionMethod !== ZIP_COMPRESSION_DEFLATE)
|
|
28
|
+
throw new TypeError(`ZIP entry "${entry.path}" uses compression method ${entry.compressionMethod}; only stored (0) and deflate (8) are supported`);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=extract-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-entry.js","sourceRoot":"","sources":["../../src/helpers/extract-entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAiB,MAAM,aAAa,CAAA;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAK5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,EACtB,kBAAkB,EAClB,uBAAuB,GAExB,MAAM,wBAAwB,CAAA;AAO/B,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,EAAmB,EACnB,MAAiB,EACjB,KAAuB,EACvB,OAA4B;IAE5B,cAAc,CAAC,KAAK,CAAC,CAAA;IAErB,IAAI,KAAK,CAAC,aAAa,KAAK,CAAC;QAC3B,OAAO,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;IAE3E,MAAM,MAAM,GAAG,gBAAgB,CAC7B,MAAM,MAAM,CAAC,IAAI,CACf,KAAK,CAAC,iBAAiB,EACvB,KAAK,CAAC,iBAAiB,GAAG,uBAAuB,CAClD,CACF,CAAA;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAA;IAErD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAA;IAE7E,OAAO,MAAM,EAAE,CAAC,KAAK,CACnB,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,EAC1B,OAAO,CAAC,WAAW,CACpB,CAAA;AACH,CAAC;AAED,SAAS,OAAO,CAAC,UAAoB,EAAE,KAAuB;IAC5D,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,CAAA;IAEvC,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAA;IAEhC,MAAM,MAAM,GACV,KAAK,CAAC,iBAAiB,KAAK,sBAAsB;QAChD,CAAC,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC;QAChC,CAAC,CAAC,CAAC,UAAU,EAAE,gBAAgB,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;IAExD,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAE1B,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,cAAc,CAAC,KAAuB;IAC7C,IAAI,KAAK,CAAC,KAAK,GAAG,kBAAkB;QAClC,MAAM,IAAI,SAAS,CACjB,cAAc,KAAK,CAAC,IAAI,sDAAsD,CAC/E,CAAA;IAEH,IACE,KAAK,CAAC,iBAAiB,KAAK,sBAAsB;QAClD,KAAK,CAAC,iBAAiB,KAAK,uBAAuB;QAEnD,MAAM,IAAI,SAAS,CACjB,cAAc,KAAK,CAAC,IAAI,6BAA6B,KAAK,CAAC,iBAAiB,iDAAiD,CAC9H,CAAA;AACL,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Binary } from '@t4h.framework/core';
|
|
2
|
+
import type { FileSystemClaim } from '@t4h.framework/fs';
|
|
3
|
+
import { ZipSource } from './ZipSource.js';
|
|
4
|
+
import { type ZipCentralHeader } from '../tools/zip-format.js';
|
|
5
|
+
export type ZipArchive = {
|
|
6
|
+
source: ZipSource;
|
|
7
|
+
entries: readonly ZipCentralHeader[];
|
|
8
|
+
};
|
|
9
|
+
export type OpenArchiveOptions = {
|
|
10
|
+
encoding: BufferEncoding;
|
|
11
|
+
durablePath: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function openArchive(fs: FileSystemClaim, binary: Binary, options: OpenArchiveOptions): Promise<ZipArchive>;
|
|
14
|
+
//# sourceMappingURL=open-archive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-archive.d.ts","sourceRoot":"","sources":["../../src/helpers/open-archive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAExD,OAAO,EAA4B,SAAS,EAAE,MAAM,gBAAgB,CAAA;AACpE,OAAO,EAUL,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAA;AAE/B,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,SAAS,CAAA;IACjB,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,cAAc,CAAA;IACxB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,wBAAsB,WAAW,CAC/B,EAAE,EAAE,eAAe,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,UAAU,CAAC,CAwBrB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { ZipSliceUnavailableError, ZipSource } from './ZipSource.js';
|
|
2
|
+
import { findEndOfCentralDirectory, hasEndOfCentralDirectory, parseCentralHeader, parseZip64EndOfCentralDirectory, ZIP_END_OF_CENTRAL_DIRECTORY_LENGTH, ZIP_MAX_COMMENT_LENGTH, ZIP_TAIL_WINDOW_LENGTH, ZIP_ZIP64_END_OF_CENTRAL_DIRECTORY_LENGTH, ZIP_ZIP64_LOCATOR_LENGTH, } from '../tools/zip-format.js';
|
|
3
|
+
export async function openArchive(fs, binary, options) {
|
|
4
|
+
try {
|
|
5
|
+
return await read(new ZipSource(fs, binary), options.encoding);
|
|
6
|
+
}
|
|
7
|
+
catch (error) {
|
|
8
|
+
if (!(error instanceof ZipSliceUnavailableError))
|
|
9
|
+
throw error;
|
|
10
|
+
}
|
|
11
|
+
const durable = await fs.write(options.durablePath, await binary.stream(), 'application/zip');
|
|
12
|
+
try {
|
|
13
|
+
return await read(new ZipSource(fs, durable), options.encoding);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
if (error instanceof ZipSliceUnavailableError)
|
|
17
|
+
throw new TypeError('The file system claim could not slice its own file: reading a ZIP archive requires ranged reads', { cause: error });
|
|
18
|
+
throw error;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async function read(source, encoding) {
|
|
22
|
+
const { contentLength } = source;
|
|
23
|
+
if (contentLength < ZIP_END_OF_CENTRAL_DIRECTORY_LENGTH)
|
|
24
|
+
throw new SyntaxError(`A ZIP archive is at least ${ZIP_END_OF_CENTRAL_DIRECTORY_LENGTH} bytes, this file has ${contentLength}`);
|
|
25
|
+
const end = findEndOfCentralDirectory(await readTail(source));
|
|
26
|
+
const { entryCount, centralDirectoryOffset, centralDirectoryLength } = end.zip64Offset === null
|
|
27
|
+
? end
|
|
28
|
+
: parseZip64EndOfCentralDirectory(await source.read(end.zip64Offset, end.zip64Offset + ZIP_ZIP64_END_OF_CENTRAL_DIRECTORY_LENGTH));
|
|
29
|
+
const directory = await source.read(centralDirectoryOffset, centralDirectoryOffset + centralDirectoryLength);
|
|
30
|
+
const entries = [];
|
|
31
|
+
for (let offset = 0; entries.length < entryCount;) {
|
|
32
|
+
const header = parseCentralHeader(directory, offset, encoding);
|
|
33
|
+
entries.push(header);
|
|
34
|
+
offset += header.length;
|
|
35
|
+
}
|
|
36
|
+
return { source, entries };
|
|
37
|
+
}
|
|
38
|
+
async function readTail(source) {
|
|
39
|
+
const { contentLength } = source;
|
|
40
|
+
const windows = [
|
|
41
|
+
ZIP_TAIL_WINDOW_LENGTH,
|
|
42
|
+
ZIP_MAX_COMMENT_LENGTH +
|
|
43
|
+
ZIP_END_OF_CENTRAL_DIRECTORY_LENGTH +
|
|
44
|
+
ZIP_ZIP64_LOCATOR_LENGTH,
|
|
45
|
+
];
|
|
46
|
+
let tail = Buffer.alloc(0);
|
|
47
|
+
for (const window of windows) {
|
|
48
|
+
const length = Math.min(contentLength, window);
|
|
49
|
+
if (length <= tail.length)
|
|
50
|
+
break;
|
|
51
|
+
tail = await source.read(contentLength - length, contentLength);
|
|
52
|
+
if (hasEndOfCentralDirectory(tail))
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
return tail;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=open-archive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-archive.js","sourceRoot":"","sources":["../../src/helpers/open-archive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assert-entry-path.d.ts","sourceRoot":"","sources":["../../src/tools/assert-entry-path.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAWlD"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function assertEntryPath(path) {
|
|
2
|
+
if (!path)
|
|
3
|
+
throw new TypeError('ZIP entry has an empty path');
|
|
4
|
+
if (path.startsWith('/') || path.startsWith('\\'))
|
|
5
|
+
throw new TypeError(`ZIP entry "${path}" has an absolute path`);
|
|
6
|
+
if (/^[a-zA-Z]:/.test(path))
|
|
7
|
+
throw new TypeError(`ZIP entry "${path}" has a drive-qualified path`);
|
|
8
|
+
if (path.split(/[/\\]/).includes('..'))
|
|
9
|
+
throw new TypeError(`ZIP entry "${path}" escapes the extraction directory`);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=assert-entry-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assert-entry-path.js","sourceRoot":"","sources":["../../src/tools/assert-entry-path.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,SAAS,CAAC,6BAA6B,CAAC,CAAA;IAE7D,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAC/C,MAAM,IAAI,SAAS,CAAC,cAAc,IAAI,wBAAwB,CAAC,CAAA;IAEjE,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QACzB,MAAM,IAAI,SAAS,CAAC,cAAc,IAAI,8BAA8B,CAAC,CAAA;IAEvE,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QACpC,MAAM,IAAI,SAAS,CAAC,cAAc,IAAI,oCAAoC,CAAC,CAAA;AAC/E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"match-path.d.ts","sourceRoot":"","sources":["../../src/tools/match-path.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAE5E"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export function matchPath(path, patterns) {
|
|
2
|
+
return patterns.some(pattern => toRegExp(pattern).test(path));
|
|
3
|
+
}
|
|
4
|
+
const cache = new Map();
|
|
5
|
+
function toRegExp(pattern) {
|
|
6
|
+
const cached = cache.get(pattern);
|
|
7
|
+
if (cached)
|
|
8
|
+
return cached;
|
|
9
|
+
let source = '^';
|
|
10
|
+
for (let index = 0; index < pattern.length; index += 1) {
|
|
11
|
+
const char = pattern[index];
|
|
12
|
+
if (char === '*') {
|
|
13
|
+
if (pattern[index + 1] === '*') {
|
|
14
|
+
source += '.*';
|
|
15
|
+
index += 1;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
source += '[^/]*';
|
|
19
|
+
}
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
source += char === '?' ? '[^/]' : escape(char);
|
|
23
|
+
}
|
|
24
|
+
const regexp = new RegExp(`${source}$`);
|
|
25
|
+
cache.set(pattern, regexp);
|
|
26
|
+
return regexp;
|
|
27
|
+
}
|
|
28
|
+
function escape(char) {
|
|
29
|
+
return /[.*+?^${}()|[\]\\]/.test(char) ? `\\${char}` : char;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=match-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"match-path.js","sourceRoot":"","sources":["../../src/tools/match-path.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,QAA2B;IACjE,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;AAC/D,CAAC;AAED,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAA;AAEvC,SAAS,QAAQ,CAAC,OAAe;IAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAEjC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IAEzB,IAAI,MAAM,GAAG,GAAG,CAAA;IAEhB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAE,CAAA;QAE5B,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC/B,MAAM,IAAI,IAAI,CAAA;gBACd,KAAK,IAAI,CAAC,CAAA;YACZ,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,OAAO,CAAA;YACnB,CAAC;YAED,SAAQ;QACV,CAAC;QAED,MAAM,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAChD,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,CAAA;IAEvC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAE1B,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AAC7D,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ZipCentralHeader } from './zip-format.js';
|
|
2
|
+
export type ZipEntrySelection = {
|
|
3
|
+
include?: string | readonly string[];
|
|
4
|
+
exclude?: string | readonly string[];
|
|
5
|
+
};
|
|
6
|
+
export declare function selectEntries(entries: readonly ZipCentralHeader[], selection: ZipEntrySelection): ZipCentralHeader[];
|
|
7
|
+
//# sourceMappingURL=select-entries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-entries.d.ts","sourceRoot":"","sources":["../../src/tools/select-entries.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEvD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAA;IACpC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAA;CACrC,CAAA;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,SAAS,gBAAgB,EAAE,EACpC,SAAS,EAAE,iBAAiB,GAC3B,gBAAgB,EAAE,CASpB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { matchPath } from './match-path.js';
|
|
2
|
+
export function selectEntries(entries, selection) {
|
|
3
|
+
const include = toPatterns(selection.include);
|
|
4
|
+
const exclude = toPatterns(selection.exclude);
|
|
5
|
+
return entries.filter(entry => {
|
|
6
|
+
if (include.length && !matchPath(entry.path, include))
|
|
7
|
+
return false;
|
|
8
|
+
return !(exclude.length && matchPath(entry.path, exclude));
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
function toPatterns(value) {
|
|
12
|
+
if (value === undefined)
|
|
13
|
+
return [];
|
|
14
|
+
const patterns = typeof value === 'string' ? [value] : [...value];
|
|
15
|
+
for (const pattern of patterns)
|
|
16
|
+
if (typeof pattern !== 'string' || !pattern)
|
|
17
|
+
throw new TypeError('ZIP entry patterns must be non-empty strings');
|
|
18
|
+
return patterns;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=select-entries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-entries.js","sourceRoot":"","sources":["../../src/tools/select-entries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAQ3C,MAAM,UAAU,aAAa,CAC3B,OAAoC,EACpC,SAA4B;IAE5B,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IAE7C,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;QAC5B,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;YAAE,OAAO,KAAK,CAAA;QAEnE,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;IAC5D,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAA6C;IAC/D,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAA;IAElC,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAA;IAEjE,KAAK,MAAM,OAAO,IAAI,QAAQ;QAC5B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO;YACzC,MAAM,IAAI,SAAS,CAAC,8CAA8C,CAAC,CAAA;IAEvE,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to-entry-info.d.ts","sourceRoot":"","sources":["../../src/tools/to-entry-info.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAE1D,wBAAgB,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,YAAY,CAUlE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function toEntryInfo(header) {
|
|
2
|
+
return {
|
|
3
|
+
path: header.path,
|
|
4
|
+
contentLength: header.contentLength,
|
|
5
|
+
compressedLength: header.compressedLength,
|
|
6
|
+
compressionMethod: header.compressionMethod,
|
|
7
|
+
crc32: header.crc32,
|
|
8
|
+
lastModifiedAt: header.lastModifiedAt,
|
|
9
|
+
directory: header.directory,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=to-entry-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to-entry-info.js","sourceRoot":"","sources":["../../src/tools/to-entry-info.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,WAAW,CAAC,MAAwB;IAClD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export declare const ZIP_LOCAL_HEADER_SIGNATURE = 67324752;
|
|
2
|
+
export declare const ZIP_CENTRAL_HEADER_SIGNATURE = 33639248;
|
|
3
|
+
export declare const ZIP_END_OF_CENTRAL_DIRECTORY_SIGNATURE = 101010256;
|
|
4
|
+
export declare const ZIP_ZIP64_END_OF_CENTRAL_DIRECTORY_SIGNATURE = 101075792;
|
|
5
|
+
export declare const ZIP_ZIP64_LOCATOR_SIGNATURE = 117853008;
|
|
6
|
+
export declare const ZIP_LOCAL_HEADER_LENGTH = 30;
|
|
7
|
+
export declare const ZIP_CENTRAL_HEADER_LENGTH = 46;
|
|
8
|
+
export declare const ZIP_END_OF_CENTRAL_DIRECTORY_LENGTH = 22;
|
|
9
|
+
export declare const ZIP_ZIP64_LOCATOR_LENGTH = 20;
|
|
10
|
+
export declare const ZIP_ZIP64_END_OF_CENTRAL_DIRECTORY_LENGTH = 56;
|
|
11
|
+
export declare const ZIP_MAX_COMMENT_LENGTH = 65535;
|
|
12
|
+
export declare const ZIP_TAIL_WINDOW_LENGTH = 1024;
|
|
13
|
+
export declare const ZIP_COMPRESSION_STORED = 0;
|
|
14
|
+
export declare const ZIP_COMPRESSION_DEFLATE = 8;
|
|
15
|
+
export declare const ZIP_FLAG_ENCRYPTED = 1;
|
|
16
|
+
export declare const ZIP_FLAG_DATA_DESCRIPTOR = 8;
|
|
17
|
+
export declare const ZIP_FLAG_UTF8 = 2048;
|
|
18
|
+
export type ZipCentralHeader = {
|
|
19
|
+
path: string;
|
|
20
|
+
flags: number;
|
|
21
|
+
compressionMethod: number;
|
|
22
|
+
crc32: number;
|
|
23
|
+
compressedLength: number;
|
|
24
|
+
contentLength: number;
|
|
25
|
+
localHeaderOffset: number;
|
|
26
|
+
lastModifiedAt: string;
|
|
27
|
+
directory: boolean;
|
|
28
|
+
length: number;
|
|
29
|
+
};
|
|
30
|
+
export type ZipLocalHeader = {
|
|
31
|
+
flags: number;
|
|
32
|
+
compressionMethod: number;
|
|
33
|
+
crc32: number;
|
|
34
|
+
compressedLength: number;
|
|
35
|
+
contentLength: number;
|
|
36
|
+
pathLength: number;
|
|
37
|
+
extraLength: number;
|
|
38
|
+
length: number;
|
|
39
|
+
};
|
|
40
|
+
export type ZipEndOfCentralDirectory = {
|
|
41
|
+
entryCount: number;
|
|
42
|
+
centralDirectoryOffset: number;
|
|
43
|
+
centralDirectoryLength: number;
|
|
44
|
+
zip64Offset: number | null;
|
|
45
|
+
};
|
|
46
|
+
export declare function parseLocalHeader(buffer: Buffer): ZipLocalHeader;
|
|
47
|
+
export declare function parseCentralHeader(buffer: Buffer, offset: number, encoding: BufferEncoding): ZipCentralHeader;
|
|
48
|
+
export declare function hasEndOfCentralDirectory(tail: Buffer): boolean;
|
|
49
|
+
export declare function findEndOfCentralDirectory(tail: Buffer): ZipEndOfCentralDirectory;
|
|
50
|
+
export declare function parseZip64EndOfCentralDirectory(buffer: Buffer): Omit<ZipEndOfCentralDirectory, 'zip64Offset'>;
|
|
51
|
+
export declare function parseDosDateTime(time: number, date: number): string;
|
|
52
|
+
//# sourceMappingURL=zip-format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zip-format.d.ts","sourceRoot":"","sources":["../../src/tools/zip-format.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,0BAA0B,WAAa,CAAA;AACpD,eAAO,MAAM,4BAA4B,WAAa,CAAA;AACtD,eAAO,MAAM,sCAAsC,YAAa,CAAA;AAChE,eAAO,MAAM,4CAA4C,YAAa,CAAA;AACtE,eAAO,MAAM,2BAA2B,YAAa,CAAA;AAErD,eAAO,MAAM,uBAAuB,KAAK,CAAA;AACzC,eAAO,MAAM,yBAAyB,KAAK,CAAA;AAC3C,eAAO,MAAM,mCAAmC,KAAK,CAAA;AACrD,eAAO,MAAM,wBAAwB,KAAK,CAAA;AAC1C,eAAO,MAAM,yCAAyC,KAAK,CAAA;AAE3D,eAAO,MAAM,sBAAsB,QAAS,CAAA;AAE5C,eAAO,MAAM,sBAAsB,OAAO,CAAA;AAE1C,eAAO,MAAM,sBAAsB,IAAI,CAAA;AACvC,eAAO,MAAM,uBAAuB,IAAI,CAAA;AAExC,eAAO,MAAM,kBAAkB,IAAS,CAAA;AACxC,eAAO,MAAM,wBAAwB,IAAS,CAAA;AAC9C,eAAO,MAAM,aAAa,OAAS,CAAA;AAMnC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,iBAAiB,EAAE,MAAM,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,gBAAgB,EAAE,MAAM,CAAA;IACxB,aAAa,EAAE,MAAM,CAAA;IACrB,iBAAiB,EAAE,MAAM,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,OAAO,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,iBAAiB,EAAE,MAAM,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,gBAAgB,EAAE,MAAM,CAAA;IACxB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,sBAAsB,EAAE,MAAM,CAAA;IAC9B,sBAAsB,EAAE,MAAM,CAAA;IAC9B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B,CAAA;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAoB/D;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,cAAc,GACvB,gBAAgB,CA+ClB;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,GACX,wBAAwB,CA0B1B;AAED,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,MAAM,GACb,IAAI,CAAC,wBAAwB,EAAE,aAAa,CAAC,CAiB/C;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAgBnE"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
export const ZIP_LOCAL_HEADER_SIGNATURE = 0x04034b50;
|
|
2
|
+
export const ZIP_CENTRAL_HEADER_SIGNATURE = 0x02014b50;
|
|
3
|
+
export const ZIP_END_OF_CENTRAL_DIRECTORY_SIGNATURE = 0x06054b50;
|
|
4
|
+
export const ZIP_ZIP64_END_OF_CENTRAL_DIRECTORY_SIGNATURE = 0x06064b50;
|
|
5
|
+
export const ZIP_ZIP64_LOCATOR_SIGNATURE = 0x07064b50;
|
|
6
|
+
export const ZIP_LOCAL_HEADER_LENGTH = 30;
|
|
7
|
+
export const ZIP_CENTRAL_HEADER_LENGTH = 46;
|
|
8
|
+
export const ZIP_END_OF_CENTRAL_DIRECTORY_LENGTH = 22;
|
|
9
|
+
export const ZIP_ZIP64_LOCATOR_LENGTH = 20;
|
|
10
|
+
export const ZIP_ZIP64_END_OF_CENTRAL_DIRECTORY_LENGTH = 56;
|
|
11
|
+
export const ZIP_MAX_COMMENT_LENGTH = 0xffff;
|
|
12
|
+
export const ZIP_TAIL_WINDOW_LENGTH = 1024;
|
|
13
|
+
export const ZIP_COMPRESSION_STORED = 0;
|
|
14
|
+
export const ZIP_COMPRESSION_DEFLATE = 8;
|
|
15
|
+
export const ZIP_FLAG_ENCRYPTED = 0x0001;
|
|
16
|
+
export const ZIP_FLAG_DATA_DESCRIPTOR = 0x0008;
|
|
17
|
+
export const ZIP_FLAG_UTF8 = 0x0800;
|
|
18
|
+
const ZIP64_EXTRA_FIELD_ID = 0x0001;
|
|
19
|
+
const ZIP64_MARKER_16 = 0xffff;
|
|
20
|
+
const ZIP64_MARKER_32 = 0xffffffff;
|
|
21
|
+
export function parseLocalHeader(buffer) {
|
|
22
|
+
if (buffer.length < ZIP_LOCAL_HEADER_LENGTH)
|
|
23
|
+
throw new SyntaxError('ZIP local header is truncated');
|
|
24
|
+
if (buffer.readUInt32LE(0) !== ZIP_LOCAL_HEADER_SIGNATURE)
|
|
25
|
+
throw new SyntaxError('ZIP local header signature not found');
|
|
26
|
+
const pathLength = buffer.readUInt16LE(26);
|
|
27
|
+
const extraLength = buffer.readUInt16LE(28);
|
|
28
|
+
return {
|
|
29
|
+
flags: buffer.readUInt16LE(6),
|
|
30
|
+
compressionMethod: buffer.readUInt16LE(8),
|
|
31
|
+
crc32: buffer.readUInt32LE(14),
|
|
32
|
+
compressedLength: buffer.readUInt32LE(18),
|
|
33
|
+
contentLength: buffer.readUInt32LE(22),
|
|
34
|
+
pathLength,
|
|
35
|
+
extraLength,
|
|
36
|
+
length: ZIP_LOCAL_HEADER_LENGTH + pathLength + extraLength,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export function parseCentralHeader(buffer, offset, encoding) {
|
|
40
|
+
if (offset + ZIP_CENTRAL_HEADER_LENGTH > buffer.length)
|
|
41
|
+
throw new SyntaxError('ZIP central directory header is truncated');
|
|
42
|
+
if (buffer.readUInt32LE(offset) !== ZIP_CENTRAL_HEADER_SIGNATURE)
|
|
43
|
+
throw new SyntaxError('ZIP central directory header signature not found');
|
|
44
|
+
const flags = buffer.readUInt16LE(offset + 8);
|
|
45
|
+
const pathLength = buffer.readUInt16LE(offset + 28);
|
|
46
|
+
const extraLength = buffer.readUInt16LE(offset + 30);
|
|
47
|
+
const commentLength = buffer.readUInt16LE(offset + 32);
|
|
48
|
+
const length = ZIP_CENTRAL_HEADER_LENGTH + pathLength + extraLength + commentLength;
|
|
49
|
+
if (offset + length > buffer.length)
|
|
50
|
+
throw new SyntaxError('ZIP central directory header is truncated');
|
|
51
|
+
const pathStart = offset + ZIP_CENTRAL_HEADER_LENGTH;
|
|
52
|
+
const extraStart = pathStart + pathLength;
|
|
53
|
+
const path = buffer
|
|
54
|
+
.subarray(pathStart, extraStart)
|
|
55
|
+
.toString(flags & ZIP_FLAG_UTF8 ? 'utf8' : encoding);
|
|
56
|
+
const sizes = readZip64Sizes(buffer.subarray(extraStart, extraStart + extraLength), {
|
|
57
|
+
contentLength: buffer.readUInt32LE(offset + 24),
|
|
58
|
+
compressedLength: buffer.readUInt32LE(offset + 20),
|
|
59
|
+
localHeaderOffset: buffer.readUInt32LE(offset + 42),
|
|
60
|
+
});
|
|
61
|
+
return {
|
|
62
|
+
path,
|
|
63
|
+
flags,
|
|
64
|
+
compressionMethod: buffer.readUInt16LE(offset + 10),
|
|
65
|
+
crc32: buffer.readUInt32LE(offset + 16),
|
|
66
|
+
lastModifiedAt: parseDosDateTime(buffer.readUInt16LE(offset + 12), buffer.readUInt16LE(offset + 14)),
|
|
67
|
+
directory: path.endsWith('/'),
|
|
68
|
+
length,
|
|
69
|
+
...sizes,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
export function hasEndOfCentralDirectory(tail) {
|
|
73
|
+
return findEndOfCentralDirectoryIndex(tail) >= 0;
|
|
74
|
+
}
|
|
75
|
+
export function findEndOfCentralDirectory(tail) {
|
|
76
|
+
const index = findEndOfCentralDirectoryIndex(tail);
|
|
77
|
+
if (index < 0)
|
|
78
|
+
throw new SyntaxError('ZIP end of central directory record not found — the file is not a ZIP archive or is truncated');
|
|
79
|
+
if (tail.readUInt16LE(index + 4) !== 0 || tail.readUInt16LE(index + 6) !== 0)
|
|
80
|
+
throw new TypeError('Multi-disk ZIP archives are not supported');
|
|
81
|
+
const entryCount = tail.readUInt16LE(index + 10);
|
|
82
|
+
const centralDirectoryLength = tail.readUInt32LE(index + 12);
|
|
83
|
+
const centralDirectoryOffset = tail.readUInt32LE(index + 16);
|
|
84
|
+
const zip64 = entryCount === ZIP64_MARKER_16 ||
|
|
85
|
+
centralDirectoryLength === ZIP64_MARKER_32 ||
|
|
86
|
+
centralDirectoryOffset === ZIP64_MARKER_32;
|
|
87
|
+
return {
|
|
88
|
+
entryCount,
|
|
89
|
+
centralDirectoryLength,
|
|
90
|
+
centralDirectoryOffset,
|
|
91
|
+
zip64Offset: zip64 ? readZip64LocatorOffset(tail, index) : null,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
export function parseZip64EndOfCentralDirectory(buffer) {
|
|
95
|
+
if (buffer.length < ZIP_ZIP64_END_OF_CENTRAL_DIRECTORY_LENGTH)
|
|
96
|
+
throw new SyntaxError('ZIP64 end of central directory record is truncated');
|
|
97
|
+
if (buffer.readUInt32LE(0) !== ZIP_ZIP64_END_OF_CENTRAL_DIRECTORY_SIGNATURE)
|
|
98
|
+
throw new SyntaxError('ZIP64 end of central directory record signature not found');
|
|
99
|
+
if (buffer.readUInt32LE(16) !== 0 || buffer.readUInt32LE(20) !== 0)
|
|
100
|
+
throw new TypeError('Multi-disk ZIP archives are not supported');
|
|
101
|
+
return {
|
|
102
|
+
entryCount: readUInt64(buffer, 32, 'entry count'),
|
|
103
|
+
centralDirectoryLength: readUInt64(buffer, 40, 'central directory size'),
|
|
104
|
+
centralDirectoryOffset: readUInt64(buffer, 48, 'central directory offset'),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export function parseDosDateTime(time, date) {
|
|
108
|
+
const pad = (value, length = 2) => value.toString().padStart(length, '0');
|
|
109
|
+
const year = ((date >> 9) & 0x7f) + 1980;
|
|
110
|
+
const month = Math.max((date >> 5) & 0x0f, 1);
|
|
111
|
+
const day = Math.max(date & 0x1f, 1);
|
|
112
|
+
const hours = (time >> 11) & 0x1f;
|
|
113
|
+
const minutes = (time >> 5) & 0x3f;
|
|
114
|
+
const seconds = (time & 0x1f) * 2;
|
|
115
|
+
return (`${pad(year, 4)}-${pad(month)}-${pad(day)}` +
|
|
116
|
+
`T${pad(hours)}:${pad(minutes)}:${pad(seconds)}`);
|
|
117
|
+
}
|
|
118
|
+
function findEndOfCentralDirectoryIndex(tail) {
|
|
119
|
+
for (let index = tail.length - ZIP_END_OF_CENTRAL_DIRECTORY_LENGTH; index >= 0; index -= 1) {
|
|
120
|
+
if (tail.readUInt32LE(index) !== ZIP_END_OF_CENTRAL_DIRECTORY_SIGNATURE)
|
|
121
|
+
continue;
|
|
122
|
+
const commentLength = tail.readUInt16LE(index + 20);
|
|
123
|
+
if (index + ZIP_END_OF_CENTRAL_DIRECTORY_LENGTH + commentLength ===
|
|
124
|
+
tail.length)
|
|
125
|
+
return index;
|
|
126
|
+
}
|
|
127
|
+
return -1;
|
|
128
|
+
}
|
|
129
|
+
function readZip64LocatorOffset(tail, endIndex) {
|
|
130
|
+
const index = endIndex - ZIP_ZIP64_LOCATOR_LENGTH;
|
|
131
|
+
if (index < 0 || tail.readUInt32LE(index) !== ZIP_ZIP64_LOCATOR_SIGNATURE)
|
|
132
|
+
throw new SyntaxError('ZIP64 archive without a ZIP64 end of central directory locator');
|
|
133
|
+
return readUInt64(tail, index + 8, 'ZIP64 central directory offset');
|
|
134
|
+
}
|
|
135
|
+
function readZip64Sizes(extra, sizes) {
|
|
136
|
+
const overflow = sizes.contentLength === ZIP64_MARKER_32 ||
|
|
137
|
+
sizes.compressedLength === ZIP64_MARKER_32 ||
|
|
138
|
+
sizes.localHeaderOffset === ZIP64_MARKER_32;
|
|
139
|
+
if (!overflow)
|
|
140
|
+
return sizes;
|
|
141
|
+
for (let offset = 0; offset + 4 <= extra.length;) {
|
|
142
|
+
const id = extra.readUInt16LE(offset);
|
|
143
|
+
const length = extra.readUInt16LE(offset + 2);
|
|
144
|
+
const start = offset + 4;
|
|
145
|
+
if (id !== ZIP64_EXTRA_FIELD_ID) {
|
|
146
|
+
offset = start + length;
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const field = extra.subarray(start, start + length);
|
|
150
|
+
let cursor = 0;
|
|
151
|
+
const next = (name) => {
|
|
152
|
+
const value = readUInt64(field, cursor, name);
|
|
153
|
+
cursor += 8;
|
|
154
|
+
return value;
|
|
155
|
+
};
|
|
156
|
+
return {
|
|
157
|
+
contentLength: sizes.contentLength === ZIP64_MARKER_32
|
|
158
|
+
? next('uncompressed size')
|
|
159
|
+
: sizes.contentLength,
|
|
160
|
+
compressedLength: sizes.compressedLength === ZIP64_MARKER_32
|
|
161
|
+
? next('compressed size')
|
|
162
|
+
: sizes.compressedLength,
|
|
163
|
+
localHeaderOffset: sizes.localHeaderOffset === ZIP64_MARKER_32
|
|
164
|
+
? next('local header offset')
|
|
165
|
+
: sizes.localHeaderOffset,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
throw new SyntaxError('ZIP64 entry without a ZIP64 extra field');
|
|
169
|
+
}
|
|
170
|
+
function readUInt64(buffer, offset, name) {
|
|
171
|
+
if (offset + 8 > buffer.length)
|
|
172
|
+
throw new SyntaxError(`ZIP64 ${name} is truncated`);
|
|
173
|
+
const value = buffer.readBigUInt64LE(offset);
|
|
174
|
+
if (value > BigInt(Number.MAX_SAFE_INTEGER))
|
|
175
|
+
throw new RangeError(`ZIP64 ${name} exceeds the safe integer range`);
|
|
176
|
+
return Number(value);
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=zip-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zip-format.js","sourceRoot":"","sources":["../../src/tools/zip-format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Binary } from '@t4h.framework/core';
|
|
2
|
+
export type ZipEntryInfo = {
|
|
3
|
+
path: string;
|
|
4
|
+
contentLength: number;
|
|
5
|
+
compressedLength: number;
|
|
6
|
+
compressionMethod: number;
|
|
7
|
+
crc32: number;
|
|
8
|
+
lastModifiedAt: string;
|
|
9
|
+
directory: boolean;
|
|
10
|
+
};
|
|
11
|
+
export type ZipEntry = ZipEntryInfo & {
|
|
12
|
+
binary: Binary;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=ZipEntry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ZipEntry.d.ts","sourceRoot":"","sources":["../../src/typings/ZipEntry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAEjD,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,MAAM,CAAA;IACrB,gBAAgB,EAAE,MAAM,CAAA;IACxB,iBAAiB,EAAE,MAAM,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG;IACpC,MAAM,EAAE,MAAM,CAAA;CACf,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ZipEntry.js","sourceRoot":"","sources":["../../src/typings/ZipEntry.ts"],"names":[],"mappings":""}
|
package/dist/zip.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zip.d.ts","sourceRoot":"","sources":["../src/zip.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAA;AAClD,cAAc,iCAAiC,CAAA;AAC/C,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA"}
|
package/dist/zip.js
ADDED
package/dist/zip.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zip.js","sourceRoot":"","sources":["../src/zip.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAA;AAClD,cAAc,iCAAiC,CAAA;AAC/C,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@t4h.framework/zip",
|
|
3
|
+
"version": "0.0.0-experimental-20260907231524",
|
|
4
|
+
"description": "ZIP extraction module for the T4H Framework",
|
|
5
|
+
"homepage": "https://github.com/tech4humans-brasil/framework/tree/main/packages/zip",
|
|
6
|
+
"bugs": "https://github.com/tech4humans-brasil/framework/issues",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/tech4humans-brasil/framework.git",
|
|
10
|
+
"directory": "packages/zip"
|
|
11
|
+
},
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"author": "Tech4Humans <contact@tech4h.com.br> (https://tech4h.com.br)",
|
|
14
|
+
"type": "module",
|
|
15
|
+
"exports": {
|
|
16
|
+
"types": "./dist/zip.d.ts",
|
|
17
|
+
"import": "./dist/zip.js"
|
|
18
|
+
},
|
|
19
|
+
"module": "./dist/zip.js",
|
|
20
|
+
"types": "./dist/zip.d.ts",
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"LICENSE",
|
|
24
|
+
".ai"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc --project tsconfig.build.json",
|
|
28
|
+
"check-types": "tsc --noEmit",
|
|
29
|
+
"lint": "eslint .",
|
|
30
|
+
"prepublishOnly": "yarn build",
|
|
31
|
+
"test": "vitest run",
|
|
32
|
+
"test:watch": "vitest"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@t4h.framework/core": "^0.11.0",
|
|
36
|
+
"@t4h.framework/fs": "^0.9.1",
|
|
37
|
+
"typescript": "^5.9.3",
|
|
38
|
+
"vitest": "^4.0.18"
|
|
39
|
+
},
|
|
40
|
+
"peerDependencies": {
|
|
41
|
+
"@t4h.framework/core": "^0.11.0",
|
|
42
|
+
"@t4h.framework/fs": "^0.9.1"
|
|
43
|
+
},
|
|
44
|
+
"packageManager": "yarn@4.12.0",
|
|
45
|
+
"engines": {
|
|
46
|
+
"node": ">=22"
|
|
47
|
+
}
|
|
48
|
+
}
|