dslengine
Version:
Engine to run DSL defined in the MaaP application
94 lines (80 loc) • 2.47 kB
JavaScript
/*
* Name : DslConcreteStrategy.js
* Module : Back-end::Lib::Model::DSLModel
* Location : /lib/controller/middleware
*
* History :
*
* Version Date Programmer
* =================================================
* 0.0.1 2015-05-15 Andrea Mantovani
* -------------------------------------------------
* Aggiornata elaborazione dsl con Sweet.js 1.x
* =================================================
* 0.0.1 2015-05-11 Andrea Mantovani
* -------------------------------------------------
* Rimosso metodo init
* =================================================
* 0.0.1 2014-03-01 Luca De Franceschi
* -------------------------------------------------
* Codifica modulo
* =================================================
*/
;
var SweetjsCompiler = require("sweetjs-compiler");
var fs = require("fs");
var vm = require("vm");
var CollectionModel = require("./CollectionModel");
var DocumentModel = require("./DocumentModel");
var CellModel = require("./CellModel");
var DashRowModel = require("./DashRowModel");
var DashboardModel = require("./DashboardModel");
var DSLSyntaxException = require("../utils/dslSyntaxException");
var IndexModel = require("./IndexModel");
var ShowModel = require("./ShowModel");
var Row = require("./Row");
var Column = require("./Column");
var DslConcreteStrategy = function() {
this.sweetjs = new SweetjsCompiler({
ambient: __dirname
});
try {
this.cachedMacro = fs.readFileSync(`${__dirname}/macro.sjs`, "utf-8");
} catch (err) {
throw new MaapError(err);
}
};
DslConcreteStrategy.prototype.load = function(content, connection) {
// Inject the macro syntax into the content
content = `${this.cachedMacro}\n\n${content}`;
var out = null;
try {
out = this.sweetjs.compile(content);
} catch(err) {
throw new DSLSyntaxException(err);
}
var models = [];
var registerModel = function (dsl) {
models.push(dsl);
};
try {
vm.runInNewContext(out.code, {
registerModel: registerModel,
require: require,
db: connection,
CollectionModel: CollectionModel,
DocumentModel: DocumentModel,
CellModel: CellModel,
DashboardModel: DashboardModel,
DashRowModel: DashRowModel,
IndexModel: IndexModel,
ShowModel: ShowModel,
Row: Row,
Column: Column
});
} catch(err) {
throw err;
}
return models;
};
module.exports = DslConcreteStrategy;