Jsaml is YAML extension for javascript that allows to define functions, getters, setters and include other Jsaml files converting the Jsaml source file into a ES6 object literal.
const jsaml = require('jsaml');
const jsamlString = `
object:
inlineFunction: (arg) return arg;`;
const myObj = jsaml.load(jsamlString);
const myObjFromFile = jsaml.load('/path/to/my/jsamlFile.jsaml');
To declare an inline function:
object:
inlineFunction: (arg) return arg;
This will be converted to:
{
object: {
inlineFunction: function (arg) {
return arg;
}
}
}
Functions can also be multiline:
object:
multilineFunction: (arg)
const argTimesTwo = arg * 2;
return arg;
This will be converted to:
{
object: {
multilineFunction: function (arg) {
let argTimesTwo = arg * 2;
return arg;
}
}
}
This works for arrays as well:
object:
someArray:
- (arg)
const argTimesTwo = arg * 2;
return arg;
If you don't want to use "()" to signal a function, you can pass different opening / closing signals via the option dictionary.
const jsamlString = `
object:
inlineFunction: {{arg]] return arg;`;
const myObj = jsaml.load(jsamlString, options: {
open_funcion_bracket: '{{',
close_funcion_bracket: ']]'
});
If an object has only a "get" function, or a "set" function or both, they'll be converted to setters and getters
const jsamlString = `
object:
property:
get: () return this.prop
set: (value) this.prop = value * 2`;
const myObj = jsaml.load(jsamlString);
myObj.property = 21;
console.log(myObj.property); // 42
If you don't want to use "get" and "set", you can pass different opening / closing signals via the option dictionary.
const jsamlString = `
object:
property:
myGet: () return this.prop
mySet: (value) this.prop = value * 2`;
const myObj = jsaml.load(jsamlString, options: {
get_property: 'myGet',
set_property: 'mySet'
});
You can also include external Jsaml files:
/* myOtherFile.jsaml
externalFile:
a: 1
b:
- 2
- 3
*/
object:
includedProperty: @include myOtherFile.jsaml
This will be loaded as:
{
object: {
includedProperty: {
externalFile: {
a: 1,
b: [2, 3]
}
}
}
}
If you don't want to use "@include", you can pass different opening / closing signals via the option dictionary.
const jsamlString = `
object:
property: @myInclude /path/to/file.jsaml
const myObj = jsaml.load(jsamlString, options: {
include_signal: '@myInclude'
});