generator-begcode
Version:
Spring Boot + Angular/React/Vue in one handy generator
83 lines (82 loc) • 2.69 kB
JavaScript
import { upperFirst } from 'lodash-es';
import { merge } from '../utils/object-utils.js';
export default class JDLField {
name;
type;
comment;
validations;
options;
constructor(args) {
const merged = merge(defaults(), args);
if (!merged.name || !merged.type) {
throw new Error(`The field name and type are mandatory to create a field. name: ${merged.name}, type: ${merged.type}.`);
}
this.name = merged.name;
this.type = merged.type;
this.comment = merged.comment;
this.validations = merged.validations ?? {};
this.options = merged.options ?? {};
}
addValidation(validation) {
if (!validation) {
throw new Error("Can't add a nil JDL validation to the JDL field.");
}
this.validations[validation.name] = validation;
}
forEachValidation(functionToApply) {
if (!functionToApply) {
throw new Error('A function must be passed to iterate over validations');
}
Object.values(this.validations).forEach(functionToApply);
}
validationQuantity() {
return Object.keys(this.validations).length;
}
forEachOption(functionToApply) {
if (!functionToApply) {
throw new Error('A function must be passed to iterate over options');
}
Object.entries(this.options).forEach(functionToApply);
}
optionQuantity() {
return Object.keys(this.options).length;
}
toString() {
let string = '';
let lineComment = '';
if (this.comment) {
if (this.comment.includes('\n') && this.comment.length > 70) {
string += `/**\n${this.comment
.split('\n')
.map(line => ` * ${line}\n`)
.join('')} */\n`;
}
else {
lineComment = ` /** ${this.comment} */`;
}
}
Object.entries(this.options ?? {}).forEach(([key, value]) => {
key = upperFirst(key);
if (value === true) {
string += `@${key}\n`;
}
else if (typeof value === 'string') {
string += `@${key}("${value}")\n`;
}
else {
string += `@${key}(${value})\n`;
}
});
string += `${this.name} ${this.type}`;
Object.keys(this.validations).forEach(validationName => {
string += ` ${this.validations[validationName].toString()}`;
});
return string + lineComment;
}
}
function defaults() {
return {
validations: {},
options: {},
};
}