es-grid-template
Version:
es-grid-template
73 lines (71 loc) • 1.84 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
const factorySymbol = Symbol('factory-symbol');
function isProtoFactory(v) {
return v && v[factorySymbol];
}
function proto(baseRecord, ensureArray = 'auto') {
const baseKeys = Object.keys(baseRecord);
function process(record) {
const result = Object.assign({}, record);
baseKeys.forEach(key => {
if (result[key] === proto.empty) {
delete result[key];
return;
}
const base = baseRecord[key];
if (isProtoFactory(base)) {
result[key] = base(result[key]);
} else {
result[key] = result[key] ?? base;
}
});
return result;
}
function factory(arg) {
const isEnsureArray = ensureArray === 'auto' ? Array.isArray(arg) : ensureArray;
if (isEnsureArray) {
if (arg == null) {
return [];
}
return arg.map(process);
} else {
return process(arg);
}
}
// @ts-ignore
factory[factorySymbol] = true;
factory.extends = extRecord => {
const extFactory = proto(extRecord, ensureArray);
return arg => factory(extFactory(arg));
};
return factory;
}
proto.empty = Symbol('proto.empty');
proto.string = v => {
if (v != null && typeof v !== 'string') {
throw new Error('must be string');
}
return v;
};
proto.string[factorySymbol] = true;
proto.number = v => {
if (v != null && typeof v !== 'number') {
throw new Error('must be number');
}
return v;
};
proto.number[factorySymbol] = true;
proto.notNull = v => {
if (v == null) {
throw new Error('must be not null');
}
return v;
};
proto.notNull[factorySymbol] = true;
proto.object = baseRecord => proto(baseRecord, false);
proto.array = baseRecord => proto(baseRecord, true);
var _default = exports.default = proto;