firebase-tools
Version:
Command-Line Interface for Firebase
104 lines (103 loc) • 3.84 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createLocalBuildTarArchive = createLocalBuildTarArchive;
exports.createSourceDeployArchive = createSourceDeployArchive;
exports.resolveIgnorePatterns = resolveIgnorePatterns;
const archiver = require("archiver");
const fs = require("fs");
const path = require("path");
const tar = require("tar");
const tmp = require("tmp");
const error_1 = require("../../error");
const fsAsync = require("../../fsAsync");
const utils_1 = require("../../utils");
async function createLocalBuildTarArchive(config, rootDir, outputFiles) {
const tmpFile = tmp.fileSync({ prefix: `${config.backendId}-`, postfix: ".tar.gz" }).name;
const filesToPackage = outputFiles.length > 0 ? outputFiles : ["."];
const allFiles = [];
for (const fileOrDir of filesToPackage) {
const absolutePath = path.join(rootDir, fileOrDir);
if (!fs.existsSync(absolutePath)) {
(0, utils_1.logLabeledWarning)("apphosting", `Expected build output file or directory not found: ${fileOrDir}`);
continue;
}
const stat = fs.statSync(absolutePath);
if (stat.isDirectory()) {
const rdrFiles = await fsAsync.readdirRecursive({
path: absolutePath,
ignoreStrings: ["firebase-debug.log", "firebase-debug.*.log"],
supportGitIgnore: false,
});
allFiles.push(...rdrFiles.map((rdrf) => path.relative(rootDir, rdrf.name)));
}
else {
allFiles.push(path.relative(rootDir, absolutePath));
}
}
try {
fs.statSync(rootDir);
}
catch (err) {
if (err instanceof Error && "code" in err && err.code === "ENOENT") {
throw new error_1.FirebaseError(`Could not read directory "${rootDir}"`);
}
throw err;
}
if (!allFiles.length) {
throw new error_1.FirebaseError(`Cannot create a tar archive with 0 files from directory "${rootDir}"`);
}
await tar.create({
gzip: true,
file: tmpFile,
cwd: rootDir,
portable: true,
}, allFiles);
return tmpFile;
}
async function createSourceDeployArchive(config, rootDir, targetSubDir) {
const tmpFile = tmp.fileSync({ prefix: `${config.backendId}-`, postfix: ".zip" }).name;
const fileStream = fs.createWriteStream(tmpFile, {
flags: "w",
encoding: "binary",
});
const archive = archiver("zip");
const targetDir = targetSubDir ? path.join(rootDir, targetSubDir) : rootDir;
const ignore = resolveIgnorePatterns(config);
try {
const files = await fsAsync.readdirRecursive({
path: targetDir,
ignoreStrings: ignore,
supportGitIgnore: true,
});
for (const file of files) {
const name = path.relative(rootDir, file.name);
archive.file(file.name, {
name,
mode: file.mode,
});
}
await pipeAsync(archive, fileStream);
}
catch (err) {
throw new error_1.FirebaseError(`Could not read source directory. Remove links and shortcuts and try again. Original: ${String(err)}`, { original: err, exit: 1 });
}
return tmpFile;
}
function resolveIgnorePatterns(config, skipDefaultNodeModules = false) {
const ignore = config.ignore
? [...config.ignore]
: skipDefaultNodeModules
? [".git"]
: ["node_modules", ".git"];
ignore.push("firebase-debug.log", "firebase-debug.*.log");
ignore.push(".local_build_*");
return ignore;
}
async function pipeAsync(from, to) {
from.pipe(to);
await from.finalize();
return new Promise((resolve, reject) => {
to.on("finish", resolve);
to.on("error", reject);
});
}