@myrialabs/zipkit 0.0.6
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/LICENSE +21 -0
- package/README.md +329 -0
- package/dist/bench/corpus.d.ts +21 -0
- package/dist/bench/corpus.d.ts.map +1 -0
- package/dist/bench/corpus.js +92 -0
- package/dist/bench/corpus.js.map +1 -0
- package/dist/checksum.d.ts +29 -0
- package/dist/checksum.d.ts.map +1 -0
- package/dist/checksum.js +35 -0
- package/dist/checksum.js.map +1 -0
- package/dist/cli.d.ts +17 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +427 -0
- package/dist/cli.js.map +1 -0
- package/dist/codecs/brotli.d.ts +6 -0
- package/dist/codecs/brotli.d.ts.map +1 -0
- package/dist/codecs/brotli.js +15 -0
- package/dist/codecs/brotli.js.map +1 -0
- package/dist/codecs/bzip2.d.ts +6 -0
- package/dist/codecs/bzip2.d.ts.map +1 -0
- package/dist/codecs/bzip2.js +15 -0
- package/dist/codecs/bzip2.js.map +1 -0
- package/dist/codecs/deflate.d.ts +6 -0
- package/dist/codecs/deflate.d.ts.map +1 -0
- package/dist/codecs/deflate.js +25 -0
- package/dist/codecs/deflate.js.map +1 -0
- package/dist/codecs/gzip.d.ts +6 -0
- package/dist/codecs/gzip.d.ts.map +1 -0
- package/dist/codecs/gzip.js +25 -0
- package/dist/codecs/gzip.js.map +1 -0
- package/dist/codecs/image.d.ts +5 -0
- package/dist/codecs/image.d.ts.map +1 -0
- package/dist/codecs/image.js +16 -0
- package/dist/codecs/image.js.map +1 -0
- package/dist/codecs/index.d.ts +18 -0
- package/dist/codecs/index.d.ts.map +1 -0
- package/dist/codecs/index.js +18 -0
- package/dist/codecs/index.js.map +1 -0
- package/dist/codecs/lz4.d.ts +6 -0
- package/dist/codecs/lz4.d.ts.map +1 -0
- package/dist/codecs/lz4.js +17 -0
- package/dist/codecs/lz4.js.map +1 -0
- package/dist/codecs/lzma.d.ts +6 -0
- package/dist/codecs/lzma.d.ts.map +1 -0
- package/dist/codecs/lzma.js +15 -0
- package/dist/codecs/lzma.js.map +1 -0
- package/dist/codecs/snappy.d.ts +6 -0
- package/dist/codecs/snappy.d.ts.map +1 -0
- package/dist/codecs/snappy.js +14 -0
- package/dist/codecs/snappy.js.map +1 -0
- package/dist/codecs/video.d.ts +13 -0
- package/dist/codecs/video.d.ts.map +1 -0
- package/dist/codecs/video.js +26 -0
- package/dist/codecs/video.js.map +1 -0
- package/dist/codecs/xz.d.ts +6 -0
- package/dist/codecs/xz.d.ts.map +1 -0
- package/dist/codecs/xz.js +30 -0
- package/dist/codecs/xz.js.map +1 -0
- package/dist/codecs/zlib.d.ts +6 -0
- package/dist/codecs/zlib.d.ts.map +1 -0
- package/dist/codecs/zlib.js +15 -0
- package/dist/codecs/zlib.js.map +1 -0
- package/dist/codecs/zstd.d.ts +6 -0
- package/dist/codecs/zstd.d.ts.map +1 -0
- package/dist/codecs/zstd.js +24 -0
- package/dist/codecs/zstd.js.map +1 -0
- package/dist/compress.d.ts +20 -0
- package/dist/compress.d.ts.map +1 -0
- package/dist/compress.js +83 -0
- package/dist/compress.js.map +1 -0
- package/dist/delta.d.ts +30 -0
- package/dist/delta.d.ts.map +1 -0
- package/dist/delta.js +44 -0
- package/dist/delta.js.map +1 -0
- package/dist/detect.d.ts +46 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +86 -0
- package/dist/detect.js.map +1 -0
- package/dist/dictionary.d.ts +37 -0
- package/dist/dictionary.d.ts.map +1 -0
- package/dist/dictionary.js +71 -0
- package/dist/dictionary.js.map +1 -0
- package/dist/engine.d.ts +102 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +204 -0
- package/dist/engine.js.map +1 -0
- package/dist/fsa.d.ts +54 -0
- package/dist/fsa.d.ts.map +1 -0
- package/dist/fsa.js +45 -0
- package/dist/fsa.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +21 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +42 -0
- package/dist/internal.js.map +1 -0
- package/dist/middleware/elysia.d.ts +15 -0
- package/dist/middleware/elysia.d.ts.map +1 -0
- package/dist/middleware/elysia.js +43 -0
- package/dist/middleware/elysia.js.map +1 -0
- package/dist/middleware/express.d.ts +17 -0
- package/dist/middleware/express.d.ts.map +1 -0
- package/dist/middleware/express.js +62 -0
- package/dist/middleware/express.js.map +1 -0
- package/dist/middleware/hono.d.ts +17 -0
- package/dist/middleware/hono.d.ts.map +1 -0
- package/dist/middleware/hono.js +41 -0
- package/dist/middleware/hono.js.map +1 -0
- package/dist/middleware/index.d.ts +14 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +14 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/shared.d.ts +29 -0
- package/dist/middleware/shared.d.ts.map +1 -0
- package/dist/middleware/shared.js +47 -0
- package/dist/middleware/shared.js.map +1 -0
- package/dist/pack.d.ts +36 -0
- package/dist/pack.d.ts.map +1 -0
- package/dist/pack.js +75 -0
- package/dist/pack.js.map +1 -0
- package/dist/parallel/index.d.ts +56 -0
- package/dist/parallel/index.d.ts.map +1 -0
- package/dist/parallel/index.js +158 -0
- package/dist/parallel/index.js.map +1 -0
- package/dist/sevenzip/index.d.ts +45 -0
- package/dist/sevenzip/index.d.ts.map +1 -0
- package/dist/sevenzip/index.js +646 -0
- package/dist/sevenzip/index.js.map +1 -0
- package/dist/streams/index.d.ts +32 -0
- package/dist/streams/index.d.ts.map +1 -0
- package/dist/streams/index.js +74 -0
- package/dist/streams/index.js.map +1 -0
- package/dist/string.d.ts +38 -0
- package/dist/string.d.ts.map +1 -0
- package/dist/string.js +64 -0
- package/dist/string.js.map +1 -0
- package/dist/tar/index.d.ts +99 -0
- package/dist/tar/index.d.ts.map +1 -0
- package/dist/tar/index.js +380 -0
- package/dist/tar/index.js.map +1 -0
- package/dist/types.d.ts +59 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +22 -0
- package/dist/types.js.map +1 -0
- package/dist/workers/index.d.ts +58 -0
- package/dist/workers/index.d.ts.map +1 -0
- package/dist/workers/index.js +158 -0
- package/dist/workers/index.js.map +1 -0
- package/dist/workers/worker.d.ts +18 -0
- package/dist/workers/worker.d.ts.map +1 -0
- package/dist/workers/worker.js +45 -0
- package/dist/workers/worker.js.map +1 -0
- package/dist/zip/crypto/aes.d.ts +25 -0
- package/dist/zip/crypto/aes.d.ts.map +1 -0
- package/dist/zip/crypto/aes.js +156 -0
- package/dist/zip/crypto/aes.js.map +1 -0
- package/dist/zip/crypto/winzip.d.ts +28 -0
- package/dist/zip/crypto/winzip.d.ts.map +1 -0
- package/dist/zip/crypto/winzip.js +87 -0
- package/dist/zip/crypto/winzip.js.map +1 -0
- package/dist/zip/crypto/zipcrypto.d.ts +14 -0
- package/dist/zip/crypto/zipcrypto.d.ts.map +1 -0
- package/dist/zip/crypto/zipcrypto.js +65 -0
- package/dist/zip/crypto/zipcrypto.js.map +1 -0
- package/dist/zip/datetime.d.ts +9 -0
- package/dist/zip/datetime.d.ts.map +1 -0
- package/dist/zip/datetime.js +13 -0
- package/dist/zip/datetime.js.map +1 -0
- package/dist/zip/index.d.ts +134 -0
- package/dist/zip/index.d.ts.map +1 -0
- package/dist/zip/index.js +473 -0
- package/dist/zip/index.js.map +1 -0
- package/dist/zip/stream.d.ts +38 -0
- package/dist/zip/stream.d.ts.map +1 -0
- package/dist/zip/stream.js +240 -0
- package/dist/zip/stream.js.map +1 -0
- package/dist/zipkit.d.ts +74 -0
- package/dist/zipkit.d.ts.map +1 -0
- package/dist/zipkit.js +168 -0
- package/dist/zipkit.js.map +1 -0
- package/engine/dist/zipkit-engine.mjs +2 -0
- package/engine/dist/zipkit-engine.wasm +0 -0
- package/package.json +137 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web-standard `TransformStream` wrappers for every codec, so ZipKit drops into
|
|
3
|
+
* any `pipeThrough()` pipeline (`fetch` bodies, files, sockets).
|
|
4
|
+
*
|
|
5
|
+
* gzip / zlib / raw-deflate are backed by the platform's native
|
|
6
|
+
* `CompressionStream` / `DecompressionStream` when present (Node 18+, Bun, and
|
|
7
|
+
* modern browsers) — true incremental streaming with no buffering. The other
|
|
8
|
+
* codecs (zstd, lz4, snappy, brotli, lzma, bzip2) are one-shot in the engine,
|
|
9
|
+
* so their streams buffer the input and compress on flush; this still composes
|
|
10
|
+
* cleanly in a pipeline, it just isn't incremental. Pick gzip/zlib/deflate for
|
|
11
|
+
* unbounded streams.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* import { compressionStream } from '@myrialabs/zipkit/streams';
|
|
16
|
+
* await response.body
|
|
17
|
+
* .pipeThrough(compressionStream('gzip'))
|
|
18
|
+
* .pipeTo(writable);
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
import type { Codec, CompressOptions, DecompressOptions } from '../types.js';
|
|
22
|
+
/**
|
|
23
|
+
* A `TransformStream` that compresses with `codec`. Native and incremental for
|
|
24
|
+
* gzip/zlib/deflate; buffered for every other codec.
|
|
25
|
+
*/
|
|
26
|
+
export declare function compressionStream(codec: Codec, opts?: CompressOptions): TransformStream<Uint8Array, Uint8Array>;
|
|
27
|
+
/**
|
|
28
|
+
* A `TransformStream` that decompresses with `codec`. Native and incremental
|
|
29
|
+
* for gzip/zlib/deflate; buffered for every other codec.
|
|
30
|
+
*/
|
|
31
|
+
export declare function decompressionStream(codec: Codec, opts?: DecompressOptions): TransformStream<Uint8Array, Uint8Array>;
|
|
32
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/streams/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAqC7E;;;GAGG;AACH,wBAAgB,iBAAiB,CAChC,KAAK,EAAE,KAAK,EACZ,IAAI,CAAC,EAAE,eAAe,GACpB,eAAe,CAAC,UAAU,EAAE,UAAU,CAAC,CAMzC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,KAAK,EACZ,IAAI,CAAC,EAAE,iBAAiB,GACtB,eAAe,CAAC,UAAU,EAAE,UAAU,CAAC,CAIzC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web-standard `TransformStream` wrappers for every codec, so ZipKit drops into
|
|
3
|
+
* any `pipeThrough()` pipeline (`fetch` bodies, files, sockets).
|
|
4
|
+
*
|
|
5
|
+
* gzip / zlib / raw-deflate are backed by the platform's native
|
|
6
|
+
* `CompressionStream` / `DecompressionStream` when present (Node 18+, Bun, and
|
|
7
|
+
* modern browsers) — true incremental streaming with no buffering. The other
|
|
8
|
+
* codecs (zstd, lz4, snappy, brotli, lzma, bzip2) are one-shot in the engine,
|
|
9
|
+
* so their streams buffer the input and compress on flush; this still composes
|
|
10
|
+
* cleanly in a pipeline, it just isn't incremental. Pick gzip/zlib/deflate for
|
|
11
|
+
* unbounded streams.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* import { compressionStream } from '@myrialabs/zipkit/streams';
|
|
16
|
+
* await response.body
|
|
17
|
+
* .pipeThrough(compressionStream('gzip'))
|
|
18
|
+
* .pipeTo(writable);
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
import { compress, decompressWith } from '../compress.js';
|
|
22
|
+
/** Codecs whose streaming is delegated to the platform's native streams. */
|
|
23
|
+
const NATIVE_FORMAT = {
|
|
24
|
+
gzip: 'gzip',
|
|
25
|
+
zlib: 'deflate',
|
|
26
|
+
deflate: 'deflate-raw'
|
|
27
|
+
};
|
|
28
|
+
const hasNative = typeof CompressionStream !== 'undefined' && typeof DecompressionStream !== 'undefined';
|
|
29
|
+
function concat(chunks, total) {
|
|
30
|
+
const out = new Uint8Array(total);
|
|
31
|
+
let off = 0;
|
|
32
|
+
for (const c of chunks) {
|
|
33
|
+
out.set(c, off);
|
|
34
|
+
off += c.length;
|
|
35
|
+
}
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
/** A buffering transform: collect every chunk, run `op` once on flush. */
|
|
39
|
+
function bufferingStream(op) {
|
|
40
|
+
const chunks = [];
|
|
41
|
+
let total = 0;
|
|
42
|
+
return new TransformStream({
|
|
43
|
+
transform(chunk) {
|
|
44
|
+
chunks.push(chunk);
|
|
45
|
+
total += chunk.length;
|
|
46
|
+
},
|
|
47
|
+
async flush(controller) {
|
|
48
|
+
controller.enqueue(await op(concat(chunks, total)));
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* A `TransformStream` that compresses with `codec`. Native and incremental for
|
|
54
|
+
* gzip/zlib/deflate; buffered for every other codec.
|
|
55
|
+
*/
|
|
56
|
+
export function compressionStream(codec, opts) {
|
|
57
|
+
const native = NATIVE_FORMAT[codec];
|
|
58
|
+
// A CompressionStream accepts BufferSource on its writable side, which is
|
|
59
|
+
// wider than Uint8Array — safe to narrow the public type to Uint8Array.
|
|
60
|
+
if (native && hasNative)
|
|
61
|
+
return new CompressionStream(native);
|
|
62
|
+
return bufferingStream((input) => compress(input, codec, opts));
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* A `TransformStream` that decompresses with `codec`. Native and incremental
|
|
66
|
+
* for gzip/zlib/deflate; buffered for every other codec.
|
|
67
|
+
*/
|
|
68
|
+
export function decompressionStream(codec, opts) {
|
|
69
|
+
const native = NATIVE_FORMAT[codec];
|
|
70
|
+
if (native && hasNative)
|
|
71
|
+
return new DecompressionStream(native);
|
|
72
|
+
return bufferingStream((input) => decompressWith(input, codec, opts));
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/streams/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE1D,4EAA4E;AAC5E,MAAM,aAAa,GAA8C;IAChE,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,aAAa;CACtB,CAAC;AAEF,MAAM,SAAS,GAAG,OAAO,iBAAiB,KAAK,WAAW,IAAI,OAAO,mBAAmB,KAAK,WAAW,CAAC;AAEzG,SAAS,MAAM,CAAC,MAAoB,EAAE,KAAa;IAClD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACxB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAChB,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC;IACjB,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,0EAA0E;AAC1E,SAAS,eAAe,CAAC,EAA8C;IACtE,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,IAAI,eAAe,CAAyB;QAClD,SAAS,CAAC,KAAK;YACd,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;QACvB,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,UAAU;YACrB,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC;KACD,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAChC,KAAY,EACZ,IAAsB;IAEtB,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,0EAA0E;IAC1E,wEAAwE;IACxE,IAAI,MAAM,IAAI,SAAS;QAAE,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAuD,CAAC;IACpH,OAAO,eAAe,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAClC,KAAY,EACZ,IAAwB;IAExB,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,MAAM,IAAI,SAAS;QAAE,OAAO,IAAI,mBAAmB,CAAC,MAAM,CAAuD,CAAC;IACtH,OAAO,eAAe,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AACvE,CAAC"}
|
package/dist/string.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* String ↔ bytes helpers.
|
|
3
|
+
*
|
|
4
|
+
* Codecs in ZipKit are byte-only by design. These helpers convert between
|
|
5
|
+
* JavaScript strings and {@link Uint8Array} so text can flow through the same
|
|
6
|
+
* API. UTF-8 is the default; Latin-1 (binary) is available for byte-exact
|
|
7
|
+
* single-byte data.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Encode a string to bytes.
|
|
11
|
+
*
|
|
12
|
+
* @param str - The string to encode.
|
|
13
|
+
* @param latin1 - When `true`, encode as Latin-1 (one byte per code unit,
|
|
14
|
+
* code points 0–255). Defaults to UTF-8.
|
|
15
|
+
*/
|
|
16
|
+
export declare function strToU8(str: string, latin1?: boolean): Uint8Array;
|
|
17
|
+
/**
|
|
18
|
+
* Decode bytes to a string.
|
|
19
|
+
*
|
|
20
|
+
* @param data - The bytes to decode.
|
|
21
|
+
* @param latin1 - When `true`, decode as Latin-1. Defaults to UTF-8.
|
|
22
|
+
*/
|
|
23
|
+
export declare function strFromU8(data: Uint8Array, latin1?: boolean): string;
|
|
24
|
+
/** A streaming UTF-8 decoder: feed chunks, get text out, flush at the end. */
|
|
25
|
+
export declare class DecodeUTF8 {
|
|
26
|
+
private decoder;
|
|
27
|
+
/** Decode a chunk. Pass `stream: false` (or use {@link end}) on the last one. */
|
|
28
|
+
push(chunk: Uint8Array, stream?: boolean): string;
|
|
29
|
+
/** Flush any buffered partial code point and finish decoding. */
|
|
30
|
+
end(chunk?: Uint8Array): string;
|
|
31
|
+
}
|
|
32
|
+
/** A streaming UTF-8 encoder: feed text chunks, get bytes out. */
|
|
33
|
+
export declare class EncodeUTF8 {
|
|
34
|
+
private encoder;
|
|
35
|
+
/** Encode a chunk of text to UTF-8 bytes. */
|
|
36
|
+
push(chunk: string): Uint8Array;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=string.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../src/string.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,UAAU,CAO/D;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,UAAQ,GAAG,MAAM,CAUlE;AAED,8EAA8E;AAC9E,qBAAa,UAAU;IACtB,OAAO,CAAC,OAAO,CAA4B;IAC3C,iFAAiF;IACjF,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,UAAO,GAAG,MAAM;IAG9C,iEAAiE;IACjE,GAAG,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM;CAG/B;AAED,kEAAkE;AAClE,qBAAa,UAAU;IACtB,OAAO,CAAC,OAAO,CAAqB;IACpC,6CAA6C;IAC7C,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU;CAG/B"}
|
package/dist/string.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* String ↔ bytes helpers.
|
|
3
|
+
*
|
|
4
|
+
* Codecs in ZipKit are byte-only by design. These helpers convert between
|
|
5
|
+
* JavaScript strings and {@link Uint8Array} so text can flow through the same
|
|
6
|
+
* API. UTF-8 is the default; Latin-1 (binary) is available for byte-exact
|
|
7
|
+
* single-byte data.
|
|
8
|
+
*/
|
|
9
|
+
const utf8Encoder = /* @__PURE__ */ new TextEncoder();
|
|
10
|
+
const utf8Decoder = /* @__PURE__ */ new TextDecoder('utf-8');
|
|
11
|
+
/**
|
|
12
|
+
* Encode a string to bytes.
|
|
13
|
+
*
|
|
14
|
+
* @param str - The string to encode.
|
|
15
|
+
* @param latin1 - When `true`, encode as Latin-1 (one byte per code unit,
|
|
16
|
+
* code points 0–255). Defaults to UTF-8.
|
|
17
|
+
*/
|
|
18
|
+
export function strToU8(str, latin1 = false) {
|
|
19
|
+
if (latin1) {
|
|
20
|
+
const out = new Uint8Array(str.length);
|
|
21
|
+
for (let i = 0; i < str.length; i++)
|
|
22
|
+
out[i] = str.charCodeAt(i) & 0xff;
|
|
23
|
+
return out;
|
|
24
|
+
}
|
|
25
|
+
return utf8Encoder.encode(str);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Decode bytes to a string.
|
|
29
|
+
*
|
|
30
|
+
* @param data - The bytes to decode.
|
|
31
|
+
* @param latin1 - When `true`, decode as Latin-1. Defaults to UTF-8.
|
|
32
|
+
*/
|
|
33
|
+
export function strFromU8(data, latin1 = false) {
|
|
34
|
+
if (latin1) {
|
|
35
|
+
let str = '';
|
|
36
|
+
// Chunk to stay well under argument-count limits for large inputs.
|
|
37
|
+
for (let i = 0; i < data.length; i += 0x8000) {
|
|
38
|
+
str += String.fromCharCode(...data.subarray(i, i + 0x8000));
|
|
39
|
+
}
|
|
40
|
+
return str;
|
|
41
|
+
}
|
|
42
|
+
return utf8Decoder.decode(data);
|
|
43
|
+
}
|
|
44
|
+
/** A streaming UTF-8 decoder: feed chunks, get text out, flush at the end. */
|
|
45
|
+
export class DecodeUTF8 {
|
|
46
|
+
decoder = new TextDecoder('utf-8');
|
|
47
|
+
/** Decode a chunk. Pass `stream: false` (or use {@link end}) on the last one. */
|
|
48
|
+
push(chunk, stream = true) {
|
|
49
|
+
return this.decoder.decode(chunk, { stream });
|
|
50
|
+
}
|
|
51
|
+
/** Flush any buffered partial code point and finish decoding. */
|
|
52
|
+
end(chunk) {
|
|
53
|
+
return this.decoder.decode(chunk ?? new Uint8Array(0));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/** A streaming UTF-8 encoder: feed text chunks, get bytes out. */
|
|
57
|
+
export class EncodeUTF8 {
|
|
58
|
+
encoder = new TextEncoder();
|
|
59
|
+
/** Encode a chunk of text to UTF-8 bytes. */
|
|
60
|
+
push(chunk) {
|
|
61
|
+
return this.encoder.encode(chunk);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=string.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string.js","sourceRoot":"","sources":["../src/string.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,WAAW,EAAE,CAAC;AACtD,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;AAE7D;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,GAAW,EAAE,MAAM,GAAG,KAAK;IAClD,IAAI,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACvE,OAAO,GAAG,CAAC;IACZ,CAAC;IACD,OAAO,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,IAAgB,EAAE,MAAM,GAAG,KAAK;IACzD,IAAI,MAAM,EAAE,CAAC;QACZ,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,mEAAmE;QACnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC;YAC9C,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,GAAG,CAAC;IACZ,CAAC;IACD,OAAO,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,8EAA8E;AAC9E,MAAM,OAAO,UAAU;IACd,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;IAC3C,iFAAiF;IACjF,IAAI,CAAC,KAAiB,EAAE,MAAM,GAAG,IAAI;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,iEAAiE;IACjE,GAAG,CAAC,KAAkB;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC;CACD;AAED,kEAAkE;AAClE,MAAM,OAAO,UAAU;IACd,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IACpC,6CAA6C;IAC7C,IAAI,CAAC,KAAa;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;CACD"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tar container — create and read POSIX `ustar` archives.
|
|
3
|
+
*
|
|
4
|
+
* Pure TypeScript, no engine: tar is a framing format, not a codec. {@link tar}
|
|
5
|
+
* concatenates 512-byte headers and padded payloads; {@link untar} walks them
|
|
6
|
+
* back. Long paths and large (>8 GB) entries transparently use PAX extended
|
|
7
|
+
* headers, and reading understands the GNU long-name (`L`) and PAX (`x`/`g`)
|
|
8
|
+
* records that `tar`/Docker emit — so archives round-trip with the standard
|
|
9
|
+
* Unix `tar` CLI and Docker image layers.
|
|
10
|
+
*
|
|
11
|
+
* Combine with a codec for the usual on-disk forms: {@link tarGz} (`.tar.gz`)
|
|
12
|
+
* and {@link tarZstd} (`.tar.zst`) pipe the framing through gzip/zstd so callers
|
|
13
|
+
* never hand-wire two functions.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* import { tar, untar, tarGz } from '@myrialabs/zipkit/tar';
|
|
18
|
+
* const archive = tar([
|
|
19
|
+
* { name: 'hello.txt', data: strToU8('hi') },
|
|
20
|
+
* { name: 'src/', type: 'directory' }
|
|
21
|
+
* ]);
|
|
22
|
+
* const gz = await tarGz([{ name: 'big.log', data: bytes }]);
|
|
23
|
+
* const files = untar(archive);
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
import type { CompressOptions, DecompressOptions } from '../types.js';
|
|
27
|
+
/** Entry kind, normalized across the on-disk typeflags. */
|
|
28
|
+
export type TarEntryType = 'file' | 'directory' | 'symlink';
|
|
29
|
+
/** An entry to write into a tar archive. */
|
|
30
|
+
export interface TarEntryInput {
|
|
31
|
+
/** Path within the archive, using `/` separators. */
|
|
32
|
+
name: string;
|
|
33
|
+
/** File contents. Omit (or leave empty) for directories and symlinks. */
|
|
34
|
+
data?: Uint8Array;
|
|
35
|
+
/** Entry kind (default `'file'`, or `'directory'` when `name` ends in `/`). */
|
|
36
|
+
type?: TarEntryType;
|
|
37
|
+
/** Unix permission bits, e.g. `0o644`. Defaults by type. */
|
|
38
|
+
mode?: number;
|
|
39
|
+
/** Last-modified time (default: now). */
|
|
40
|
+
mtime?: Date | number;
|
|
41
|
+
/** Owner uid (default `0`). */
|
|
42
|
+
uid?: number;
|
|
43
|
+
/** Owner gid (default `0`). */
|
|
44
|
+
gid?: number;
|
|
45
|
+
/** Owner user name. */
|
|
46
|
+
uname?: string;
|
|
47
|
+
/** Owner group name. */
|
|
48
|
+
gname?: string;
|
|
49
|
+
/** Symlink target (required when `type` is `'symlink'`). */
|
|
50
|
+
linkname?: string;
|
|
51
|
+
}
|
|
52
|
+
/** A decoded tar entry. */
|
|
53
|
+
export interface TarEntry {
|
|
54
|
+
/** Path within the archive. */
|
|
55
|
+
name: string;
|
|
56
|
+
/** File contents (empty for directories/symlinks). */
|
|
57
|
+
data: Uint8Array;
|
|
58
|
+
/** Entry kind. */
|
|
59
|
+
type: TarEntryType;
|
|
60
|
+
/** Unix permission bits. */
|
|
61
|
+
mode: number;
|
|
62
|
+
/** Last-modified time. */
|
|
63
|
+
mtime: Date;
|
|
64
|
+
/** Owner uid. */
|
|
65
|
+
uid: number;
|
|
66
|
+
/** Owner gid. */
|
|
67
|
+
gid: number;
|
|
68
|
+
/** Owner user name, if recorded. */
|
|
69
|
+
uname: string;
|
|
70
|
+
/** Owner group name, if recorded. */
|
|
71
|
+
gname: string;
|
|
72
|
+
/** Symlink target, if this is a symlink. */
|
|
73
|
+
linkname?: string;
|
|
74
|
+
/** Uncompressed size in bytes. */
|
|
75
|
+
size: number;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Create a tar archive from `entries`. Synchronous and engine-free. Emits PAX
|
|
79
|
+
* extended headers for paths over 100 bytes that don't fit the ustar
|
|
80
|
+
* prefix/name split, and for entries larger than 8 GB (ustar's octal size
|
|
81
|
+
* ceiling). The result ends with the two zero blocks `tar` expects.
|
|
82
|
+
*/
|
|
83
|
+
export declare function tar(entries: TarEntryInput[]): Uint8Array;
|
|
84
|
+
/**
|
|
85
|
+
* Read a tar archive into its entries. Synchronous and engine-free. Understands
|
|
86
|
+
* the ustar prefix/name split, GNU long-name/long-link records, and PAX
|
|
87
|
+
* extended headers (so it reads archives from the Unix `tar` CLI and Docker
|
|
88
|
+
* layers). Throws {@link ZipKitError} on a corrupt header checksum.
|
|
89
|
+
*/
|
|
90
|
+
export declare function untar(data: Uint8Array): TarEntry[];
|
|
91
|
+
/** Create a `.tar.gz` archive: {@link tar} then gzip. */
|
|
92
|
+
export declare function tarGz(entries: TarEntryInput[], opts?: CompressOptions): Promise<Uint8Array>;
|
|
93
|
+
/** Read a `.tar.gz` archive: gunzip then {@link untar}. */
|
|
94
|
+
export declare function untarGz(data: Uint8Array, opts?: DecompressOptions): Promise<TarEntry[]>;
|
|
95
|
+
/** Create a `.tar.zst` archive: {@link tar} then zstd. */
|
|
96
|
+
export declare function tarZstd(entries: TarEntryInput[], opts?: CompressOptions): Promise<Uint8Array>;
|
|
97
|
+
/** Read a `.tar.zst` archive: unzstd then {@link untar}. */
|
|
98
|
+
export declare function untarZstd(data: Uint8Array, opts?: DecompressOptions): Promise<TarEntry[]>;
|
|
99
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tar/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AActE,2DAA2D;AAC3D,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;AAE5D,4CAA4C;AAC5C,MAAM,WAAW,aAAa;IAC7B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,+EAA+E;IAC/E,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,KAAK,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IACtB,+BAA+B;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,2BAA2B;AAC3B,MAAM,WAAW,QAAQ;IACxB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,IAAI,EAAE,UAAU,CAAC;IACjB,kBAAkB;IAClB,IAAI,EAAE,YAAY,CAAC;IACnB,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,KAAK,EAAE,IAAI,CAAC;IACZ,iBAAiB;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,iBAAiB;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;CACb;AAuLD;;;;;GAKG;AACH,wBAAgB,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,UAAU,CA8CxD;AA6BD;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,QAAQ,EAAE,CA2ElD;AAQD,yDAAyD;AACzD,wBAAsB,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAEjG;AAED,2DAA2D;AAC3D,wBAAsB,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAE7F;AAED,0DAA0D;AAC1D,wBAAsB,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAEnG;AAED,4DAA4D;AAC5D,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAE/F"}
|