nested-builder
Version:
Tersely construct complex test fixture objects with the builder pattern.
66 lines • 2.53 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createBuilderClass = void 0;
const types_1 = require("./types");
const builder_1 = require("./builder");
function createBuilderClass() {
return (template) => {
const DynamicBuilder = class extends builder_1.BuilderBase {
constructor() {
super(template);
}
};
function defineScalarSetter(fieldName) {
DynamicBuilder.prototype[fieldName] = function (value) {
return this.setScalar(fieldName, value);
};
}
function defineScalarAdder(fieldName) {
Object.defineProperty(DynamicBuilder.prototype, fieldName, {
get() {
const fn = (elements) => this.setScalar(fieldName, elements);
fn.add = (element) => this.addScalar(fieldName, element);
return fn;
},
});
}
function defineNestedSetter(fieldName, builderClass) {
DynamicBuilder.prototype[fieldName] = function (block) {
const builder = new builderClass();
return this.setNested(fieldName, builder, block);
};
}
function defineNestedAdder(fieldName, builderClass) {
Object.defineProperty(DynamicBuilder.prototype, fieldName, {
get() {
const fn = (elements) => this.setScalar(fieldName, elements);
fn.add = (block) => {
const builder = new builderClass();
return this.addNested(fieldName, builder, block);
};
return fn;
},
});
}
for (const fieldName in template) {
const fieldTemplate = template[fieldName];
if (types_1.isPlural(fieldTemplate)) {
if (types_1.isNested(fieldTemplate)) {
defineNestedAdder(fieldName, fieldTemplate.nested);
}
else {
defineScalarAdder(fieldName);
}
}
else if (types_1.isNested(fieldTemplate)) {
defineNestedSetter(fieldName, fieldTemplate.nested);
}
else {
defineScalarSetter(fieldName);
}
}
return DynamicBuilder;
};
}
exports.createBuilderClass = createBuilderClass;
//# sourceMappingURL=create.js.map