-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
126 lines (106 loc) · 3.42 KB
/
index.js
File metadata and controls
126 lines (106 loc) · 3.42 KB
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
122
123
124
125
126
'use strict';
// Declare defaults options or take provided options
// =================================================
var defaultConfig = {};
function setDefaultConfig ( opts ){
defaultConfig = Object.assign({
engine : 'mysql',
array : 'split',
}, opts);
};
setDefaultConfig();
/*=====================================================================
Interface
=====================================================================*/
module.exports = generateTemplateFunction;
module.exports.setDefaultConfig = setDefaultConfig;
/**
* sql moduleon generate template function whom generate plain sql & parameter values
* @callback templateFunction
* @param {array} data
* @return {{sql:string, values:array}}
*/
/**
* @param {String} sql : sql template to generate the template function from
* @param {object=} config
* @return {(data:object) => {sql:string, values:array}} template function
*/
function generateTemplateFunction( sql, config ){
config = Object.assign({}, defaultConfig, config);
var tb = '{{';
var te = '}}';
var varname = 'data';
var _code = 'var vals = [], out="";\n';
var arr = sql.replace(/\s*<!\[CDATA\[\s*|\s*\]\]>\s*|[\r\t]|(\/\*[\s\S]*?\*\/)/g, ' ')
.split(tb).join(te +'\x1b')
.split(te);
for (var m=0, l=arr.length; m < l; m++) {
if( arr[m].charAt(0) !== '\x1b' ){
_code += 'out+=\'' + arr[m].replace(/(\\|["'])/g, '\\$1').replace(/\n/g, '\\n') + '\';';
}
else{
if(arr[m].charAt(1) === '='){
// console.log(JSON.stringify(arr[m]), arr[m].replace(/[^\w]/g, '.'), arr[m].substr(2).replace(/\s/g, ''))
var valName = arr[m].substr(2).replace(/\s/g, '');
// TODO remove varname
_code += transformValue(varname + '.' + valName, config);
}
else if(arr[m].charAt(1) === '?' && arr[m].length === 2){
_code += '}';
}
else if(arr[m].charAt(1) === '?'){
_code += ';if(' ;
_code += varname + '.' + arr[m].substr(2).replace(/\s/g, '') ;
_code += '){';
}
else{
_code += ';' + arr[m].substr(1);
}
}
}
_code += 'return { sql:out, values:vals };';
try {
return new Function( varname, _code);
} catch (e) {
if (typeof console !== 'undefined') console.log('Could not create a template function: ' + _code);
throw e;
}
}
/*=================================================================
Template Generator Helper Functions
=================================================================*/
function transformValue(valName, config){
var _code = '';
_code += 'if(Array.isArray('+valName+')){';
_code += transformArray(valName, config);
_code += '} else {';
_code += ' vals.push('+valName+');';
_code += ' out += '+ transformParameter(config) + ';';
_code += '}';
return _code;
}
function transformArray (valName, config){
var _code = '';
if(config.array === 'string'){
_code += 'vals.push('+valName+'.join(\',\'));';
_code += 'out +=' + transformParameter(config) + ';';
return _code;
} else {
_code += 'for(var i=0; i < '+valName+'.length; i++){';
_code += ' vals.push('+valName+'[i]);';
_code += ' if(i === 0){';
_code += ' out +=' + transformParameter(config) + ';';
_code += ' } else {';
_code += ' out += \',\'+' + transformParameter(config) + ';';
_code += ' }';
_code += '}';
return _code;
}
}
function transformParameter (config) {
if(config.engine === 'pg'){
return '\'$\' + vals.length';
} else {
return '\'?\'';
}
}