-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathinfra.js
121 lines (115 loc) · 4.7 KB
/
infra.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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
const webpack = require('webpack');
const path = require('path');
const fs = require('fs');
const request = require('superagent');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const serverURLGEN = (server_url = 'http://localhost:8021') =>
(path) => `${process.env.SERVER_URL !== undefined ? process.env.SERVER_URL : server_url}/${path}`;
const createRuleContract = (ruleMeta, ruleData, ruleDependencyUUID) => ({
ruleDependencyUUID: ruleDependencyUUID,
type: ruleMeta.type,
entity: {uuid: ruleMeta.entityUUID, type: ruleMeta.entityType},
data: ruleData.metadata,
uuid: ruleData.uuid,
name: ruleData.name,
fnName: ruleData.fnName || ruleData.fn.name,
executionOrder: ruleData.executionOrder
});
const createRules = (userName, server_url, token = "", rules) =>
request.post(serverURLGEN(server_url)("rules"), rules)
.set("USER-NAME", userName)
.set("AUTH-TOKEN", token)
.on('error', console.log)
.then(() => rules.forEach(rule => console.log(`Created Rule: ${rule.name} ${rule.fnName}`)));
const postAllRules = (userName, ruleFilePath, server_url = 'http://localhost:8021', token = "") => {
const compiler = webpack({
target: 'web',
entry: {
rules: ruleFilePath
},
output: {
filename: '[name].bundle.js',
libraryTarget: 'var',
library: 'rulesConfig',
path: path.resolve(__dirname, 'dist')
},
plugins: [
new UglifyJsPlugin({
test: /\.js$/,
exclude: /(node_modules)/,
uglifyOptions: {
ecma: 5,
warnings: false,
compress: true,
mangle: true,
keep_fnames: true,
keep_classnames: true,
output: {comments: false, beautify: false}
}
})
],
module: {
rules: [
{
test: /\.js$/,
exclude: /(node_modules)/,
use: {
loader: 'babel-loader',
options: {
"presets": [
[
"env"
]
],
"plugins": [
"@babel/plugin-proposal-class-properties",
"@babel/plugin-syntax-export-extensions",
["@babel/plugin-proposal-decorators", { "legacy" : true }],
"@babel/plugin-transform-destructuring"
]
}
}
}
]
}
});
return new Promise((resolve, reject) => {
compiler.run((err, stats) => {
var rulesConfig = undefined;
const rulesContent = String(fs.readFileSync(path.resolve(__dirname, 'dist') + '/rules.bundle.js'));
eval(rulesContent);
const rules = rulesConfig;
const serverURL = serverURLGEN(server_url);
request
.post(serverURL("ruleDependency"), {
code: rulesContent,
hash: stats.hash
})
.set("USER-NAME", userName)
.set("AUTH-TOKEN", token)
.then((response) => {
console.log(`Created Rule Dependency with UUID: ${response.text}`);
const registry = rules[Object.keys(rules).find(r => rules[r].registry !== undefined)].registry;
const rulesContracts = registry.getAll()
.reduce((acc, [ruleMeta, rulesData]) =>
acc.concat(
rulesData
.map(ruleData =>
createRuleContract(ruleMeta, ruleData, response.text))),
[]);
return createRules(userName, server_url, token, rulesContracts).then(resolve);
})
.catch((err) => {
const info = (err && err.response && err.response.text) || err;
console.log(`Rule Dependency creation failed: ${info}`);
reject(err);
});
});
});
};
const postRulesWithoutDependency = (userName, rules) => {
rules.forEach(([ruleKey, rulesData]) => {
rulesData.map(ruleData => createRules(userName, ruleKey.formUUID, ruleKey.type, ruleData));
})
};
module.exports = {postAllRules, postRulesWithoutDependency};