-
Notifications
You must be signed in to change notification settings - Fork 0
/
elm-transformer.js
99 lines (88 loc) · 3.27 KB
/
elm-transformer.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
'use strict';
const fs = require("fs");
const ejs = require("ejs");
const _ = require("lodash");
const capitalize = require("underscore.string/capitalize");
const decapitalize = require("underscore.string/decapitalize");
class ElmTransformer {
constructor() {
this.propertyTemplate = fs.readFileSync("templates/property.ejs", 'utf8');
this.enumPropertyTemplate = fs.readFileSync("templates/enum-property.ejs", 'utf8');
this.funcPropertyTemplate = fs.readFileSync("templates/func-property.ejs", 'utf8');
this.elementTemplate = fs.readFileSync("templates/element.ejs", 'utf8');
this.moduleTemplate = fs.readFileSync("templates/module.ejs", 'utf8');
this.elementsModuleTemplate = fs.readFileSync("templates/elements-module.ejs", 'utf8');
}
module(moduleName, content, moduleExports) {
return ejs.render(this.moduleTemplate, {
moduleName: moduleName,
content: content,
moduleExports: moduleExports
});
}
elementsModule(elements, modules) {
var moduleExports = Object.keys(elements);
var moduleNames = Object.keys(modules);
moduleExports = moduleExports.concat(moduleNames);
var moduleImports = moduleNames.map(function(moduleName) {
return "import " + moduleName;
});
return ejs.render(this.elementsModuleTemplate, {
content: _.values(elements).join("\n\n"),
moduleExports: moduleExports.join(", "),
moduleImports: moduleImports.join("\n")
});
}
element(elementName, elementFuncName) {
return ejs.render(this.elementTemplate, {
elementName: elementName,
elementFuncName: elementFuncName
});
}
property(propName, propType) {
return ejs.render(this.propertyTemplate, {
propName: propName,
propType: propType
});
}
enumProperty(propName, moduleName, values) {
var unionTypeName = capitalize(moduleName) + capitalize(propName);
var unionTypeValue = function(value) {
return unionTypeName + value.split("-").map(function(val) {
return capitalize(val);
}).join("");
}
var unionTypeValues = values.map(function(value) {
return unionTypeValue(value);
}).join("\n | ");
var valueFuncName = decapitalize(moduleName) + capitalize(propName) + "Value";
var valueToStringCaseBody = values.map(function(value) {
return unionTypeValue(value) + " -> " + '"' + value + '"';
}).join("\n ");
return ejs.render(this.enumPropertyTemplate, {
propName: propName,
unionTypeName: unionTypeName,
unionTypeValues: unionTypeValues,
valueToStringCaseBody: valueToStringCaseBody
});
}
funcProperty(funcName, args) {
if (args) {
var funcDef = "(" + capitalize(args.type) + "-> a)";
var funcParamNames = args.type + "ToAction";
var decoder = "Json.Decode." + args.type + " (\\" + args.name +" -> Signal.message address (" + funcParamNames + " " + args.name + "))";
} else {
var funcDef = "a";
var funcParamNames = "action";
var decoder = "Json.Decode.value (\\_ -> Signal.message address action)";
}
return ejs.render(this.funcPropertyTemplate, {
funcName: funcName,
handlerName: funcName.replace("on", ""),
funcDef: funcDef,
funcParamNames: funcParamNames,
decoder: decoder
});
}
}
module.exports = ElmTransformer;