@jahed/terraform
Version:
A wrapper which downloads and runs Terraform locally via npm.
66 lines (65 loc) • 2.78 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.extractArchive = void 0;
const promises_1 = require("@jahed/promises");
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const yauzl_1 = __importDefault(require("yauzl"));
const debug_1 = require("./debug");
const extractArchive = ({ outputs, buffer, outdir }) => {
(0, debug_1.debug)("extracting", { outdir });
return (0, promises_1.eventually)((resolve, reject) => {
yauzl_1.default.fromBuffer(buffer, { lazyEntries: true }, (err, archive) => {
if (err) {
reject(err);
return;
}
if (!archive) {
// bad @types/yauzl
reject(new Error("failed to read archive and no reason was given."));
return;
}
archive.on("error", (error) => reject(error));
archive.on("entry", (entry) => {
if (entry.fileName !== outputs.originalFilename) {
// ignore LICENSE.txt and any other additional files
archive.readEntry();
return;
}
archive.openReadStream(entry, (err, readStream) => {
if (err) {
reject(err);
return;
}
if (!readStream) {
// bad @types/yauzl
reject(new Error("failed to read archive entry and no reason was given."));
return;
}
const filePath = path_1.default.resolve(outdir, outputs.versionedFilename);
const fileStream = fs_1.default.createWriteStream(filePath);
readStream.on("error", (error) => reject(error));
readStream.on("end", () => {
archive.close();
fileStream.close((error) => {
if (error) {
reject(error);
return;
}
resolve(filePath);
});
});
readStream.pipe(fileStream);
});
});
archive.on("end", () => {
reject((0, promises_1.reason)(`expected zip to contain a terraform executable. (${outputs.originalFilename})`));
});
archive.readEntry();
});
});
};
exports.extractArchive = extractArchive;