jscrambler
Version:
Jscrambler Code Integrity API client.
156 lines (153 loc) • 5.73 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.unzip = unzip;
exports.zip = zip;
exports.zipSources = zipSources;
require("core-js/modules/es.array.reverse.js");
require("core-js/modules/es.regexp.exec.js");
require("core-js/modules/web.dom-collections.iterator.js");
var _lodash = _interopRequireDefault(require("lodash.size"));
var _jszip = _interopRequireDefault(require("jszip"));
var fs = _interopRequireWildcard(require("fs/promises"));
var _path2 = require("path");
var _util = require("util");
var _utils = require("./utils");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
// TODO Replace `sync` functions with async versions
const debug = !!process.env.DEBUG;
async function zip(files, cwd, runBeforeProtection) {
debug && console.log('Zipping files', (0, _util.inspect)(files));
// Flag to detect if any file was added to the zip archive
let hasFiles = false;
// Sanitize `cwd`
if (cwd) {
cwd = (0, _path2.normalize)(cwd);
}
// If it's already a zip file
if (files.length === 1 && /^.*\.zip$/.test(files[0])) {
hasFiles = true;
const zipFile = new _jszip.default();
const zipFileData = await fs.readFile(files[0]);
return await zipFile.loadAsync(zipFileData);
}
const zipFile = new _jszip.default();
for (let i = 0, l = files.length; i < l; ++i) {
// Sanitise path
if (typeof files[i] === 'string') {
files[i] = (0, _path2.normalize)(files[i]);
if (files[i].indexOf('../') === 0) {
files[i] = (0, _path2.resolve)(files[i]);
}
}
// Bypass unwanted patterns from `files`
if (/.*\.(git|hg)(\/.*|$)/.test(files[i].path || files[i])) {
continue;
}
let buffer, name;
let sPath;
if (cwd && files[i].indexOf && files[i].indexOf(cwd) !== 0) {
sPath = (0, _path2.join)(cwd, files[i]);
} else {
sPath = files[i];
}
// If buffer
if (files[i].contents) {
name = (0, _path2.relative)(files[i].cwd, files[i].path);
buffer = files[i].contents;
} else if (!(await fs.stat(sPath)).isDirectory()) {
// Else if it's a path and not a directory
if (cwd && files[i].indexOf && files[i].indexOf(cwd) === 0) {
name = files[i].substring(cwd.length);
} else {
name = files[i];
}
buffer = await fs.readFile(sPath);
runBeforeProtection.reverse().map(element => {
buffer = (0, _utils.concatenate)(element, cwd, sPath, buffer);
});
} else {
// Else if it's a directory path
zipFile.folder(sPath);
}
if (name) {
hasFiles = true;
zipFile.file(name, buffer);
}
}
if (!hasFiles) {
throw new Error('No source files found. If you intend to send a whole directory sufix your path with "**" (e.g. ./my-directory/**)');
}
return zipFile;
}
function zipSources(sources) {
const zipFile = new _jszip.default();
const fileNames = sources.map(source => {
zipFile.file(source.filename, source.content);
return source.filename;
});
if (debug) {
console.log('Zipping files', (0, _util.inspect)(fileNames));
}
return Promise.resolve(zipFile);
}
function isWinAbsolutePath(path) {
return (0, _path2.isAbsolute)(path) && /^([a-z]:)(.*)/i.test(path);
}
function parseWinAbsolutePath(_path) {
const [full, drv, path] = _path.match(/^([a-z]:)(.*)/i);
return {
drv,
path
};
}
async function unzip(zipFile, dest) {
let stream = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
const zip = new _jszip.default();
await zip.loadAsync(zipFile);
const _size = (0, _lodash.default)(zip.files);
const results = [];
// eslint-disable-next-line no-restricted-syntax
for (const file in zip.files) {
if (!zip.files[file].dir) {
const buffer = await zip.file(file).async('nodebuffer');
if (typeof dest === 'function') {
if (stream) {
dest(buffer, file);
} else {
results.push({
filename: file,
content: buffer.toString()
});
}
} else if (dest && typeof dest === 'string') {
var destPath;
const lastDestChar = dest[dest.length - 1];
if (_size === 1 && lastDestChar !== '/' && lastDestChar !== '\\') {
destPath = dest;
const parentPath = (0, _path2.dirname)(destPath);
await fs.mkdir(parentPath, {
recursive: true
});
} else {
let _file = file;
// Deal with win path join c:\dest\:c\src
if (isWinAbsolutePath(_file)) {
_file = parseWinAbsolutePath(_file).path;
}
destPath = (0, _path2.join)(dest, _file);
await fs.mkdir((0, _path2.dirname)(destPath), {
recursive: true
});
}
await fs.writeFile(destPath, buffer);
}
}
}
if (!stream) {
dest(results);
}
}