@digitalwalletcorp/sql-builder 1.2.0 → 1.2.1

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.
@@ -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
+ private shuntingYard;
53
+ /**
54
+ * 逆ポーランド記法(Reverse Polish Notation)のトークンを評価する
55
+ *
56
+ * @param {Token[]} rpnTokens
57
+ * @param {Record<string, any>} entity
58
+ * @returns {boolean}
59
+ */
60
+ private evaluateRpn;
61
+ }
62
+ export {};
@@ -0,0 +1,347 @@
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
+ const tokens = this.tokenize(condition); // トークン化
67
+ const rpnTokens = this.shuntingYard(tokens); // RPN変換
68
+ const result = this.evaluateRpn(rpnTokens, entity); // 評価
69
+ return result;
70
+ }
71
+ catch (error) {
72
+ console.error('Error evaluating condition:', condition, entity, error);
73
+ throw error;
74
+ }
75
+ }
76
+ /**
77
+ * 与えられた条件文字列をトークンに分割する
78
+ *
79
+ * @param {string} condition
80
+ * @returns {Token[]}
81
+ */
82
+ tokenize(condition) {
83
+ const tokens = [];
84
+ let i = 0;
85
+ while (i < condition.length) {
86
+ const char = condition[i];
87
+ // 空白をスキップ
88
+ if (/\s/.test(char)) {
89
+ i++;
90
+ continue;
91
+ }
92
+ // 演算子 (長いものからチェック)
93
+ // 3桁定義
94
+ const chunk3 = condition.substring(i, i + 3);
95
+ switch (chunk3) {
96
+ case '===':
97
+ case '!==':
98
+ tokens.push({ type: 'OPERATOR', value: chunk3 });
99
+ i += 3;
100
+ continue;
101
+ default:
102
+ }
103
+ // 2桁定義
104
+ const chunk2 = condition.substring(i, i + 2);
105
+ switch (chunk2) {
106
+ case '==':
107
+ case '!=':
108
+ case '<=':
109
+ case '>=':
110
+ case '&&':
111
+ case '||':
112
+ tokens.push({ type: 'OPERATOR', value: chunk2 });
113
+ i += 2;
114
+ continue;
115
+ default:
116
+ }
117
+ // 1桁定義
118
+ const chunk1 = char;
119
+ switch (chunk1) {
120
+ case '>':
121
+ case '<':
122
+ case '!':
123
+ case '=':
124
+ tokens.push({ type: 'OPERATOR', value: chunk1 });
125
+ i += 1;
126
+ continue;
127
+ // case '.':
128
+ // tokens.push({ type: 'IDENTIFIER', value: chunk1 }); // '.'も識別子の一部として扱う
129
+ // i += 1;
130
+ // continue;
131
+ case '(':
132
+ case ')':
133
+ tokens.push({ type: 'PARENTHESIS', value: chunk1 });
134
+ i += 1;
135
+ continue;
136
+ default:
137
+ }
138
+ const reststring = condition.substring(i); // 現在のインデックスから末尾までの文字列
139
+ // 数値リテラル
140
+ const numMatch = reststring.match(/^-?\d+(\.\d+)?/);
141
+ if (numMatch) {
142
+ tokens.push({ type: 'NUMBER', value: parseFloat(numMatch[0]) });
143
+ i += numMatch[0].length;
144
+ continue;
145
+ }
146
+ // 文字列リテラル
147
+ switch (chunk1) {
148
+ case '\'':
149
+ case '"':
150
+ const quote = chunk1;
151
+ let j = i + 1;
152
+ let strValue = '';
153
+ while (j < condition.length && condition[j] !== quote) {
154
+ // エスケープ文字の処理 (\' や \\) は必要に応じて追加
155
+ if (condition[j] === '\\' && j + 1 < condition.length) {
156
+ strValue += condition[j + 1];
157
+ j += 2;
158
+ }
159
+ else {
160
+ strValue += condition[j];
161
+ j++;
162
+ }
163
+ }
164
+ if (condition[j] === quote) {
165
+ tokens.push({ type: 'STRING', value: strValue });
166
+ i = j + 1;
167
+ continue;
168
+ }
169
+ else {
170
+ // クォートが閉じられていない
171
+ throw new Error('Unterminated string literal');
172
+ }
173
+ default:
174
+ }
175
+ // 識別子 (変数名, true, false, null, undefined, length)
176
+ const identMatch = reststring.match(/^[a-zA-Z_][a-zA-Z0-9_.]*/); // ドットを含む識別子
177
+ if (identMatch) {
178
+ const ident = identMatch[0];
179
+ switch (ident) {
180
+ case 'true':
181
+ tokens.push({ type: 'BOOLEAN', value: true });
182
+ break;
183
+ case 'false':
184
+ tokens.push({ type: 'BOOLEAN', value: false });
185
+ break;
186
+ case 'null':
187
+ tokens.push({ type: 'NULL', value: null });
188
+ break;
189
+ case 'undefined':
190
+ tokens.push({ type: 'UNDEFINED', value: undefined });
191
+ break;
192
+ default:
193
+ tokens.push({ type: 'IDENTIFIER', value: ident }); // プロパティ名
194
+ }
195
+ i += ident.length;
196
+ continue;
197
+ }
198
+ // 未知の文字
199
+ throw new Error(`Unexpected character in condition: ${char} at index ${i}`);
200
+ }
201
+ return tokens;
202
+ }
203
+ /**
204
+ * Shunting Yardアルゴリズムで構文を逆ポーランド記法(Reverse Polish Notation)に変換する
205
+ *
206
+ * @param {Token[]} tokens
207
+ * @returns {Token[]}
208
+ */
209
+ shuntingYard(tokens) {
210
+ const output = [];
211
+ const operatorStack = [];
212
+ for (const token of tokens) {
213
+ switch (token.type) {
214
+ case 'NUMBER':
215
+ case 'BOOLEAN':
216
+ case 'NULL':
217
+ case 'UNDEFINED':
218
+ case 'STRING':
219
+ case 'IDENTIFIER':
220
+ output.push(token);
221
+ break;
222
+ case 'OPERATOR':
223
+ const op1 = token;
224
+ while (operatorStack.length) {
225
+ const op2 = operatorStack[operatorStack.length - 1];
226
+ // 括弧内は処理しない
227
+ if (op2.value === '(') {
228
+ break;
229
+ }
230
+ // 優先順位のルールに従う
231
+ if (PRECEDENCE[op1.value].associativity === 'left'
232
+ && PRECEDENCE[op1.value].precedence <= PRECEDENCE[op2.value].precedence) {
233
+ output.push(operatorStack.pop());
234
+ }
235
+ else {
236
+ break;
237
+ }
238
+ }
239
+ operatorStack.push(op1);
240
+ break;
241
+ case 'PARENTHESIS':
242
+ if (token.value === '(') {
243
+ operatorStack.push(token);
244
+ }
245
+ else if (token.value === ')') {
246
+ let foundLeftParen = false;
247
+ while (operatorStack.length > 0) {
248
+ const op = operatorStack.pop();
249
+ if ('value' in op && op.value === '(') {
250
+ foundLeftParen = true;
251
+ break;
252
+ }
253
+ output.push(op);
254
+ }
255
+ if (!foundLeftParen) {
256
+ throw new Error('Mismatched parentheses');
257
+ }
258
+ }
259
+ break;
260
+ // default:
261
+ }
262
+ }
263
+ while (operatorStack.length) {
264
+ const op = operatorStack.pop();
265
+ if ('value' in op && (op.value === '(' || op.value === ')')) {
266
+ throw new Error('Mismatched parentheses');
267
+ }
268
+ output.push(op);
269
+ }
270
+ return output;
271
+ }
272
+ /**
273
+ * 逆ポーランド記法(Reverse Polish Notation)のトークンを評価する
274
+ *
275
+ * @param {Token[]} rpnTokens
276
+ * @param {Record<string, any>} entity
277
+ * @returns {boolean}
278
+ */
279
+ evaluateRpn(rpnTokens, entity) {
280
+ const stack = [];
281
+ for (const token of rpnTokens) {
282
+ switch (token.type) {
283
+ case 'NUMBER':
284
+ case 'BOOLEAN':
285
+ case 'STRING':
286
+ case 'NULL':
287
+ case 'UNDEFINED':
288
+ stack.push(token.value);
289
+ break;
290
+ case 'IDENTIFIER':
291
+ stack.push(common.getProperty(entity, token.value));
292
+ break;
293
+ case 'OPERATOR':
294
+ // 単項演算子 '!'
295
+ if (token.value === '!') {
296
+ const operand = stack.pop();
297
+ stack.push(!operand);
298
+ break;
299
+ }
300
+ // 二項演算子
301
+ const right = stack.pop();
302
+ const left = stack.pop();
303
+ switch (token.value) {
304
+ case '==':
305
+ stack.push(left == right);
306
+ break;
307
+ case '!=':
308
+ stack.push(left != right);
309
+ break;
310
+ case '===':
311
+ stack.push(left === right);
312
+ break;
313
+ case '!==':
314
+ stack.push(left !== right);
315
+ break;
316
+ case '<':
317
+ stack.push(left < right);
318
+ break;
319
+ case '<=':
320
+ stack.push(left <= right);
321
+ break;
322
+ case '>':
323
+ stack.push(left > right);
324
+ break;
325
+ case '>=':
326
+ stack.push(left >= right);
327
+ break;
328
+ case '&&':
329
+ stack.push(left && right);
330
+ break;
331
+ case '||':
332
+ stack.push(left || right);
333
+ break;
334
+ default: throw new Error(`Unknown operator: ${token.value}`);
335
+ }
336
+ break;
337
+ // default:
338
+ }
339
+ }
340
+ if (stack.length !== 1) {
341
+ throw new Error('Invalid expression');
342
+ }
343
+ return !!stack[0];
344
+ }
345
+ }
346
+ exports.AbstractSyntaxTree = AbstractSyntaxTree;
347
+ //# 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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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * entityで指定したオブジェクトからドットで連結されたプロパティキーに該当する値を取得する
3
+ *
4
+ * @param {Record<string, any>} entity
5
+ * @param {string} property
6
+ * @returns {any}
7
+ */
8
+ export declare function getProperty(entity: Record<string, any>, property: string): any;
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"}
@@ -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 {};
@@ -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 rootMatcher = template.match(this.REGEX_TAG_PATTERN);
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
- if (rootMatcher) {
84
- for (const matchContent of rootMatcher) {
85
- const index = template.indexOf(matchContent, pos);
86
- pos = index + 1;
87
- const tagContext = {
88
- type: null,
89
- match: matchContent,
90
- contents: '',
91
- startIndex: index,
92
- endIndex: index + matchContent.length,
93
- sub: [],
94
- parent: null,
95
- status: 0
96
- };
97
- switch (true) {
98
- case matchContent === '/*BEGIN*/': {
99
- tagContext.type = 'BEGIN';
100
- break;
101
- }
102
- case matchContent.startsWith('/*IF'): {
103
- tagContext.type = 'IF';
104
- const contentMatcher = matchContent.match(/^\/\*IF\s+(.*?)\*\/$/);
105
- tagContext.contents = contentMatcher && contentMatcher[1] || '';
106
- break;
107
- }
108
- case matchContent.startsWith('/*FOR'): {
109
- tagContext.type = 'FOR';
110
- const contentMatcher = matchContent.match(/^\/\*FOR\s+(.*?)\*\/$/);
111
- tagContext.contents = contentMatcher && contentMatcher[1] || '';
112
- break;
113
- }
114
- case matchContent === '/*END*/': {
115
- tagContext.type = 'END';
116
- break;
117
- }
118
- default: {
119
- tagContext.type = 'BIND';
120
- const contentMatcher = matchContent.match(/\/\*(.*?)\*\//);
121
- tagContext.contents = contentMatcher && contentMatcher[1] || '';
122
- // ダミー値の終了位置をendIndexに設定
123
- const dummyEndIndex = this.getDummyParamEndIndex(template, tagContext);
124
- tagContext.endIndex = dummyEndIndex;
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, { [bindName]: value }, tagContext.sub);
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 = this.extractValue(tagContext.contents, entity);
260
- result += value == null ? '' : String(value);
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
  /**
@@ -346,15 +483,9 @@ class SQLBuilder {
346
483
  */
347
484
  evaluateCondition(condition, entity) {
348
485
  try {
349
- const evaluate = new Function('entity', `
350
- with (entity) {
351
- try {
352
- return ${condition};
353
- } catch(error) {
354
- return false;
355
- }
356
- }`);
357
- return !!evaluate(entity);
486
+ const ast = new abstract_syntax_tree_1.AbstractSyntaxTree();
487
+ const result = ast.evaluateCondition(condition, entity);
488
+ return result;
358
489
  }
359
490
  catch (error) {
360
491
  console.warn('Error evaluating condition:', condition, entity, error);
@@ -363,6 +494,7 @@ class SQLBuilder {
363
494
  }
364
495
  /**
365
496
  * entityからparamで指定した値を文字列で取得する
497
+ * entityの値がstringの場合、SQLインジェクションの危険のある文字はエスケープする
366
498
  *
367
499
  * * 返却する値が配列の場合は丸括弧で括り、各項目をカンマで区切る
368
500
  * ('a', 'b', 'c')
@@ -380,16 +512,7 @@ class SQLBuilder {
380
512
  */
381
513
  extractValue(property, entity, options) {
382
514
  try {
383
- const propertyPath = property.split('.');
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
- }
515
+ const value = common.getProperty(entity, property);
393
516
  let result = '';
394
517
  switch (options?.responseType) {
395
518
  case 'array':
@@ -398,10 +521,10 @@ class SQLBuilder {
398
521
  default:
399
522
  // string
400
523
  if (Array.isArray(value)) {
401
- result = `(${value.map(v => typeof v === 'string' ? `'${v}'` : v).join(',')})`;
524
+ result = `(${value.map(v => typeof v === 'string' ? `'${this.escape(v)}'` : v).join(',')})`;
402
525
  }
403
526
  else {
404
- result = typeof value === 'string' ? `'${value}'` : value;
527
+ result = typeof value === 'string' ? `'${this.escape(value)}'` : value;
405
528
  }
406
529
  return result;
407
530
  }
@@ -411,6 +534,20 @@ class SQLBuilder {
411
534
  return undefined;
412
535
  }
413
536
  }
537
+ /**
538
+ * SQLインジェクション対策
539
+ * * シングルクォートのエスケープ
540
+ * * バックスラッシュのエスケープ
541
+ *
542
+ * @param {string} str
543
+ * @returns {string}
544
+ */
545
+ escape(str) {
546
+ let escapedString = str;
547
+ escapedString = escapedString.replace(/'/g, '\'\'');
548
+ escapedString = escapedString.replace(/\\/g, '\\\\');
549
+ return escapedString;
550
+ }
414
551
  }
415
552
  exports.SQLBuilder = SQLBuilder;
416
553
  //# sourceMappingURL=sql-builder.js.map
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAmC;AACnC,iEAA4D;AA8C5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,MAAa,UAAU;IAEb,iBAAiB,GAAG,gBAAgB,CAAC;IAE7C;IACA,CAAC;IAED;;;;;;OAMG;IACI,WAAW,CAAC,QAAgB,EAAE,MAA2B;QAC9D;;WAEG;QACH,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC3D,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,GAAG,GAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAC9D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;;;;OAQG;IACI,wBAAwB,CAAqB,QAAgB,EAAE,MAA2B,EAAE,QAAW;QAE5G,IAAI,UAAgC,CAAC;QACrC,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,UAAU,CAAC;YAChB,KAAK,OAAO;gBACV,UAAU,GAAG,EAAqC,CAAC;gBACnD,MAAM;YACR,KAAK,QAAQ;gBACX,UAAU,GAAG,EAA0B,CAAC;gBACxC,MAAM;YACR;gBACE,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED;;WAEG;QACH,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC3D,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAChC,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,GAAG,GAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE;YAC5D,QAAQ,EAAE,QAAQ;YAClB,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,UAAU;SACvB,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED;;;;;OAKG;IACK,iBAAiB,CAAC,QAAgB;QACxC,oDAAoD;QACpD;;WAEG;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAE1D,0DAA0D;QAC1D,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,MAAM,WAAW,GAAiB,EAAE,CAAC;QACrC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAC1B,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC;YAChB,MAAM,UAAU,GAAe;gBAC7B,IAAI,EAAE,MAAM,EAAE,4BAA4B;gBAC1C,KAAK,EAAE,YAAY;gBACnB,QAAQ,EAAE,EAAE;gBACZ,UAAU,EAAE,KAAK;gBACjB,QAAQ,EAAE,KAAK,GAAG,YAAY,CAAC,MAAM;gBACrC,GAAG,EAAE,EAAE;gBACP,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,CAAC;aACV,CAAC;YACF,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,YAAY,KAAK,WAAW,CAAC,CAAC,CAAC;oBAClC,UAAU,CAAC,IAAI,GAAG,OAAO,CAAC;oBAC1B,MAAM;gBACR,CAAC;gBACD,KAAK,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBACrC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC;oBACvB,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;oBAClE,UAAU,CAAC,QAAQ,GAAG,cAAc,IAAI,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAChE,MAAM;gBACR,CAAC;gBACD,KAAK,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBACtC,UAAU,CAAC,IAAI,GAAG,KAAK,CAAC;oBACxB,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;oBACnE,UAAU,CAAC,QAAQ,GAAG,cAAc,IAAI,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAChE,MAAM;gBACR,CAAC;gBACD,KAAK,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC;oBAChC,UAAU,CAAC,IAAI,GAAG,KAAK,CAAC;oBACxB,MAAM;gBACR,CAAC;gBACD,OAAO,CAAC,CAAC,CAAC;oBACR,UAAU,CAAC,IAAI,GAAG,MAAM,CAAC;oBACzB,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;oBAC3D,UAAU,CAAC,QAAQ,GAAG,cAAc,IAAI,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAChE,wBAAwB;oBACxB,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;oBACvE,UAAU,CAAC,QAAQ,GAAG,aAAa,CAAC;gBACtC,CAAC;YACH,CAAC;YACD,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC;QAED,oEAAoE;QACpE,gBAAgB;QAChB;;;;;;;;;;WAUG;QACH,MAAM,iBAAiB,GAAiB,EAAE,CAAC;QAC3C,MAAM,cAAc,GAAiB,EAAE,CAAC;QACxC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;gBACxB,KAAK,OAAO,CAAC;gBACb,KAAK,IAAI,CAAC;gBACV,KAAK,KAAK,CAAC,CAAC,CAAC;oBACX,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBACzE,IAAI,gBAAgB,EAAE,CAAC;wBACrB,SAAS;wBACT,UAAU,CAAC,MAAM,GAAG,gBAAgB,CAAC;wBACrC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBACxC,CAAC;yBAAM,CAAC;wBACN,cAAc;wBACd,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBAClC,CAAC;oBACD,sBAAsB;oBACtB,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBACnC,MAAM;gBACR,CAAC;gBACD,KAAK,KAAK,CAAC,CAAC,CAAC;oBACX,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,GAAG,EAAG,CAAC;oBAClD,sCAAsC;oBACtC,UAAU,CAAC,MAAM,GAAG,gBAAgB,CAAC;oBACrC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBACtC,MAAM;gBACR,CAAC;gBACD,OAAO,CAAC,CAAC,CAAC;oBACR,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBACzE,IAAI,gBAAgB,EAAE,CAAC;wBACrB,SAAS;wBACT,UAAU,CAAC,MAAM,GAAG,gBAAgB,CAAC;wBACrC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBACxC,CAAC;yBAAM,CAAC;wBACN,cAAc;wBACd,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;IAED;;;;;;;;;;;;OAYG;IACK,KAAK,CAAqB,GAAgB,EAAE,QAAgB,EAAE,MAA2B,EAAE,WAAyB,EAAE,OAI7H;QACC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;gBACxB,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;oBAC/D,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC;oBAChC,6BAA6B;oBAC7B,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;oBACrE,MAAM;gBACR,CAAC;gBACD,KAAK,IAAI,CAAC,CAAC,CAAC;oBACV,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;oBAC/D,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC;oBAChC,IAAI,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;wBACxD,4BAA4B;wBAC5B,UAAU,CAAC,MAAM,GAAG,EAAE,CAAC;wBACvB,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;oBACvE,CAAC;yBAAM,CAAC;wBACN,kDAAkD;wBAClD,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;wBAChE,GAAG,CAAC,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC;oBACrC,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,KAAK,CAAC,CAAC,CAAC;oBACX,MAAM,CAAC,QAAQ,EAAE,cAAc,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;oBACrF,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE;wBACtD,YAAY,EAAE,OAAO;qBACtB,CAAC,CAAC;oBACH,IAAI,KAAK,EAAE,CAAC;wBACV,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;wBAC/D,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;4BAC1B,uCAAuC;4BACvC,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC;4BAChC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE;gCAClC,GAAG,MAAM;gCACT,CAAC,QAAQ,CAAC,EAAE,KAAK;6BAClB,EAAE,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;4BAC5B,qBAAqB;4BACrB,MAAM,IAAI,IAAI,CAAC;wBACjB,CAAC;oBACH,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,KAAK,CAAC,CAAC,CAAC;oBACX,kDAAkD;oBAClD,QAAQ,IAAI,EAAE,CAAC;wBACb,oDAAoD;wBACpD,KAAK,UAAU,CAAC,MAAM,EAAE,IAAI,KAAK,OAAO;+BACnC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;+BAClD,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;wBAC1E,uCAAuC;wBACvC,KAAK,UAAU,CAAC,MAAM,EAAE,IAAI,KAAK,IAAI,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,KAAK,EAAE;4BACtE,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC;4BAChC,OAAO,EAAE,CAAC;wBACZ,QAAQ;oBACV,CAAC;oBACD,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;oBAC/D,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC;oBAChC,OAAO,MAAM,CAAC;gBAChB,CAAC;gBACD,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;oBAC/D,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC;oBAChC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;oBAC9D,QAAQ,OAAO,EAAE,QAAQ,EAAE,CAAC;wBAC1B,KAAK,UAAU,CAAC,CAAC,CAAC;4BAChB,kCAAkC;4BAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gCACzB,MAAM,YAAY,GAAa,EAAE,CAAC;gCAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oCACzB,YAAY,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;oCAC5C,OAAO,CAAC,UAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gCAC3C,CAAC;gCACD,MAAM,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,gBAAgB;4BAC3D,CAAC;iCAAM,CAAC;gCACN,MAAM,IAAI,IAAI,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;gCACnC,OAAO,CAAC,UAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;4BAC5C,CAAC;4BACD,MAAM;wBACR,CAAC;wBACD,KAAK,OAAO,CAAC,CAAC,CAAC;4BACb,4BAA4B;4BAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gCACzB,MAAM,YAAY,GAAa,EAAE,CAAC;gCAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oCACzB,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oCACtB,OAAO,CAAC,UAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gCAC3C,CAAC;gCACD,MAAM,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,aAAa;4BACxD,CAAC;iCAAM,CAAC;gCACN,MAAM,IAAI,GAAG,CAAC;gCACb,OAAO,CAAC,UAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;4BAC5C,CAAC;4BACD,MAAM;wBACR,CAAC;wBACD,KAAK,QAAQ,CAAC,CAAC,CAAC;4BACd,oCAAoC;4BACpC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gCACzB,MAAM,YAAY,GAAa,EAAE,CAAC;gCAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oCACtC,sCAAsC;oCACtC,MAAM,SAAS,GAAG,GAAG,UAAU,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC,CAAC,mCAAmC;oCACpF,YAAY,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;oCAClC,OAAO,CAAC,UAAkC,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gCACpE,CAAC;gCACD,MAAM,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,qBAAqB;4BAChE,CAAC;iCAAM,CAAC;gCACN,MAAM,IAAI,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;gCACnC,OAAO,CAAC,UAAkC,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;4BAC3E,CAAC;4BACD,MAAM;wBACR,CAAC;wBACD,OAAO,CAAC,CAAC,CAAC;4BACR,iBAAiB;4BACjB,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;4BACpE,MAAM,IAAI,YAAY,IAAI,EAAE,CAAC;wBAC/B,CAAC;oBACH,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,QAAQ;YACV,CAAC;QACH,CAAC;QAED,gBAAgB;QAChB,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACK,qBAAqB,CAAC,QAAgB,EAAE,UAAsB;QACpE,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,GAAG,UAAU,CAAC,IAAI,qCAAqC,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,KAAK,GAAa,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7C,KAAK,IAAI,CAAC,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3D,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACnB,IAAI,OAAO,EAAE,CAAC;gBACZ,SAAS;gBACT,QAAQ,IAAI,EAAE,CAAC;oBACb,KAAK,CAAC,KAAK,GAAG;wBACZ,QAAQ;wBACR,OAAO,CAAC,GAAG,CAAC,CAAC;oBACf,KAAK,CAAC,KAAK,IAAI;wBACb,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;oBACzC,QAAQ;gBACV,CAAC;YACH,CAAC;iBAAM,IAAI,MAAM,EAAE,CAAC;gBAClB,UAAU;gBACV,QAAQ,IAAI,EAAE,CAAC;oBACb,KAAK,CAAC,KAAK,IAAI;wBACb,SAAS;wBACT,OAAO,CAAC,GAAG,CAAC,CAAC;oBACf,KAAK,CAAC,KAAK,IAAI;wBACb,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;oBAC3C,QAAQ;gBACV,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,QAAQ,IAAI,EAAE,CAAC;oBACb,KAAK,CAAC,KAAK,IAAI;wBACb,SAAS;wBACT,MAAM,GAAG,IAAI,CAAC;wBACd,MAAM;oBACR,KAAK,CAAC,KAAK,GAAG;wBACZ,QAAQ;wBACR,OAAO,GAAG,IAAI,CAAC;wBACf,MAAM;oBACR,KAAK,CAAC,KAAK,GAAG;wBACZ,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;oBACzC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG;wBAC7C,SAAS;wBACT,OAAO,CAAC,GAAG,CAAC,CAAC;oBACf,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG;wBAC7C,QAAQ;wBACR,OAAO,CAAC,GAAG,CAAC,CAAC;oBACf,KAAK,CAAC,KAAK,IAAI;wBACb,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;4BACnC,OAAO;4BACP,OAAO,CAAC,GAAG,CAAC,CAAC;wBACf,CAAC;wBACD,KAAK;wBACL,OAAO,CAAC,CAAC;oBACX,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI;wBAC1B,OAAO;wBACP,OAAO,CAAC,CAAC;oBACX,QAAQ;gBACV,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC,MAAM,CAAC;IACzB,CAAC;IAED;;;;;;OAMG;IACK,iBAAiB,CAAC,SAAiB,EAAE,MAA2B;QACtE,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,yCAAkB,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,GAAG,CAAC,iBAAiB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACxD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,6BAA6B,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YACtE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACK,YAAY,CAAqD,QAAgB,EAAE,MAA2B,EAAE,OAEvH;QACC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACnD,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,QAAQ,OAAO,EAAE,YAAY,EAAE,CAAC;gBAC9B,KAAK,OAAO,CAAC;gBACb,KAAK,QAAQ;oBACX,OAAO,KAA4B,CAAC;gBACtC;oBACE,SAAS;oBACT,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;wBACzB,MAAM,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBAC9F,CAAC;yBAAM,CAAC;wBACN,MAAM,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;oBACzE,CAAC;oBACD,OAAO,MAA6B,CAAC;YACzC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YAChE,OAAO,SAAgC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACK,MAAM,CAAC,GAAW;QACxB,IAAI,aAAa,GAAG,GAAG,CAAC;QACxB,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACpD,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACrD,OAAO,aAAa,CAAC;IACvB,CAAC;CACF;AAreD,gCAqeC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digitalwalletcorp/sql-builder",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "description": "This is a library for building SQL",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -9,7 +9,8 @@
9
9
  "version:patch": "npm version patch",
10
10
  "version:minor": "npm version minor",
11
11
  "version:major": "npm version major",
12
- "pack": "rm -rf dest && mkdir -p dest && npm pack --pack-destination=dest",
12
+ "prepack": "rm -rf lib && npm run build",
13
+ "pack": "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"
15
16
  },
@@ -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]: {
@@ -52,7 +50,7 @@ export class AbstractSyntaxTree {
52
50
  const result = this.evaluateRpn(rpnTokens, entity); // 評価
53
51
  return result;
54
52
  } catch (error) {
55
- console.warn('Error evaluating condition:', condition, entity, error);
53
+ console.error('Error evaluating condition:', condition, entity, error);
56
54
  throw error;
57
55
  }
58
56
  }
@@ -170,10 +168,10 @@ export class AbstractSyntaxTree {
170
168
  tokens.push({ type: 'BOOLEAN', value: false });
171
169
  break;
172
170
  case 'null':
173
- tokens.push({ type: 'NULL' });
171
+ tokens.push({ type: 'NULL', value: null });
174
172
  break;
175
173
  case 'undefined':
176
- tokens.push({ type: 'UNDEFINED' });
174
+ tokens.push({ type: 'UNDEFINED', value: undefined });
177
175
  break;
178
176
  default:
179
177
  tokens.push({ type: 'IDENTIFIER', value: ident }); // プロパティ名
@@ -192,31 +190,26 @@ export class AbstractSyntaxTree {
192
190
  * Shunting Yardアルゴリズムで構文を逆ポーランド記法(Reverse Polish Notation)に変換する
193
191
  *
194
192
  * @param {Token[]} tokens
195
- * @returns {RpnToken[]}
193
+ * @returns {Token[]}
196
194
  */
197
- private shuntingYard(tokens: Token[]): RpnToken[] {
198
- const output: RpnToken[] = [];
199
- const operatorStack: Token[] = [];
195
+ private shuntingYard(tokens: Token[]): Token[] {
196
+ const output: Token[] = [];
197
+ const operatorStack: (Token & { value: string })[] = [];
200
198
 
201
199
  for (const token of tokens) {
202
- const type = token.type;
203
- switch (type) {
200
+ switch (token.type) {
204
201
  case 'NUMBER':
205
202
  case 'BOOLEAN':
206
203
  case 'NULL':
207
204
  case 'UNDEFINED':
208
205
  case 'STRING':
209
- output.push(token);
210
- break;
211
206
  case 'IDENTIFIER':
212
- // 識別子(プロパティパスの可能性)をそのまま出力
213
207
  output.push(token);
214
208
  break;
215
209
  case 'OPERATOR':
216
210
  const op1 = token;
217
211
  while (operatorStack.length) {
218
- // TODO: 型キャストが必要になるので、Geniericsを強化する
219
- const op2 = operatorStack[operatorStack.length - 1] as { type: string, value: string };
212
+ const op2 = operatorStack[operatorStack.length - 1];
220
213
 
221
214
  // 括弧内は処理しない
222
215
  if (op2.value === '(') {
@@ -224,11 +217,8 @@ export class AbstractSyntaxTree {
224
217
  }
225
218
 
226
219
  // 優先順位のルールに従う
227
- if (
228
- (PRECEDENCE[op1.value].associativity === 'left' && PRECEDENCE[op1.value].precedence <= PRECEDENCE[op2.value].precedence)
229
- // ||
230
- // (PRECEDENCE[op1.value].associativity === 'right' && PRECEDENCE[op1.value].precedence < PRECEDENCE[op2.value].precedence)
231
- ) {
220
+ if (PRECEDENCE[op1.value].associativity === 'left'
221
+ && PRECEDENCE[op1.value].precedence <= PRECEDENCE[op2.value].precedence) {
232
222
  output.push(operatorStack.pop()!);
233
223
  } else {
234
224
  break;
@@ -254,8 +244,7 @@ export class AbstractSyntaxTree {
254
244
  }
255
245
  }
256
246
  break;
257
- default:
258
- throw new Error(`Unexpected token type: ${type}`);
247
+ // default:
259
248
  }
260
249
  }
261
250
 
@@ -273,24 +262,21 @@ export class AbstractSyntaxTree {
273
262
  /**
274
263
  * 逆ポーランド記法(Reverse Polish Notation)のトークンを評価する
275
264
  *
276
- * @param {RpnToken[]} rpnTokens
265
+ * @param {Token[]} rpnTokens
277
266
  * @param {Record<string, any>} entity
278
267
  * @returns {boolean}
279
268
  */
280
- private evaluateRpn(rpnTokens: RpnToken[], entity: Record<string, any>): boolean {
269
+ private evaluateRpn(rpnTokens: Token[], entity: Record<string, any>): boolean {
281
270
  const stack: any[] = [];
282
271
 
283
272
  for (const token of rpnTokens) {
284
- const type = token.type;
285
- switch (type) {
273
+ switch (token.type) {
286
274
  case 'NUMBER':
287
275
  case 'BOOLEAN':
276
+ case 'STRING':
288
277
  case 'NULL':
289
278
  case 'UNDEFINED':
290
- case 'STRING':
291
- if ('value' in token) {
292
- stack.push(token.value);
293
- }
279
+ stack.push(token.value);
294
280
  break;
295
281
  case 'IDENTIFIER':
296
282
  stack.push(common.getProperty(entity, token.value));
@@ -321,8 +307,7 @@ export class AbstractSyntaxTree {
321
307
  default: throw new Error(`Unknown operator: ${token.value}`);
322
308
  }
323
309
  break;
324
- default:
325
- throw new Error(`Unexpected token type in RPN: ${type}`);
310
+ // default:
326
311
  }
327
312
  }
328
313