neozipkit 1.0.5 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/NEOZIP_APPNOTE.md +116 -18
  2. package/README.md +38 -8
  3. package/WHATS_NEW.md +111 -0
  4. package/dist/browser/zstd-browser-shim.d.ts +17 -9
  5. package/dist/browser/zstd-browser-shim.d.ts.map +1 -1
  6. package/dist/browser/zstd-browser-shim.js +99 -21
  7. package/dist/browser/zstd-browser-shim.js.map +1 -1
  8. package/dist/browser-esm/index.js +6178 -1261
  9. package/dist/browser-esm/index.js.map +4 -4
  10. package/dist/browser-umd/index.js +6178 -1261
  11. package/dist/browser-umd/index.js.map +4 -4
  12. package/dist/browser-umd/index.min.js +6 -3
  13. package/dist/core/ZipCompress.d.ts +6 -0
  14. package/dist/core/ZipCompress.d.ts.map +1 -1
  15. package/dist/core/ZipCompress.js.map +1 -1
  16. package/dist/core/ZipCopy.d.ts.map +1 -1
  17. package/dist/core/ZipCopy.js +33 -25
  18. package/dist/core/ZipCopy.js.map +1 -1
  19. package/dist/core/ZipEntry.d.ts +18 -0
  20. package/dist/core/ZipEntry.d.ts.map +1 -1
  21. package/dist/core/ZipEntry.js +139 -13
  22. package/dist/core/ZipEntry.js.map +1 -1
  23. package/dist/core/Zipkit.d.ts.map +1 -1
  24. package/dist/core/Zipkit.js +26 -19
  25. package/dist/core/Zipkit.js.map +1 -1
  26. package/dist/core/constants/Headers.d.ts +1 -0
  27. package/dist/core/constants/Headers.d.ts.map +1 -1
  28. package/dist/core/constants/Headers.js +1 -0
  29. package/dist/core/constants/Headers.js.map +1 -1
  30. package/dist/core/index.d.ts +3 -0
  31. package/dist/core/index.d.ts.map +1 -1
  32. package/dist/core/index.js +5 -1
  33. package/dist/core/index.js.map +1 -1
  34. package/dist/core/inflateZipPayload.d.ts +6 -0
  35. package/dist/core/inflateZipPayload.d.ts.map +1 -0
  36. package/dist/core/inflateZipPayload.js +28 -0
  37. package/dist/core/inflateZipPayload.js.map +1 -0
  38. package/dist/core/origin/OriginExtra.d.ts +43 -0
  39. package/dist/core/origin/OriginExtra.d.ts.map +1 -0
  40. package/dist/core/origin/OriginExtra.js +187 -0
  41. package/dist/core/origin/OriginExtra.js.map +1 -0
  42. package/dist/core/version.js +1 -1
  43. package/dist/core/zip64/Zip64.d.ts +138 -0
  44. package/dist/core/zip64/Zip64.d.ts.map +1 -0
  45. package/dist/core/zip64/Zip64.js +353 -0
  46. package/dist/core/zip64/Zip64.js.map +1 -0
  47. package/dist/node/ZipCopyNode.d.ts.map +1 -1
  48. package/dist/node/ZipCopyNode.js +26 -26
  49. package/dist/node/ZipCopyNode.js.map +1 -1
  50. package/dist/node/ZipDecompressNode.d.ts.map +1 -1
  51. package/dist/node/ZipDecompressNode.js +8 -6
  52. package/dist/node/ZipDecompressNode.js.map +1 -1
  53. package/dist/node/ZipkitNode.d.ts +14 -1
  54. package/dist/node/ZipkitNode.d.ts.map +1 -1
  55. package/dist/node/ZipkitNode.js +91 -53
  56. package/dist/node/ZipkitNode.js.map +1 -1
  57. package/dist/node/ZstdNode.d.ts +14 -4
  58. package/dist/node/ZstdNode.d.ts.map +1 -1
  59. package/dist/node/ZstdNode.js +28 -4
  60. package/dist/node/ZstdNode.js.map +1 -1
  61. package/dist/node/buildZipBuffer.d.ts +49 -0
  62. package/dist/node/buildZipBuffer.d.ts.map +1 -0
  63. package/dist/node/buildZipBuffer.js +146 -0
  64. package/dist/node/buildZipBuffer.js.map +1 -0
  65. package/dist/node/index.d.ts +3 -0
  66. package/dist/node/index.d.ts.map +1 -1
  67. package/dist/node/index.js +6 -1
  68. package/dist/node/index.js.map +1 -1
  69. package/dist/node/inflateZipPayload.d.ts +5 -0
  70. package/dist/node/inflateZipPayload.d.ts.map +1 -0
  71. package/dist/node/inflateZipPayload.js +21 -0
  72. package/dist/node/inflateZipPayload.js.map +1 -0
  73. package/dist/types/index.js +2 -2
  74. package/node-esm.mjs +32 -0
  75. package/package.json +11 -5
  76. package/src/browser/zstd-browser-shim.ts +110 -28
  77. package/src/core/ZipCompress.ts +6 -0
  78. package/src/core/ZipCopy.ts +56 -27
  79. package/src/core/ZipEntry.ts +192 -13
  80. package/src/core/Zipkit.ts +40 -22
  81. package/src/core/constants/Headers.ts +1 -0
  82. package/src/core/index.ts +3 -0
  83. package/src/core/inflateZipPayload.ts +27 -0
  84. package/src/core/origin/OriginExtra.ts +209 -0
  85. package/src/core/version.ts +1 -1
  86. package/src/core/zip64/Zip64.ts +473 -0
  87. package/src/node/ZipCopyNode.ts +31 -29
  88. package/src/node/ZipDecompressNode.ts +6 -5
  89. package/src/node/ZipkitNode.ts +121 -68
  90. package/src/node/ZstdNode.ts +33 -8
  91. package/src/node/buildZipBuffer.ts +221 -0
  92. package/src/node/index.ts +7 -0
  93. package/src/node/inflateZipPayload.ts +19 -0
  94. package/src/types/index.ts +2 -2
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  /**
3
- * Browser stub for ZSTD — native zlib streaming is Node-only.
4
- * Browser builds alias `ZstdNode` to this module so the bad WASM codec is never shipped.
3
+ * Browser zstd codec for in-memory buffers.
4
+ * Uses CompressionStream / DecompressionStream ('zstd') so the old WASM codec stays out.
5
+ * Node builds use src/node/ZstdNode.ts (native zlib) instead of this file.
5
6
  */
