in appservice/src/deploy/runWithZipStream.ts [20:81]
export async function runWithZipStream(context: IActionContext, options: {
fsPath: string,
site: ParsedSite,
pathFileMap?: Map<string, string>
callback: (zipStream: Readable) => Promise<void>
}): Promise<void> {
function onFileSize(size: number): void {
context.telemetry.measurements.zipFileSize = size;
ext.outputChannel.appendLog(localize('zipSize', 'Zip package size: {0}', prettybytes(size)), { resourceName: site.fullName });
}
let zipStream: Readable;
const { site, pathFileMap, callback } = options;
let { fsPath } = options;
if (getFileExtension(fsPath) === 'zip') {
context.telemetry.properties.alreadyZipped = 'true';
zipStream = fse.createReadStream(fsPath);
// don't wait
void fse.lstat(fsPath).then(stats => {
onFileSize(stats.size);
});
} else {
ext.outputChannel.appendLog(localize('zipCreate', 'Creating zip package...'), { resourceName: site.fullName });
const zipFile: yazl.ZipFile = new yazl.ZipFile();
let filesToZip: string[] = [];
let sizeOfZipFile: number = 0;
zipFile.outputStream.on('data', (chunk) => {
if (typeof chunk === 'string' || Buffer.isBuffer(chunk)) {
sizeOfZipFile += chunk.length;
}
});
zipFile.outputStream.on('finish', () => onFileSize(sizeOfZipFile));
if ((await fse.lstat(fsPath)).isDirectory()) {
if (!fsPath.endsWith(path.sep)) {
fsPath += path.sep;
}
if (site.isFunctionApp) {
filesToZip = await getFilesFromGitignore(fsPath, '.funcignore');
} else {
filesToZip = await getFilesFromGlob(fsPath, site);
}
for (const file of filesToZip) {
zipFile.addFile(path.join(fsPath, file), getPathFromMap(file, pathFileMap));
}
} else {
zipFile.addFile(fsPath, getPathFromMap(path.basename(fsPath), pathFileMap));
}
zipFile.end();
zipStream = new Readable().wrap(zipFile.outputStream);
}
await callback(zipStream);
}