@cicctencent/json-orm 0.1.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.
Files changed (116) hide show
  1. package/README.md +154 -0
  2. package/dist/cjs/index.d.ts +25 -0
  3. package/dist/cjs/index.d.ts.map +1 -0
  4. package/dist/cjs/index.js +66 -0
  5. package/dist/cjs/index.js.map +1 -0
  6. package/dist/cjs/json-backend-fs.d.ts +26 -0
  7. package/dist/cjs/json-backend-fs.d.ts.map +1 -0
  8. package/dist/cjs/json-backend-fs.js +278 -0
  9. package/dist/cjs/json-backend-fs.js.map +1 -0
  10. package/dist/cjs/json-collection.d.ts +70 -0
  11. package/dist/cjs/json-collection.d.ts.map +1 -0
  12. package/dist/cjs/json-collection.js +385 -0
  13. package/dist/cjs/json-collection.js.map +1 -0
  14. package/dist/cjs/json-config.d.ts +87 -0
  15. package/dist/cjs/json-config.d.ts.map +1 -0
  16. package/dist/cjs/json-config.js +77 -0
  17. package/dist/cjs/json-config.js.map +1 -0
  18. package/dist/cjs/json-datasource.d.ts +35 -0
  19. package/dist/cjs/json-datasource.d.ts.map +1 -0
  20. package/dist/cjs/json-datasource.js +131 -0
  21. package/dist/cjs/json-datasource.js.map +1 -0
  22. package/dist/cjs/json-entity-meta.d.ts +42 -0
  23. package/dist/cjs/json-entity-meta.d.ts.map +1 -0
  24. package/dist/cjs/json-entity-meta.js +128 -0
  25. package/dist/cjs/json-entity-meta.js.map +1 -0
  26. package/dist/cjs/json-query-builder.d.ts +83 -0
  27. package/dist/cjs/json-query-builder.d.ts.map +1 -0
  28. package/dist/cjs/json-query-builder.js +477 -0
  29. package/dist/cjs/json-query-builder.js.map +1 -0
  30. package/dist/cjs/json-repository.d.ts +59 -0
  31. package/dist/cjs/json-repository.d.ts.map +1 -0
  32. package/dist/cjs/json-repository.js +309 -0
  33. package/dist/cjs/json-repository.js.map +1 -0
  34. package/dist/cjs/json-sql-expr.d.ts +107 -0
  35. package/dist/cjs/json-sql-expr.d.ts.map +1 -0
  36. package/dist/cjs/json-sql-expr.js +857 -0
  37. package/dist/cjs/json-sql-expr.js.map +1 -0
  38. package/dist/cjs/json-sql-select.d.ts +9 -0
  39. package/dist/cjs/json-sql-select.d.ts.map +1 -0
  40. package/dist/cjs/json-sql-select.js +434 -0
  41. package/dist/cjs/json-sql-select.js.map +1 -0
  42. package/dist/cjs/json-sql-shared.d.ts +16 -0
  43. package/dist/cjs/json-sql-shared.d.ts.map +1 -0
  44. package/dist/cjs/json-sql-shared.js +12 -0
  45. package/dist/cjs/json-sql-shared.js.map +1 -0
  46. package/dist/cjs/json-sql.d.ts +8 -0
  47. package/dist/cjs/json-sql.d.ts.map +1 -0
  48. package/dist/cjs/json-sql.js +322 -0
  49. package/dist/cjs/json-sql.js.map +1 -0
  50. package/dist/cjs/json-where.d.ts +54 -0
  51. package/dist/cjs/json-where.d.ts.map +1 -0
  52. package/dist/cjs/json-where.js +352 -0
  53. package/dist/cjs/json-where.js.map +1 -0
  54. package/dist/cjs/package.json +3 -0
  55. package/dist/esm/index.d.ts +25 -0
  56. package/dist/esm/index.d.ts.map +1 -0
  57. package/dist/esm/index.js +26 -0
  58. package/dist/esm/index.js.map +1 -0
  59. package/dist/esm/json-backend-fs.d.ts +26 -0
  60. package/dist/esm/json-backend-fs.d.ts.map +1 -0
  61. package/dist/esm/json-backend-fs.js +241 -0
  62. package/dist/esm/json-backend-fs.js.map +1 -0
  63. package/dist/esm/json-collection.d.ts +70 -0
  64. package/dist/esm/json-collection.d.ts.map +1 -0
  65. package/dist/esm/json-collection.js +346 -0
  66. package/dist/esm/json-collection.js.map +1 -0
  67. package/dist/esm/json-config.d.ts +87 -0
  68. package/dist/esm/json-config.d.ts.map +1 -0
  69. package/dist/esm/json-config.js +69 -0
  70. package/dist/esm/json-config.js.map +1 -0
  71. package/dist/esm/json-datasource.d.ts +35 -0
  72. package/dist/esm/json-datasource.d.ts.map +1 -0
  73. package/dist/esm/json-datasource.js +123 -0
  74. package/dist/esm/json-datasource.js.map +1 -0
  75. package/dist/esm/json-entity-meta.d.ts +42 -0
  76. package/dist/esm/json-entity-meta.d.ts.map +1 -0
  77. package/dist/esm/json-entity-meta.js +120 -0
  78. package/dist/esm/json-entity-meta.js.map +1 -0
  79. package/dist/esm/json-query-builder.d.ts +83 -0
  80. package/dist/esm/json-query-builder.d.ts.map +1 -0
  81. package/dist/esm/json-query-builder.js +473 -0
  82. package/dist/esm/json-query-builder.js.map +1 -0
  83. package/dist/esm/json-repository.d.ts +59 -0
  84. package/dist/esm/json-repository.d.ts.map +1 -0
  85. package/dist/esm/json-repository.js +304 -0
  86. package/dist/esm/json-repository.js.map +1 -0
  87. package/dist/esm/json-sql-expr.d.ts +107 -0
  88. package/dist/esm/json-sql-expr.d.ts.map +1 -0
  89. package/dist/esm/json-sql-expr.js +847 -0
  90. package/dist/esm/json-sql-expr.js.map +1 -0
  91. package/dist/esm/json-sql-select.d.ts +9 -0
  92. package/dist/esm/json-sql-select.d.ts.map +1 -0
  93. package/dist/esm/json-sql-select.js +429 -0
  94. package/dist/esm/json-sql-select.js.map +1 -0
  95. package/dist/esm/json-sql-shared.d.ts +16 -0
  96. package/dist/esm/json-sql-shared.d.ts.map +1 -0
  97. package/dist/esm/json-sql-shared.js +9 -0
  98. package/dist/esm/json-sql-shared.js.map +1 -0
  99. package/dist/esm/json-sql.d.ts +8 -0
  100. package/dist/esm/json-sql.d.ts.map +1 -0
  101. package/dist/esm/json-sql.js +319 -0
  102. package/dist/esm/json-sql.js.map +1 -0
  103. package/dist/esm/json-where.d.ts +54 -0
  104. package/dist/esm/json-where.d.ts.map +1 -0
  105. package/dist/esm/json-where.js +342 -0
  106. package/dist/esm/json-where.js.map +1 -0
  107. package/dist/esm/package.json +3 -0
  108. package/examples/01-basic-entity.ts +89 -0
  109. package/examples/02-query-builder.ts +114 -0
  110. package/examples/03-raw-sql.ts +105 -0
  111. package/examples/04-non-entity-table.ts +70 -0
  112. package/examples/05-custom-backend.ts +145 -0
  113. package/examples/06-find-operators.ts +75 -0
  114. package/examples/README.md +73 -0
  115. package/examples/tsconfig.json +20 -0
  116. package/package.json +53 -0
