@dpkit/core
Version:
Fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames
102 lines • 14.6 kB
JavaScript
import slugify from "@sindresorhus/slugify";
import { node } from "./node.js";
export function isRemotePath(path) {
try {
new URL(path);
return true;
}
catch {
return false;
}
}
export function getName(filename) {
if (!filename) {
return undefined;
}
const name = filename.split(".")[0];
if (!name) {
return undefined;
}
return slugify(name);
}
export function getFormat(filename) {
return filename?.split(".").slice(-1)[0]?.toLowerCase();
}
export function getFilename(path) {
const isRemote = isRemotePath(path);
if (isRemote) {
const pathname = new URL(path).pathname;
const filename = pathname.split("/").slice(-1)[0];
return filename?.includes(".") ? filename : undefined;
}
if (!node) {
throw new Error("File system is not supported in this environment");
}
const resolvedPath = node.path.resolve(path);
const filename = node.path.parse(resolvedPath).base;
return filename?.includes(".") ? filename : undefined;
}
export function getBasepath(path) {
const isRemote = isRemotePath(path);
if (isRemote) {
const normalizedPath = new URL(path).toString();
return normalizedPath.split("/").slice(0, -1).join("/");
}
if (!node) {
throw new Error("File system is not supported in this environment");
}
const resolvedPath = node.path.resolve(path);
return node.path.relative(process.cwd(), node.path.parse(resolvedPath).dir);
}
export function normalizePath(path, options) {
const isPathRemote = isRemotePath(path);
const isBasepathRemote = isRemotePath(options.basepath ?? "");
if (isPathRemote) {
return new URL(path).toString();
}
if (isBasepathRemote) {
const normalizedPath = new URL([options.basepath, path].join("/")).toString();
if (!normalizedPath.startsWith(options.basepath ?? "")) {
throw new Error(`Path ${path} is not a subpath of ${options.basepath}`);
}
return normalizedPath;
}
if (!node) {
throw new Error("File system is not supported in this environment");
}
const normalizedPath = options.basepath
? node.path.join(options.basepath, path)
: path;
const relativePath = node.path.relative(options.basepath ?? "", normalizedPath);
if (relativePath.startsWith("..")) {
throw new Error(`Path ${path} is not a subpath of ${options.basepath}`);
}
return node.path.relative(process.cwd(), node.path.resolve(normalizedPath));
}
export function denormalizePath(path, options) {
const isPathRemote = isRemotePath(path);
const isBasepathRemote = isRemotePath(options.basepath ?? "");
if (isPathRemote) {
return new URL(path).toString();
}
if (isBasepathRemote) {
const basepath = new URL(options.basepath ?? "").toString();
if (!path.startsWith(basepath)) {
throw new Error(`Path ${path} is not a subpath of ${options.basepath}`);
}
const relative = path.replace(`${basepath}/`, "");
return relative;
}
if (!node) {
throw new Error("File system is not supported in this environment");
}
const normalizedPath = node.path.resolve(path);
const normalizedBasepath = node.path.resolve(options.basepath ?? "");
if (!normalizedPath.startsWith(normalizedBasepath)) {
throw new Error(`Path ${path} is not a subpath of ${options.basepath}`);
}
// The Data Package standard requires "/" as the path separator
const relative = node.path.relative(normalizedBasepath, normalizedPath);
return relative.split(node.path.sep).join("/");
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2dlbmVyYWwvcGF0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE9BQU8sTUFBTSx1QkFBdUIsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBRWhDLE1BQU0sVUFBVSxZQUFZLENBQUMsSUFBWTtJQUN2QyxJQUFJLENBQUM7UUFDSCxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNiLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsT0FBTyxDQUFDLFFBQWlCO0lBQ3ZDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ25DLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUN0QixDQUFDO0FBRUQsTUFBTSxVQUFVLFNBQVMsQ0FBQyxRQUFpQjtJQUN6QyxPQUFPLFFBQVEsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUE7QUFDekQsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBWTtJQUN0QyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFbkMsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNiLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFD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O1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLHdCQUF3QixPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtRQUN6RSxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ2pELE9BQU8sUUFBUSxDQUFBO0lBQ2pCLENBQUM7SUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUE7SUFDckUsQ0FBQztJQUVELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzlDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUVwRSxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7UUFDbkQsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksd0JBQXdCLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQ3pFLENBQUM7SUFFRCwrREFBK0Q7SUFDL0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxDQUFDLENBQUE7SUFDdkUsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ2hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2x1Z2lmeSBmcm9tIFwiQHNpbmRyZXNvcmh1cy9zbHVnaWZ5XCJcbmltcG9ydCB7IG5vZGUgfSBmcm9tIFwiLi9ub2RlLnRzXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVtb3RlUGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBuZXcgVVJMKHBhdGgpXG4gICAgcmV0dXJuIHRydWVcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5hbWUoZmlsZW5hbWU/OiBzdHJpbmcpIHtcbiAgaWYgKCFmaWxlbmFtZSkge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IG5hbWUgPSBmaWxlbmFtZS5zcGxpdChcIi5cIilbMF1cbiAgaWYgKCFuYW1lKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgcmV0dXJuIHNsdWdpZnkobmFtZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdChmaWxlbmFtZT86IHN0cmluZykge1xuICByZXR1cm4gZmlsZW5hbWU/LnNwbGl0KFwiLlwiKS5zbGljZSgtMSlbMF0/LnRvTG93ZXJDYXNlKClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVuYW1lKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBpc1JlbW90ZSA9IGlzUmVtb3RlUGF0aChwYXRoKVxuXG4gIGlmIChpc1JlbW90ZSkge1xuICAgIGNvbnN0IHBhdGhuYW1lID0gbmV3IFVSTChwYXRoKS5wYXRobmFtZVxuICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aG5hbWUuc3BsaXQoXCIvXCIpLnNsaWNlKC0xKVswXVxuICAgIHJldHVybiBmaWxlbmFtZT8uaW5jbHVkZXMoXCIuXCIpID8gZmlsZW5hbWUgOiB1bmRlZmluZWRcbiAgfVxuXG4gIGlmICghbm9kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkZpbGUgc3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudFwiKVxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRQYXRoID0gbm9kZS5wYXRoLnJlc29sdmUocGF0aClcbiAgY29uc3QgZmlsZW5hbWUgPSBub2RlLnBhdGgucGFyc2UocmVzb2x2ZWRQYXRoKS5iYXNlXG4gIHJldHVybiBmaWxlbmFtZT8uaW5jbHVkZXMoXCIuXCIpID8gZmlsZW5hbWUgOiB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJhc2VwYXRoKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBpc1JlbW90ZSA9IGlzUmVtb3RlUGF0aChwYXRoKVxuXG4gIGlmIChpc1JlbW90ZSkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gbmV3IFVSTChwYXRoKS50b1N0cmluZygpXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSkuam9pbihcIi9cIilcbiAgfVxuXG4gIGlmICghbm9kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkZpbGUgc3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudFwiKVxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRQYXRoID0gbm9kZS5wYXRoLnJlc29sdmUocGF0aClcbiAgcmV0dXJuIG5vZGUucGF0aC5yZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBub2RlLnBhdGgucGFyc2UocmVzb2x2ZWRQYXRoKS5kaXIpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVQYXRoKHBhdGg6IHN0cmluZywgb3B0aW9uczogeyBiYXNlcGF0aD86IHN0cmluZyB9KSB7XG4gIGNvbnN0IGlzUGF0aFJlbW90ZSA9IGlzUmVtb3RlUGF0aChwYXRoKVxuICBjb25zdCBpc0Jhc2VwYXRoUmVtb3RlID0gaXNSZW1vdGVQYXRoKG9wdGlvbnMuYmFzZXBhdGggPz8gXCJcIilcblxuICBpZiAoaXNQYXRoUmVtb3RlKSB7XG4gICAgcmV0dXJuIG5ldyBVUkwocGF0aCkudG9TdHJpbmcoKVxuICB9XG5cbiAgaWYgKGlzQmFzZXBhdGhSZW1vdGUpIHtcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IG5ldyBVUkwoXG4gICAgICBbb3B0aW9ucy5iYXNlcGF0aCwgcGF0aF0uam9pbihcIi9cIiksXG4gICAgKS50b1N0cmluZygpXG5cbiAgICBpZiAoIW5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgob3B0aW9ucy5iYXNlcGF0aCA/PyBcIlwiKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoICR7cGF0aH0gaXMgbm90IGEgc3VicGF0aCBvZiAke29wdGlvbnMuYmFzZXBhdGh9YClcbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZFBhdGhcbiAgfVxuXG4gIGlmICghbm9kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkZpbGUgc3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudFwiKVxuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBvcHRpb25zLmJhc2VwYXRoXG4gICAgPyBub2RlLnBhdGguam9pbihvcHRpb25zLmJhc2VwYXRoLCBwYXRoKVxuICAgIDogcGF0aFxuXG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IG5vZGUucGF0aC5yZWxhdGl2ZShcbiAgICBvcHRpb25zLmJhc2VwYXRoID8/IFwiXCIsXG4gICAgbm9ybWFsaXplZFBhdGgsXG4gIClcbiAgaWYgKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKFwiLi5cIikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggJHtwYXRofSBpcyBub3QgYSBzdWJwYXRoIG9mICR7b3B0aW9ucy5iYXNlcGF0aH1gKVxuICB9XG5cbiAgcmV0dXJuIG5vZGUucGF0aC5yZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBub2RlLnBhdGgucmVzb2x2ZShub3JtYWxpemVkUGF0aCkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZW5vcm1hbGl6ZVBhdGgocGF0aDogc3RyaW5nLCBvcHRpb25zOiB7IGJhc2VwYXRoPzogc3RyaW5nIH0pIHtcbiAgY29uc3QgaXNQYXRoUmVtb3RlID0gaXNSZW1vdGVQYXRoKHBhdGgpXG4gIGNvbnN0IGlzQmFzZXBhdGhSZW1vdGUgPSBpc1JlbW90ZVBhdGgob3B0aW9ucy5iYXNlcGF0aCA/PyBcIlwiKVxuXG4gIGlmIChpc1BhdGhSZW1vdGUpIHtcbiAgICByZXR1cm4gbmV3IFVSTChwYXRoKS50b1N0cmluZygpXG4gIH1cblxuICBpZiAoaXNCYXNlcGF0aFJlbW90ZSkge1xuICAgIGNvbnN0IGJhc2VwYXRoID0gbmV3IFVSTChvcHRpb25zLmJhc2VwYXRoID8/IFwiXCIpLnRvU3RyaW5nKClcblxuICAgIGlmICghcGF0aC5zdGFydHNXaXRoKGJhc2VwYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoICR7cGF0aH0gaXMgbm90IGEgc3VicGF0aCBvZiAke29wdGlvbnMuYmFzZXBhdGh9YClcbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGl2ZSA9IHBhdGgucmVwbGFjZShgJHtiYXNlcGF0aH0vYCwgXCJcIilcbiAgICByZXR1cm4gcmVsYXRpdmVcbiAgfVxuXG4gIGlmICghbm9kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkZpbGUgc3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudFwiKVxuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBub2RlLnBhdGgucmVzb2x2ZShwYXRoKVxuICBjb25zdCBub3JtYWxpemVkQmFzZXBhdGggPSBub2RlLnBhdGgucmVzb2x2ZShvcHRpb25zLmJhc2VwYXRoID8/IFwiXCIpXG5cbiAgaWYgKCFub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKG5vcm1hbGl6ZWRCYXNlcGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggJHtwYXRofSBpcyBub3QgYSBzdWJwYXRoIG9mICR7b3B0aW9ucy5iYXNlcGF0aH1gKVxuICB9XG5cbiAgLy8gVGhlIERhdGEgUGFja2FnZSBzdGFuZGFyZCByZXF1aXJlcyBcIi9cIiBhcyB0aGUgcGF0aCBzZXBhcmF0b3JcbiAgY29uc3QgcmVsYXRpdmUgPSBub2RlLnBhdGgucmVsYXRpdmUobm9ybWFsaXplZEJhc2VwYXRoLCBub3JtYWxpemVkUGF0aClcbiAgcmV0dXJuIHJlbGF0aXZlLnNwbGl0KG5vZGUucGF0aC5zZXApLmpvaW4oXCIvXCIpXG59XG4iXX0=