@dpkit/core
Version:
Fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames
70 lines • 8.16 kB
JavaScript
import invariant from "tiny-invariant";
import { normalizeField } from "../../field/index.js";
export function normalizeSchema(descriptor) {
descriptor = globalThis.structuredClone(descriptor);
normalizeProfile(descriptor);
normalizeFields(descriptor);
normalizePrimaryKey(descriptor);
normalizeForeignKeys(descriptor);
normalizeUniqueKeys(descriptor);
return descriptor;
}
function normalizeProfile(descriptor) {
descriptor.$schema = descriptor.$schema ?? descriptor.profile;
}
function normalizeFields(descriptor) {
const fields = descriptor.fields;
if (!fields) {
return;
}
invariant(Array.isArray(fields), "Fields being an array is guaranteed by the validation");
for (const field of fields) {
normalizeField({ descriptor: field });
}
}
function normalizePrimaryKey(descriptor) {
const primaryKey = descriptor.primaryKey;
if (!primaryKey) {
return;
}
if (typeof primaryKey === "string") {
descriptor.primaryKey = [primaryKey];
}
}
function normalizeForeignKeys(descriptor) {
const foreignKeys = descriptor.foreignKeys;
if (!foreignKeys) {
return;
}
if (Array.isArray(foreignKeys)) {
for (const foreignKey of foreignKeys) {
const fields = foreignKey.fields;
if (typeof fields === "string") {
foreignKey.fields = [fields];
}
const referenceFields = foreignKey.reference?.fields;
if (typeof referenceFields === "string") {
foreignKey.reference.fields = [referenceFields];
}
}
}
}
function normalizeUniqueKeys(descriptor) {
const uniqueKeys = descriptor.uniqueKeys;
if (!uniqueKeys) {
return;
}
if (!Array.isArray(uniqueKeys)) {
descriptor.uniqueKeys = undefined;
console.warn(`Ignoring v2.0 incompatible uniqueKeys: ${uniqueKeys}`);
return;
}
for (const uniqueKey of uniqueKeys) {
if (!Array.isArray(uniqueKey)) {
descriptor.uniqueKeys = undefined;
console.warn(`Ignoring v2.0 incompatible uniqueKey: ${uniqueKey}`);
break;
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ybWFsaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc2NoZW1hL3Byb2Nlc3Mvbm9ybWFsaXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sU0FBUyxNQUFNLGdCQUFnQixDQUFBO0FBQ3RDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUdyRCxNQUFNLFVBQVUsZUFBZSxDQUFDLFVBQXNCO0lBQ3BELFVBQVUsR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBRW5ELGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQzVCLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUMzQixtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUMvQixvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUNoQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUUvQixPQUFPLFVBQVUsQ0FBQTtBQUNuQixDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxVQUFzQjtJQUM5QyxVQUFVLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQTtBQUMvRCxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsVUFBc0I7SUFDN0MsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQTtJQUNoQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixPQUFNO0lBQ1IsQ0FBQztJQUVELFNBQVMsQ0FDUCxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUNyQix1REFBdUQsQ0FDeEQsQ0FBQTtJQUVELEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7UUFDM0IsY0FBYyxDQUFDLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7SUFDdkMsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLFVBQXNCO0lBQ2pELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUE7SUFDeEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE9BQU07SUFDUixDQUFDO0lBRUQsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNuQyxVQUFVLENBQUMsVUFBVSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDdEMsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUFDLFVBQXNCO0lBQ2xELE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUE7SUFDMUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pCLE9BQU07SUFDUixDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDL0IsS0FBSyxNQUFNLFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNyQyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFBO1lBQ2hDLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQy9CLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUM5QixDQUFDO1lBRUQsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUE7WUFDcEQsSUFBSSxPQUFPLGVBQWUsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDeEMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQTtZQUNqRCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxVQUFzQjtJQUNqRCxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFBO0lBQ3hDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixPQUFNO0lBQ1IsQ0FBQztJQUVELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDL0IsVUFBVSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUE7UUFDakMsT0FBTyxDQUFDLElBQUksQ0FBQywwQ0FBMEMsVUFBVSxFQUFFLENBQUMsQ0FBQTtRQUNwRSxPQUFNO0lBQ1IsQ0FBQztJQUVELEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUM5QixVQUFVLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQTtZQUNqQyxPQUFPLENBQUMsSUFBSSxDQUFDLHlDQUF5QyxTQUFTLEVBQUUsQ0FBQyxDQUFBO1lBQ2xFLE1BQUs7UUFDUCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaW52YXJpYW50IGZyb20gXCJ0aW55LWludmFyaWFudFwiXG5pbXBvcnQgeyBub3JtYWxpemVGaWVsZCB9IGZyb20gXCIuLi8uLi9maWVsZC9pbmRleC5qc1wiXG5pbXBvcnQgdHlwZSB7IERlc2NyaXB0b3IgfSBmcm9tIFwiLi4vLi4vZ2VuZXJhbC9pbmRleC5qc1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTY2hlbWEoZGVzY3JpcHRvcjogRGVzY3JpcHRvcikge1xuICBkZXNjcmlwdG9yID0gZ2xvYmFsVGhpcy5zdHJ1Y3R1cmVkQ2xvbmUoZGVzY3JpcHRvcilcblxuICBub3JtYWxpemVQcm9maWxlKGRlc2NyaXB0b3IpXG4gIG5vcm1hbGl6ZUZpZWxkcyhkZXNjcmlwdG9yKVxuICBub3JtYWxpemVQcmltYXJ5S2V5KGRlc2NyaXB0b3IpXG4gIG5vcm1hbGl6ZUZvcmVpZ25LZXlzKGRlc2NyaXB0b3IpXG4gIG5vcm1hbGl6ZVVuaXF1ZUtleXMoZGVzY3JpcHRvcilcblxuICByZXR1cm4gZGVzY3JpcHRvclxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQcm9maWxlKGRlc2NyaXB0b3I6IERlc2NyaXB0b3IpIHtcbiAgZGVzY3JpcHRvci4kc2NoZW1hID0gZGVzY3JpcHRvci4kc2NoZW1hID8/IGRlc2NyaXB0b3IucHJvZmlsZVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVGaWVsZHMoZGVzY3JpcHRvcjogRGVzY3JpcHRvcikge1xuICBjb25zdCBmaWVsZHMgPSBkZXNjcmlwdG9yLmZpZWxkc1xuICBpZiAoIWZpZWxkcykge1xuICAgIHJldHVyblxuICB9XG5cbiAgaW52YXJpYW50KFxuICAgIEFycmF5LmlzQXJyYXkoZmllbGRzKSxcbiAgICBcIkZpZWxkcyBiZWluZyBhbiBhcnJheSBpcyBndWFyYW50ZWVkIGJ5IHRoZSB2YWxpZGF0aW9uXCIsXG4gIClcblxuICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgIG5vcm1hbGl6ZUZpZWxkKHsgZGVzY3JpcHRvcjogZmllbGQgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQcmltYXJ5S2V5KGRlc2NyaXB0b3I6IERlc2NyaXB0b3IpIHtcbiAgY29uc3QgcHJpbWFyeUtleSA9IGRlc2NyaXB0b3IucHJpbWFyeUtleVxuICBpZiAoIXByaW1hcnlLZXkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmICh0eXBlb2YgcHJpbWFyeUtleSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGRlc2NyaXB0b3IucHJpbWFyeUtleSA9IFtwcmltYXJ5S2V5XVxuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZvcmVpZ25LZXlzKGRlc2NyaXB0b3I6IERlc2NyaXB0b3IpIHtcbiAgY29uc3QgZm9yZWlnbktleXMgPSBkZXNjcmlwdG9yLmZvcmVpZ25LZXlzXG4gIGlmICghZm9yZWlnbktleXMpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGZvcmVpZ25LZXlzKSkge1xuICAgIGZvciAoY29uc3QgZm9yZWlnbktleSBvZiBmb3JlaWduS2V5cykge1xuICAgICAgY29uc3QgZmllbGRzID0gZm9yZWlnbktleS5maWVsZHNcbiAgICAgIGlmICh0eXBlb2YgZmllbGRzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGZvcmVpZ25LZXkuZmllbGRzID0gW2ZpZWxkc11cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVmZXJlbmNlRmllbGRzID0gZm9yZWlnbktleS5yZWZlcmVuY2U/LmZpZWxkc1xuICAgICAgaWYgKHR5cGVvZiByZWZlcmVuY2VGaWVsZHMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgZm9yZWlnbktleS5yZWZlcmVuY2UuZmllbGRzID0gW3JlZmVyZW5jZUZpZWxkc11cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVW5pcXVlS2V5cyhkZXNjcmlwdG9yOiBEZXNjcmlwdG9yKSB7XG4gIGNvbnN0IHVuaXF1ZUtleXMgPSBkZXNjcmlwdG9yLnVuaXF1ZUtleXNcbiAgaWYgKCF1bmlxdWVLZXlzKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkodW5pcXVlS2V5cykpIHtcbiAgICBkZXNjcmlwdG9yLnVuaXF1ZUtleXMgPSB1bmRlZmluZWRcbiAgICBjb25zb2xlLndhcm4oYElnbm9yaW5nIHYyLjAgaW5jb21wYXRpYmxlIHVuaXF1ZUtleXM6ICR7dW5pcXVlS2V5c31gKVxuICAgIHJldHVyblxuICB9XG5cbiAgZm9yIChjb25zdCB1bmlxdWVLZXkgb2YgdW5pcXVlS2V5cykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh1bmlxdWVLZXkpKSB7XG4gICAgICBkZXNjcmlwdG9yLnVuaXF1ZUtleXMgPSB1bmRlZmluZWRcbiAgICAgIGNvbnNvbGUud2FybihgSWdub3JpbmcgdjIuMCBpbmNvbXBhdGlibGUgdW5pcXVlS2V5OiAke3VuaXF1ZUtleX1gKVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cbn1cbiJdfQ==