@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.
Files changed (185) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +329 -0
  3. package/dist/bench/corpus.d.ts +21 -0
  4. package/dist/bench/corpus.d.ts.map +1 -0
  5. package/dist/bench/corpus.js +92 -0
  6. package/dist/bench/corpus.js.map +1 -0
  7. package/dist/checksum.d.ts +29 -0
  8. package/dist/checksum.d.ts.map +1 -0
  9. package/dist/checksum.js +35 -0
  10. package/dist/checksum.js.map +1 -0
  11. package/dist/cli.d.ts +17 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +427 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/codecs/brotli.d.ts +6 -0
  16. package/dist/codecs/brotli.d.ts.map +1 -0
  17. package/dist/codecs/brotli.js +15 -0
  18. package/dist/codecs/brotli.js.map +1 -0
  19. package/dist/codecs/bzip2.d.ts +6 -0
  20. package/dist/codecs/bzip2.d.ts.map +1 -0
  21. package/dist/codecs/bzip2.js +15 -0
  22. package/dist/codecs/bzip2.js.map +1 -0
  23. package/dist/codecs/deflate.d.ts +6 -0
  24. package/dist/codecs/deflate.d.ts.map +1 -0
  25. package/dist/codecs/deflate.js +25 -0
  26. package/dist/codecs/deflate.js.map +1 -0
  27. package/dist/codecs/gzip.d.ts +6 -0
  28. package/dist/codecs/gzip.d.ts.map +1 -0
  29. package/dist/codecs/gzip.js +25 -0
  30. package/dist/codecs/gzip.js.map +1 -0
  31. package/dist/codecs/image.d.ts +5 -0
  32. package/dist/codecs/image.d.ts.map +1 -0
  33. package/dist/codecs/image.js +16 -0
  34. package/dist/codecs/image.js.map +1 -0
  35. package/dist/codecs/index.d.ts +18 -0
  36. package/dist/codecs/index.d.ts.map +1 -0
  37. package/dist/codecs/index.js +18 -0
  38. package/dist/codecs/index.js.map +1 -0
  39. package/dist/codecs/lz4.d.ts +6 -0
  40. package/dist/codecs/lz4.d.ts.map +1 -0
  41. package/dist/codecs/lz4.js +17 -0
  42. package/dist/codecs/lz4.js.map +1 -0
  43. package/dist/codecs/lzma.d.ts +6 -0
  44. package/dist/codecs/lzma.d.ts.map +1 -0
  45. package/dist/codecs/lzma.js +15 -0
  46. package/dist/codecs/lzma.js.map +1 -0
  47. package/dist/codecs/snappy.d.ts +6 -0
  48. package/dist/codecs/snappy.d.ts.map +1 -0
  49. package/dist/codecs/snappy.js +14 -0
  50. package/dist/codecs/snappy.js.map +1 -0
  51. package/dist/codecs/video.d.ts +13 -0
  52. package/dist/codecs/video.d.ts.map +1 -0
  53. package/dist/codecs/video.js +26 -0
  54. package/dist/codecs/video.js.map +1 -0
  55. package/dist/codecs/xz.d.ts +6 -0
  56. package/dist/codecs/xz.d.ts.map +1 -0
  57. package/dist/codecs/xz.js +30 -0
  58. package/dist/codecs/xz.js.map +1 -0
  59. package/dist/codecs/zlib.d.ts +6 -0
  60. package/dist/codecs/zlib.d.ts.map +1 -0
  61. package/dist/codecs/zlib.js +15 -0
  62. package/dist/codecs/zlib.js.map +1 -0
  63. package/dist/codecs/zstd.d.ts +6 -0
  64. package/dist/codecs/zstd.d.ts.map +1 -0
  65. package/dist/codecs/zstd.js +24 -0
  66. package/dist/codecs/zstd.js.map +1 -0
  67. package/dist/compress.d.ts +20 -0
  68. package/dist/compress.d.ts.map +1 -0
  69. package/dist/compress.js +83 -0
  70. package/dist/compress.js.map +1 -0
  71. package/dist/delta.d.ts +30 -0
  72. package/dist/delta.d.ts.map +1 -0
  73. package/dist/delta.js +44 -0
  74. package/dist/delta.js.map +1 -0
  75. package/dist/detect.d.ts +46 -0
  76. package/dist/detect.d.ts.map +1 -0
  77. package/dist/detect.js +86 -0
  78. package/dist/detect.js.map +1 -0
  79. package/dist/dictionary.d.ts +37 -0
  80. package/dist/dictionary.d.ts.map +1 -0
  81. package/dist/dictionary.js +71 -0
  82. package/dist/dictionary.js.map +1 -0
  83. package/dist/engine.d.ts +102 -0
  84. package/dist/engine.d.ts.map +1 -0
  85. package/dist/engine.js +204 -0
  86. package/dist/engine.js.map +1 -0
  87. package/dist/fsa.d.ts +54 -0
  88. package/dist/fsa.d.ts.map +1 -0
  89. package/dist/fsa.js +45 -0
  90. package/dist/fsa.js.map +1 -0
  91. package/dist/index.d.ts +35 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +47 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/internal.d.ts +21 -0
  96. package/dist/internal.d.ts.map +1 -0
  97. package/dist/internal.js +42 -0
  98. package/dist/internal.js.map +1 -0
  99. package/dist/middleware/elysia.d.ts +15 -0
  100. package/dist/middleware/elysia.d.ts.map +1 -0
  101. package/dist/middleware/elysia.js +43 -0
  102. package/dist/middleware/elysia.js.map +1 -0
  103. package/dist/middleware/express.d.ts +17 -0
  104. package/dist/middleware/express.d.ts.map +1 -0
  105. package/dist/middleware/express.js +62 -0
  106. package/dist/middleware/express.js.map +1 -0
  107. package/dist/middleware/hono.d.ts +17 -0
  108. package/dist/middleware/hono.d.ts.map +1 -0
  109. package/dist/middleware/hono.js +41 -0
  110. package/dist/middleware/hono.js.map +1 -0
  111. package/dist/middleware/index.d.ts +14 -0
  112. package/dist/middleware/index.d.ts.map +1 -0
  113. package/dist/middleware/index.js +14 -0
  114. package/dist/middleware/index.js.map +1 -0
  115. package/dist/middleware/shared.d.ts +29 -0
  116. package/dist/middleware/shared.d.ts.map +1 -0
  117. package/dist/middleware/shared.js +47 -0
  118. package/dist/middleware/shared.js.map +1 -0
  119. package/dist/pack.d.ts +36 -0
  120. package/dist/pack.d.ts.map +1 -0
  121. package/dist/pack.js +75 -0
  122. package/dist/pack.js.map +1 -0
  123. package/dist/parallel/index.d.ts +56 -0
  124. package/dist/parallel/index.d.ts.map +1 -0
  125. package/dist/parallel/index.js +158 -0
  126. package/dist/parallel/index.js.map +1 -0
  127. package/dist/sevenzip/index.d.ts +45 -0
  128. package/dist/sevenzip/index.d.ts.map +1 -0
  129. package/dist/sevenzip/index.js +646 -0
  130. package/dist/sevenzip/index.js.map +1 -0
  131. package/dist/streams/index.d.ts +32 -0
  132. package/dist/streams/index.d.ts.map +1 -0
  133. package/dist/streams/index.js +74 -0
  134. package/dist/streams/index.js.map +1 -0
  135. package/dist/string.d.ts +38 -0
  136. package/dist/string.d.ts.map +1 -0
  137. package/dist/string.js +64 -0
  138. package/dist/string.js.map +1 -0
  139. package/dist/tar/index.d.ts +99 -0
  140. package/dist/tar/index.d.ts.map +1 -0
  141. package/dist/tar/index.js +380 -0
  142. package/dist/tar/index.js.map +1 -0
  143. package/dist/types.d.ts +59 -0
  144. package/dist/types.d.ts.map +1 -0
  145. package/dist/types.js +22 -0
  146. package/dist/types.js.map +1 -0
  147. package/dist/workers/index.d.ts +58 -0
  148. package/dist/workers/index.d.ts.map +1 -0
  149. package/dist/workers/index.js +158 -0
  150. package/dist/workers/index.js.map +1 -0
  151. package/dist/workers/worker.d.ts +18 -0
  152. package/dist/workers/worker.d.ts.map +1 -0
  153. package/dist/workers/worker.js +45 -0
  154. package/dist/workers/worker.js.map +1 -0
  155. package/dist/zip/crypto/aes.d.ts +25 -0
  156. package/dist/zip/crypto/aes.d.ts.map +1 -0
  157. package/dist/zip/crypto/aes.js +156 -0
  158. package/dist/zip/crypto/aes.js.map +1 -0
  159. package/dist/zip/crypto/winzip.d.ts +28 -0
  160. package/dist/zip/crypto/winzip.d.ts.map +1 -0
  161. package/dist/zip/crypto/winzip.js +87 -0
  162. package/dist/zip/crypto/winzip.js.map +1 -0
  163. package/dist/zip/crypto/zipcrypto.d.ts +14 -0
  164. package/dist/zip/crypto/zipcrypto.d.ts.map +1 -0
  165. package/dist/zip/crypto/zipcrypto.js +65 -0
  166. package/dist/zip/crypto/zipcrypto.js.map +1 -0
  167. package/dist/zip/datetime.d.ts +9 -0
  168. package/dist/zip/datetime.d.ts.map +1 -0
  169. package/dist/zip/datetime.js +13 -0
  170. package/dist/zip/datetime.js.map +1 -0
  171. package/dist/zip/index.d.ts +134 -0
  172. package/dist/zip/index.d.ts.map +1 -0
  173. package/dist/zip/index.js +473 -0
  174. package/dist/zip/index.js.map +1 -0
  175. package/dist/zip/stream.d.ts +38 -0
  176. package/dist/zip/stream.d.ts.map +1 -0
  177. package/dist/zip/stream.js +240 -0
  178. package/dist/zip/stream.js.map +1 -0
  179. package/dist/zipkit.d.ts +74 -0
  180. package/dist/zipkit.d.ts.map +1 -0
  181. package/dist/zipkit.js +168 -0
  182. package/dist/zipkit.js.map +1 -0
  183. package/engine/dist/zipkit-engine.mjs +2 -0
  184. package/engine/dist/zipkit-engine.wasm +0 -0
  185. 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"}
@@ -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"}