@data-client/endpoint
Version:
Declarative Network Interface Definitions
81 lines (79 loc) • 13 kB
JavaScript
import { isImmutable } from './ImmutableUtils.js';
export default class PolymorphicSchema {
constructor(definition, schemaAttribute) {
this.schema = void 0;
if (schemaAttribute) {
this._schemaAttribute = typeof schemaAttribute === 'string' ? input => input[schemaAttribute] : schemaAttribute;
}
this.define(definition);
}
get isSingleSchema() {
return !this._schemaAttribute;
}
define(definition) {
// sending Union into another Polymorphic gets hoisted
if ('_schemaAttribute' in definition && !this._schemaAttribute) {
this.schema = definition.schema;
this._schemaAttribute = definition._schemaAttribute;
} else {
this.schema = definition;
}
}
getSchemaAttribute(input, parent, key) {
return !this.isSingleSchema && this._schemaAttribute(input, parent, key);
}
inferSchema(input, parent, key) {
if (this.isSingleSchema) {
return this.schema;
}
const attr = this.getSchemaAttribute(input, parent, key);
return this.schema[attr];
}
schemaKey() {
if (this.isSingleSchema) {
return this.schema.key;
}
return Object.values(this.schema).join(';');
}
normalizeValue(value, parent, key, args, visit) {
if (!value) return value;
const schema = this.inferSchema(value, parent, key);
if (!schema) {
/* istanbul ignore else */
if (process.env.NODE_ENV !== 'production') {
const attr = this.getSchemaAttribute(value, parent, key);
console.warn(`Schema attribute ${JSON.stringify(attr, undefined, 2)} is not expected.
Expected one of: ${Object.keys(this.schema).map(k => `"${k}"`).join(', ')}
Value: ${JSON.stringify(value, undefined, 2)}`);
}
return value;
}
const normalizedValue = visit(schema, value, parent, key, args);
return this.isSingleSchema || normalizedValue === undefined || normalizedValue === null ? normalizedValue : {
id: normalizedValue,
schema: this.getSchemaAttribute(value, parent, key)
};
}
// value is guaranteed by caller to not be null
denormalizeValue(value, unvisit) {
const schemaKey = !this.isSingleSchema && value && (isImmutable(value) ? value.get('schema') : value.schema);
if (!this.isSingleSchema && !schemaKey) {
// denormalize should also handle 'passthrough' values (not normalized) and still
// construct the correct Entity instance
if (typeof value === 'object' && value !== null) {
const schema = this.inferSchema(value, undefined, undefined);
if (schema) return unvisit(schema, value);
}
/* istanbul ignore else */
if (process.env.NODE_ENV !== 'production' && value) {
console.warn(`TypeError: Unable to infer schema for ${this.constructor.name}
Value: ${JSON.stringify(value, undefined, 2)}.`);
}
return value;
}
const id = this.isSingleSchema ? undefined : isImmutable(value) ? value.get('id') : value.id;
const schema = this.isSingleSchema ? this.schema : this.schema[schemaKey];
return unvisit(schema, id || value);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc0ltbXV0YWJsZSIsIlBvbHltb3JwaGljU2NoZW1hIiwiY29uc3RydWN0b3IiLCJkZWZpbml0aW9uIiwic2NoZW1hQXR0cmlidXRlIiwic2NoZW1hIiwiX3NjaGVtYUF0dHJpYnV0ZSIsImlucHV0IiwiZGVmaW5lIiwiaXNTaW5nbGVTY2hlbWEiLCJnZXRTY2hlbWFBdHRyaWJ1dGUiLCJwYXJlbnQiLCJrZXkiLCJpbmZlclNjaGVtYSIsImF0dHIiLCJzY2hlbWFLZXkiLCJPYmplY3QiLCJ2YWx1ZXMiLCJqb2luIiwibm9ybWFsaXplVmFsdWUiLCJ2YWx1ZSIsImFyZ3MiLCJ2aXNpdCIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsImNvbnNvbGUiLCJ3YXJuIiwiSlNPTiIsInN0cmluZ2lmeSIsInVuZGVmaW5lZCIsImtleXMiLCJtYXAiLCJrIiwibm9ybWFsaXplZFZhbHVlIiwiaWQiLCJkZW5vcm1hbGl6ZVZhbHVlIiwidW52aXNpdCIsImdldCIsIm5hbWUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NoZW1hcy9Qb2x5bW9ycGhpYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc0ltbXV0YWJsZSB9IGZyb20gJy4vSW1tdXRhYmxlVXRpbHMuanMnO1xuaW1wb3J0IHsgVmlzaXQgfSBmcm9tICcuLi9pbnRlcmZhY2UuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQb2x5bW9ycGhpY1NjaGVtYSB7XG4gIGRlY2xhcmUgcHJpdmF0ZSBfc2NoZW1hQXR0cmlidXRlOiBhbnk7XG4gIHByb3RlY3RlZCBzY2hlbWE6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBkZWZpbml0aW9uOiBhbnksXG4gICAgc2NoZW1hQXR0cmlidXRlPzogc3RyaW5nIHwgKCguLi5hcmdzOiBhbnkpID0+IGFueSksXG4gICkge1xuICAgIGlmIChzY2hlbWFBdHRyaWJ1dGUpIHtcbiAgICAgIHRoaXMuX3NjaGVtYUF0dHJpYnV0ZSA9XG4gICAgICAgIHR5cGVvZiBzY2hlbWFBdHRyaWJ1dGUgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICAoaW5wdXQ6IGFueSkgPT4gaW5wdXRbc2NoZW1hQXR0cmlidXRlXVxuICAgICAgICA6IHNjaGVtYUF0dHJpYnV0ZTtcbiAgICB9XG4gICAgdGhpcy5kZWZpbmUoZGVmaW5pdGlvbik7XG4gIH1cblxuICBnZXQgaXNTaW5nbGVTY2hlbWEoKSB7XG4gICAgcmV0dXJuICF0aGlzLl9zY2hlbWFBdHRyaWJ1dGU7XG4gIH1cblxuICBkZWZpbmUoZGVmaW5pdGlvbjogYW55KSB7XG4gICAgLy8gc2VuZGluZyBVbmlvbiBpbnRvIGFub3RoZXIgUG9seW1vcnBoaWMgZ2V0cyBob2lzdGVkXG4gICAgaWYgKCdfc2NoZW1hQXR0cmlidXRlJyBpbiBkZWZpbml0aW9uICYmICF0aGlzLl9zY2hlbWFBdHRyaWJ1dGUpIHtcbiAgICAgIHRoaXMuc2NoZW1hID0gZGVmaW5pdGlvbi5zY2hlbWE7XG4gICAgICB0aGlzLl9zY2hlbWFBdHRyaWJ1dGUgPSBkZWZpbml0aW9uLl9zY2hlbWFBdHRyaWJ1dGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2NoZW1hID0gZGVmaW5pdGlvbjtcbiAgICB9XG4gIH1cblxuICBnZXRTY2hlbWFBdHRyaWJ1dGUoaW5wdXQ6IGFueSwgcGFyZW50OiBhbnksIGtleTogYW55KSB7XG4gICAgcmV0dXJuICF0aGlzLmlzU2luZ2xlU2NoZW1hICYmIHRoaXMuX3NjaGVtYUF0dHJpYnV0ZShpbnB1dCwgcGFyZW50LCBrZXkpO1xuICB9XG5cbiAgaW5mZXJTY2hlbWEoaW5wdXQ6IGFueSwgcGFyZW50OiBhbnksIGtleTogYW55KSB7XG4gICAgaWYgKHRoaXMuaXNTaW5nbGVTY2hlbWEpIHtcbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYTtcbiAgICB9XG5cbiAgICBjb25zdCBhdHRyID0gdGhpcy5nZXRTY2hlbWFBdHRyaWJ1dGUoaW5wdXQsIHBhcmVudCwga2V5KTtcbiAgICByZXR1cm4gdGhpcy5zY2hlbWFbYXR0cl07XG4gIH1cblxuICBzY2hlbWFLZXkoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5pc1NpbmdsZVNjaGVtYSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hLmtleTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5zY2hlbWEpLmpvaW4oJzsnKTtcbiAgfVxuXG4gIG5vcm1hbGl6ZVZhbHVlKHZhbHVlOiBhbnksIHBhcmVudDogYW55LCBrZXk6IGFueSwgYXJnczogYW55W10sIHZpc2l0OiBWaXNpdCkge1xuICAgIGlmICghdmFsdWUpIHJldHVybiB2YWx1ZTtcbiAgICBjb25zdCBzY2hlbWEgPSB0aGlzLmluZmVyU2NoZW1hKHZhbHVlLCBwYXJlbnQsIGtleSk7XG4gICAgaWYgKCFzY2hlbWEpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBjb25zdCBhdHRyID0gdGhpcy5nZXRTY2hlbWFBdHRyaWJ1dGUodmFsdWUsIHBhcmVudCwga2V5KTtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBTY2hlbWEgYXR0cmlidXRlICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBhdHRyLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgMixcbiAgICAgICAgICApfSBpcyBub3QgZXhwZWN0ZWQuXG5FeHBlY3RlZCBvbmUgb2Y6ICR7T2JqZWN0LmtleXModGhpcy5zY2hlbWEpXG4gICAgICAgICAgICAubWFwKGsgPT4gYFwiJHtrfVwiYClcbiAgICAgICAgICAgIC5qb2luKCcsICcpfVxuXG5WYWx1ZTogJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSwgdW5kZWZpbmVkLCAyKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBub3JtYWxpemVkVmFsdWUgPSB2aXNpdChzY2hlbWEsIHZhbHVlLCBwYXJlbnQsIGtleSwgYXJncyk7XG4gICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5pc1NpbmdsZVNjaGVtYSB8fFxuICAgICAgICAgIG5vcm1hbGl6ZWRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgbm9ybWFsaXplZFZhbHVlID09PSBudWxsXG4gICAgICApID9cbiAgICAgICAgbm9ybWFsaXplZFZhbHVlXG4gICAgICA6IHtcbiAgICAgICAgICBpZDogbm9ybWFsaXplZFZhbHVlLFxuICAgICAgICAgIHNjaGVtYTogdGhpcy5nZXRTY2hlbWFBdHRyaWJ1dGUodmFsdWUsIHBhcmVudCwga2V5KSxcbiAgICAgICAgfTtcbiAgfVxuXG4gIC8vIHZhbHVlIGlzIGd1YXJhbnRlZWQgYnkgY2FsbGVyIHRvIG5vdCBiZSBudWxsXG4gIGRlbm9ybWFsaXplVmFsdWUodmFsdWU6IGFueSwgdW52aXNpdDogYW55KSB7XG4gICAgY29uc3Qgc2NoZW1hS2V5ID1cbiAgICAgICF0aGlzLmlzU2luZ2xlU2NoZW1hICYmXG4gICAgICB2YWx1ZSAmJlxuICAgICAgKGlzSW1tdXRhYmxlKHZhbHVlKSA/IHZhbHVlLmdldCgnc2NoZW1hJykgOiB2YWx1ZS5zY2hlbWEpO1xuICAgIGlmICghdGhpcy5pc1NpbmdsZVNjaGVtYSAmJiAhc2NoZW1hS2V5KSB7XG4gICAgICAvLyBkZW5vcm1hbGl6ZSBzaG91bGQgYWxzbyBoYW5kbGUgJ3Bhc3N0aHJvdWdoJyB2YWx1ZXMgKG5vdCBub3JtYWxpemVkKSBhbmQgc3RpbGxcbiAgICAgIC8vIGNvbnN0cnVjdCB0aGUgY29ycmVjdCBFbnRpdHkgaW5zdGFuY2VcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuaW5mZXJTY2hlbWEodmFsdWUsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHNjaGVtYSkgcmV0dXJuIHVudmlzaXQoc2NoZW1hLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdmFsdWUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBUeXBlRXJyb3I6IFVuYWJsZSB0byBpbmZlciBzY2hlbWEgZm9yICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfVxuVmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUsIHVuZGVmaW5lZCwgMil9LmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IGlkID1cbiAgICAgIHRoaXMuaXNTaW5nbGVTY2hlbWEgPyB1bmRlZmluZWRcbiAgICAgIDogaXNJbW11dGFibGUodmFsdWUpID8gdmFsdWUuZ2V0KCdpZCcpXG4gICAgICA6IHZhbHVlLmlkO1xuICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuaXNTaW5nbGVTY2hlbWEgPyB0aGlzLnNjaGVtYSA6IHRoaXMuc2NoZW1hW3NjaGVtYUtleV07XG4gICAgcmV0dXJuIHVudmlzaXQoc2NoZW1hLCBpZCB8fCB2YWx1ZSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsV0FBVyxRQUFRLHFCQUFxQjtBQUdqRCxlQUFlLE1BQU1DLGlCQUFpQixDQUFDO0VBSXJDQyxXQUFXQSxDQUNUQyxVQUFlLEVBQ2ZDLGVBQWtELEVBQ2xEO0lBQUEsS0FMUUMsTUFBTTtJQU1kLElBQUlELGVBQWUsRUFBRTtNQUNuQixJQUFJLENBQUNFLGdCQUFnQixHQUNuQixPQUFPRixlQUFlLEtBQUssUUFBUSxHQUNoQ0csS0FBVSxJQUFLQSxLQUFLLENBQUNILGVBQWUsQ0FBQyxHQUN0Q0EsZUFBZTtJQUNyQjtJQUNBLElBQUksQ0FBQ0ksTUFBTSxDQUFDTCxVQUFVLENBQUM7RUFDekI7RUFFQSxJQUFJTSxj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QUFLLEVBQUVULE1BQU0sRUFBRUMsR0FBRztJQUNwRCxDQUFDO0VBQ1A7O0VBRUE7RUFDQXdCLGdCQUFnQkEsQ0FBQ2hCLEtBQVUsRUFBRWlCLE9BQVksRUFBRTtJQUN6QyxNQUFNdEIsU0FBUyxHQUNiLENBQUMsSUFBSSxDQUFDTixjQUFjLElBQ3BCVyxLQUFLLEtBQ0pwQixXQUFXLENBQUNvQixLQUFLLENBQUMsR0FBR0EsS0FBSyxDQUFDa0IsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHbEIsS0FBSyxDQUFDZixNQUFNLENBQUM7SUFDM0QsSUFBSSxDQUFDLElBQUksQ0FBQ0ksY0FBYyxJQUFJLENBQUNNLFNBQVMsRUFBRTtNQUN0QztNQUNBO01BQ0EsSUFBSSxPQUFPSyxLQUFLLEtBQUssUUFBUSxJQUFJQSxLQUFLLEtBQUssSUFBSSxFQUFFO1FBQy9DLE1BQU1mLE1BQU0sR0FBRyxJQUFJLENBQUNRLFdBQVcsQ0FBQ08sS0FBSyxFQUFFVSxTQUFTLEVBQUVBLFNBQVMsQ0FBQztRQUM1RCxJQUFJekIsTUFBTSxFQUFFLE9BQU9nQyxPQUFPLENBQUNoQyxNQUFNLEVBQUVlLEtBQUssQ0FBQztNQUMzQztNQUNBO01BQ0EsSUFBSUcsT0FBTyxDQUFDQyxHQUFHLENBQUNDLFFBQVEsS0FBSyxZQUFZLElBQUlMLEtBQUssRUFBRTtRQUNsRE0sT0FBTyxDQUFDQyxJQUFJLENBQ1YseUNBQXlDLElBQUksQ0FBQ3pCLFdBQVcsQ0FBQ3FDLElBQUk7QUFDeEUsU0FBU1gsSUFBSSxDQUFDQyxTQUFTLENBQUNULEtBQUssRUFBRVUsU0FBUyxFQUFFLENBQUMsQ0FBQyxHQUNwQyxDQUFDO01BQ0g7TUFDQSxPQUFPVixLQUFLO0lBQ2Q7SUFDQSxNQUFNZSxFQUFFLEdBQ04sSUFBSSxDQUFDMUIsY0FBYyxHQUFHcUIsU0FBUyxHQUM3QjlCLFdBQVcsQ0FBQ29CLEtBQUssQ0FBQyxHQUFHQSxLQUFLLENBQUNrQixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQ3BDbEIsS0FBSyxDQUFDZSxFQUFFO0lBQ1osTUFBTTlCLE1BQU0sR0FBRyxJQUFJLENBQUNJLGNBQWMsR0FBRyxJQUFJLENBQUNKLE1BQU0sR0FBRyxJQUFJLENBQUNBLE1BQU0sQ0FBQ1UsU0FBUyxDQUFDO0lBQ3pFLE9BQU9zQixPQUFPLENBQUNoQyxNQUFNLEVBQUU4QixFQUFFLElBQUlmLEtBQUssQ0FBQztFQUNyQztBQUNGIiwiaWdub3JlTGlzdCI6W119