unzipit 1.3.6 → 1.4.1
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/README.md +66 -1
- package/dist/unzipit-worker.js +1 -1
- package/dist/unzipit-worker.min.js +1 -1
- package/dist/unzipit-worker.module.js +1 -1
- package/dist/unzipit.d.ts +2 -0
- package/dist/unzipit.js +5 -3
- package/dist/unzipit.min.js +5 -5
- package/dist/unzipit.module.d.ts +2 -0
- package/dist/unzipit.module.js +5 -3
- package/package.json +5 -3
package/README.md
CHANGED
|
@@ -63,13 +63,37 @@ async function readFiles(url) {
|
|
|
63
63
|
}
|
|
64
64
|
```
|
|
65
65
|
|
|
66
|
-
|
|
67
66
|
You can also pass a [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob),
|
|
68
67
|
[`ArrayBuffer`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer),
|
|
69
68
|
[`SharedArrayBuffer`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer),
|
|
70
69
|
[`TypedArray`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray),
|
|
71
70
|
or your own `Reader`
|
|
72
71
|
|
|
72
|
+
For using without a builder/bundler grab `unzipit.min.js` or `unzipit.module.js` from
|
|
73
|
+
the [`dist`](https://github.com/greggman/unzipit/tree/master/dist) folder and
|
|
74
|
+
include with
|
|
75
|
+
|
|
76
|
+
```js
|
|
77
|
+
import * as unzipit from `./unzipit.module.js`;
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
or
|
|
81
|
+
|
|
82
|
+
```html
|
|
83
|
+
<script src="unzipit.min.js"></script>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
or vs CDN
|
|
87
|
+
|
|
88
|
+
```js
|
|
89
|
+
import * as unzipit from 'https://unpkg.com/unzipit@1.4.0/dist/unzipit.module.js';
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
or
|
|
93
|
+
|
|
94
|
+
```html
|
|
95
|
+
<script src="https://unpkg.com/unzipit@1.4.0/dist/unzipit.js"></script>
|
|
96
|
+
```
|
|
73
97
|
## Node
|
|
74
98
|
|
|
75
99
|
For node you need to make your own `Reader` or pass in an
|
|
@@ -361,6 +385,8 @@ class ZipEntry {
|
|
|
361
385
|
lastModDate: Date, // a Date
|
|
362
386
|
isDirectory: bool, // True if directory
|
|
363
387
|
encrypted: bool, // True if encrypted
|
|
388
|
+
externalFileAttributes: number, // platform specific file attributes
|
|
389
|
+
versionMadeBy: number, // platform that made this file
|
|
364
390
|
}
|
|
365
391
|
```
|
|
366
392
|
|
|
@@ -475,6 +501,45 @@ size before asking for their content.
|
|
|
475
501
|
unzipit does not currently support encrypted zip files and will throw if you try to get the data for one.
|
|
476
502
|
Put it on the TODO list 😅
|
|
477
503
|
|
|
504
|
+
## File Attributes
|
|
505
|
+
|
|
506
|
+
If you want to make an unzip utilitiy using this library you'll need to be able to mark some files as executable.
|
|
507
|
+
That is unforutunately platform specific. For example, Windows has no concept of "mark a file as executable".
|
|
508
|
+
Each zip entry provides a `versionMadeBy` and `externalFileAttributes` property. You could theoretically use
|
|
509
|
+
that to set file attributes. For example
|
|
510
|
+
|
|
511
|
+
```js
|
|
512
|
+
fs.writeFileSync(filename, data);
|
|
513
|
+
if (process.platform === 'darwin' || process.platform === 'linux') {
|
|
514
|
+
const platform = entry.versionMadeBy >> 8;
|
|
515
|
+
const unix = 3;
|
|
516
|
+
const darwin = 13
|
|
517
|
+
if (entry.versionMadeBy === unix || entry.versionMadeBy === darwin) {
|
|
518
|
+
// no idea what's best here
|
|
519
|
+
// +- owner read
|
|
520
|
+
// |+- owner write
|
|
521
|
+
// ||+- owner execute
|
|
522
|
+
// |||+- group read
|
|
523
|
+
// ||||+- group write
|
|
524
|
+
// |||||+- group execute
|
|
525
|
+
// ||||||+- other read
|
|
526
|
+
// |||||||+- other write
|
|
527
|
+
// ||||||||+- other execute
|
|
528
|
+
// |||||||||
|
|
529
|
+
// VVVVVVVVV
|
|
530
|
+
let mod = (entry.externalFileAttributes >> 16) & 0b111111111; // all the bits
|
|
531
|
+
mod &= 0b111100100; // remove write and executable from group and other?
|
|
532
|
+
mod |= 0b110100100; // add in owner R/W, group R, other R
|
|
533
|
+
fs.chmodSync(filename, mod);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
## Other Limitations
|
|
539
|
+
|
|
540
|
+
unzipit only supports the uncompressed and deflate compression algorithms. Other algorithms are defined
|
|
541
|
+
in the zip spec but are uncommon.
|
|
542
|
+
|
|
478
543
|
# Testing
|
|
479
544
|
|
|
480
545
|
When writing tests serve the folder with your favorite web server (recommend [`servez`](https://www.npmjs.com/package/servez))
|
package/dist/unzipit-worker.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* unzipit@1.
|
|
1
|
+
/* unzipit@1.4.1, license MIT */
|
|
2
2
|
'use strict';(function(w){"function"===typeof define&&define.amd?define(w):w()})(function(){function w(a,b){var e=a.length;if(b<=e)return a;b=new Uint8Array(Math.max(e<<1,b));b.set(a,0);return b}function X(a,b,e,g){for(var f=0,c=0,m=g.length>>>1;c<e;){var p=a[c+b];g[c<<1]=0;g[(c<<1)+1]=p;p>f&&(f=p);c++}for(;c<m;)g[c<<1]=0,g[(c<<1)+1]=0,c++;return f}function z(a,b){var e=a.length,g,f;var c=d.bl_count;for(f=0;f<=b;f++)c[f]=0;for(f=1;f<e;f+=2)c[a[f]]++;f=d.next_code;var m=0;c[0]=0;for(g=1;g<=b;g++)m=
|
|
3
3
|
m+c[g-1]<<1,f[g]=m;for(b=0;b<e;b+=2)c=a[b+1],0!=c&&(a[b]=f[c],f[c]++)}function A(a,b,e){for(var g=a.length,f=d.rev15,c=0;c<g;c+=2)if(0!=a[c+1]){var m=a[c+1],p=c>>1<<4|m,t=b-m;m=a[c]<<t;for(t=m+(1<<t);m!=t;)e[f[m]>>>15-b]=p,m++}}function Y(a,b){for(var e=d.rev15,g=15-b,f=0;f<a.length;f+=2)a[f]=e[a[f]<<b-a[f+1]]>>>g}function x(a,b,e){return(a[b>>>3]|a[(b>>>3)+1]<<8)>>>(b&7)&(1<<e)-1}function K(a,b,e){return(a[b>>>3]|a[(b>>>3)+1]<<8|a[(b>>>3)+2]<<16)>>>(b&7)&(1<<e)-1}function L(a,b){return(a[b>>>3]|
|
|
4
4
|
a[(b>>>3)+1]<<8|a[(b>>>3)+2]<<16)>>>(b&7)}function fa(a){return a.arrayBuffer?a.arrayBuffer():new Promise((b,e)=>{const g=new FileReader;g.addEventListener("loadend",()=>{b(g.result)});g.addEventListener("error",e);g.readAsArrayBuffer(a)})}async function ha(a){a=await fa(a);return new Uint8Array(a)}const d=function(){var a=Uint16Array,b=Uint32Array;return{next_code:new a(16),bl_count:new a(16),ordr:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],of0:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,
|
package/dist/unzipit.d.ts
CHANGED
|
@@ -30,6 +30,8 @@ export type ZipEntry = {
|
|
|
30
30
|
lastModDate: Date, // a Date
|
|
31
31
|
isDirectory: boolean, // True if directory
|
|
32
32
|
encrypted: boolean, // True if encrypted
|
|
33
|
+
externalFileAttributes: number, // platform specific file attributes
|
|
34
|
+
versionMadeBy: number, // platform that made this file
|
|
33
35
|
};
|
|
34
36
|
|
|
35
37
|
export interface Reader {
|
package/dist/unzipit.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* unzipit@1.
|
|
1
|
+
/* unzipit@1.4.1, license MIT */
|
|
2
2
|
(function (global, factory) {
|
|
3
3
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
|
4
4
|
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
|
@@ -430,7 +430,7 @@
|
|
|
430
430
|
}
|
|
431
431
|
|
|
432
432
|
function dynamicRequire(mod, request) {
|
|
433
|
-
return mod.require(request);
|
|
433
|
+
return mod.require ? mod.require(request) : undefined;
|
|
434
434
|
}
|
|
435
435
|
|
|
436
436
|
const workerHelper = (function() {
|
|
@@ -695,6 +695,8 @@
|
|
|
695
695
|
this.lastModDate = dosDateTimeToDate(rawEntry.lastModFileDate, rawEntry.lastModFileTime);
|
|
696
696
|
this.isDirectory = rawEntry.uncompressedSize === 0 && rawEntry.name.endsWith('/');
|
|
697
697
|
this.encrypted = !!(rawEntry.generalPurposeBitFlag & 0x1);
|
|
698
|
+
this.externalFileAttributes = rawEntry.externalFileAttributes;
|
|
699
|
+
this.versionMadeBy = rawEntry.versionMadeBy;
|
|
698
700
|
}
|
|
699
701
|
// returns a promise that returns a Blob for this entry
|
|
700
702
|
async blob(type = 'application/octet-stream') {
|
|
@@ -978,7 +980,7 @@
|
|
|
978
980
|
// find the Zip64 Extended Information Extra Field
|
|
979
981
|
const zip64ExtraField = rawEntry.extraFields.find(e => e.id === 0x0001);
|
|
980
982
|
if (!zip64ExtraField) {
|
|
981
|
-
|
|
983
|
+
throw new Error('expected zip64 extended information extra field');
|
|
982
984
|
}
|
|
983
985
|
const zip64EiefBuffer = zip64ExtraField.data;
|
|
984
986
|
let index = 0;
|
package/dist/unzipit.min.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* unzipit@1.
|
|
1
|
+
/* unzipit@1.4.1, license MIT */
|
|
2
2
|
'use strict';(function(z,G){"object"===typeof exports&&"undefined"!==typeof module?G(exports):"function"===typeof define&&define.amd?define(["exports"],G):(z="undefined"!==typeof globalThis?globalThis:z||self,G(z.unzipit={}))})(this,function(z){function G(a){return a.arrayBuffer?a.arrayBuffer():new Promise((b,c)=>{const e=new FileReader;e.addEventListener("loadend",()=>{b(e.result)});e.addEventListener("error",c);e.readAsArrayBuffer(a)})}async function na(a){a=await G(a);return new Uint8Array(a)}
|
|
3
3
|
function aa(a){return"undefined"!==typeof Blob&&a instanceof Blob}function I(a){return"undefined"!==typeof SharedArrayBuffer&&a instanceof SharedArrayBuffer}function R(a,b){var c=a.length;if(b<=c)return a;b=new Uint8Array(Math.max(c<<1,b));b.set(a,0);return b}function oa(a,b,c,e,d,h){for(var k=ba,f=ca,l=0;l<c;){var n=a[f(e,d)&b];d+=n&15;var u=n>>>4;if(15>=u)h[l]=u,l++;else{var x=n=0;16==u?(x=3+k(e,d,2),d+=2,n=h[l-1]):17==u?(x=3+k(e,d,3),d+=3):18==u&&(x=11+k(e,d,7),d+=7);for(u=l+x;l<u;)h[l]=n,l++}}return d}
|
|
4
4
|
function da(a,b,c,e){for(var d=0,h=0,k=e.length>>>1;h<c;){var f=a[h+b];e[h<<1]=0;e[(h<<1)+1]=f;f>d&&(d=f);h++}for(;h<k;)e[h<<1]=0,e[(h<<1)+1]=0,h++;return d}function J(a,b){var c=a.length,e,d;var h=g.bl_count;for(d=0;d<=b;d++)h[d]=0;for(d=1;d<c;d+=2)h[a[d]]++;d=g.next_code;var k=0;h[0]=0;for(e=1;e<=b;e++)k=k+h[e-1]<<1,d[e]=k;for(b=0;b<c;b+=2)h=a[b+1],0!=h&&(a[b]=d[h],d[h]++)}function K(a,b,c){for(var e=a.length,d=g.rev15,h=0;h<e;h+=2)if(0!=a[h+1]){var k=a[h+1],f=h>>1<<4|k,l=b-k;k=a[h]<<l;for(l=k+
|
|
@@ -12,7 +12,7 @@ b){return w(a,b)+4294967296*w(a,b+4)}function M(a,b){I(a.buffer)&&(a=new Uint8Ar
|
|
|
12
12
|
d=new Uint8Array(d.buffer,d.byteOffset+22,h);h=M(d);return 65535===e||4294967295===f?await xa(a,b+c,h,d):await ha(a,f,k,e,h,d)}throw Error("could not find end of central directory. maybe not zip file");}async function xa(a,b,c,e){b=await H(a,b-20,20);if(117853008!==w(b,0))throw Error("invalid zip64 end of central directory locator signature");b=F(b,8);var d=await H(a,b,56);if(101075792!==w(d,0))throw Error("invalid zip64 end of central directory record signature");b=F(d,32);const h=F(d,40);d=F(d,
|
|
13
13
|
48);return ha(a,d,h,b,c,e)}async function ha(a,b,c,e,d,h){let k=0;b=await H(a,b,c);c=[];for(let A=0;A<e;++A){var f=b.subarray(k,k+46),l=w(f,0);if(33639248!==l)throw Error(`invalid central directory file header signature: 0x${l.toString(16)}`);f={versionMadeBy:v(f,4),versionNeededToExtract:v(f,6),generalPurposeBitFlag:v(f,8),compressionMethod:v(f,10),lastModFileTime:v(f,12),lastModFileDate:v(f,14),crc32:w(f,16),compressedSize:w(f,20),uncompressedSize:w(f,24),fileNameLength:v(f,28),extraFieldLength:v(f,
|
|
14
14
|
30),fileCommentLength:v(f,32),internalFileAttributes:v(f,36),externalFileAttributes:w(f,38),relativeOffsetOfLocalHeader:w(f,42)};if(f.generalPurposeBitFlag&64)throw Error("strong encryption is not supported");k+=46;l=b.subarray(k,k+f.fileNameLength+f.extraFieldLength+f.fileCommentLength);f.nameBytes=l.slice(0,f.fileNameLength);f.name=M(f.nameBytes);var n=f.fileNameLength+f.extraFieldLength;const C=l.slice(f.fileNameLength,n);f.extraFields=[];for(var u=0;u<C.length-3;){const t=v(C,u+0);var x=v(C,u+
|
|
15
|
-
2);u+=4;x=u+x;if(x>C.length)throw Error("extra field length exceeds extra field buffer size");f.extraFields.push({id:t,data:C.slice(u,x)});u=x}f.commentBytes=l.slice(n,n+f.fileCommentLength);f.comment=M(f.commentBytes);k+=l.length;if(4294967295===f.uncompressedSize||4294967295===f.compressedSize||4294967295===f.relativeOffsetOfLocalHeader){l=f.extraFields.find(t=>1===t.id);if(!l)
|
|
15
|
+
2);u+=4;x=u+x;if(x>C.length)throw Error("extra field length exceeds extra field buffer size");f.extraFields.push({id:t,data:C.slice(u,x)});u=x}f.commentBytes=l.slice(n,n+f.fileCommentLength);f.comment=M(f.commentBytes);k+=l.length;if(4294967295===f.uncompressedSize||4294967295===f.compressedSize||4294967295===f.relativeOffsetOfLocalHeader){l=f.extraFields.find(t=>1===t.id);if(!l)throw Error("expected zip64 extended information extra field");l=l.data;n=0;if(4294967295===f.uncompressedSize){if(n+8>
|
|
16
16
|
l.length)throw Error("zip64 extended information extra field does not include uncompressed size");f.uncompressedSize=F(l,n);n+=8}if(4294967295===f.compressedSize){if(n+8>l.length)throw Error("zip64 extended information extra field does not include compressed size");f.compressedSize=F(l,n);n+=8}if(4294967295===f.relativeOffsetOfLocalHeader){if(n+8>l.length)throw Error("zip64 extended information extra field does not include relative header offset");f.relativeOffsetOfLocalHeader=F(l,n);n+=8}}if(l=f.extraFields.find(t=>
|
|
17
17
|
28789===t.id&&6<=t.data.length&&1===t.data[0]&&w(t.data,1),ya.unsigned(f.nameBytes)))f.fileName=M(l.data.slice(5));if(0===f.compressionMethod&&(l=f.uncompressedSize,0!==(f.generalPurposeBitFlag&1)&&(l+=12),f.compressedSize!==l))throw Error(`compressed size mismatch for stored file: ${f.compressedSize} != ${l}`);c.push(f)}return{zip:{comment:d,commentBytes:h},entries:c.map(A=>new za(a,A))}}async function ia(a,b){if(b.generalPurposeBitFlag&1)throw Error("encrypted entries not supported");var c=await H(a,
|
|
18
18
|
b.relativeOffsetOfLocalHeader,30);a=await a.getLength();var e=w(c,0);if(67324752!==e)throw Error(`invalid local file header signature: 0x${e.toString(16)}`);e=v(c,26);var d=v(c,28);c=b.relativeOffsetOfLocalHeader+c.length+e+d;if(0===b.compressionMethod)e=!1;else if(8===b.compressionMethod)e=!0;else throw Error(`unsupported compression method: ${b.compressionMethod}`);d=c+b.compressedSize;if(0!==b.compressedSize&&d>a)throw Error(`file data overflows file bounds: ${c} + ${b.compressedSize} > ${a}`);
|
|
@@ -24,8 +24,8 @@ this.length=parseInt(a.headers.get("content-length"));if(Number.isNaN(this.lengt
|
|
|
24
24
|
bl_count:new a(16),ordr:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],of0:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],exb:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],ldef:new a(32),df0:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],dxb:[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0],ddef:new b(32),flmap:new a(512),
|
|
25
25
|
fltree:[],fdmap:new a(32),fdtree:[],lmap:new a(32768),ltree:[],ttree:[],dmap:new a(32768),dtree:[],imap:new a(512),itree:[],rev15:new a(32768),lhst:new b(286),dhst:new b(30),ihst:new b(19),lits:new b(15E3),strt:new a(65536),prev:new a(32768)}}();(function(){function a(e,d,h){for(;0!=d--;)e.push(0,h)}for(var b=0;32768>b;b++){var c=b;c=(c&2863311530)>>>1|(c&1431655765)<<1;c=(c&3435973836)>>>2|(c&858993459)<<2;c=(c&4042322160)>>>4|(c&252645135)<<4;c=(c&4278255360)>>>8|(c&16711935)<<8;g.rev15[b]=(c>>>
|
|
26
26
|
16|c<<16)>>>17}for(b=0;32>b;b++)g.ldef[b]=g.of0[b]<<3|g.exb[b],g.ddef[b]=g.df0[b]<<4|g.dxb[b];a(g.fltree,144,8);a(g.fltree,112,9);a(g.fltree,24,7);a(g.fltree,8,8);J(g.fltree,9);K(g.fltree,9,g.flmap);ea(g.fltree,9);a(g.fdtree,32,5);J(g.fdtree,5);K(g.fdtree,5,g.fdmap);ea(g.fdtree,5);a(g.itree,19,0);a(g.ltree,286,0);a(g.dtree,30,0);a(g.ttree,320,0)})();const ma={table:function(){for(var a=new Uint32Array(256),b=0;256>b;b++){for(var c=b,e=0;8>e;e++)c=c&1?3988292384^c>>>1:c>>>1;a[b]=c}return a}(),update:function(a,
|
|
27
|
-
b,c,e){for(var d=0;d<e;d++)a=ma.table[(a^b[c+d])&255]^a>>>8;return a},crc:function(a,b,c){return ma.update(4294967295,a,b,c)^4294967295}},y={numWorkers:1,workerURL:"",useWorkers:!1};let ta=0,U=0,P=!0;const O=[],D=[],B=[],N=new Map,V=function(){if(Ca){const {Worker:a}=module.require("worker_threads");return{async createWorker(b){return new a(b)},addEventListener(b,c){b.on("message",e=>{c({target:b,data:e})})},async terminate(b){await b.terminate()}}}return{async createWorker(a){try{return await T(a)}catch(c){console.warn("could not load worker:",
|
|
27
|
+
b,c,e){for(var d=0;d<e;d++)a=ma.table[(a^b[c+d])&255]^a>>>8;return a},crc:function(a,b,c){return ma.update(4294967295,a,b,c)^4294967295}},y={numWorkers:1,workerURL:"",useWorkers:!1};let ta=0,U=0,P=!0;const O=[],D=[],B=[],N=new Map,V=function(){if(Ca){const {Worker:a}=module.require?module.require("worker_threads"):void 0;return{async createWorker(b){return new a(b)},addEventListener(b,c){b.on("message",e=>{c({target:b,data:e})})},async terminate(b){await b.terminate()}}}return{async createWorker(a){try{return await T(a)}catch(c){console.warn("could not load worker:",
|
|
28
28
|
a)}let b;try{const c=await fetch(a,{mode:"cors"});if(!c.ok)throw Error(`could not load: ${a}`);b=await c.text();a=URL.createObjectURL(new Blob([b],{type:"application/javascript"}));const e=await T(a);y.workerURL=a;return e}catch(c){console.warn("could not load worker via fetch:",a)}if(void 0!==b)try{a=`data:application/javascript;base64,${btoa(b)}`;const c=await T(a);y.workerURL=a;return c}catch(c){console.warn("could not load worker via dataURI")}console.warn("workers will not be used");throw Error("can not start workers");
|
|
29
29
|
},addEventListener(a,b){a.addEventListener("message",b)},async terminate(a){a.terminate()}}}();class za{constructor(a,b){this._reader=a;this._rawEntry=b;this.name=b.name;this.nameBytes=b.nameBytes;this.size=b.uncompressedSize;this.compressedSize=b.compressedSize;this.comment=b.comment;this.commentBytes=b.commentBytes;this.compressionMethod=b.compressionMethod;a=b.lastModFileDate;var c=b.lastModFileTime;this.lastModDate=new Date((a>>9&127)+1980,(a>>5&15)-1,a&31,c>>11&31,c>>5&63,2*(c&31),0);this.isDirectory=
|
|
30
|
-
0===b.uncompressedSize&&b.name.endsWith("/");this.encrypted=!!(b.generalPurposeBitFlag&1)}async blob(a="application/octet-stream"){return await Ba(this._reader,this._rawEntry,a)}async arrayBuffer(){return await Aa(this._reader,this._rawEntry)}async text(){const a=await this.arrayBuffer();return M(new Uint8Array(a))}async json(){const a=await this.text();return JSON.parse(a)}}const ya={unsigned(){return 0}},va=
|
|
31
|
-
a.workerURL||y.workerURL;a.workerURL&&(y.useWorkers=!0);y.useWorkers=void 0!==a.useWorkers?a.useWorkers:y.useWorkers;y.numWorkers=a.numWorkers||y.numWorkers};z.unzip=async function(a){const {zip:b,entries:c}=await ja(a);return{zip:b,entries:Object.fromEntries(c.map(e=>[e.name,e]))}};z.unzipRaw=ja;Object.defineProperty(z,"__esModule",{value:!0})});
|
|
30
|
+
0===b.uncompressedSize&&b.name.endsWith("/");this.encrypted=!!(b.generalPurposeBitFlag&1);this.externalFileAttributes=b.externalFileAttributes;this.versionMadeBy=b.versionMadeBy}async blob(a="application/octet-stream"){return await Ba(this._reader,this._rawEntry,a)}async arrayBuffer(){return await Aa(this._reader,this._rawEntry)}async text(){const a=await this.arrayBuffer();return M(new Uint8Array(a))}async json(){const a=await this.text();return JSON.parse(a)}}const ya={unsigned(){return 0}},va=
|
|
31
|
+
new TextDecoder;z.HTTPRangeReader=Da;z.cleanup=function(){ua()};z.setOptions=function(a){y.workerURL=a.workerURL||y.workerURL;a.workerURL&&(y.useWorkers=!0);y.useWorkers=void 0!==a.useWorkers?a.useWorkers:y.useWorkers;y.numWorkers=a.numWorkers||y.numWorkers};z.unzip=async function(a){const {zip:b,entries:c}=await ja(a);return{zip:b,entries:Object.fromEntries(c.map(e=>[e.name,e]))}};z.unzipRaw=ja;Object.defineProperty(z,"__esModule",{value:!0})});
|
package/dist/unzipit.module.d.ts
CHANGED
|
@@ -30,6 +30,8 @@ export type ZipEntry = {
|
|
|
30
30
|
lastModDate: Date, // a Date
|
|
31
31
|
isDirectory: boolean, // True if directory
|
|
32
32
|
encrypted: boolean, // True if encrypted
|
|
33
|
+
externalFileAttributes: number, // platform specific file attributes
|
|
34
|
+
versionMadeBy: number, // platform that made this file
|
|
33
35
|
};
|
|
34
36
|
|
|
35
37
|
export interface Reader {
|
package/dist/unzipit.module.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* unzipit@1.
|
|
1
|
+
/* unzipit@1.4.1, license MIT */
|
|
2
2
|
/* global SharedArrayBuffer, process */
|
|
3
3
|
|
|
4
4
|
function readBlobAsArrayBuffer(blob) {
|
|
@@ -424,7 +424,7 @@ function startWorker(url) {
|
|
|
424
424
|
}
|
|
425
425
|
|
|
426
426
|
function dynamicRequire(mod, request) {
|
|
427
|
-
return mod.require(request);
|
|
427
|
+
return mod.require ? mod.require(request) : undefined;
|
|
428
428
|
}
|
|
429
429
|
|
|
430
430
|
const workerHelper = (function() {
|
|
@@ -689,6 +689,8 @@ class ZipEntry {
|
|
|
689
689
|
this.lastModDate = dosDateTimeToDate(rawEntry.lastModFileDate, rawEntry.lastModFileTime);
|
|
690
690
|
this.isDirectory = rawEntry.uncompressedSize === 0 && rawEntry.name.endsWith('/');
|
|
691
691
|
this.encrypted = !!(rawEntry.generalPurposeBitFlag & 0x1);
|
|
692
|
+
this.externalFileAttributes = rawEntry.externalFileAttributes;
|
|
693
|
+
this.versionMadeBy = rawEntry.versionMadeBy;
|
|
692
694
|
}
|
|
693
695
|
// returns a promise that returns a Blob for this entry
|
|
694
696
|
async blob(type = 'application/octet-stream') {
|
|
@@ -972,7 +974,7 @@ async function readEntries(reader, centralDirectoryOffset, centralDirectorySize,
|
|
|
972
974
|
// find the Zip64 Extended Information Extra Field
|
|
973
975
|
const zip64ExtraField = rawEntry.extraFields.find(e => e.id === 0x0001);
|
|
974
976
|
if (!zip64ExtraField) {
|
|
975
|
-
|
|
977
|
+
throw new Error('expected zip64 extended information extra field');
|
|
976
978
|
}
|
|
977
979
|
const zip64EiefBuffer = zip64ExtraField.data;
|
|
978
980
|
let index = 0;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "unzipit",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.1",
|
|
4
4
|
"description": "random access unzip library for JavaScript",
|
|
5
5
|
"main": "dist/unzipit.js",
|
|
6
6
|
"module": "dist/unzipit.module.js",
|
|
@@ -14,7 +14,9 @@
|
|
|
14
14
|
"build-min": "rollup -c && google-closure-compiler --warning_level=VERBOSE --jscomp_off=globalThis --jscomp_off=checkTypes --externs build/externs.js --language_in=ECMASCRIPT_2019 --language_out=ECMASCRIPT_2019 --js dist/unzipit.js --js_output_file dist/unzipit.min.js && google-closure-compiler --warning_level=VERBOSE --jscomp_off=globalThis --jscomp_off=checkTypes --externs build/externs.js --language_in=ECMASCRIPT_2019 --language_out=ECMASCRIPT_2019 --js dist/unzipit-worker.js --js_output_file dist/unzipit-worker.min.js && node ./build/append-banner.js dist/unzipit.min.js dist/unzipit-worker.min.js",
|
|
15
15
|
"build-ts": "node ./build/copy.js dist/unzipit.d.ts dist/unzipit.module.d.ts && tsc --lib es2019,dom,dom.iterable --target es2019 test/ts/ts-test.ts",
|
|
16
16
|
"eslint": "eslint src/**/*.js test/tests/**/*.js",
|
|
17
|
-
"test": "
|
|
17
|
+
"test": "npm run test-node && npm run test-browser",
|
|
18
|
+
"test-node": "mocha test/node-test.js",
|
|
19
|
+
"test-browser": "node test/puppeteer.js"
|
|
18
20
|
},
|
|
19
21
|
"files": [
|
|
20
22
|
"dist/**"
|
|
@@ -45,7 +47,7 @@
|
|
|
45
47
|
"express": "^4.17.1",
|
|
46
48
|
"google-closure-compiler": "^20200830.0.0",
|
|
47
49
|
"mocha": "^8.1.3",
|
|
48
|
-
"puppeteer": "^
|
|
50
|
+
"puppeteer": "^13.0.1",
|
|
49
51
|
"rollup": "^2.27.1",
|
|
50
52
|
"rollup-plugin-node-resolve": "^5.2.0",
|
|
51
53
|
"typescript": "^4.0.2"
|