You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
2.0 KiB
JavaScript

"use strict";
const mapObj = require("map-obj");
const filterObj = require("filter-obj");
const typeRules = require("./type-rules");
const generateDescriptor = require("./generate-descriptor");
const getSchemaKeys = require("./util/get-schema-keys");
const nullMissingFields = require("./util/null-missing-fields");
/* TODO: Traits implementing traits */
module.exports = function createTrait(name, schema, options = {}) {
let schemaDescriptors = mapObj(schema, (key, rule) => {
return generateDescriptor(rule, key, true, options._registry);
});
let schemaKeys = getSchemaKeys(schema);
return typeRules._createTypeRule({
_isTrait: true,
_registry: options._registry,
_name: name,
applyImplementation: function (implementation) {
/* FIXME: Verify that there are no extraneous keys or unspecified values */
let validatedImplementation = Object.create({
_data: {}
}, schemaDescriptors);
let implementationWithoutSlots = filterObj(implementation, (key, value) => {
return (value == null || value._isSlotRule !== true);
});
let nullFields = nullMissingFields(implementation, schemaKeys);
Object.assign(validatedImplementation, implementationWithoutSlots, nullFields);
// let slotProperties = filterObj(implementation, (key, value) => {
// return (value != null && value._isSlotRule === true);
// });
//
// let slotDescriptors = mapObj(slotProperties, (key, value) => {
// return generateDescriptor(schema[key], key);
// });
let implementationDescriptors = mapObj(implementation, (key, value) => {
if (value != null && value._isSlotRule === true) {
return generateDescriptor(schema[key], key, true, options._registry);
} else {
return generateDescriptor(value, key, false, options._registry);
}
});
/* FIXME: Get rid of duplication here somehow? */
let slotSchemaKeys = Object.keys(implementation).filter((key) => {
let value = implementation[key];
return (value != null && value._isSlotRule != null);
});
return {implementationDescriptors, slotSchemaKeys};
}
});
};