@dpkit/core
Version:
Fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames
39 lines • 5.77 kB
JavaScript
import { node } from "../node.js";
import { getBasepath, isRemotePath } from "../path.js";
import { parseDescriptor } from "./process/parse.js";
/**
* Load a descriptor (JSON Object) from a file or URL
* Uses dynamic imports to work in both Node.js and browser environments
* Supports HTTP, HTTPS, FTP, and FTPS protocols
*/
export async function loadDescriptor(path, options) {
const isRemote = isRemotePath(path);
if (!isRemote && options?.onlyRemote) {
throw new Error("Cannot load descriptor for security reasons");
}
return isRemote
? await loadRemoteDescriptor(path)
: await loadLocalDescriptor(path);
}
const ALLOWED_REMOTE_PROTOCOLS = ["http:", "https:", "ftp:", "ftps:"];
async function loadRemoteDescriptor(path) {
const url = new URL(path);
const protocol = url.protocol.toLowerCase();
if (!ALLOWED_REMOTE_PROTOCOLS.includes(protocol)) {
throw new Error(`Unsupported remote protocol: ${protocol}`);
}
const response = await fetch(url.toString());
const descriptor = (await response.json());
const basepath = getBasepath(response.url ?? path); // supports redirects
return { descriptor, basepath };
}
async function loadLocalDescriptor(path) {
if (!node) {
throw new Error("File system is not supported in this environment");
}
const text = await node.fs.readFile(path, "utf-8");
const descriptor = parseDescriptor(text);
const basepath = getBasepath(path);
return { descriptor, basepath };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2dlbmVyYWwvZGVzY3JpcHRvci9sb2FkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDakMsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBRXBEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGNBQWMsQ0FDbEMsSUFBWSxFQUNaLE9BRUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDbkMsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFBO0lBQ2hFLENBQUM7SUFFRCxPQUFPLFFBQVE7UUFDYixDQUFDLENBQUMsTUFBTSxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7UUFDbEMsQ0FBQyxDQUFDLE1BQU0sbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDckMsQ0FBQztBQUVELE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUVyRSxLQUFLLFVBQVUsb0JBQW9CLENBQUMsSUFBWTtJQUM5QyxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUV6QixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQzNDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQzdELENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtJQUM1QyxNQUFNLFVBQVUsR0FBRyxDQUFDLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUF3QixDQUFBO0lBQ2pFLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFBLENBQUMscUJBQXFCO0lBRXhFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUE7QUFDakMsQ0FBQztBQUVELEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxJQUFZO0lBQzdDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQTtJQUNyRSxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDbEQsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3hDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUVsQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFBO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBub2RlIH0gZnJvbSBcIi4uL25vZGUudHNcIlxuaW1wb3J0IHsgZ2V0QmFzZXBhdGgsIGlzUmVtb3RlUGF0aCB9IGZyb20gXCIuLi9wYXRoLnRzXCJcbmltcG9ydCB7IHBhcnNlRGVzY3JpcHRvciB9IGZyb20gXCIuL3Byb2Nlc3MvcGFyc2UudHNcIlxuXG4vKipcbiAqIExvYWQgYSBkZXNjcmlwdG9yIChKU09OIE9iamVjdCkgZnJvbSBhIGZpbGUgb3IgVVJMXG4gKiBVc2VzIGR5bmFtaWMgaW1wb3J0cyB0byB3b3JrIGluIGJvdGggTm9kZS5qcyBhbmQgYnJvd3NlciBlbnZpcm9ubWVudHNcbiAqIFN1cHBvcnRzIEhUVFAsIEhUVFBTLCBGVFAsIGFuZCBGVFBTIHByb3RvY29sc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZERlc2NyaXB0b3IoXG4gIHBhdGg6IHN0cmluZyxcbiAgb3B0aW9ucz86IHtcbiAgICBvbmx5UmVtb3RlPzogYm9vbGVhblxuICB9LFxuKSB7XG4gIGNvbnN0IGlzUmVtb3RlID0gaXNSZW1vdGVQYXRoKHBhdGgpXG4gIGlmICghaXNSZW1vdGUgJiYgb3B0aW9ucz8ub25seVJlbW90ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBsb2FkIGRlc2NyaXB0b3IgZm9yIHNlY3VyaXR5IHJlYXNvbnNcIilcbiAgfVxuXG4gIHJldHVybiBpc1JlbW90ZVxuICAgID8gYXdhaXQgbG9hZFJlbW90ZURlc2NyaXB0b3IocGF0aClcbiAgICA6IGF3YWl0IGxvYWRMb2NhbERlc2NyaXB0b3IocGF0aClcbn1cblxuY29uc3QgQUxMT1dFRF9SRU1PVEVfUFJPVE9DT0xTID0gW1wiaHR0cDpcIiwgXCJodHRwczpcIiwgXCJmdHA6XCIsIFwiZnRwczpcIl1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZFJlbW90ZURlc2NyaXB0b3IocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aClcblxuICBjb25zdCBwcm90b2NvbCA9IHVybC5wcm90b2NvbC50b0xvd2VyQ2FzZSgpXG4gIGlmICghQUxMT1dFRF9SRU1PVEVfUFJPVE9DT0xTLmluY2x1ZGVzKHByb3RvY29sKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgcmVtb3RlIHByb3RvY29sOiAke3Byb3RvY29sfWApXG4gIH1cblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybC50b1N0cmluZygpKVxuICBjb25zdCBkZXNjcmlwdG9yID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgUmVjb3JkPHN0cmluZywgYW55PlxuICBjb25zdCBiYXNlcGF0aCA9IGdldEJhc2VwYXRoKHJlc3BvbnNlLnVybCA/PyBwYXRoKSAvLyBzdXBwb3J0cyByZWRpcmVjdHNcblxuICByZXR1cm4geyBkZXNjcmlwdG9yLCBiYXNlcGF0aCB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRMb2NhbERlc2NyaXB0b3IocGF0aDogc3RyaW5nKSB7XG4gIGlmICghbm9kZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkZpbGUgc3lzdGVtIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudFwiKVxuICB9XG5cbiAgY29uc3QgdGV4dCA9IGF3YWl0IG5vZGUuZnMucmVhZEZpbGUocGF0aCwgXCJ1dGYtOFwiKVxuICBjb25zdCBkZXNjcmlwdG9yID0gcGFyc2VEZXNjcmlwdG9yKHRleHQpXG4gIGNvbnN0IGJhc2VwYXRoID0gZ2V0QmFzZXBhdGgocGF0aClcblxuICByZXR1cm4geyBkZXNjcmlwdG9yLCBiYXNlcGF0aCB9XG59XG4iXX0=