6
7
  Object.defineProperty(exports, "__esModule", { value: true });
7
8
  exports.ZstdNode = void 0;
@@ -12,43 +13,118 @@ exports.createDecompressTransform = createDecompressTransform;
12
13
  exports.compress = compress;
13
14
  exports.decompress = decompress;
14
15
  exports.compressSync = compressSync;
16
+ exports.compressSyncAtLevel = compressSyncAtLevel;
15
17
  exports.decompressSync = decompressSync;
18
+ exports.asZstdBuffer = asZstdBuffer;
16
19
  exports.compressChunks = compressChunks;
17
20
  exports.decompressStream = decompressStream;
18
- const ZSTD_BROWSER_UNSUPPORTED = 'ZSTD requires Node.js with native zlib support (Node.js >= 22.15 or >= 23.8). ' +
19
- 'Browser builds do not include a zstd codec; use Deflate or process zstd archives in Node.';
20
- function unsupported() {
21
- throw new Error(ZSTD_BROWSER_UNSUPPORTED);
21
+ const buffer_1 = require("buffer");
22
+ const ZSTD_UNAVAILABLE = 'This browser does not expose CompressionStream zstd. ' +
23
+ 'Use a current Chromium or Safari, or inflate the archive in Node.';
24
+ function asBytes(data) {
25
+ if (data instanceof ArrayBuffer)
26
+ return new Uint8Array(data);
27
+ return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
28
+ }
29
+ function toBuffer(bytes) {
30
+ return buffer_1.Buffer.from(bytes);
22
31
  }
23
32
  function isNativeZstdAvailable() {
24
- return false;
33
+ try {
34
+ if (typeof CompressionStream === 'undefined' || typeof DecompressionStream === 'undefined') {
35
+ return false;
36
+ }
37
+ // 'zstd' is not in the older CompressionFormat union.
38
+ new CompressionStream('zstd');
39
+ new DecompressionStream('zstd');
40
+ return true;
41
+ }
42
+ catch {
43
+ return false;
44
+ }
45
+ }
46
+ function mapCompressionLevel(level) {
47
+ return Math.min(Math.max(1, Math.floor(level * 2.1)), 19);
48
+ }
49
+ function assertZstd() {
50
+ if (!isNativeZstdAvailable()) {
51
+ throw new Error(ZSTD_UNAVAILABLE);
52
+ }
25
53
  }
26
- function mapCompressionLevel(_level) {
27
- return unsupported();
54
+ async function transformZstd(data, mode) {
55
+ assertZstd();
56
+ const Stream = mode === 'compress' ? CompressionStream : DecompressionStream;
57
+ const stream = new Stream('zstd');
58
+ const copy = new Uint8Array(data.byteLength);
59
+ copy.set(data);
60
+ const writer = stream.writable.getWriter();
61
+ await writer.write(copy);
62
+ await writer.close();
63
+ const reader = stream.readable.getReader();
64
+ const chunks = [];
65
+ let total = 0;
66
+ for (;;) {
67
+ const { done, value } = await reader.read();
68
+ if (done)
69
+ break;
70
+ if (value) {
71
+ chunks.push(value);
72
+ total += value.byteLength;
73
+ }
74
+ }
75
+ const out = new Uint8Array(total);
76
+ let offset = 0;
77
+ for (const chunk of chunks) {
78
+ out.set(chunk, offset);
79
+ offset += chunk.byteLength;
80
+ }
81
+ return out;
28
82
  }
29
83
  function createCompressTransform(_level) {
30
- return unsupported();
84
+ throw new Error('Browser zstd uses buffer compress(); Node zlib transforms are not available.');
31
85
  }
32
86
  function createDecompressTransform() {
33
- return unsupported();
87
+ throw new Error('Browser zstd uses buffer decompress(); Node zlib transforms are not available.');
34
88
  }
35
- async function compress(_data, _level) {
36
- return unsupported();
89
+ async function compress(data, _level) {
90
+ return toBuffer(await transformZstd(asBytes(data), 'compress'));
37
91
  }
38
- async function decompress(_data) {
39
- return unsupported();
92
+ async function decompress(data) {
93
+ return toBuffer(await transformZstd(asBytes(data), 'decompress'));
40
94
  }
41
95
  function compressSync(_data, _level) {
42
- return unsupported();
96
+ throw new Error('Browser zstd compress is async. Use compress().');
97
+ }
98
+ function compressSyncAtLevel(data, _zstdLevel) {
99
+ return compressSync(data);
43
100
  }
44
101
  function decompressSync(_data) {
45
- return unsupported();
102
+ throw new Error('Browser zstd decompress is async. Use decompress().');
103
+ }
104
+ function asZstdBuffer(data) {
105
+ return toBuffer(asBytes(data));
46
106
  }
47
- async function compressChunks(_readChunk, _totalSize, _chunkSize, _level, _onPlainChunk, _onCompressedChunk) {
48
- return unsupported();
107
+ async function compressChunks(readChunk, totalSize, chunkSize, level, _onPlainChunk, onCompressedChunk) {
108
+ const parts = [];
109
+ let position = 0;
110
+ while (position < totalSize) {
111
+ const size = Math.min(chunkSize, totalSize - position);
112
+ const chunk = readChunk(position, size);
113
+ parts.push(buffer_1.Buffer.from(chunk));
114
+ position += chunk.length;
115
+ }
116
+ const compressed = await compress(buffer_1.Buffer.concat(parts), level);
117
+ if (onCompressedChunk) {
118
+ await onCompressedChunk(compressed);
119
+ }
120
+ return compressed.length;
49
121
  }
50
- async function* decompressStream(_compressedStream) {
51
- unsupported();
122
+ async function* decompressStream(compressedStream) {
123
+ const parts = [];
124
+ for await (const chunk of compressedStream) {
125
+ parts.push(buffer_1.Buffer.from(chunk));
126
+ }
127
+ yield await decompress(buffer_1.Buffer.concat(parts));
52
128
  }
53
129
  exports.ZstdNode = {
54
130
  isNativeZstdAvailable,
@@ -58,7 +134,9 @@ exports.ZstdNode = {
58
134
  compress,
59
135
  decompress,
60
136
  compressSync,
137
+ compressSyncAtLevel,
61
138
  decompressSync,
139
+ asZstdBuffer,
62
140
  compressChunks,
63
141
  decompressStream,
64
142
  };
@@ -1 +1 @@
1
- {"version":3,"file":"zstd-browser-shim.js","sourceRoot":"","sources":["../../src/browser/zstd-browser-shim.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAUH,sDAEC;AAED,kDAEC;AAED,0DAEC;AAED,8DAEC;AAED,4BAEC;AAED,gCAEC;AAED,oCAEC;AAED,wCAEC;AAED,wCASC;AAED,4CAIC;AAvDD,MAAM,wBAAwB,GAC5B,gFAAgF;IAChF,2FAA2F,CAAC;AAE9F,SAAS,WAAW;IAClB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;AAC5C,CAAC;AAED,SAAgB,qBAAqB;IACnC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,mBAAmB,CAAC,MAAc;IAChD,OAAO,WAAW,EAAE,CAAC;AACvB,CAAC;AAED,SAAgB,uBAAuB,CAAC,MAAe;IACrD,OAAO,WAAW,EAAE,CAAC;AACvB,CAAC;AAED,SAAgB,yBAAyB;IACvC,OAAO,WAAW,EAAE,CAAC;AACvB,CAAC;AAEM,KAAK,UAAU,QAAQ,CAAC,KAAa,EAAE,MAAe;IAC3D,OAAO,WAAW,EAAE,CAAC;AACvB,CAAC;AAEM,KAAK,UAAU,UAAU,CAAC,KAAa;IAC5C,OAAO,WAAW,EAAE,CAAC;AACvB,CAAC;AAED,SAAgB,YAAY,CAAC,KAAa,EAAE,MAAe;IACzD,OAAO,WAAW,EAAE,CAAC;AACvB,CAAC;AAED,SAAgB,cAAc,CAAC,KAAa;IAC1C,OAAO,WAAW,EAAE,CAAC;AACvB,CAAC;AAEM,KAAK,UAAU,cAAc,CAClC,UAAsD,EACtD,UAAkB,EAClB,UAAkB,EAClB,MAAc,EACd,aAAuC,EACvC,kBAA4D;IAE5D,OAAO,WAAW,EAAE,CAAC;AACvB,CAAC;AAEM,KAAK,SAAS,CAAC,CAAC,gBAAgB,CACrC,iBAAwC;IAExC,WAAW,EAAE,CAAC;AAChB,CAAC;AAEY,QAAA,QAAQ,GAAG;IACtB,qBAAqB;IACrB,mBAAmB;IACnB,uBAAuB;IACvB,yBAAyB;IACzB,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,cAAc;IACd,cAAc;IACd,gBAAgB;CACjB,CAAC;AAEF,kBAAe,gBAAQ,CAAC"}
1
+ {"version":3,"file":"zstd-browser-shim.js","sourceRoot":"","sources":["../../src/browser/zstd-browser-shim.ts"],"names":[],"mappings":"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"}