@dpkit/zip
Version:
Fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames
41 lines (32 loc) • 1.09 kB
text/typescript
import { createWriteStream } from "node:fs"
import { mkdir, rm } from "node:fs/promises"
import { join } from "node:path"
import { pipeline } from "node:stream/promises"
import { loadPackageDescriptor } from "@dpkit/core"
import { temporaryDirectory } from "tempy"
import yauzl from "yauzl-promise"
export async function loadPackageFromZip(archivePath: string) {
const tempdir = temporaryDirectory()
const zipfile = await yauzl.open(archivePath)
try {
for await (const entry of zipfile) {
const path = join(tempdir, entry.filename)
if (entry.filename.endsWith("/")) {
await mkdir(path, { recursive: true })
continue
}
const readStream = await entry.openReadStream()
const writeStream = createWriteStream(path)
await pipeline(readStream, writeStream)
}
} finally {
await zipfile.close()
}
const dataPackage = await loadPackageDescriptor(
join(tempdir, "dataPackage.json"),
)
const cleanup = async () => {
await rm(tempdir, { recursive: true, force: true })
}
return { dataPackage, cleanup }
}