Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | /** * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ // Helper for working with tarball files (.tar, .tgz) // Docs: https://github.com/npm/node-tar import tar from "tar"; import path from "path"; import type { JsonValue } from "type-fest"; export type ReadFileFromTarOpts<ParseJson extends boolean> = { tarPath: string; filePath: string; } & ( ParseJson extends true ? { parseJson: true; } : { parseJson?: false; } ); export function readFileFromTar(opts: ReadFileFromTarOpts<false>): Promise<Buffer>; export function readFileFromTar(opts: ReadFileFromTarOpts<true>): Promise<JsonValue>; export function readFileFromTar<ParseJson extends boolean>({ tarPath, filePath, parseJson = false }: ReadFileFromTarOpts<ParseJson>): Promise<JsonValue | Buffer> { return new Promise((resolve, reject) => { const fileChunks: Buffer[] = []; tar.list({ file: tarPath, filter: entryPath => path.normalize(entryPath) === filePath, sync: true, onentry(entry) { entry.on("data", chunk => { fileChunks.push(chunk); }); entry.once("error", err => { reject(new Error(`reading file has failed ${entry.path}: ${err}`)); }); entry.once("end", () => { const data = Buffer.concat(fileChunks); const result = parseJson ? JSON.parse(data.toString("utf8")) : data; resolve(result); }); }, }); if (!fileChunks.length) { reject(new Error("Not found")); } }); } export async function listTarEntries(filePath: string): Promise<string[]> { const entries: string[] = []; await tar.list({ file: filePath, onentry: (entry) => { entries.push(path.normalize(entry.path)); }, }); return entries; } |