mirror of
https://github.com/tiennm99/FBcount.git
synced 2026-05-14 14:58:04 +00:00
164 lines
5.1 KiB
JavaScript
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
|
|
};
|
|
} |