web-audio-test-api
Version:
Web Audio API test library for CI
64 lines (50 loc) • 1.63 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = param;
var map = new WeakMap();
function getFromMap(map, key, Container) {
if (map.has(key)) {
return map.get(key);
}
var value = new Container();
map.set(key, value);
return value;
}
function check(values, validators) {
for (var i = 0; i < validators.length; i++) {
if (validators[i].optional === true && values.length <= i) {
break;
}
if (!validators[i].validator.test(values[i])) {
return i;
}
}
return -1;
}
function param(paramName, validator) {
return function (target, name, descriptor) {
var func = descriptor.value;
var klasses = getFromMap(map, target, Map);
var validators = getFromMap(klasses, name, Array);
var optional = /^\[\s*\w+?\s*\]$/.test(paramName);
if (optional) {
paramName = paramName.replace(/^\[|\]$/g, "").trim();
}
validators.unshift({ paramName: paramName, validator: validator, optional: optional });
if (validators.length === 1) {
descriptor.value = function param() {
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var errIndex = check(args, validators);
if (errIndex !== -1) {
throw new TypeError(this.constructor.name + "#" + name + "(); argument(" + errIndex + ") should be a " + validators[errIndex].validator.name + ", but got: " + args[errIndex]);
}
return func.call.apply(func, [this].concat(args));
};
}
return descriptor;
};
}