aboutsummaryrefslogtreecommitdiff
path: root/node_modules/decompress-unzip/index.js
diff options
context:
space:
mode:
authorMinteck <nekostarfan@gmail.com>2021-08-24 14:41:48 +0200
committerMinteck <nekostarfan@gmail.com>2021-08-24 14:41:48 +0200
commitd25e11bee6ca5ca523884da132d18e1400e077b9 (patch)
tree8af39fde19f7ed640a60fb397c7edd647dff1c4c /node_modules/decompress-unzip/index.js
downloadkartik-iridium-d25e11bee6ca5ca523884da132d18e1400e077b9.tar.gz
kartik-iridium-d25e11bee6ca5ca523884da132d18e1400e077b9.tar.bz2
kartik-iridium-d25e11bee6ca5ca523884da132d18e1400e077b9.zip
Initial commit
Diffstat (limited to 'node_modules/decompress-unzip/index.js')
-rw-r--r--node_modules/decompress-unzip/index.js86
1 files changed, 86 insertions, 0 deletions
diff --git a/node_modules/decompress-unzip/index.js b/node_modules/decompress-unzip/index.js
new file mode 100644
index 0000000..3c1f943
--- /dev/null
+++ b/node_modules/decompress-unzip/index.js
@@ -0,0 +1,86 @@
+'use strict';
+const fileType = require('file-type');
+const getStream = require('get-stream');
+const pify = require('pify');
+const yauzl = require('yauzl');
+
+const getType = (entry, mode) => {
+ const IFMT = 61440;
+ const IFDIR = 16384;
+ const IFLNK = 40960;
+ const madeBy = entry.versionMadeBy >> 8;
+
+ if ((mode & IFMT) === IFLNK) {
+ return 'symlink';
+ }
+
+ if ((mode & IFMT) === IFDIR || (madeBy === 0 && entry.externalFileAttributes === 16)) {
+ return 'directory';
+ }
+
+ return 'file';
+};
+
+const extractEntry = (entry, zip) => {
+ const file = {
+ mode: (entry.externalFileAttributes >> 16) & 0xFFFF,
+ mtime: entry.getLastModDate(),
+ path: entry.fileName
+ };
+
+ file.type = getType(entry, file.mode);
+
+ if (file.mode === 0 && file.type === 'directory') {
+ file.mode = 493;
+ }
+
+ if (file.mode === 0) {
+ file.mode = 420;
+ }
+
+ return pify(zip.openReadStream.bind(zip))(entry)
+ .then(getStream.buffer)
+ .then(buf => {
+ file.data = buf;
+
+ if (file.type === 'symlink') {
+ file.linkname = buf.toString();
+ }
+
+ return file;
+ })
+ .catch(err => {
+ zip.close();
+ throw err;
+ });
+};
+
+const extractFile = zip => new Promise((resolve, reject) => {
+ const files = [];
+
+ zip.readEntry();
+
+ zip.on('entry', entry => {
+ extractEntry(entry, zip)
+ .catch(reject)
+ .then(file => {
+ files.push(file);
+ zip.readEntry();
+ });
+ });
+
+ zip.on('error', reject);
+ zip.on('end', () => resolve(files));
+});
+
+module.exports = () => buf => {
+ if (!Buffer.isBuffer(buf)) {
+ return Promise.reject(new TypeError(`Expected a Buffer, got ${typeof buf}`));
+ }
+
+ if (!fileType(buf) || fileType(buf).ext !== 'zip') {
+ return Promise.resolve([]);
+ }
+
+ return pify(yauzl.fromBuffer)(buf, {lazyEntries: true}).then(extractFile);
+};