@digitalwalletcorp/sql-builder 1.2.0 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/abstract-syntax-tree.d.ts +62 -0
- package/lib/abstract-syntax-tree.js +351 -0
- package/lib/abstract-syntax-tree.js.map +1 -0
- package/lib/common.d.ts +8 -0
- package/lib/common.js +24 -0
- package/lib/common.js.map +1 -0
- package/lib/sql-builder.d.ts +39 -0
- package/lib/sql-builder.js +209 -78
- package/lib/sql-builder.js.map +1 -1
- package/package.json +2 -1
- package/src/abstract-syntax-tree.ts +34 -45
- package/src/sql-builder.ts +3 -8
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
type Token = {
|
|
2
|
+
type: 'IDENTIFIER';
|
|
3
|
+
value: string;
|
|
4
|
+
} | {
|
|
5
|
+
type: 'OPERATOR';
|
|
6
|
+
value: string;
|
|
7
|
+
} | {
|
|
8
|
+
type: 'NUMBER';
|
|
9
|
+
value: number;
|
|
10
|
+
} | {
|
|
11
|
+
type: 'BOOLEAN';
|
|
12
|
+
value: boolean;
|
|
13
|
+
} | {
|
|
14
|
+
type: 'STRING';
|
|
15
|
+
value: string;
|
|
16
|
+
} | {
|
|
17
|
+
type: 'NULL';
|
|
18
|
+
value: null;
|
|
19
|
+
} | {
|
|
20
|
+
type: 'UNDEFINED';
|
|
21
|
+
value: undefined;
|
|
22
|
+
} | {
|
|
23
|
+
type: 'PARENTHESIS';
|
|
24
|
+
value: '(' | ')';
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* SQLBuilderの条件文(*IF*)で指定された条件文字列を解析するためのAST。
|
|
28
|
+
* JavaScriptの文法をカバーするものではなく、SQLBuilderで利用可能な限定的な構文のみサポートする。
|
|
29
|
+
*/
|
|
30
|
+
export declare class AbstractSyntaxTree {
|
|
31
|
+
/**
|
|
32
|
+
* 与えられた条件文字列を構文解析し、entityに対する条件として成立するか評価する
|
|
33
|
+
*
|
|
34
|
+
* @param {string} condition "params != null && params.length > 10" のような条件
|
|
35
|
+
* @param {Record<string, any>} entity
|
|
36
|
+
* @returns {boolean}
|
|
37
|
+
*/
|
|
38
|
+
evaluateCondition(condition: string, entity: Record<string, any>): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* 与えられた条件文字列をトークンに分割する
|
|
41
|
+
*
|
|
42
|
+
* @param {string} condition
|
|
43
|
+
* @returns {Token[]}
|
|
44
|
+
*/
|
|
45
|
+
tokenize(condition: string): Token[];
|
|
46
|
+
/**
|
|
47
|
+
* Shunting Yardアルゴリズムで構文を逆ポーランド記法(Reverse Polish Notation)に変換する
|
|
48
|
+
*
|
|
49
|
+
* @param {Token[]} tokens
|
|
50
|
+
* @returns {Token[]}
|
|
51
|
+
*/
|
|
52
|
+
shuntingYard(tokens: Token[]): Token[];
|
|
53
|
+
/**
|
|
54
|
+
* 逆ポーランド記法(Reverse Polish Notation)のトークンを評価する
|
|
55
|
+
*
|
|
56
|
+
* @param {Token[]} rpnTokens
|
|
57
|
+
* @param {Record<string, any>} entity
|
|
58
|
+
* @returns {boolean}
|
|
59
|
+
*/
|
|
60
|
+
evaluateRpn(rpnTokens: Token[], entity: Record<string, any>): boolean;
|
|
61
|
+
}
|
|
62
|
+
export {};
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.AbstractSyntaxTree = void 0;
|
|
37
|
+
const common = __importStar(require("./common"));
|
|
38
|
+
// 演算子の優先順位と結合性 (より長い演算子を先に定義)
|
|
39
|
+
const PRECEDENCE = {
|
|
40
|
+
'||': { precedence: 1, associativity: 'left' },
|
|
41
|
+
'&&': { precedence: 2, associativity: 'left' },
|
|
42
|
+
'==': { precedence: 3, associativity: 'left' },
|
|
43
|
+
'!=': { precedence: 3, associativity: 'left' },
|
|
44
|
+
'===': { precedence: 3, associativity: 'left' },
|
|
45
|
+
'!==': { precedence: 3, associativity: 'left' },
|
|
46
|
+
'<': { precedence: 4, associativity: 'left' },
|
|
47
|
+
'<=': { precedence: 4, associativity: 'left' },
|
|
48
|
+
'>': { precedence: 4, associativity: 'left' },
|
|
49
|
+
'>=': { precedence: 4, associativity: 'left' },
|
|
50
|
+
'!': { precedence: 5, associativity: 'right' } // 単項演算子は高優先度
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* SQLBuilderの条件文(*IF*)で指定された条件文字列を解析するためのAST。
|
|
54
|
+
* JavaScriptの文法をカバーするものではなく、SQLBuilderで利用可能な限定的な構文のみサポートする。
|
|
55
|
+
*/
|
|
56
|
+
class AbstractSyntaxTree {
|
|
57
|
+
/**
|
|
58
|
+
* 与えられた条件文字列を構文解析し、entityに対する条件として成立するか評価する
|
|
59
|
+
*
|
|
60
|
+
* @param {string} condition "params != null && params.length > 10" のような条件
|
|
61
|
+
* @param {Record<string, any>} entity
|
|
62
|
+
* @returns {boolean}
|
|
63
|
+
*/
|
|
64
|
+
evaluateCondition(condition, entity) {
|
|
65
|
+
try {
|
|
66
|
+
// 一般的な条件チェックのルーチンをまとめて実施する
|
|
67
|
+
// 生成されたトークンに手を加えたい場合、各関数はpublicになっているので個別に呼び出し可能
|
|
68
|
+
const tokens = this.tokenize(condition); // トークン化
|
|
69
|
+
const rpnTokens = this.shuntingYard(tokens); // RPN変換
|
|
70
|
+
const result = this.evaluateRpn(rpnTokens, entity); // 評価
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
error.condition = condition;
|
|
75
|
+
error.entity = entity;
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* 与えられた条件文字列をトークンに分割する
|
|
81
|
+
*
|
|
82
|
+
* @param {string} condition
|
|
83
|
+
* @returns {Token[]}
|
|
84
|
+
*/
|
|
85
|
+
tokenize(condition) {
|
|
86
|
+
const tokens = [];
|
|
87
|
+
let i = 0;
|
|
88
|
+
while (i < condition.length) {
|
|
89
|
+
const char = condition[i];
|
|
90
|
+
// 空白をスキップ
|
|
91
|
+
if (/\s/.test(char)) {
|
|
92
|
+
i++;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
// 演算子 (長いものからチェック)
|
|
96
|
+
// 3桁定義
|
|
97
|
+
const chunk3 = condition.substring(i, i + 3);
|
|
98
|
+
switch (chunk3) {
|
|
99
|
+
case '===':
|
|
100
|
+
case '!==':
|
|
101
|
+
tokens.push({ type: 'OPERATOR', value: chunk3 });
|
|
102
|
+
i += 3;
|
|
103
|
+
continue;
|
|
104
|
+
default:
|
|
105
|
+
}
|
|
106
|
+
// 2桁定義
|
|
107
|
+
const chunk2 = condition.substring(i, i + 2);
|
|
108
|
+
switch (chunk2) {
|
|
109
|
+
case '==':
|
|
110
|
+
case '!=':
|
|
111
|
+
case '<=':
|
|
112
|
+
case '>=':
|
|
113
|
+
case '&&':
|
|
114
|
+
case '||':
|
|
115
|
+
tokens.push({ type: 'OPERATOR', value: chunk2 });
|
|
116
|
+
i += 2;
|
|
117
|
+
continue;
|
|
118
|
+
default:
|
|
119
|
+
}
|
|
120
|
+
// 1桁定義
|
|
121
|
+
const chunk1 = char;
|
|
122
|
+
switch (chunk1) {
|
|
123
|
+
case '>':
|
|
124
|
+
case '<':
|
|
125
|
+
case '!':
|
|
126
|
+
case '=':
|
|
127
|
+
tokens.push({ type: 'OPERATOR', value: chunk1 });
|
|
128
|
+
i += 1;
|
|
129
|
+
continue;
|
|
130
|
+
// case '.':
|
|
131
|
+
// tokens.push({ type: 'IDENTIFIER', value: chunk1 }); // '.'も識別子の一部として扱う
|
|
132
|
+
// i += 1;
|
|
133
|
+
// continue;
|
|
134
|
+
case '(':
|
|
135
|
+
case ')':
|
|
136
|
+
tokens.push({ type: 'PARENTHESIS', value: chunk1 });
|
|
137
|
+
i += 1;
|
|
138
|
+
continue;
|
|
139
|
+
default:
|
|
140
|
+
}
|
|
141
|
+
const reststring = condition.substring(i); // 現在のインデックスから末尾までの文字列
|
|
142
|
+
// 数値リテラル
|
|
143
|
+
const numMatch = reststring.match(/^-?\d+(\.\d+)?/);
|
|
144
|
+
if (numMatch) {
|
|
145
|
+
tokens.push({ type: 'NUMBER', value: parseFloat(numMatch[0]) });
|
|
146
|
+
i += numMatch[0].length;
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
// 文字列リテラル
|
|
150
|
+
switch (chunk1) {
|
|
151
|
+
case '\'':
|
|
152
|
+
case '"':
|
|
153
|
+
const quote = chunk1;
|
|
154
|
+
let j = i + 1;
|
|
155
|
+
let strValue = '';
|
|
156
|
+
while (j < condition.length && condition[j] !== quote) {
|
|
157
|
+
// エスケープ文字の処理 (\' や \\) は必要に応じて追加
|
|
158
|
+
if (condition[j] === '\\' && j + 1 < condition.length) {
|
|
159
|
+
strValue += condition[j + 1];
|
|
160
|
+
j += 2;
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
strValue += condition[j];
|
|
164
|
+
j++;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (condition[j] === quote) {
|
|
168
|
+
tokens.push({ type: 'STRING', value: strValue });
|
|
169
|
+
i = j + 1;
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
// クォートが閉じられていない
|
|
174
|
+
throw new Error(`Unterminated string literal: '${condition}', index: ${j}`);
|
|
175
|
+
}
|
|
176
|
+
default:
|
|
177
|
+
}
|
|
178
|
+
// 識別子 (変数名, true, false, null, undefined, length)
|
|
179
|
+
const identMatch = reststring.match(/^[a-zA-Z_][a-zA-Z0-9_.]*/); // ドットを含む識別子
|
|
180
|
+
if (identMatch) {
|
|
181
|
+
const ident = identMatch[0];
|
|
182
|
+
switch (ident) {
|
|
183
|
+
case 'true':
|
|
184
|
+
tokens.push({ type: 'BOOLEAN', value: true });
|
|
185
|
+
break;
|
|
186
|
+
case 'false':
|
|
187
|
+
tokens.push({ type: 'BOOLEAN', value: false });
|
|
188
|
+
break;
|
|
189
|
+
case 'null':
|
|
190
|
+
tokens.push({ type: 'NULL', value: null });
|
|
191
|
+
break;
|
|
192
|
+
case 'undefined':
|
|
193
|
+
tokens.push({ type: 'UNDEFINED', value: undefined });
|
|
194
|
+
break;
|
|
195
|
+
default:
|
|
196
|
+
tokens.push({ type: 'IDENTIFIER', value: ident }); // プロパティ名
|
|
197
|
+
}
|
|
198
|
+
i += ident.length;
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
// 未知の文字
|
|
202
|
+
throw new Error(`Unexpected character in condition: ${char} at index ${i}`);
|
|
203
|
+
}
|
|
204
|
+
return tokens;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Shunting Yardアルゴリズムで構文を逆ポーランド記法(Reverse Polish Notation)に変換する
|
|
208
|
+
*
|
|
209
|
+
* @param {Token[]} tokens
|
|
210
|
+
* @returns {Token[]}
|
|
211
|
+
*/
|
|
212
|
+
shuntingYard(tokens) {
|
|
213
|
+
const output = [];
|
|
214
|
+
// operatorStackにはIDENTIFIERとPARENTHESISしか格納されないので、必ず{ value: string }を持つ
|
|
215
|
+
const operatorStack = [];
|
|
216
|
+
for (const token of tokens) {
|
|
217
|
+
switch (token.type) {
|
|
218
|
+
case 'NUMBER':
|
|
219
|
+
case 'BOOLEAN':
|
|
220
|
+
case 'NULL':
|
|
221
|
+
case 'UNDEFINED':
|
|
222
|
+
case 'STRING':
|
|
223
|
+
case 'IDENTIFIER':
|
|
224
|
+
output.push(token);
|
|
225
|
+
break;
|
|
226
|
+
case 'OPERATOR':
|
|
227
|
+
const op1 = token;
|
|
228
|
+
while (operatorStack.length) {
|
|
229
|
+
const op2 = operatorStack[operatorStack.length - 1];
|
|
230
|
+
// 括弧内は処理しない
|
|
231
|
+
if (op2.value === '(') {
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
// 優先順位のルールに従う
|
|
235
|
+
if (PRECEDENCE[op1.value].associativity === 'left'
|
|
236
|
+
&& PRECEDENCE[op1.value].precedence <= PRECEDENCE[op2.value].precedence) {
|
|
237
|
+
output.push(operatorStack.pop());
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
operatorStack.push(op1);
|
|
244
|
+
break;
|
|
245
|
+
case 'PARENTHESIS':
|
|
246
|
+
if (token.value === '(') {
|
|
247
|
+
operatorStack.push(token);
|
|
248
|
+
}
|
|
249
|
+
else if (token.value === ')') {
|
|
250
|
+
let foundLeftParen = false;
|
|
251
|
+
while (operatorStack.length) {
|
|
252
|
+
const op = operatorStack.pop();
|
|
253
|
+
if (op.value === '(') {
|
|
254
|
+
foundLeftParen = true;
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
output.push(op);
|
|
258
|
+
}
|
|
259
|
+
if (!foundLeftParen) {
|
|
260
|
+
throw new Error('Mismatched parentheses');
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
break;
|
|
264
|
+
// default:
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
while (operatorStack.length) {
|
|
268
|
+
const op = operatorStack.pop();
|
|
269
|
+
if (op.value === '(' || op.value === ')') {
|
|
270
|
+
throw new Error('Mismatched parentheses');
|
|
271
|
+
}
|
|
272
|
+
output.push(op);
|
|
273
|
+
}
|
|
274
|
+
return output;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* 逆ポーランド記法(Reverse Polish Notation)のトークンを評価する
|
|
278
|
+
*
|
|
279
|
+
* @param {Token[]} rpnTokens
|
|
280
|
+
* @param {Record<string, any>} entity
|
|
281
|
+
* @returns {boolean}
|
|
282
|
+
*/
|
|
283
|
+
evaluateRpn(rpnTokens, entity) {
|
|
284
|
+
const stack = [];
|
|
285
|
+
for (const token of rpnTokens) {
|
|
286
|
+
switch (token.type) {
|
|
287
|
+
case 'NUMBER':
|
|
288
|
+
case 'BOOLEAN':
|
|
289
|
+
case 'STRING':
|
|
290
|
+
case 'NULL':
|
|
291
|
+
case 'UNDEFINED':
|
|
292
|
+
stack.push(token.value);
|
|
293
|
+
break;
|
|
294
|
+
case 'IDENTIFIER':
|
|
295
|
+
stack.push(common.getProperty(entity, token.value));
|
|
296
|
+
break;
|
|
297
|
+
case 'OPERATOR':
|
|
298
|
+
// 単項演算子 '!'
|
|
299
|
+
if (token.value === '!') {
|
|
300
|
+
const operand = stack.pop();
|
|
301
|
+
stack.push(!operand);
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
// 二項演算子
|
|
305
|
+
const right = stack.pop();
|
|
306
|
+
const left = stack.pop();
|
|
307
|
+
switch (token.value) {
|
|
308
|
+
case '==':
|
|
309
|
+
stack.push(left == right);
|
|
310
|
+
break;
|
|
311
|
+
case '!=':
|
|
312
|
+
stack.push(left != right);
|
|
313
|
+
break;
|
|
314
|
+
case '===':
|
|
315
|
+
stack.push(left === right);
|
|
316
|
+
break;
|
|
317
|
+
case '!==':
|
|
318
|
+
stack.push(left !== right);
|
|
319
|
+
break;
|
|
320
|
+
case '<':
|
|
321
|
+
stack.push(left < right);
|
|
322
|
+
break;
|
|
323
|
+
case '<=':
|
|
324
|
+
stack.push(left <= right);
|
|
325
|
+
break;
|
|
326
|
+
case '>':
|
|
327
|
+
stack.push(left > right);
|
|
328
|
+
break;
|
|
329
|
+
case '>=':
|
|
330
|
+
stack.push(left >= right);
|
|
331
|
+
break;
|
|
332
|
+
case '&&':
|
|
333
|
+
stack.push(left && right);
|
|
334
|
+
break;
|
|
335
|
+
case '||':
|
|
336
|
+
stack.push(left || right);
|
|
337
|
+
break;
|
|
338
|
+
default: throw new Error(`Unknown operator: ${token.value}`);
|
|
339
|
+
}
|
|
340
|
+
break;
|
|
341
|
+
// default:
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
if (stack.length !== 1) {
|
|
345
|
+
throw new Error(`Invalid expression: ${JSON.stringify(rpnTokens)}`);
|
|
346
|
+
}
|
|
347
|
+
return !!stack[0];
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
exports.AbstractSyntaxTree = AbstractSyntaxTree;
|
|
351
|
+
//# sourceMappingURL=abstract-syntax-tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abstract-syntax-tree.js","sourceRoot":"","sources":["../src/abstract-syntax-tree.ts"],"names":[],"mappings":"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"}
|
package/lib/common.d.ts
ADDED
package/lib/common.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getProperty = getProperty;
|
|
4
|
+
/**
|
|
5
|
+
* entityで指定したオブジェクトからドットで連結されたプロパティキーに該当する値を取得する
|
|
6
|
+
*
|
|
7
|
+
* @param {Record<string, any>} entity
|
|
8
|
+
* @param {string} property
|
|
9
|
+
* @returns {any}
|
|
10
|
+
*/
|
|
11
|
+
function getProperty(entity, property) {
|
|
12
|
+
const propertyPath = property.split('.');
|
|
13
|
+
let value = entity;
|
|
14
|
+
for (const prop of propertyPath) {
|
|
15
|
+
if (value && value.hasOwnProperty(prop)) {
|
|
16
|
+
value = value[prop];
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return value;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":";;AAOA,kCAWC;AAlBD;;;;;;GAMG;AACH,SAAgB,WAAW,CAAC,MAA2B,EAAE,QAAgB;IACvE,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,KAAK,GAAG,MAAM,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,IAAI,KAAK,IAAI,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/lib/sql-builder.d.ts
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL: $1, $2... 配列
|
|
3
|
+
* MySQL: ? 配列
|
|
4
|
+
* SQLite: ?, $name, :name 配列またはオブジェクト
|
|
5
|
+
* SQL Server: ?, `@name` 配列またはオブジェクト
|
|
6
|
+
* Oracle: :name オブジェクト
|
|
7
|
+
*
|
|
8
|
+
* 以下をサポートする
|
|
9
|
+
* ・$1, $2 (postgres)
|
|
10
|
+
* ・? (mysql) SQLite, SQL Serverもこれで代替可能
|
|
11
|
+
* ・:name (oracle) SQLiteもこれで代替可能
|
|
12
|
+
*/
|
|
13
|
+
type BindType = 'postgres' | 'mysql' | 'oracle';
|
|
14
|
+
type BindParameterType<T extends 'postgres' | 'mysql' | 'oracle'> = T extends 'postgres' ? any[] : T extends 'mysql' ? any[] : Record<string, any>;
|
|
1
15
|
/**
|
|
2
16
|
* 動的SQLを生成する
|
|
3
17
|
*
|
|
@@ -49,6 +63,16 @@ export declare class SQLBuilder {
|
|
|
49
63
|
* @returns {string}
|
|
50
64
|
*/
|
|
51
65
|
generateSQL(template: string, entity: Record<string, any>): string;
|
|
66
|
+
/**
|
|
67
|
+
* 指定したテンプレートにエンティティの値をバインド可能なプレースホルダー付きSQLを生成し、
|
|
68
|
+
* バインドパラメータと共にタプル型で返却する
|
|
69
|
+
*
|
|
70
|
+
* @param {string} template
|
|
71
|
+
* @param {Record<string, any>} entity
|
|
72
|
+
* @param {BindType} bindType
|
|
73
|
+
* @returns {[string, BindParameterType<T>]}
|
|
74
|
+
*/
|
|
75
|
+
generateParameterizedSQL<T extends BindType>(template: string, entity: Record<string, any>, bindType: T): [string, BindParameterType<T>];
|
|
52
76
|
/**
|
|
53
77
|
* テンプレートに含まれるタグ構成を解析してコンテキストを返す
|
|
54
78
|
*
|
|
@@ -63,6 +87,10 @@ export declare class SQLBuilder {
|
|
|
63
87
|
* @param {string} template
|
|
64
88
|
* @param {Record<string, any>} entity
|
|
65
89
|
* @param {TagContext[]} tagContexts
|
|
90
|
+
* @param {*} [options]
|
|
91
|
+
* ├ bindType BindType
|
|
92
|
+
* ├ bindIndex number
|
|
93
|
+
* ├ bindParams BindParameterType<T>
|
|
66
94
|
* @returns {string}
|
|
67
95
|
*/
|
|
68
96
|
private parse;
|
|
@@ -84,6 +112,7 @@ export declare class SQLBuilder {
|
|
|
84
112
|
private evaluateCondition;
|
|
85
113
|
/**
|
|
86
114
|
* entityからparamで指定した値を文字列で取得する
|
|
115
|
+
* entityの値がstringの場合、SQLインジェクションの危険のある文字はエスケープする
|
|
87
116
|
*
|
|
88
117
|
* * 返却する値が配列の場合は丸括弧で括り、各項目をカンマで区切る
|
|
89
118
|
* ('a', 'b', 'c')
|
|
@@ -100,4 +129,14 @@ export declare class SQLBuilder {
|
|
|
100
129
|
* @returns {string}
|
|
101
130
|
*/
|
|
102
131
|
private extractValue;
|
|
132
|
+
/**
|
|
133
|
+
* SQLインジェクション対策
|
|
134
|
+
* * シングルクォートのエスケープ
|
|
135
|
+
* * バックスラッシュのエスケープ
|
|
136
|
+
*
|
|
137
|
+
* @param {string} str
|
|
138
|
+
* @returns {string}
|
|
139
|
+
*/
|
|
140
|
+
private escape;
|
|
103
141
|
}
|
|
142
|
+
export {};
|
package/lib/sql-builder.js
CHANGED
|
@@ -1,6 +1,41 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.SQLBuilder = void 0;
|
|
37
|
+
const common = __importStar(require("./common"));
|
|
38
|
+
const abstract_syntax_tree_1 = require("./abstract-syntax-tree");
|
|
4
39
|
/**
|
|
5
40
|
* 動的SQLを生成する
|
|
6
41
|
*
|
|
@@ -65,6 +100,44 @@ class SQLBuilder {
|
|
|
65
100
|
const result = this.parse(pos, template, entity, tagContexts);
|
|
66
101
|
return result;
|
|
67
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* 指定したテンプレートにエンティティの値をバインド可能なプレースホルダー付きSQLを生成し、
|
|
105
|
+
* バインドパラメータと共にタプル型で返却する
|
|
106
|
+
*
|
|
107
|
+
* @param {string} template
|
|
108
|
+
* @param {Record<string, any>} entity
|
|
109
|
+
* @param {BindType} bindType
|
|
110
|
+
* @returns {[string, BindParameterType<T>]}
|
|
111
|
+
*/
|
|
112
|
+
generateParameterizedSQL(template, entity, bindType) {
|
|
113
|
+
let bindParams;
|
|
114
|
+
switch (bindType) {
|
|
115
|
+
case 'postgres':
|
|
116
|
+
case 'mysql':
|
|
117
|
+
bindParams = [];
|
|
118
|
+
break;
|
|
119
|
+
case 'oracle':
|
|
120
|
+
bindParams = {};
|
|
121
|
+
break;
|
|
122
|
+
default:
|
|
123
|
+
throw new Error(`Unsupported bind type: ${bindType}`);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 「\/* *\/」で囲まれたすべての箇所を抽出
|
|
127
|
+
*/
|
|
128
|
+
const allMatchers = template.match(this.REGEX_TAG_PATTERN);
|
|
129
|
+
if (!allMatchers) {
|
|
130
|
+
return [template, bindParams];
|
|
131
|
+
}
|
|
132
|
+
const tagContexts = this.createTagContexts(template);
|
|
133
|
+
const pos = { index: 0 };
|
|
134
|
+
const result = this.parse(pos, template, entity, tagContexts, {
|
|
135
|
+
bindType: bindType,
|
|
136
|
+
bindIndex: 1,
|
|
137
|
+
bindParams: bindParams
|
|
138
|
+
});
|
|
139
|
+
return [result, bindParams];
|
|
140
|
+
}
|
|
68
141
|
/**
|
|
69
142
|
* テンプレートに含まれるタグ構成を解析してコンテキストを返す
|
|
70
143
|
*
|
|
@@ -76,56 +149,55 @@ class SQLBuilder {
|
|
|
76
149
|
/**
|
|
77
150
|
* 「\/* *\/」で囲まれたすべての箇所を抽出
|
|
78
151
|
*/
|
|
79
|
-
const
|
|
152
|
+
const matches = template.matchAll(this.REGEX_TAG_PATTERN);
|
|
80
153
|
// まず最初にREGEX_TAG_PATTERNで解析した情報をそのままフラットにTagContextの配列に格納
|
|
81
154
|
let pos = 0;
|
|
82
155
|
const tagContexts = [];
|
|
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
|
-
}
|
|
156
|
+
for (const match of matches) {
|
|
157
|
+
const matchContent = match[0];
|
|
158
|
+
const index = match.index;
|
|
159
|
+
pos = index + 1;
|
|
160
|
+
const tagContext = {
|
|
161
|
+
type: 'BIND', // ダミーの初期値。後続処理で適切なタイプに変更する。
|
|
162
|
+
match: matchContent,
|
|
163
|
+
contents: '',
|
|
164
|
+
startIndex: index,
|
|
165
|
+
endIndex: index + matchContent.length,
|
|
166
|
+
sub: [],
|
|
167
|
+
parent: null,
|
|
168
|
+
status: 0
|
|
169
|
+
};
|
|
170
|
+
switch (true) {
|
|
171
|
+
case matchContent === '/*BEGIN*/': {
|
|
172
|
+
tagContext.type = 'BEGIN';
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
case matchContent.startsWith('/*IF'): {
|
|
176
|
+
tagContext.type = 'IF';
|
|
177
|
+
const contentMatcher = matchContent.match(/^\/\*IF\s+(.*?)\*\/$/);
|
|
178
|
+
tagContext.contents = contentMatcher && contentMatcher[1] || '';
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
case matchContent.startsWith('/*FOR'): {
|
|
182
|
+
tagContext.type = 'FOR';
|
|
183
|
+
const contentMatcher = matchContent.match(/^\/\*FOR\s+(.*?)\*\/$/);
|
|
184
|
+
tagContext.contents = contentMatcher && contentMatcher[1] || '';
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
case matchContent === '/*END*/': {
|
|
188
|
+
tagContext.type = 'END';
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
default: {
|
|
192
|
+
tagContext.type = 'BIND';
|
|
193
|
+
const contentMatcher = matchContent.match(/\/\*(.*?)\*\//);
|
|
194
|
+
tagContext.contents = contentMatcher && contentMatcher[1] || '';
|
|
195
|
+
// ダミー値の終了位置をendIndexに設定
|
|
196
|
+
const dummyEndIndex = this.getDummyParamEndIndex(template, tagContext);
|
|
197
|
+
tagContext.endIndex = dummyEndIndex;
|
|
126
198
|
}
|
|
127
|
-
tagContexts.push(tagContext);
|
|
128
199
|
}
|
|
200
|
+
tagContexts.push(tagContext);
|
|
129
201
|
}
|
|
130
202
|
// できあがったTagContextの配列から、BEGEN、IFの場合は次の対応するENDが出てくるまでをsubに入れ直して構造化し、
|
|
131
203
|
// 以下のような構造の変更する
|
|
@@ -191,9 +263,13 @@ class SQLBuilder {
|
|
|
191
263
|
* @param {string} template
|
|
192
264
|
* @param {Record<string, any>} entity
|
|
193
265
|
* @param {TagContext[]} tagContexts
|
|
266
|
+
* @param {*} [options]
|
|
267
|
+
* ├ bindType BindType
|
|
268
|
+
* ├ bindIndex number
|
|
269
|
+
* ├ bindParams BindParameterType<T>
|
|
194
270
|
* @returns {string}
|
|
195
271
|
*/
|
|
196
|
-
parse(pos, template, entity, tagContexts) {
|
|
272
|
+
parse(pos, template, entity, tagContexts, options) {
|
|
197
273
|
let result = '';
|
|
198
274
|
for (const tagContext of tagContexts) {
|
|
199
275
|
switch (tagContext.type) {
|
|
@@ -201,7 +277,7 @@ class SQLBuilder {
|
|
|
201
277
|
result += template.substring(pos.index, tagContext.startIndex);
|
|
202
278
|
pos.index = tagContext.endIndex;
|
|
203
279
|
// BEGINのときは無条件にsubに対して再帰呼び出し
|
|
204
|
-
result += this.parse(pos, template, entity, tagContext.sub);
|
|
280
|
+
result += this.parse(pos, template, entity, tagContext.sub, options);
|
|
205
281
|
break;
|
|
206
282
|
}
|
|
207
283
|
case 'IF': {
|
|
@@ -210,7 +286,7 @@ class SQLBuilder {
|
|
|
210
286
|
if (this.evaluateCondition(tagContext.contents, entity)) {
|
|
211
287
|
// IF条件が成立する場合はsubに対して再帰呼び出し
|
|
212
288
|
tagContext.status = 10;
|
|
213
|
-
result += this.parse(pos, template, entity, tagContext.sub);
|
|
289
|
+
result += this.parse(pos, template, entity, tagContext.sub, options);
|
|
214
290
|
}
|
|
215
291
|
else {
|
|
216
292
|
// IF条件が成立しない場合は再帰呼び出しせず、subのENDタグのendIndexをposに設定
|
|
@@ -229,7 +305,10 @@ class SQLBuilder {
|
|
|
229
305
|
for (const value of array) {
|
|
230
306
|
// 再帰呼び出しによりposが進むので、ループのたびにposを戻す必要がある
|
|
231
307
|
pos.index = tagContext.endIndex;
|
|
232
|
-
result += this.parse(pos, template, {
|
|
308
|
+
result += this.parse(pos, template, {
|
|
309
|
+
...entity,
|
|
310
|
+
[bindName]: value
|
|
311
|
+
}, tagContext.sub, options);
|
|
233
312
|
// FORループするときは各行で改行する
|
|
234
313
|
result += '\n';
|
|
235
314
|
}
|
|
@@ -256,13 +335,71 @@ class SQLBuilder {
|
|
|
256
335
|
case 'BIND': {
|
|
257
336
|
result += template.substring(pos.index, tagContext.startIndex);
|
|
258
337
|
pos.index = tagContext.endIndex;
|
|
259
|
-
const value =
|
|
260
|
-
|
|
338
|
+
const value = common.getProperty(entity, tagContext.contents);
|
|
339
|
+
switch (options?.bindType) {
|
|
340
|
+
case 'postgres': {
|
|
341
|
+
// PostgreSQL形式の場合、$Nでバインドパラメータを展開
|
|
342
|
+
if (Array.isArray(value)) {
|
|
343
|
+
const placeholders = [];
|
|
344
|
+
for (const item of value) {
|
|
345
|
+
placeholders.push(`$${options.bindIndex++}`);
|
|
346
|
+
options.bindParams.push(item);
|
|
347
|
+
}
|
|
348
|
+
result += `(${placeholders.join(',')})`; // IN ($1,$2,$3)
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
result += `$${options.bindIndex++}`;
|
|
352
|
+
options.bindParams.push(value);
|
|
353
|
+
}
|
|
354
|
+
break;
|
|
355
|
+
}
|
|
356
|
+
case 'mysql': {
|
|
357
|
+
// MySQL形式の場合、?でバインドパラメータを展開
|
|
358
|
+
if (Array.isArray(value)) {
|
|
359
|
+
const placeholders = [];
|
|
360
|
+
for (const item of value) {
|
|
361
|
+
placeholders.push('?');
|
|
362
|
+
options.bindParams.push(item);
|
|
363
|
+
}
|
|
364
|
+
result += `(${placeholders.join(',')})`; // IN (?,?,?)
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
result += '?';
|
|
368
|
+
options.bindParams.push(value);
|
|
369
|
+
}
|
|
370
|
+
break;
|
|
371
|
+
}
|
|
372
|
+
case 'oracle': {
|
|
373
|
+
// Oracle形式の場合、名前付きバインドでバインドパラメータを展開
|
|
374
|
+
if (Array.isArray(value)) {
|
|
375
|
+
const placeholders = [];
|
|
376
|
+
for (let i = 0; i < value.length; i++) {
|
|
377
|
+
// 名前付きバインドで配列の場合は名前が重複する可能性があるので枝番を付与
|
|
378
|
+
const paramName = `${tagContext.contents}_${i}`; // :projectNames_0, :projectNames_1
|
|
379
|
+
placeholders.push(`:${paramName}`);
|
|
380
|
+
options.bindParams[paramName] = value[i];
|
|
381
|
+
}
|
|
382
|
+
result += `(${placeholders.join(',')})`; // IN (:p_0,:p_1,:p3)
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
result += `:${tagContext.contents}`;
|
|
386
|
+
options.bindParams[tagContext.contents] = value;
|
|
387
|
+
}
|
|
388
|
+
break;
|
|
389
|
+
}
|
|
390
|
+
default: {
|
|
391
|
+
// generateSQLの場合
|
|
392
|
+
const escapedValue = this.extractValue(tagContext.contents, entity);
|
|
393
|
+
result += escapedValue ?? '';
|
|
394
|
+
}
|
|
395
|
+
}
|
|
261
396
|
break;
|
|
262
397
|
}
|
|
263
398
|
default:
|
|
264
399
|
}
|
|
265
400
|
}
|
|
401
|
+
// 最後に余った部分を追加する
|
|
402
|
+
result += template.substring(pos.index);
|
|
266
403
|
return result;
|
|
267
404
|
}
|
|
268
405
|
/**
|
|
@@ -345,24 +482,13 @@ class SQLBuilder {
|
|
|
345
482
|
* @returns {boolean}
|
|
346
483
|
*/
|
|
347
484
|
evaluateCondition(condition, entity) {
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
try {
|
|
352
|
-
return ${condition};
|
|
353
|
-
} catch(error) {
|
|
354
|
-
return false;
|
|
355
|
-
}
|
|
356
|
-
}`);
|
|
357
|
-
return !!evaluate(entity);
|
|
358
|
-
}
|
|
359
|
-
catch (error) {
|
|
360
|
-
console.warn('Error evaluating condition:', condition, entity, error);
|
|
361
|
-
return false;
|
|
362
|
-
}
|
|
485
|
+
const ast = new abstract_syntax_tree_1.AbstractSyntaxTree();
|
|
486
|
+
const result = ast.evaluateCondition(condition, entity);
|
|
487
|
+
return result;
|
|
363
488
|
}
|
|
364
489
|
/**
|
|
365
490
|
* entityからparamで指定した値を文字列で取得する
|
|
491
|
+
* entityの値がstringの場合、SQLインジェクションの危険のある文字はエスケープする
|
|
366
492
|
*
|
|
367
493
|
* * 返却する値が配列の場合は丸括弧で括り、各項目をカンマで区切る
|
|
368
494
|
* ('a', 'b', 'c')
|
|
@@ -380,16 +506,7 @@ class SQLBuilder {
|
|
|
380
506
|
*/
|
|
381
507
|
extractValue(property, entity, options) {
|
|
382
508
|
try {
|
|
383
|
-
const
|
|
384
|
-
let value = entity;
|
|
385
|
-
for (const prop of propertyPath) {
|
|
386
|
-
if (value && value.hasOwnProperty(prop)) {
|
|
387
|
-
value = value[prop];
|
|
388
|
-
}
|
|
389
|
-
else {
|
|
390
|
-
return undefined;
|
|
391
|
-
}
|
|
392
|
-
}
|
|
509
|
+
const value = common.getProperty(entity, property);
|
|
393
510
|
let result = '';
|
|
394
511
|
switch (options?.responseType) {
|
|
395
512
|
case 'array':
|
|
@@ -398,10 +515,10 @@ class SQLBuilder {
|
|
|
398
515
|
default:
|
|
399
516
|
// string
|
|
400
517
|
if (Array.isArray(value)) {
|
|
401
|
-
result = `(${value.map(v => typeof v === 'string' ? `'${v}'` : v).join(',')})`;
|
|
518
|
+
result = `(${value.map(v => typeof v === 'string' ? `'${this.escape(v)}'` : v).join(',')})`;
|
|
402
519
|
}
|
|
403
520
|
else {
|
|
404
|
-
result = typeof value === 'string' ? `'${value}'` : value;
|
|
521
|
+
result = typeof value === 'string' ? `'${this.escape(value)}'` : value;
|
|
405
522
|
}
|
|
406
523
|
return result;
|
|
407
524
|
}
|
|
@@ -411,6 +528,20 @@ class SQLBuilder {
|
|
|
411
528
|
return undefined;
|
|
412
529
|
}
|
|
413
530
|
}
|
|
531
|
+
/**
|
|
532
|
+
* SQLインジェクション対策
|
|
533
|
+
* * シングルクォートのエスケープ
|
|
534
|
+
* * バックスラッシュのエスケープ
|
|
535
|
+
*
|
|
536
|
+
* @param {string} str
|
|
537
|
+
* @returns {string}
|
|
538
|
+
*/
|
|
539
|
+
escape(str) {
|
|
540
|
+
let escapedString = str;
|
|
541
|
+
escapedString = escapedString.replace(/'/g, '\'\'');
|
|
542
|
+
escapedString = escapedString.replace(/\\/g, '\\\\');
|
|
543
|
+
return escapedString;
|
|
544
|
+
}
|
|
414
545
|
}
|
|
415
546
|
exports.SQLBuilder = SQLBuilder;
|
|
416
547
|
//# sourceMappingURL=sql-builder.js.map
|
package/lib/sql-builder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-builder.js","sourceRoot":"","sources":["../src/sql-builder.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sql-builder.js","sourceRoot":"","sources":["../src/sql-builder.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@digitalwalletcorp/sql-builder",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"description": "This is a library for building SQL",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"types": "lib/index.d.ts",
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"version:patch": "npm version patch",
|
|
10
10
|
"version:minor": "npm version minor",
|
|
11
11
|
"version:major": "npm version major",
|
|
12
|
+
"prepack": "rm -rf lib && npm run build",
|
|
12
13
|
"pack": "rm -rf dest && mkdir -p dest && npm pack --pack-destination=dest",
|
|
13
14
|
"publish:npm": "bash ../bin/publish.sh",
|
|
14
15
|
"test:unit": "NODE_OPTIONS=--max-old-space-size=2048 npx jest --runInBand --logHeapUsage --detectOpenHandles --forceExit --errorOnDeprecated --coverage --silent --unhandled-rejections=strict"
|
|
@@ -5,13 +5,11 @@ type Token =
|
|
|
5
5
|
| { type: 'OPERATOR'; value: string } // 例: >, &&, ===, !=
|
|
6
6
|
| { type: 'NUMBER'; value: number } // 例: 100.123
|
|
7
7
|
| { type: 'BOOLEAN'; value: boolean } // 例: true, false
|
|
8
|
-
| { type: 'NULL' }
|
|
9
|
-
| { type: 'UNDEFINED' }
|
|
10
8
|
| { type: 'STRING'; value: string } // 例: 'abc'
|
|
9
|
+
| { type: 'NULL'; value: null }
|
|
10
|
+
| { type: 'UNDEFINED', value: undefined }
|
|
11
11
|
| { type: 'PARENTHESIS'; value: '(' | ')' };
|
|
12
12
|
|
|
13
|
-
type RpnToken = Token | { type: 'MEMBER_ACCESS_PART', value: string };
|
|
14
|
-
|
|
15
13
|
// 演算子の優先順位と結合性 (より長い演算子を先に定義)
|
|
16
14
|
const PRECEDENCE: {
|
|
17
15
|
[op: string]: {
|
|
@@ -47,12 +45,15 @@ export class AbstractSyntaxTree {
|
|
|
47
45
|
*/
|
|
48
46
|
public evaluateCondition(condition: string, entity: Record<string, any>): boolean {
|
|
49
47
|
try {
|
|
48
|
+
// 一般的な条件チェックのルーチンをまとめて実施する
|
|
49
|
+
// 生成されたトークンに手を加えたい場合、各関数はpublicになっているので個別に呼び出し可能
|
|
50
50
|
const tokens = this.tokenize(condition); // トークン化
|
|
51
51
|
const rpnTokens = this.shuntingYard(tokens); // RPN変換
|
|
52
52
|
const result = this.evaluateRpn(rpnTokens, entity); // 評価
|
|
53
53
|
return result;
|
|
54
|
-
} catch (error) {
|
|
55
|
-
|
|
54
|
+
} catch (error: any) {
|
|
55
|
+
error.condition = condition;
|
|
56
|
+
error.entity = entity;
|
|
56
57
|
throw error;
|
|
57
58
|
}
|
|
58
59
|
}
|
|
@@ -140,11 +141,11 @@ export class AbstractSyntaxTree {
|
|
|
140
141
|
while (j < condition.length && condition[j] !== quote) {
|
|
141
142
|
// エスケープ文字の処理 (\' や \\) は必要に応じて追加
|
|
142
143
|
if (condition[j] === '\\' && j + 1 < condition.length) {
|
|
143
|
-
|
|
144
|
-
|
|
144
|
+
strValue += condition[j+1];
|
|
145
|
+
j += 2;
|
|
145
146
|
} else {
|
|
146
|
-
|
|
147
|
-
|
|
147
|
+
strValue += condition[j];
|
|
148
|
+
j++;
|
|
148
149
|
}
|
|
149
150
|
}
|
|
150
151
|
if (condition[j] === quote) {
|
|
@@ -153,7 +154,7 @@ export class AbstractSyntaxTree {
|
|
|
153
154
|
continue;
|
|
154
155
|
} else {
|
|
155
156
|
// クォートが閉じられていない
|
|
156
|
-
throw new Error(
|
|
157
|
+
throw new Error(`Unterminated string literal: '${condition}', index: ${j}`);
|
|
157
158
|
}
|
|
158
159
|
default:
|
|
159
160
|
}
|
|
@@ -170,10 +171,10 @@ export class AbstractSyntaxTree {
|
|
|
170
171
|
tokens.push({ type: 'BOOLEAN', value: false });
|
|
171
172
|
break;
|
|
172
173
|
case 'null':
|
|
173
|
-
tokens.push({ type: 'NULL' });
|
|
174
|
+
tokens.push({ type: 'NULL', value: null });
|
|
174
175
|
break;
|
|
175
176
|
case 'undefined':
|
|
176
|
-
tokens.push({ type: 'UNDEFINED' });
|
|
177
|
+
tokens.push({ type: 'UNDEFINED', value: undefined });
|
|
177
178
|
break;
|
|
178
179
|
default:
|
|
179
180
|
tokens.push({ type: 'IDENTIFIER', value: ident }); // プロパティ名
|
|
@@ -192,31 +193,27 @@ export class AbstractSyntaxTree {
|
|
|
192
193
|
* Shunting Yardアルゴリズムで構文を逆ポーランド記法(Reverse Polish Notation)に変換する
|
|
193
194
|
*
|
|
194
195
|
* @param {Token[]} tokens
|
|
195
|
-
* @returns {
|
|
196
|
+
* @returns {Token[]}
|
|
196
197
|
*/
|
|
197
|
-
|
|
198
|
-
const output:
|
|
199
|
-
|
|
198
|
+
public shuntingYard(tokens: Token[]): Token[] {
|
|
199
|
+
const output: Token[] = [];
|
|
200
|
+
// operatorStackにはIDENTIFIERとPARENTHESISしか格納されないので、必ず{ value: string }を持つ
|
|
201
|
+
const operatorStack: (Token & { value: string })[] = [];
|
|
200
202
|
|
|
201
203
|
for (const token of tokens) {
|
|
202
|
-
|
|
203
|
-
switch (type) {
|
|
204
|
+
switch (token.type) {
|
|
204
205
|
case 'NUMBER':
|
|
205
206
|
case 'BOOLEAN':
|
|
206
207
|
case 'NULL':
|
|
207
208
|
case 'UNDEFINED':
|
|
208
209
|
case 'STRING':
|
|
209
|
-
output.push(token);
|
|
210
|
-
break;
|
|
211
210
|
case 'IDENTIFIER':
|
|
212
|
-
// 識別子(プロパティパスの可能性)をそのまま出力
|
|
213
211
|
output.push(token);
|
|
214
212
|
break;
|
|
215
213
|
case 'OPERATOR':
|
|
216
214
|
const op1 = token;
|
|
217
215
|
while (operatorStack.length) {
|
|
218
|
-
|
|
219
|
-
const op2 = operatorStack[operatorStack.length - 1] as { type: string, value: string };
|
|
216
|
+
const op2 = operatorStack[operatorStack.length - 1];
|
|
220
217
|
|
|
221
218
|
// 括弧内は処理しない
|
|
222
219
|
if (op2.value === '(') {
|
|
@@ -224,11 +221,8 @@ export class AbstractSyntaxTree {
|
|
|
224
221
|
}
|
|
225
222
|
|
|
226
223
|
// 優先順位のルールに従う
|
|
227
|
-
if (
|
|
228
|
-
|
|
229
|
-
// ||
|
|
230
|
-
// (PRECEDENCE[op1.value].associativity === 'right' && PRECEDENCE[op1.value].precedence < PRECEDENCE[op2.value].precedence)
|
|
231
|
-
) {
|
|
224
|
+
if (PRECEDENCE[op1.value].associativity === 'left'
|
|
225
|
+
&& PRECEDENCE[op1.value].precedence <= PRECEDENCE[op2.value].precedence) {
|
|
232
226
|
output.push(operatorStack.pop()!);
|
|
233
227
|
} else {
|
|
234
228
|
break;
|
|
@@ -241,9 +235,9 @@ export class AbstractSyntaxTree {
|
|
|
241
235
|
operatorStack.push(token);
|
|
242
236
|
} else if (token.value === ')') {
|
|
243
237
|
let foundLeftParen = false;
|
|
244
|
-
while (operatorStack.length
|
|
238
|
+
while (operatorStack.length) {
|
|
245
239
|
const op = operatorStack.pop()!;
|
|
246
|
-
if (
|
|
240
|
+
if (op.value === '(') {
|
|
247
241
|
foundLeftParen = true;
|
|
248
242
|
break;
|
|
249
243
|
}
|
|
@@ -254,14 +248,13 @@ export class AbstractSyntaxTree {
|
|
|
254
248
|
}
|
|
255
249
|
}
|
|
256
250
|
break;
|
|
257
|
-
default:
|
|
258
|
-
throw new Error(`Unexpected token type: ${type}`);
|
|
251
|
+
// default:
|
|
259
252
|
}
|
|
260
253
|
}
|
|
261
254
|
|
|
262
255
|
while (operatorStack.length) {
|
|
263
256
|
const op = operatorStack.pop()!;
|
|
264
|
-
if (
|
|
257
|
+
if (op.value === '(' || op.value === ')') {
|
|
265
258
|
throw new Error('Mismatched parentheses');
|
|
266
259
|
}
|
|
267
260
|
output.push(op);
|
|
@@ -273,24 +266,21 @@ export class AbstractSyntaxTree {
|
|
|
273
266
|
/**
|
|
274
267
|
* 逆ポーランド記法(Reverse Polish Notation)のトークンを評価する
|
|
275
268
|
*
|
|
276
|
-
* @param {
|
|
269
|
+
* @param {Token[]} rpnTokens
|
|
277
270
|
* @param {Record<string, any>} entity
|
|
278
271
|
* @returns {boolean}
|
|
279
272
|
*/
|
|
280
|
-
|
|
273
|
+
public evaluateRpn(rpnTokens: Token[], entity: Record<string, any>): boolean {
|
|
281
274
|
const stack: any[] = [];
|
|
282
275
|
|
|
283
276
|
for (const token of rpnTokens) {
|
|
284
|
-
|
|
285
|
-
switch (type) {
|
|
277
|
+
switch (token.type) {
|
|
286
278
|
case 'NUMBER':
|
|
287
279
|
case 'BOOLEAN':
|
|
280
|
+
case 'STRING':
|
|
288
281
|
case 'NULL':
|
|
289
282
|
case 'UNDEFINED':
|
|
290
|
-
|
|
291
|
-
if ('value' in token) {
|
|
292
|
-
stack.push(token.value);
|
|
293
|
-
}
|
|
283
|
+
stack.push(token.value);
|
|
294
284
|
break;
|
|
295
285
|
case 'IDENTIFIER':
|
|
296
286
|
stack.push(common.getProperty(entity, token.value));
|
|
@@ -321,13 +311,12 @@ export class AbstractSyntaxTree {
|
|
|
321
311
|
default: throw new Error(`Unknown operator: ${token.value}`);
|
|
322
312
|
}
|
|
323
313
|
break;
|
|
324
|
-
default:
|
|
325
|
-
throw new Error(`Unexpected token type in RPN: ${type}`);
|
|
314
|
+
// default:
|
|
326
315
|
}
|
|
327
316
|
}
|
|
328
317
|
|
|
329
318
|
if (stack.length !== 1) {
|
|
330
|
-
throw new Error(
|
|
319
|
+
throw new Error(`Invalid expression: ${JSON.stringify(rpnTokens)}`);
|
|
331
320
|
}
|
|
332
321
|
return !!stack[0];
|
|
333
322
|
}
|
package/src/sql-builder.ts
CHANGED
|
@@ -503,14 +503,9 @@ export class SQLBuilder {
|
|
|
503
503
|
* @returns {boolean}
|
|
504
504
|
*/
|
|
505
505
|
private evaluateCondition(condition: string, entity: Record<string, any>): boolean {
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
return result;
|
|
510
|
-
} catch (error) {
|
|
511
|
-
console.warn('Error evaluating condition:', condition, entity, error);
|
|
512
|
-
return false;
|
|
513
|
-
}
|
|
506
|
+
const ast = new AbstractSyntaxTree();
|
|
507
|
+
const result = ast.evaluateCondition(condition, entity);
|
|
508
|
+
return result;
|
|
514
509
|
}
|
|
515
510
|
|
|
516
511
|
/**
|