UNPKG

firebase-tools

Version:
106 lines (105 loc) 3.84 kB
"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); }); }