UNPKG

@dpkit/core

Version:

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

103 lines 14.8 kB
import Slugger from "github-slugger"; 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; } const slugger = new Slugger(); return slugger.slug(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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2dlbmVyYWwvcGF0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE9BQU8sTUFBTSxnQkFBZ0IsQ0FBQTtBQUNwQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBRWhDLE1BQU0sVUFBVSxZQUFZLENBQUMsSUFBWTtJQUN2QyxJQUFJLENBQUM7UUFDSCxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNiLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsT0FBTyxDQUFDLFFBQWlCO0lBQ3ZDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ25DLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO0lBQzdCLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUMzQixDQUFDO0FBRUQsTUFBTSxVQUFVLFNBQVMsQ0FBQyxRQUFpQjtJQUN6QyxPQUFPLFFBQVEsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUE7QUFDekQsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBWTtJQUN0QyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFbkMsSUFB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RCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLHdCQUF3QixPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtRQUN6RSxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ2pELE9BQU8sUUFBUSxDQUFBO0lBQ2pCLENBQUM7SUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUE7SUFDckUsQ0FBQztJQUVELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzlDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUVwRSxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7UUFDbkQsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksd0JBQXdCLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQ3pFLENBQUM7SUFFRCwrREFBK0Q7SUFDL0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxDQUFDLENBQUE7SUFDdkUsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ2hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU2x1Z2dlciBmcm9tIFwiZ2l0aHViLXNsdWdnZXJcIlxuaW1wb3J0IHsgbm9kZSB9IGZyb20gXCIuL25vZGUuanNcIlxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZW1vdGVQYXRoKHBhdGg6IHN0cmluZykge1xuICB0cnkge1xuICAgIG5ldyBVUkwocGF0aClcbiAgICByZXR1cm4gdHJ1ZVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZShmaWxlbmFtZT86IHN0cmluZykge1xuICBpZiAoIWZpbGVuYW1lKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgY29uc3QgbmFtZSA9IGZpbGVuYW1lLnNwbGl0KFwiLlwiKVswXVxuICBpZiAoIW5hbWUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCBzbHVnZ2VyID0gbmV3IFNsdWdnZXIoKVxuICByZXR1cm4gc2x1Z2dlci5zbHVnKG5hbWUpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXQoZmlsZW5hbWU/OiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZpbGVuYW1lPy5zcGxpdChcIi5cIikuc2xpY2UoLTEpWzBdPy50b0xvd2VyQ2FzZSgpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlbmFtZShwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgaXNSZW1vdGUgPSBpc1JlbW90ZVBhdGgocGF0aClcblxuICBpZiAoaXNSZW1vdGUpIHtcbiAgICBjb25zdCBwYXRobmFtZSA9IG5ldyBVUkwocGF0aCkucGF0aG5hbWVcbiAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGhuYW1lLnNwbGl0KFwiL1wiKS5zbGljZSgtMSlbMF1cbiAgICByZXR1cm4gZmlsZW5hbWU/LmluY2x1ZGVzKFwiLlwiKSA/IGZpbGVuYW1lIDogdW5kZWZpbmVkXG4gIH1cblxuICBpZiAoIW5vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaWxlIHN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnRcIilcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9IG5vZGUucGF0aC5yZXNvbHZlKHBhdGgpXG4gIGNvbnN0IGZpbGVuYW1lID0gbm9kZS5wYXRoLnBhcnNlKHJlc29sdmVkUGF0aCkuYmFzZVxuICByZXR1cm4gZmlsZW5hbWU/LmluY2x1ZGVzKFwiLlwiKSA/IGZpbGVuYW1lIDogdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCYXNlcGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgaXNSZW1vdGUgPSBpc1JlbW90ZVBhdGgocGF0aClcblxuICBpZiAoaXNSZW1vdGUpIHtcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IG5ldyBVUkwocGF0aCkudG9TdHJpbmcoKVxuICAgIHJldHVybiBub3JtYWxpemVkUGF0aC5zcGxpdChcIi9cIikuc2xpY2UoMCwgLTEpLmpvaW4oXCIvXCIpXG4gIH1cblxuICBpZiAoIW5vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaWxlIHN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnRcIilcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9IG5vZGUucGF0aC5yZXNvbHZlKHBhdGgpXG4gIHJldHVybiBub2RlLnBhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgbm9kZS5wYXRoLnBhcnNlKHJlc29sdmVkUGF0aCkuZGlyKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoOiBzdHJpbmcsIG9wdGlvbnM6IHsgYmFzZXBhdGg/OiBzdHJpbmcgfSkge1xuICBjb25zdCBpc1BhdGhSZW1vdGUgPSBpc1JlbW90ZVBhdGgocGF0aClcbiAgY29uc3QgaXNCYXNlcGF0aFJlbW90ZSA9IGlzUmVtb3RlUGF0aChvcHRpb25zLmJhc2VwYXRoID8/IFwiXCIpXG5cbiAgaWYgKGlzUGF0aFJlbW90ZSkge1xuICAgIHJldHVybiBuZXcgVVJMKHBhdGgpLnRvU3RyaW5nKClcbiAgfVxuXG4gIGlmIChpc0Jhc2VwYXRoUmVtb3RlKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBuZXcgVVJMKFxuICAgICAgW29wdGlvbnMuYmFzZXBhdGgsIHBhdGhdLmpvaW4oXCIvXCIpLFxuICAgICkudG9TdHJpbmcoKVxuXG4gICAgaWYgKCFub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKG9wdGlvbnMuYmFzZXBhdGggPz8gXCJcIikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCAke3BhdGh9IGlzIG5vdCBhIHN1YnBhdGggb2YgJHtvcHRpb25zLmJhc2VwYXRofWApXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoXG4gIH1cblxuICBpZiAoIW5vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaWxlIHN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnRcIilcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gb3B0aW9ucy5iYXNlcGF0aFxuICAgID8gbm9kZS5wYXRoLmpvaW4ob3B0aW9ucy5iYXNlcGF0aCwgcGF0aClcbiAgICA6IHBhdGhcblxuICBjb25zdCByZWxhdGl2ZVBhdGggPSBub2RlLnBhdGgucmVsYXRpdmUoXG4gICAgb3B0aW9ucy5iYXNlcGF0aCA/PyBcIlwiLFxuICAgIG5vcm1hbGl6ZWRQYXRoLFxuICApXG4gIGlmIChyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChcIi4uXCIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoICR7cGF0aH0gaXMgbm90IGEgc3VicGF0aCBvZiAke29wdGlvbnMuYmFzZXBhdGh9YClcbiAgfVxuXG4gIHJldHVybiBub2RlLnBhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgbm9kZS5wYXRoLnJlc29sdmUobm9ybWFsaXplZFBhdGgpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVub3JtYWxpemVQYXRoKHBhdGg6IHN0cmluZywgb3B0aW9uczogeyBiYXNlcGF0aD86IHN0cmluZyB9KSB7XG4gIGNvbnN0IGlzUGF0aFJlbW90ZSA9IGlzUmVtb3RlUGF0aChwYXRoKVxuICBjb25zdCBpc0Jhc2VwYXRoUmVtb3RlID0gaXNSZW1vdGVQYXRoKG9wdGlvbnMuYmFzZXBhdGggPz8gXCJcIilcblxuICBpZiAoaXNQYXRoUmVtb3RlKSB7XG4gICAgcmV0dXJuIG5ldyBVUkwocGF0aCkudG9TdHJpbmcoKVxuICB9XG5cbiAgaWYgKGlzQmFzZXBhdGhSZW1vdGUpIHtcbiAgICBjb25zdCBiYXNlcGF0aCA9IG5ldyBVUkwob3B0aW9ucy5iYXNlcGF0aCA/PyBcIlwiKS50b1N0cmluZygpXG5cbiAgICBpZiAoIXBhdGguc3RhcnRzV2l0aChiYXNlcGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCAke3BhdGh9IGlzIG5vdCBhIHN1YnBhdGggb2YgJHtvcHRpb25zLmJhc2VwYXRofWApXG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRpdmUgPSBwYXRoLnJlcGxhY2UoYCR7YmFzZXBhdGh9L2AsIFwiXCIpXG4gICAgcmV0dXJuIHJlbGF0aXZlXG4gIH1cblxuICBpZiAoIW5vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaWxlIHN5c3RlbSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnRcIilcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gbm9kZS5wYXRoLnJlc29sdmUocGF0aClcbiAgY29uc3Qgbm9ybWFsaXplZEJhc2VwYXRoID0gbm9kZS5wYXRoLnJlc29sdmUob3B0aW9ucy5iYXNlcGF0aCA/PyBcIlwiKVxuXG4gIGlmICghbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChub3JtYWxpemVkQmFzZXBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoICR7cGF0aH0gaXMgbm90IGEgc3VicGF0aCBvZiAke29wdGlvbnMuYmFzZXBhdGh9YClcbiAgfVxuXG4gIC8vIFRoZSBEYXRhIFBhY2thZ2Ugc3RhbmRhcmQgcmVxdWlyZXMgXCIvXCIgYXMgdGhlIHBhdGggc2VwYXJhdG9yXG4gIGNvbnN0IHJlbGF0aXZlID0gbm9kZS5wYXRoLnJlbGF0aXZlKG5vcm1hbGl6ZWRCYXNlcGF0aCwgbm9ybWFsaXplZFBhdGgpXG4gIHJldHVybiByZWxhdGl2ZS5zcGxpdChub2RlLnBhdGguc2VwKS5qb2luKFwiL1wiKVxufVxuIl19