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.
61 lines
1.7 KiB
JavaScript
61 lines
1.7 KiB
JavaScript
"use strict";
|
|
|
|
const moduleAPI = require("./module-api");
|
|
const typeRules = require("./type-rules");
|
|
|
|
/* FIXME: Disallow usage of registry.type-style references from one registry in types of another? Or perhaps embed the registry in the reference, instead of passing it through functions by means of scope? */
|
|
|
|
module.exports = function createRegistry() {
|
|
return Object.assign({}, moduleAPI, {
|
|
_types: new Map(),
|
|
_traits: new Map(),
|
|
_getType: function (name) {
|
|
if (this._types.has(name)) {
|
|
return this._types.get(name);
|
|
} else {
|
|
throw new Error(`No type named ${name} was found in the registry`);
|
|
}
|
|
},
|
|
_getTrait: function (name) {
|
|
if (this._traits.has(name)) {
|
|
return this._traits.get(name);
|
|
} else {
|
|
throw new Error(`No trait named ${name} was found in the registry`);
|
|
}
|
|
},
|
|
createType: function (name, schema, options = {}) {
|
|
if (!this._types.has(name)) {
|
|
let type = moduleAPI.createType(name, schema, options);
|
|
this._types.set(name, type);
|
|
return type;
|
|
} else {
|
|
throw new Error(`A type named ${name} already exists in this registry`);
|
|
}
|
|
},
|
|
createTrait: function (name, schema, options = {}) {
|
|
if (!this._traits.has(name)) {
|
|
let trait = moduleAPI.createTrait(name, schema, options);
|
|
this._traits.set(name, trait);
|
|
return trait;
|
|
} else {
|
|
throw new Error(`A trait named ${name} already exists in this registry`);
|
|
}
|
|
},
|
|
type: function (typeName) {
|
|
return typeRules._createTypeRule({
|
|
_isCustomRegistryType: true,
|
|
_name: typeName,
|
|
_registry: this
|
|
});
|
|
},
|
|
trait: function (traitName) {
|
|
return typeRules._createTypeRule({
|
|
_isRegistryTrait: true,
|
|
_name: traitName,
|
|
_registry: this
|
|
});
|
|
},
|
|
createRegistry: undefined
|
|
});
|
|
};
|