@criticalmanufacturing/node-package-bundler
Version:
Connect IoT Package Bundler
127 lines • 6.24 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ShrinkwrapGenerator = void 0;
const log_1 = require("./log");
const io = require("fs-extra");
const path = require("path");
const inversify_1 = require("inversify");
const types_1 = require("../types");
let ShrinkwrapGenerator = class ShrinkwrapGenerator {
process(source, fileName) {
var _a, _b, _c, _d, _e;
let lockFilePath = path.join(source, "package-lock.json");
let isWorkspaces = false;
if (!io.existsSync(lockFilePath)) {
this._logger.warn(`Package Lock file not found. Assuming this environment is using workspaces`);
// Search up to 3 levels up
for (let i = 0; i < 3; i++) {
const levels = [];
for (let j = 0; j <= i; j++) {
levels.push("..");
}
lockFilePath = path.resolve(source, ...levels, "package-lock.json");
if (io.existsSync(lockFilePath)) {
isWorkspaces = true;
break;
}
}
}
if (!io.existsSync(lockFilePath)) {
this._logger.error(`Unable to find a suitable package lock file in the directory tree!`);
}
else {
if (!isWorkspaces) {
this._logger.info(`Since this is not a workspace environment, copying package-lock.json file as ${fileName}`);
io.copyFileSync(lockFilePath, path.join(source, fileName));
}
else {
const packageJsonLocation = path.join(source, "package.json");
this._logger.info(`Reading original package from '${packageJsonLocation}'`);
const packageJson = io.readJSONSync(packageJsonLocation);
this._logger.info(`Reading lock file from '${lockFilePath}'`);
const lockJson = io.readJSONSync(lockFilePath);
// now, cleanup the file
const prefix = source.slice(path.dirname(lockFilePath).length + 1).replace("\\", "/");
let dependencies = [];
for (const key in (_a = packageJson.dependencies) !== null && _a !== void 0 ? _a : {}) {
dependencies.push(key);
}
for (const key in (_b = packageJson.peerDependencies) !== null && _b !== void 0 ? _b : {}) {
dependencies.push(key);
}
// Reprocess the important packages (@criticalmanufacturing/);
for (const dep of dependencies) {
if (dep.startsWith("@criticalmanufacturing/")) {
const importantPack = this.searchImportantPackage((_c = lockJson.packages) !== null && _c !== void 0 ? _c : {}, dep);
for (const key in (_d = importantPack.dependencies) !== null && _d !== void 0 ? _d : {}) {
dependencies.push(key);
}
for (const key in (_e = importantPack.peerDependencies) !== null && _e !== void 0 ? _e : {}) {
dependencies.push(key);
}
}
}
// Remove duplicates
dependencies = dependencies.filter((item, index) => dependencies.indexOf(item) === index);
const result = {};
// First add all entries that match the same name of this path
for (const key in lockJson.packages) {
if (key.startsWith(prefix)) {
result[key] = lockJson.packages[key];
}
}
dependencies.forEach((pack) => {
var _a;
this._logger.info(` Adding resolved package information for '${pack}'`);
const results = this.searchPackage((_a = lockJson.packages) !== null && _a !== void 0 ? _a : {}, pack);
for (const key in results) {
result[key] = results[key];
}
});
this._logger.info(`Generating '${fileName}' file with relevant dependencies information for this package`);
io.writeJSONSync(path.join(source, fileName), {
name: packageJson.name,
version: packageJson.version,
packages: result
}, {
spaces: 2
});
}
}
}
searchPackage(full, search) {
const result = {};
for (const key in full) {
if (key === ("node_modules/" + search) || key.startsWith("node_modules/" + search + "/") || full[key].name === search) {
result[key] = full[key];
}
}
return (result);
}
searchImportantPackage(full, search) {
for (const key in full) {
if (full[key].name === search) {
return (full[key]);
}
}
return ({});
}
};
exports.ShrinkwrapGenerator = ShrinkwrapGenerator;
__decorate([
(0, inversify_1.inject)(types_1.TYPES.Logger),
__metadata("design:type", log_1.Log)
], ShrinkwrapGenerator.prototype, "_logger", void 0);
exports.ShrinkwrapGenerator = ShrinkwrapGenerator = __decorate([
(0, inversify_1.injectable)()
], ShrinkwrapGenerator);
//# sourceMappingURL=shrinkwrapGenerator.js.map