Files
2020-03-02 14:53:23 +07:00

164 lines
5.1 KiB
JavaScript

"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault.js");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = _default;
var _common = require("../prelude/common.js");
var _log = require("./log.js");
var _assert = _interopRequireDefault(require("assert"));
var _fsExtra = _interopRequireDefault(require("fs-extra"));
var _package = require("../package.json");
/* eslint-disable complexity */
const bootstrapText = _fsExtra.default.readFileSync(require.resolve('../prelude/bootstrap.js'), 'utf8').replace('%VERSION%', _package.version);
const commonText = _fsExtra.default.readFileSync(require.resolve('../prelude/common.js'), 'utf8');
function itemsToText(items) {
const len = items.length;
return len.toString() + (len % 10 === 1 ? ' item' : ' items');
}
function hasAnyStore(record) {
// discarded records like native addons
for (const store of [_common.STORE_BLOB, _common.STORE_CONTENT, _common.STORE_LINKS, _common.STORE_STAT]) {
if (record[store]) return true;
}
return false;
}
function _default({
records,
entrypoint,
bytecode
}) {
const stripes = [];
for (const snap in records) {
const record = records[snap];
const {
file
} = record;
if (!hasAnyStore(record)) continue;
(0, _assert.default)(record[_common.STORE_STAT], 'packer: no STORE_STAT');
if ((0, _common.isDotNODE)(file)) {
continue;
} else {
(0, _assert.default)(record[_common.STORE_BLOB] || record[_common.STORE_CONTENT] || record[_common.STORE_LINKS]);
}
if (record[_common.STORE_BLOB] && !bytecode) {
delete record[_common.STORE_BLOB];
if (!record[_common.STORE_CONTENT]) {
// TODO make a test for it?
throw (0, _log.wasReported)('--no-bytecode and no source breaks final executable', [file, 'Please run with "-d" and without "--no-bytecode" first, and make', 'sure that debug log does not contain "was included as bytecode".']);
}
}
for (const store of [_common.STORE_BLOB, _common.STORE_CONTENT, _common.STORE_LINKS, _common.STORE_STAT]) {
const value = record[store];
if (!value) continue;
if (store === _common.STORE_BLOB || store === _common.STORE_CONTENT) {
if (record.body === undefined) {
stripes.push({
snap,
store,
file
});
} else if (Buffer.isBuffer(record.body)) {
stripes.push({
snap,
store,
buffer: record.body
});
} else if (typeof record.body === 'string') {
stripes.push({
snap,
store,
buffer: Buffer.from(record.body)
});
} else {
(0, _assert.default)(false, 'packer: bad STORE_BLOB/STORE_CONTENT');
}
} else if (store === _common.STORE_LINKS) {
if (Array.isArray(value)) {
const buffer = Buffer.from(JSON.stringify(value));
stripes.push({
snap,
store,
buffer
});
} else {
(0, _assert.default)(false, 'packer: bad STORE_LINKS');
}
} else if (store === _common.STORE_STAT) {
if (typeof value === 'object') {
// reproducible
delete value.atime;
delete value.atimeMs;
delete value.mtime;
delete value.mtimeMs;
delete value.ctime;
delete value.ctimeMs;
delete value.birthtime;
delete value.birthtimeMs; // non-date
delete value.blksize;
delete value.blocks;
delete value.dev;
delete value.gid;
delete value.ino;
delete value.nlink;
delete value.rdev;
delete value.uid;
if (!value.isFile()) value.size = 0; // portable
const newStat = Object.assign({}, value);
newStat.isFileValue = value.isFile();
newStat.isDirectoryValue = value.isDirectory();
const buffer = Buffer.from(JSON.stringify(newStat));
stripes.push({
snap,
store,
buffer
});
} else {
(0, _assert.default)(false, 'packer: bad STORE_STAT');
}
} else {
(0, _assert.default)(false, 'packer: unknown store');
}
}
if (record[_common.STORE_CONTENT]) {
const disclosed = (0, _common.isDotJS)(file) || (0, _common.isDotJSON)(file);
_log.log.debug(disclosed ? 'The file was included as DISCLOSED code (with sources)' : 'The file was included as asset content', file);
} else if (record[_common.STORE_BLOB]) {
_log.log.debug('The file was included as bytecode (no sources)', file);
} else if (record[_common.STORE_LINKS]) {
const value = record[_common.STORE_LINKS];
_log.log.debug('The directory files list was included (' + itemsToText(value) + ')', file);
}
}
const prelude = 'return (function (REQUIRE_COMMON, VIRTUAL_FILESYSTEM, DEFAULT_ENTRYPOINT) { ' + bootstrapText + '\n})(function (exports) {\n' + commonText + '\n},\n' + '%VIRTUAL_FILESYSTEM%' + '\n,\n' + '%DEFAULT_ENTRYPOINT%' + '\n);';
return {
prelude,
entrypoint,
stripes
};
}