@@ -0,0 +1,319 @@
1
+ /**
2
+ * JSON 回退存储:SQL 执行入口(json-fallback-storage 规格)
3
+ *
4
+ * 在 json-sql-expr(表达式引擎)与 json-sql-select(SELECT 执行器)之上:
5
+ * - INSERT ... VALUES ... [ON DUPLICATE KEY UPDATE](含 VALUES(col)/IF/NOW())
6
+ * - UPDATE ... SET ... WHERE(返回 affectedRows/changedRows)
7
+ * - DELETE FROM ... WHERE(返回 affectedRows)
8
+ * - ALTER/CREATE/DROP/SHOW/SET/LOCK/UNLOCK:no-op;TRUNCATE:清空表
9
+ */
10
+ import { tokenizeSql, TokenCursor, looseEqual } from "./json-where.js";
11
+ import { parseExpr, evalExpr, truthy } from "./json-sql-expr.js";
12
+ import { executeSelect, parseQualifiedTableName, parseTableAlias } from "./json-sql-select.js";
13
+ import { toParams } from "./json-sql-shared.js";
14
+ import { getNonEntityUniqueColumns } from "./json-entity-meta.js";
15
+ /**
16
+ * 执行原生 SQL(MySQL 方言子集)。
17
+ * SELECT 返回行数组;INSERT/UPDATE/DELETE 返回 OkPacket 形态;DDL 返回 []。
18
+ */
19
+ export async function executeRawQuery(sql, params, getSqlTable) {
20
+ const cursor = new TokenCursor(tokenizeSql(sql));
21
+ const head = cursor.peek();
22
+ if (head.type !== 'ident') {
23
+ throw new Error(`[json-storage] 无法识别的 SQL:${sql.slice(0, 60)}`);
24
+ }
25
+ switch (head.value.toUpperCase()) {
26
+ case 'SELECT':
27
+ return await executeSelect(cursor, toParams(params), getSqlTable);
28
+ case 'INSERT':
29
+ return await executeInsert(cursor, false, toParams(params), getSqlTable);
30
+ case 'REPLACE':
31
+ return await executeInsert(cursor, true, toParams(params), getSqlTable);
32
+ case 'UPDATE':
33
+ return await executeUpdate(cursor, toParams(params), getSqlTable);
34
+ case 'DELETE':
35
+ return await executeDelete(cursor, toParams(params), getSqlTable);
36
+ case 'ALTER':
37
+ case 'CREATE':
38
+ case 'DROP':
39
+ case 'SHOW':
40
+ case 'SET':
41
+ case 'LOCK':
42
+ case 'UNLOCK':
43
+ case 'RENAME':
44
+ case 'ANALYZE':
45
+ case 'OPTIMIZE':
46
+ case 'CALL':
47
+ return [];
48
+ case 'TRUNCATE': {
49
+ // 语法:TRUNCATE [TABLE] <表>(MySQL 兼容,TABLE 关键字可选;
50
+ // 此前 peek(1) 恒为 'TABLE' 导致标准写法静默 no-op)
51
+ const t = cursor.isKeyword('TABLE', 1) ? cursor.peek(2) : cursor.peek(1);
52
+ if (t.type === 'ident') {
53
+ // 必须 await:返回时清空已完成(否则后续读写与后台删除交错,且可能 unhandled rejection)
54
+ await getSqlTable(t.value)?.collection.clear();
55
+ }
56
+ return [];
57
+ }
58
+ default:
59
+ throw new Error(`[json-storage] 不支持的 SQL 语句类型:${head.value.toUpperCase()}`);
60
+ }
61
+ }
62
+ // ---------------- INSERT ----------------
63
+ async function executeInsert(cursor, replace, params, getSqlTable) {
64
+ cursor.expectKeyword(replace ? 'REPLACE' : 'INSERT');
65
+ if (cursor.isKeyword('IGNORE'))
66
+ cursor.next();
67
+ cursor.expectKeyword('INTO');
68
+ const tableName = parseQualifiedTableName(cursor);
69
+ const table = getSqlTable(tableName);
70
+ if (!table) {
71
+ throw new Error(`[json-storage] INSERT 引用了未知表:${tableName}`);
72
+ }
73
+ const meta = table.meta;
74
+ const aliases = [{ alias: tableName, meta }];
75
+ // 列清单
76
+ const columns = [];
77
+ if (cursor.peek().type === 'lparen') {
78
+ cursor.next();
79
+ do {
80
+ columns.push(cursor.expect('ident').value);
81
+ } while (cursor.peek().type === 'comma' && (cursor.next(), true));
82
+ cursor.expect('rparen');
83
+ }
84
+ cursor.expectKeyword('VALUES');
85
+ const tuples = [];
86
+ do {
87
+ cursor.expect('lparen');
88
+ const values = [];
89
+ if (cursor.peek().type !== 'rparen') {
90
+ do {
91
+ values.push(parseExpr(cursor));
92
+ } while (cursor.peek().type === 'comma' && (cursor.next(), true));
93
+ }
94
+ cursor.expect('rparen');
95
+ tuples.push(values);
96
+ } while (cursor.peek().type === 'comma' && (cursor.next(), true));
97
+ // ON DUPLICATE KEY UPDATE
98
+ const upserts = [];
99
+ if (cursor.isKeyword('ON')) {
100
+ cursor.next();
101
+ cursor.expectKeyword('DUPLICATE');
102
+ cursor.expectKeyword('KEY');
103
+ cursor.expectKeyword('UPDATE');
104
+ do {
105
+ const col = cursor.expect('ident').value;
106
+ cursor.expect('op', '=');
107
+ upserts.push({ column: col, expr: parseExpr(cursor) });
108
+ } while (cursor.peek().type === 'comma' && (cursor.next(), true));
109
+ }
110
+ if (!cursor.atEnd()) {
111
+ throw new Error(`[json-storage] INSERT 解析失败:未消费的 token "${cursor.peek().value}"`);
112
+ }
113
+ // 两遍执行:
114
+ // 第一遍按 SQL 文本顺序求值全部 VALUES 元组(位置参数跨元组推进,与 MySQL 绑定顺序一致);
115
+ // ODKU 的位置参数从 VALUES 消费完的位置起步,且每个冲突行独立从该起点消费
116
+ // (MySQL 语义:同一占位符参数对每一行求值,而非跨行推进)。
117
+ let affected = 0;
118
+ let lastId = 0;
119
+ const pos = { i: 0 };
120
+ const evaluatedTuples = tuples.map(tuple => {
121
+ const ctx = {
122
+ named: params.named,
123
+ positional: params.positional,
124
+ pos,
125
+ aliases,
126
+ row: {},
127
+ };
128
+ return tuple.map(e => evalExpr(e, ctx));
129
+ });
130
+ const odkuStart = pos.i;
131
+ // 唯一索引冲突检测快照:惰性获取一次、随写维护(含本批新行,保证批内自冲突检测正确)
132
+ let uniqueSnapshot = null;
133
+ for (let ti = 0; ti < evaluatedTuples.length; ti += 1) {
134
+ const vals = evaluatedTuples[ti];
135
+ const newRow = {};
136
+ columns.forEach((col, i) => {
137
+ const prop = meta?.columnByDbName.get(col) ?? col;
138
+ newRow[prop] = vals[i];
139
+ });
140
+ const pk = table.collection.primaryProperty;
141
+ if (!pk) {
142
+ throw new Error(`[json-storage] 表 ${tableName} 缺少主键定义,无法执行 INSERT`);
143
+ }
144
+ const keyValue = newRow[pk];
145
+ let existing = keyValue !== undefined && keyValue !== null ? await table.collection.get(keyValue) : undefined;
146
+ if (!existing) {
147
+ // 主键未提供:按唯一索引检测冲突行(如 t_ai_chat_tool_result 的
148
+ // uk_msg_toolcall(messageId, toolCallId),ON DUPLICATE KEY UPDATE 依赖它幂等)
149
+ uniqueSnapshot ??= await table.collection.all();
150
+ existing = findByUniqueIndex(uniqueSnapshot, meta, tableName, newRow);
151
+ }
152
+ if (existing && !replace && upserts.length > 0) {
153
+ // ON DUPLICATE KEY UPDATE:列引用当前行,VALUES(col) 引用新行
154
+ const valuesRow = {};
155
+ columns.forEach((col, i) => {
156
+ valuesRow[col] = vals[i];
157
+ });
158
+ const updCtx = {
159
+ named: params.named,
160
+ positional: params.positional,
161
+ pos: { i: odkuStart },
162
+ aliases,
163
+ row: { [tableName]: existing },
164
+ valuesRow,
165
+ };
166
+ const merged = { ...existing };
167
+ for (const u of upserts) {
168
+ const prop = meta?.columnByDbName.get(u.column) ?? u.column;
169
+ merged[prop] = evalExpr(u.expr, updCtx);
170
+ }
171
+ await table.collection.write(merged);
172
+ affected += 2;
173
+ lastId = merged[pk];
174
+ }
175
+ else {
176
+ if (existing && replace) {
177
+ await table.collection.delete(existing[pk]);
178
+ }
179
+ if (newRow[pk] === undefined || newRow[pk] === null) {
180
+ // 自增主键未提供:由序列器分配
181
+ newRow[pk] = await table.collection.nextId();
182
+ }
183
+ await table.collection.write(newRow);
184
+ // 随写维护快照(REPLACE 先删后插残留的旧快照行仅致无害的冗余命中,最终态正确)
185
+ uniqueSnapshot?.push({ ...newRow });
186
+ // 已知语义(见设计 Risks):REPLACE = 删后插,本求值器 affectedRows 记 1(MySQL 记 2)。
187
+ // 仅消费 insertId 时无影响;依赖 affectedRows 计数做分支的调用方需注意。
188
+ affected += 1;
189
+ lastId = newRow[pk];
190
+ }
191
+ }
192
+ return { affectedRows: affected, insertId: Number(lastId) || 0, fieldCount: 0, info: '' };
193
+ }
194
+ /**
195
+ * 按唯一索引查找已存在的行(ON DUPLICATE KEY UPDATE 冲突检测)。
196
+ * 实体表用元数据唯一索引(属性名),非实体表用注册的唯一列组(原始列名)。
197
+ * 在调用方提供的快照上查找:快照由元组循环共享并随写维护,避免逐元组整表深拷贝。
198
+ */
199
+ function findByUniqueIndex(rows, meta, tableName, newRow) {
200
+ const keyGroups = meta ? meta.uniqueIndexes : getNonEntityUniqueColumns(tableName);
201
+ for (const group of keyGroups) {
202
+ const hit = group.every(k => newRow[k] !== undefined && newRow[k] !== null);
203
+ if (!hit)
204
+ continue;
205
+ const found = rows.find(row => group.every(k => looseEqual(row[k], newRow[k])));
206
+ if (found)
207
+ return found;
208
+ }
209
+ return undefined;
210
+ }
211
+ // ---------------- UPDATE ----------------
212
+ async function executeUpdate(cursor, params, getSqlTable) {
213
+ cursor.expectKeyword('UPDATE');
214
+ const tableName = parseQualifiedTableName(cursor);
215
+ const table = getSqlTable(tableName);
216
+ if (!table) {
217
+ throw new Error(`[json-storage] UPDATE 引用了未知表:${tableName}`);
218
+ }
219
+ const alias = parseTableAlias(cursor, tableName);
220
+ const meta = table.meta;
221
+ const aliases = [{ alias, meta }];
222
+ cursor.expectKeyword('SET');
223
+ const assigns = [];
224
+ do {
225
+ const col = cursor.expect('ident').value;
226
+ cursor.expect('op', '=');
227
+ assigns.push({ column: col, expr: parseExpr(cursor) });
228
+ } while (cursor.peek().type === 'comma' && (cursor.next(), true));
229
+ let where;
230
+ if (cursor.isKeyword('WHERE')) {
231
+ cursor.next();
232
+ where = parseExpr(cursor);
233
+ }
234
+ if (!cursor.atEnd()) {
235
+ throw new Error(`[json-storage] UPDATE 解析失败:未消费的 token "${cursor.peek().value}"`);
236
+ }
237
+ let affected = 0;
238
+ let changed = 0;
239
+ const rows = await table.collection.all();
240
+ for (const row of rows) {
241
+ const ctx = {
242
+ named: params.named,
243
+ positional: params.positional,
244
+ pos: { i: 0 },
245
+ aliases,
246
+ row: { [alias]: row },
247
+ };
248
+ if (where && !truthy(evalExpr(where, ctx)))
249
+ continue;
250
+ affected += 1;
251
+ const updated = { ...row };
252
+ let rowChanged = false;
253
+ for (const a of assigns) {
254
+ const prop = meta?.columnByDbName.get(a.column) ?? a.column;
255
+ const value = evalExpr(a.expr, ctx);
256
+ if (!looseEq(updated[prop], value))
257
+ rowChanged = true;
258
+ updated[prop] = value;
259
+ }
260
+ if (rowChanged) {
261
+ changed += 1;
262
+ await table.collection.write(updated);
263
+ }
264
+ }
265
+ return { affectedRows: affected, changedRows: changed, fieldCount: 0, info: '' };
266
+ }
267
+ function looseEq(a, b) {
268
+ if (a === b)
269
+ return true;
270
+ if (a === null || a === undefined || b === null || b === undefined)
271
+ return false;
272
+ if (a instanceof Date || b instanceof Date)
273
+ return looseEqual(a, b);
274
+ return looseEqual(a, b);
275
+ }
276
+ // ---------------- DELETE ----------------
277
+ async function executeDelete(cursor, params, getSqlTable) {
278
+ cursor.expectKeyword('DELETE');
279
+ cursor.expectKeyword('FROM');
280
+ const tableName = parseQualifiedTableName(cursor);
281
+ const table = getSqlTable(tableName);
282
+ if (!table) {
283
+ throw new Error(`[json-storage] DELETE 引用了未知表:${tableName}`);
284
+ }
285
+ const alias = parseTableAlias(cursor, tableName);
286
+ const meta = table.meta;
287
+ const aliases = [{ alias, meta }];
288
+ let where;
289
+ if (cursor.isKeyword('WHERE')) {
290
+ cursor.next();
291
+ where = parseExpr(cursor);
292
+ }
293
+ if (!cursor.atEnd()) {
294
+ throw new Error(`[json-storage] DELETE 解析失败:未消费的 token "${cursor.peek().value}"`);
295
+ }
296
+ const pk = table.collection.primaryProperty;
297
+ if (!pk) {
298
+ throw new Error(`[json-storage] 表 ${tableName} 缺少主键定义,无法执行 DELETE`);
299
+ }
300
+ let affected = 0;
301
+ const rows = await table.collection.all();
302
+ for (const row of rows) {
303
+ if (where) {
304
+ const ctx = {
305
+ named: params.named,
306
+ positional: params.positional,
307
+ pos: { i: 0 },
308
+ aliases,
309
+ row: { [alias]: row },
310
+ };
311
+ if (!truthy(evalExpr(where, ctx)))
312
+ continue;
313
+ }
314
+ if (await table.collection.delete(row[pk]))
315
+ affected += 1;
316
+ }
317
+ return { affectedRows: affected, fieldCount: 0, info: '' };
318
+ }
319
+ //# sourceMappingURL=json-sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-sql.js","sourceRoot":"","sources":["../../src/json-sql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * JSON 回退存储:WHERE 条件解析与求值(json-fallback-storage 规格)
3
+ *
4
+ * 三部分:
5
+ * 1) SQL 分词器(`tokenizeSql`,供本模块与 json-sql.ts / json-sql-expr.ts 共用)
6
+ * 2) 值比较与 LIKE 匹配原语(`compareValues`/`looseEqual`/`likeMatch`,供本模块与
7
+ * json-sql 求值器共用;字符串条件统一拼成 SQL 后由 json-sql 解析求值)
8
+ * 3) FindOptionsWhere 对象匹配(等值 + typeorm FindOperator:In/Like/Not/
9
+ * IsNull/LessThan/MoreThan/Between 等)
10
+ *
11
+ * 列名解析:`alias.Fxxx` / `Fxxx`(数据库列名)或 `alias.prop` / `prop`(属性名)
12
+ * 均经 JsonEntityMeta 映射到 JSON 行的属性键;超出语法覆盖时显式抛错(fail-loud)。
13
+ */
14
+ import { FindOperator } from 'typeorm';
15
+ import type { JsonEntityMeta } from './json-entity-meta.js';
16
+ /**
17
+ * 跨 typeorm 多副本安全的 FindOperator 判定。
18
+ * 本包与消费方(如 app/work-space)常因 pnpm 解析到不同 typeorm 副本,
19
+ * 导致 `instanceof FindOperator` 跨模块实例失效;改用运行时类名鸭子类型检测,
20
+ * 避免把 FindOperator 误判为普通值。
21
+ */
22
+ export declare function isFindOperator(value: unknown): value is FindOperator<unknown>;
23
+ export type TokenType = 'ident' | 'string' | 'number' | 'param' | 'qmark' | 'op' | 'lparen' | 'rparen' | 'comma' | 'dot' | 'eof';
24
+ export interface Token {
25
+ type: TokenType;
26
+ value: string;
27
+ pos: number;
28
+ }
29
+ export declare function tokenizeSql(sql: string): Token[];
30
+ /** 分词游标(供条件/表达式解析共用) */
31
+ export declare class TokenCursor {
32
+ readonly tokens: Token[];
33
+ private idx;
34
+ constructor(tokens: Token[]);
35
+ peek(offset?: number): Token;
36
+ next(): Token;
37
+ /** 当前 ident 是否关键字(大小写不敏感) */
38
+ isKeyword(word: string, offset?: number): boolean;
39
+ expectKeyword(word: string): void;
40
+ expect(type: TokenType, value?: string): Token;
41
+ atEnd(): boolean;
42
+ }
43
+ /** 稳健比较:数字按数值、日期按时间戳、字符串按字典序;类型不可比时按字符串 */
44
+ export declare function compareValues(a: unknown, b: unknown): number;
45
+ /** SQL LIKE:`%` 任意串、`_` 单字符 */
46
+ export declare function likeMatch(input: string, pattern: string): boolean;
47
+ /** 宽松等值(Date/ISO 字符串、数字/字符串数字) */
48
+ export declare function looseEqual(a: unknown, b: unknown): boolean;
49
+ /**
50
+ * 匹配 FindOptionsWhere(对象或对象数组=OR)。
51
+ * 键为属性名(若为数据库列名则经 meta 映射),值支持原始值与 FindOperator。
52
+ */
53
+ export declare function matchesWhere(row: Record<string, unknown>, where: unknown, meta: JsonEntityMeta | null): boolean;
54
+ //# sourceMappingURL=json-where.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-where.d.ts","sourceRoot":"","sources":["../../src/json-where.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAAC,OAAO,CAAC,CAQ7E;AAID,MAAM,MAAM,SAAS,GACjB,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,OAAO,GACP,IAAI,GACJ,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,KAAK,GACL,KAAK,CAAC;AAEV,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAMD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,EAAE,CAwHhD;AAED,wBAAwB;AACxB,qBAAa,WAAW;IAEV,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE;IADpC,OAAO,CAAC,GAAG,CAAK;gBACK,MAAM,EAAE,KAAK,EAAE;IAEpC,IAAI,CAAC,MAAM,SAAI,GAAG,KAAK;IAIvB,IAAI,IAAI,KAAK;IAMb,6BAA6B;IAC7B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,OAAO;IAK5C,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOjC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK;IAU9C,KAAK,IAAI,OAAO;CAGjB;AAID,2CAA2C;AAC3C,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,CAe5D;AAoBD,+BAA+B;AAC/B,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAOjE;AAED,kCAAkC;AAClC,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAe1D;AAoBD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,cAAc,GAAG,IAAI,GAC1B,OAAO,CAyBT"}