UNPKG

@dpkit/file

Version:

Fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames

57 lines (42 loc) 1.39 kB
import { join, relative, resolve, sep } from "node:path" import { type Package, getBasepath, isRemotePath } from "@dpkit/core" export function getPackageBasepath(dataPackage: Package) { const paths: string[] = [] for (const resource of dataPackage.resources) { if (!resource.path) { continue } const resourcePaths = Array.isArray(resource.path) ? resource.path : [resource.path] paths.push(...resourcePaths) } return getCommonLocalBasepath(paths) } export function getCommonLocalBasepath(paths: string[]) { const absoluteBasepaths = paths .filter(path => !isRemotePath(path)) .map(path => resolve(getBasepath(path))) if (!absoluteBasepaths.length) { return undefined } // On Unix it split the root fs as an empty segment const segmentTable = absoluteBasepaths.map(path => path.split(sep).map(segment => segment || "/"), ) let column = 0 const segments: string[] = [] while (true) { const segmentColumn = segmentTable.map(segments => segments[column]) const uniqueSegments = new Set(segmentColumn) if (uniqueSegments.size !== 1) break if (!segmentColumn[0]) break column++ segments.push(segmentColumn[0]) } if (!segments.length) { throw new Error("Cannot find common basepath") } const basepath = relative(process.cwd(), join(...segments)) return basepath }