@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,309 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JsonRepository = void 0;
4
+ exports.createJsonRepository = createJsonRepository;
5
+ /**
6
+ * JSON 回退存储:Repository 垫片(json-fallback-storage 规格)
7
+ *
8
+ * 覆盖 `src/store/*` 与 `src/service/*` 实际使用的 Repository API:
9
+ * - find / findBy / findOne / findOneBy / findAndCount / findAndCountBy
10
+ * (where 支持对象 AND、数组 OR、FindOperator:In/Like/Not/IsNull/LessThan/…)
11
+ * - order / skip / take / select(投影)
12
+ * - save(新增或按主键合并;自动填充 createTime/modifyTime;自增主键经 `_meta.json` 序列器)
13
+ * - update / delete / upsert(conflictPaths 冲突合并)
14
+ * - count / countBy / query / createQueryBuilder
15
+ *
16
+ * 删除语义与 TypeORM 一致:硬删除;`isDeleted` 为普通列。
17
+ */
18
+ const json_where_ts_1 = require("./json-where.js");
19
+ const json_sql_ts_1 = require("./json-sql.js");
20
+ const json_entity_meta_ts_1 = require("./json-entity-meta.js");
21
+ const json_query_builder_ts_1 = require("./json-query-builder.js");
22
+ class JsonRepository {
23
+ meta;
24
+ collection;
25
+ getSqlTable;
26
+ constructor(meta, collection, getSqlTable) {
27
+ this.meta = meta;
28
+ this.collection = collection;
29
+ this.getSqlTable = getSqlTable;
30
+ }
31
+ // ---------------- 查询 ----------------
32
+ async find(options) {
33
+ const rows = await this.selectRows(options);
34
+ return rows;
35
+ }
36
+ async findBy(where) {
37
+ return this.find({ where });
38
+ }
39
+ async findOne(options) {
40
+ const rows = await this.find({ ...options, take: 1 });
41
+ return rows[0] ?? null;
42
+ }
43
+ async findOneBy(where) {
44
+ return this.findOne({ where });
45
+ }
46
+ async findAndCount(options) {
47
+ const rows = await this.selectRows({ ...options, skip: 0, take: undefined });
48
+ const total = rows.length;
49
+ const sliced = this.applyWindow(rows, options);
50
+ return [this.applySelect(sliced, options), total];
51
+ }
52
+ async findAndCountBy(where, options) {
53
+ return this.findAndCount({ ...options, where });
54
+ }
55
+ async count(options) {
56
+ return (await this.selectRows(options)).length;
57
+ }
58
+ async countBy(where) {
59
+ return this.count({ where });
60
+ }
61
+ async save(target) {
62
+ if (Array.isArray(target)) {
63
+ const out = [];
64
+ for (const e of target)
65
+ out.push(await this.saveOne(e));
66
+ return out;
67
+ }
68
+ return this.saveOne(target);
69
+ }
70
+ async saveOne(entity) {
71
+ const row = { ...entity };
72
+ const pk = this.collection.primaryProperty;
73
+ if (!pk) {
74
+ throw new Error(`[json-storage] 表 ${this.collection.tableName} 缺少主键定义,无法 save`);
75
+ }
76
+ const now = new Date();
77
+ // MySQL 语义:自增主键下 0 视为未赋值(INSERT id=0 触发自增生成新 id);
78
+ // 非自增主键的 0 是合法显式主键,按主键查已有行做合并
79
+ const pkUnassigned = row[pk] === undefined ||
80
+ row[pk] === null ||
81
+ row[pk] === '' ||
82
+ (row[pk] === 0 && this.meta?.primaryGenerated);
83
+ const existing = pkUnassigned ? undefined : await this.collection.get(row[pk]);
84
+ let stored;
85
+ if (existing) {
86
+ // 局部合并(与 TypeORM save 的部分更新语义一致;undefined 视为「不修改」,与 update 同款:
87
+ // 实体未赋值字段不得把存量列擦除——JSON 序列化会静默丢弃 undefined 键)
88
+ stored = { ...existing };
89
+ for (const [k, v] of Object.entries(row)) {
90
+ if (v !== undefined)
91
+ stored[k] = v;
92
+ }
93
+ if (this.meta?.updatedAtProperty)
94
+ stored[this.meta.updatedAtProperty] = now;
95
+ }
96
+ else {
97
+ if (pkUnassigned && this.meta?.primaryGenerated) {
98
+ row[pk] = await this.collection.nextId();
99
+ }
100
+ if (row[pk] === undefined || row[pk] === null || row[pk] === '') {
101
+ throw new Error(`[json-storage] 表 ${this.collection.tableName} save 行缺少主键 ${pk}`);
102
+ }
103
+ if (this.meta?.createdAtProperty && stored0(row, this.meta.createdAtProperty)) {
104
+ row[this.meta.createdAtProperty] = now;
105
+ }
106
+ if (this.meta?.updatedAtProperty)
107
+ row[this.meta.updatedAtProperty] = now;
108
+ stored = row;
109
+ }
110
+ await this.collection.write(stored);
111
+ return stored;
112
+ }
113
+ async update(criteria, partial) {
114
+ const rows = await this.selectByCriteria(criteria);
115
+ const now = new Date();
116
+ for (const row of rows) {
117
+ // 部分更新:仅覆盖 partial 中显式提供的列,undefined 视为「不修改」
118
+ // (对齐 TypeORM `update(criteria, partial)` 语义,避免把其余列清成 null)
119
+ const updated = { ...row };
120
+ for (const [k, v] of Object.entries(partial)) {
121
+ if (v !== undefined)
122
+ updated[k] = v;
123
+ }
124
+ if (this.meta?.updatedAtProperty)
125
+ updated[this.meta.updatedAtProperty] = now;
126
+ await this.collection.write(updated);
127
+ }
128
+ return { affected: rows.length, raw: [], generatedMaps: [] };
129
+ }
130
+ async delete(criteria) {
131
+ const rows = await this.selectByCriteria(criteria);
132
+ const pk = this.collection.primaryProperty;
133
+ if (!pk) {
134
+ throw new Error(`[json-storage] 表 ${this.collection.tableName} 缺少主键定义,无法 delete`);
135
+ }
136
+ let affected = 0;
137
+ for (const row of rows) {
138
+ if (await this.collection.delete(row[pk]))
139
+ affected += 1;
140
+ }
141
+ return { affected, raw: [] };
142
+ }
143
+ async upsert(entities, options) {
144
+ const list = Array.isArray(entities) ? entities : [entities];
145
+ const declared = options?.conflictPaths ?? [];
146
+ // 空 conflictPaths 回退到主键匹配(对齐 TypeORM upsert 默认语义),避免误合并首行
147
+ const conflictPaths = declared.length > 0 ? declared : this.collection.primaryProperty ? [this.collection.primaryProperty] : [];
148
+ const now = new Date();
149
+ const identifiers = [];
150
+ // 冲突检测快照:循环外取一次、随写维护(消除逐实体 all() 深拷贝;保持批内自冲突检测)
151
+ const snapshot = await this.collection.all();
152
+ for (const entity of list) {
153
+ const row = { ...entity };
154
+ // 冲突行:全部 conflictPaths 属性 looseEqual 匹配(与 matchesWhere 同语义)
155
+ const existing = snapshot.find(r => conflictPaths.every(p => (0, json_where_ts_1.looseEqual)(r[p], row[p])));
156
+ let stored;
157
+ if (existing) {
158
+ // 冲突合并:保留原主键。incoming 实体多为 `new Entity()`,自增 id 取类默认值 0,
159
+ // 若以 0 覆盖真实 id,JSON 模式会写出 id=0 的新行而原主键行残留,破坏唯一约束。
160
+ // undefined 视为「不修改」(与 update/save 合并同款),未赋值字段不得擦除存量列。
161
+ stored = { ...existing };
162
+ for (const [k, v] of Object.entries(row)) {
163
+ if (v !== undefined)
164
+ stored[k] = v;
165
+ }
166
+ const pkProp = this.collection.primaryProperty;
167
+ if (pkProp)
168
+ stored[pkProp] = existing[pkProp];
169
+ if (this.meta?.updatedAtProperty)
170
+ stored[this.meta.updatedAtProperty] = now;
171
+ }
172
+ else {
173
+ const pk = this.collection.primaryProperty;
174
+ if (!pk) {
175
+ throw new Error(`[json-storage] 表 ${this.collection.tableName} 缺少主键定义,无法 upsert`);
176
+ }
177
+ if ((row[pk] === undefined || row[pk] === null || row[pk] === '' || row[pk] === 0) &&
178
+ this.meta?.primaryGenerated) {
179
+ // 同 save:自增主键下 0 视为未赋值(MySQL 语义)
180
+ row[pk] = await this.collection.nextId();
181
+ }
182
+ if (this.meta?.createdAtProperty && stored0(row, this.meta.createdAtProperty)) {
183
+ row[this.meta.createdAtProperty] = now;
184
+ }
185
+ if (this.meta?.updatedAtProperty)
186
+ row[this.meta.updatedAtProperty] = now;
187
+ stored = row;
188
+ }
189
+ await this.collection.write(stored);
190
+ if (!existing)
191
+ snapshot.push({ ...stored });
192
+ identifiers.push({ [this.collection.primaryProperty ?? 'id']: stored[this.collection.primaryProperty ?? 'id'] });
193
+ }
194
+ return { identifiers, generatedMaps: [], raw: [] };
195
+ }
196
+ /** TypeORM create():仅构造实体实例,这里原样返回浅拷贝 */
197
+ create(entityLike) {
198
+ return entityLike ? { ...entityLike } : {};
199
+ }
200
+ // ---------------- 原生 SQL / QueryBuilder ----------------
201
+ async query(sql, params) {
202
+ return (0, json_sql_ts_1.executeRawQuery)(sql, params, this.getSqlTable);
203
+ }
204
+ createQueryBuilder(alias) {
205
+ // 别名可省略(delete/update/insert 无别名形态,默认用表名)
206
+ return new json_query_builder_ts_1.JsonQueryBuilder(this.collection.tableName, alias ?? this.collection.tableName, this.getSqlTable);
207
+ }
208
+ // ---------------- 内部实现 ----------------
209
+ async selectRows(options) {
210
+ // 带 where 时先过滤再深拷贝(只克隆命中行),避免「全表深拷贝后再丢弃」的开销
211
+ let rows = options?.where
212
+ ? await this.collection.findWhere(r => (0, json_where_ts_1.matchesWhere)(r, options.where, this.meta))
213
+ : await this.collection.all();
214
+ rows = this.applyOrder(rows, options?.order);
215
+ rows = this.applyWindow(rows, options);
216
+ return this.applySelect(rows, options);
217
+ }
218
+ applyOrder(rows, order) {
219
+ if (!order || Object.keys(order).length === 0)
220
+ return rows;
221
+ const entries = Object.entries(order);
222
+ return [...rows].sort((a, b) => {
223
+ for (const [prop, dir] of entries) {
224
+ const cmp = compareLoose(a[prop], b[prop]);
225
+ if (cmp !== 0)
226
+ return dir === 'DESC' ? -cmp : cmp;
227
+ }
228
+ return 0;
229
+ });
230
+ }
231
+ applyWindow(rows, options) {
232
+ const skip = options?.skip ?? 0;
233
+ const take = options?.take;
234
+ let out = rows.slice(skip);
235
+ if (typeof take === 'number' && take >= 0)
236
+ out = out.slice(0, take);
237
+ return out;
238
+ }
239
+ applySelect(rows, options) {
240
+ if (!options?.select || options.select.length === 0)
241
+ return rows;
242
+ const pk = this.collection.primaryProperty;
243
+ const keep = new Set(options.select);
244
+ if (pk)
245
+ keep.add(pk);
246
+ return rows.map(r => {
247
+ const out = {};
248
+ for (const k of keep) {
249
+ if (k in r)
250
+ out[k] = r[k];
251
+ }
252
+ return out;
253
+ });
254
+ }
255
+ async selectByCriteria(criteria) {
256
+ if (criteria === null || criteria === undefined)
257
+ return [];
258
+ if (typeof criteria === 'number' || typeof criteria === 'string' || criteria instanceof Date) {
259
+ const row = await this.collection.get(criteria);
260
+ return row ? [row] : [];
261
+ }
262
+ if (typeof criteria === 'object') {
263
+ return (await this.collection.all()).filter(r => (0, json_where_ts_1.matchesWhere)(r, criteria, this.meta));
264
+ }
265
+ return [];
266
+ }
267
+ }
268
+ exports.JsonRepository = JsonRepository;
269
+ function stored0(row, prop) {
270
+ const v = row[prop];
271
+ return v === undefined || v === null || v === '';
272
+ }
273
+ function compareLoose(a, b) {
274
+ if (a === b)
275
+ return 0;
276
+ if (a === null || a === undefined)
277
+ return -1;
278
+ if (b === null || b === undefined)
279
+ return 1;
280
+ if (a instanceof Date || b instanceof Date) {
281
+ const ta = a instanceof Date ? a.getTime() : Date.parse(String(a));
282
+ const tb = b instanceof Date ? b.getTime() : Date.parse(String(b));
283
+ if (!Number.isNaN(ta) && !Number.isNaN(tb))
284
+ return ta < tb ? -1 : ta > tb ? 1 : 0;
285
+ }
286
+ const na = Number(a);
287
+ const nb = Number(b);
288
+ if (!Number.isNaN(na) && !Number.isNaN(nb))
289
+ return na < nb ? -1 : na > nb ? 1 : 0;
290
+ const sa = String(a);
291
+ const sb = String(b);
292
+ return sa < sb ? -1 : sa > sb ? 1 : 0;
293
+ }
294
+ /** 为 DataSource 垫片构造 Repository(表名解析 + 集合单例) */
295
+ function createJsonRepository(targetOrTable, getSqlTable) {
296
+ const table = typeof targetOrTable === 'string' ? getSqlTable(targetOrTable) : getSqlTable(entityTableName(targetOrTable));
297
+ if (!table) {
298
+ throw new Error(`[json-storage] 未知表:${typeof targetOrTable === 'string' ? targetOrTable : targetOrTable.name}`);
299
+ }
300
+ return new JsonRepository(table.meta, table.collection, getSqlTable);
301
+ }
302
+ function entityTableName(target) {
303
+ const meta = (0, json_entity_meta_ts_1.resolveEntityMeta)(target);
304
+ if (!meta) {
305
+ throw new Error(`[json-storage] 实体未注册 @Entity 或缺少表名:${target.name}`);
306
+ }
307
+ return meta.tableName;
308
+ }
309
+ //# sourceMappingURL=json-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-repository.js","sourceRoot":"","sources":["../../src/json-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * JSON 回退存储:SQL 表达式引擎(json-fallback-storage 规格)
3
+ *
4
+ * 供 json-sql.ts 共用的表达式 AST、递归下降解析与求值:
5
+ * - 优先级:OR → AND → NOT → 比较(= != < > <= >= IS [NOT] NULL、
6
+ * [NOT] IN、[NOT] LIKE、[NOT] BETWEEN)→ 加减(含 `NOW() ± INTERVAL n UNIT`)
7
+ * → 乘除模 → 一元 → 后缀(`col->'$.path'` / `->>`)
8
+ * - CASE [operand] WHEN ... THEN ... ELSE ... END、CAST(x AS type)
9
+ * - MySQL 函数:COALESCE/NULLIF/IF/IFNULL、JSON_EXTRACT/JSON_UNQUOTE、
10
+ * NOW/UNIX_TIMESTAMP/FROM_UNIXTIME/DATE_FORMAT/TIMESTAMPDIFF/DATEDIFF、
11
+ * ABS/ROUND/FLOOR/CEIL、CONCAT/LOWER/UPPER/LENGTH/SUBSTRING/TRIM、DATABASE
12
+ * - 聚合(SUM/COUNT/AVG/MIN/MAX,含 DISTINCT)在分组上下文中求值
13
+ *
14
+ * 未覆盖语法显式抛错(fail-loud)。
15
+ */
16
+ import { TokenCursor } from './json-where.js';
17
+ import type { JsonEntityMeta } from './json-entity-meta.js';
18
+ import type { JsonRow } from './json-collection.js';
19
+ export type Expr = {
20
+ kind: 'column';
21
+ alias?: string;
22
+ name: string;
23
+ } | {
24
+ kind: 'param';
25
+ name: string;
26
+ } | {
27
+ kind: 'literal';
28
+ value: unknown;
29
+ } | {
30
+ kind: 'star';
31
+ alias?: string;
32
+ } | {
33
+ kind: 'func';
34
+ name: string;
35
+ args: Expr[];
36
+ distinct?: boolean;
37
+ star?: boolean;
38
+ } | {
39
+ kind: 'binary';
40
+ op: string;
41
+ left: Expr;
42
+ right: Expr;
43
+ } | {
44
+ kind: 'unary';
45
+ op: string;
46
+ operand: Expr;
47
+ } | {
48
+ kind: 'case';
49
+ operand?: Expr;
50
+ whens: {
51
+ when: Expr;
52
+ then: Expr;
53
+ }[];
54
+ else?: Expr;
55
+ } | {
56
+ kind: 'cast';
57
+ operand: Expr;
58
+ type: string;
59
+ } | {
60
+ kind: 'jsonPath';
61
+ source: Expr;
62
+ path: string;
63
+ unquote: boolean;
64
+ } | {
65
+ kind: 'interval';
66
+ value: Expr;
67
+ unit: string;
68
+ } | {
69
+ kind: 'valuesCol';
70
+ column: string;
71
+ };
72
+ export interface AliasInfo {
73
+ alias: string;
74
+ meta: JsonEntityMeta | null;
75
+ }
76
+ export interface EvalContext {
77
+ named: Record<string, unknown>;
78
+ positional: unknown[];
79
+ pos: {
80
+ i: number;
81
+ };
82
+ aliases: AliasInfo[];
83
+ row: Record<string, JsonRow>;
84
+ /** 分组成员(聚合上下文;无 GROUP BY 的聚合为全表单组) */
85
+ groupRows?: Record<string, JsonRow>[];
86
+ /** SELECT 投影别名(ORDER BY / HAVING 引用) */
87
+ outer?: Record<string, unknown>;
88
+ /** ON DUPLICATE KEY UPDATE 的 VALUES(col) 新行(原始列名 → 值) */
89
+ valuesRow?: Record<string, unknown>;
90
+ }
91
+ export declare const AGG_FUNCS: Set<string>;
92
+ /** 表达式中是否含聚合函数 */
93
+ export declare function hasAggregate(e: Expr): boolean;
94
+ declare function parseExpr(c: TokenCursor): Expr;
95
+ export declare function truthy(v: unknown): boolean;
96
+ export declare function evalExpr(e: Expr, ctx: EvalContext): unknown;
97
+ export declare function toDate(v: unknown): Date | null;
98
+ /**
99
+ * MySQL datetime 文本(本地时区格式化)。
100
+ * 已知语义:落盘存储为 UTC ISO,此函数按进程本地时区格式化;仅当服务 TZ 与 MySQL 会话 TZ 一致时等价。
101
+ */
102
+ export declare function mysqlDatetime(d: Date): string;
103
+ /** JSON 路径取值:`$.a.b[0].c`;`[*]` 通配符收集为数组(MySQL JSON_EXTRACT 语义);缺失返回 null(SQL NULL) */
104
+ export declare function jsonPathGet(value: unknown, path: string): unknown;
105
+ export declare function jsonUnquote(v: unknown): unknown;
106
+ export { parseExpr };
107
+ //# sourceMappingURL=json-sql-expr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-sql-expr.d.ts","sourceRoot":"","sources":["../../src/json-sql-expr.ts"],"names":[],"mappings":"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"}