JFL Parser
A parser for JHipster Form Language.
The JFL language enables the definition of a form as a set of composable subforms. Each form could be based on an entity and could have one or more subforms. Of course, subforms could also have a list of subforms.
The form presentation is defined by a template used to generate a form.
To define "master - detail" kind of forms a parent and linked fields could be defined on subforms.
One form could also have several views, for example a list view, edit view and show view.
The JFL grammar also enables definition of nested menus.
Definition of the JFL grammar is here. The parser is generated with peg.js.
Examples
Simple form
form formName title "Form Title" {
entity Person
template "default"
fields {
id title "ID",
name title "Name" required
status title "Status" default "ACTIVE"
validFrom title "Valid from" default "today"
validUntil title "Valid until"
}
views {
list {
fields id, name
}
edit {
fields all except status
}
show {
fields all
}
}
}
Master - detail form
/**
* Master form
*/
form masterFormName title "Master Form Title" {
entity Person
template "default"
fields {
id title "ID" required,
name title "Name" required
}
/**
* Detail form
*/
form subformName title "Subform" {
entity PersonContact
template "subform"
parent fields id
linked fields person
fields {
id title "ID",
contact title "Contact",
person title "Person"
}
}
views {
editableList {
fields id, contact
}
}
}
Menu definiton 1
menu mnuName01 title "MenuTitle01" {
menu mnuName02 title "MenuTitle02" form formName2
menu mnuName03 title "MenuTitle03" form formName3
}
Menu definition 2
menu mnuName01 title "MenuTitle01"
menu mnuName02 title "MenuTitle02" form formName2 parent mnuName01
menu mnuName03 title "MenuTitle03" form formName3 parent mnuName01
Usage
- Include jfl-parser in your code
const formParser = require('jfl-parser');
- Create function that calls a parser with a list of JFL files
parseJFL() {
try {
const jflObject = formParser.convertToJFL(formParser.parseFromFiles(this.jflFiles));
this.changedForms = formParser.exportFormToJSON(jflObject.forms, this.options.force);
this.updatedKeys = Object.keys(this.changedForms);
if (this.updatedKeys.length > 0) {
this.log(`Updated forms are: ${chalk.yellow(this.updatedKeys)}`);
} else {
this.log(chalk.yellow('No change in form configurations. No forms were updated'));
}
} catch (e) {
this.debug('Error:', e);
if (e && e.message) {
this.log(chalk.red(`${e.name || ''}: ${e.message}`));
}
this.error('\nError while parsing entities from JFL\n');
}
}