@pipobscure/sea
Version:
Node SEA Builder
131 lines • 5.33 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.bundle = bundle;
const Path = __importStar(require("node:path"));
const node_fs_1 = require("node:fs");
const glob_1 = require("glob");
const minimatch_1 = require("minimatch");
const Blob = __importStar(require("./appendblob.js"));
const packagebase_js_1 = require("./packagebase.js");
const filenames_js_1 = __importDefault(require("./filenames.js"));
const PackageBase = (0, packagebase_js_1.base)(process.cwd());
const PKG = JSON.parse((0, node_fs_1.readFileSync)(Path.join(PackageBase, 'package.json'), 'utf-8'));
const File = (0, filenames_js_1.default)(PKG);
async function bundle() {
const resolutions = JSON.parse(await node_fs_1.promises.readFile(Path.join(PackageBase, File.resolutions), 'utf-8'));
const bundle = (0, node_fs_1.createWriteStream)(Path.join(PackageBase, File.blobs));
const index = (0, node_fs_1.createWriteStream)(Path.join(PackageBase, File.index));
const seen = new Set();
let hashFlags = Blob.HASH.NONE;
switch (PKG.sea?.hash) {
case 'sha1':
hashFlags = Blob.HASH.SHA1;
break;
case 'sha2': // fall-through
case 'sha256':
hashFlags = Blob.HASH.SHA2;
break;
}
let compressFlags = Blob.COMPRESSION.NONE;
switch (PKG.sea?.compression) {
case 'deflate':
compressFlags = Blob.COMPRESSION.DEFLATE;
break;
case 'gzip':
compressFlags = Blob.COMPRESSION.GZIP;
break;
case 'brotli':
compressFlags = Blob.COMPRESSION.BROTLI;
break;
}
const exclusions = PKG?.sea?.exclude ?? []; //.map((pattern: string) => Object.assign(new Minimatch(pattern, { partial: true, platform: 'linux' }), { pattern }));
for (const dependecies of Object.values(resolutions)) {
for (const item of Object.values(dependecies)) {
if (item.startsWith('node:') || item.startsWith('file:'))
continue;
const filename = Path.join(PackageBase, item.split('/').slice(1).join(Path.sep));
if (seen.has(filename))
continue;
seen.add(filename);
if (excluded(exclusions, item.slice(1)))
continue;
const data = await node_fs_1.promises.readFile(filename);
await Blob.append(bundle, item, data, compressFlags | hashFlags, index);
process.stderr.write('.');
}
}
if (Array.isArray(PKG.sea?.assets)) {
for (const expr of PKG.sea.assets) {
for await (const fname of (0, glob_1.globIterate)(expr, { cwd: PackageBase, nodir: true, absolute: true })) {
if (seen.has(fname))
continue;
seen.add(fname);
const name = `/${Path.relative(PackageBase, fname).split(Path.sep).join('/')}`;
if (excluded(exclusions, name.slice(1)))
continue;
const data = await node_fs_1.promises.readFile(fname);
await Blob.append(bundle, name, data, compressFlags | hashFlags, index);
process.stderr.write('.');
}
}
}
process.stderr.write('\n');
await Promise.all([close(bundle), close(index)]);
}
function close(stream) {
return new Promise((resolve, reject) => {
stream.end((err) => {
if (err)
return reject(err);
resolve();
});
});
}
function excluded(exclusions, filename) {
for (const pattern of exclusions) {
const match = (0, minimatch_1.minimatch)(filename, pattern);
if (match) {
return true;
}
}
return false;
}
if (require.main === module)
bundle();
//# sourceMappingURL=bundlefiles.js.map