firebase-tools
Version:
Command-Line Interface for Firebase
106 lines (105 loc) • 3.84 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createLocalBuildTarArchive = createLocalBuildTarArchive;
exports.createSourceDeployArchive = createSourceDeployArchive;
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 config_1 = require("../../apphosting/config");
async function createLocalBuildTarArchive(config, rootDir, targetSubDir) {
const tmpFile = tmp.fileSync({ prefix: `${config.backendId}-`, postfix: ".tar.gz" }).name;
const targetDir = targetSubDir ? path.join(rootDir, targetSubDir) : rootDir;
const ignore = ["firebase-debug.log", "firebase-debug.*.log", ".git"];
const rdrFiles = await fsAsync.readdirRecursive({
path: targetDir,
ignore: ignore,
isGitIgnore: true,
});
const allFiles = rdrFiles.map((rdrf) => path.relative(rootDir, rdrf.name));
if (targetSubDir) {
const defaultFiles = fs.readdirSync(rootDir).filter((file) => {
return config_1.APPHOSTING_YAML_FILE_REGEX.test(file);
});
for (const file of defaultFiles) {
if (!allFiles.includes(file)) {
allFiles.push(file);
}
}
}
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 = config.ignore || ["node_modules", ".git"];
ignore.push("firebase-debug.log", "firebase-debug.*.log");
const gitIgnorePatterns = parseGitIgnorePatterns(targetDir);
ignore.push(...gitIgnorePatterns);
try {
const files = await fsAsync.readdirRecursive({
path: targetDir,
ignore: ignore,
isGitIgnore: 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: ${err}`, { original: err, exit: 1 });
}
return tmpFile;
}
function parseGitIgnorePatterns(projectRoot, gitIgnorePath = ".gitignore") {
const absoluteFilePath = path.resolve(projectRoot, gitIgnorePath);
if (!fs.existsSync(absoluteFilePath)) {
return [];
}
const lines = fs
.readFileSync(absoluteFilePath)
.toString()
.split("\n")
.map((line) => line.trim())
.filter((line) => !line.startsWith("#") && !(line === ""));
return lines;
}
async function pipeAsync(from, to) {
from.pipe(to);
await from.finalize();
return new Promise((resolve, reject) => {
to.on("finish", resolve);
to.on("error", reject);
});
}