@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.
- package/README.md +154 -0
- package/dist/cjs/index.d.ts +25 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +66 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/json-backend-fs.d.ts +26 -0
- package/dist/cjs/json-backend-fs.d.ts.map +1 -0
- package/dist/cjs/json-backend-fs.js +278 -0
- package/dist/cjs/json-backend-fs.js.map +1 -0
- package/dist/cjs/json-collection.d.ts +70 -0
- package/dist/cjs/json-collection.d.ts.map +1 -0
- package/dist/cjs/json-collection.js +385 -0
- package/dist/cjs/json-collection.js.map +1 -0
- package/dist/cjs/json-config.d.ts +87 -0
- package/dist/cjs/json-config.d.ts.map +1 -0
- package/dist/cjs/json-config.js +77 -0
- package/dist/cjs/json-config.js.map +1 -0
- package/dist/cjs/json-datasource.d.ts +35 -0
- package/dist/cjs/json-datasource.d.ts.map +1 -0
- package/dist/cjs/json-datasource.js +131 -0
- package/dist/cjs/json-datasource.js.map +1 -0
- package/dist/cjs/json-entity-meta.d.ts +42 -0
- package/dist/cjs/json-entity-meta.d.ts.map +1 -0
- package/dist/cjs/json-entity-meta.js +128 -0
- package/dist/cjs/json-entity-meta.js.map +1 -0
- package/dist/cjs/json-query-builder.d.ts +83 -0
- package/dist/cjs/json-query-builder.d.ts.map +1 -0
- package/dist/cjs/json-query-builder.js +477 -0
- package/dist/cjs/json-query-builder.js.map +1 -0
- package/dist/cjs/json-repository.d.ts +59 -0
- package/dist/cjs/json-repository.d.ts.map +1 -0
- package/dist/cjs/json-repository.js +309 -0
- package/dist/cjs/json-repository.js.map +1 -0
- package/dist/cjs/json-sql-expr.d.ts +107 -0
- package/dist/cjs/json-sql-expr.d.ts.map +1 -0
- package/dist/cjs/json-sql-expr.js +857 -0
- package/dist/cjs/json-sql-expr.js.map +1 -0
- package/dist/cjs/json-sql-select.d.ts +9 -0
- package/dist/cjs/json-sql-select.d.ts.map +1 -0
- package/dist/cjs/json-sql-select.js +434 -0
- package/dist/cjs/json-sql-select.js.map +1 -0
- package/dist/cjs/json-sql-shared.d.ts +16 -0
- package/dist/cjs/json-sql-shared.d.ts.map +1 -0
- package/dist/cjs/json-sql-shared.js +12 -0
- package/dist/cjs/json-sql-shared.js.map +1 -0
- package/dist/cjs/json-sql.d.ts +8 -0
- package/dist/cjs/json-sql.d.ts.map +1 -0
- package/dist/cjs/json-sql.js +322 -0
- package/dist/cjs/json-sql.js.map +1 -0
- package/dist/cjs/json-where.d.ts +54 -0
- package/dist/cjs/json-where.d.ts.map +1 -0
- package/dist/cjs/json-where.js +352 -0
- package/dist/cjs/json-where.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/esm/index.d.ts +25 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +26 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/json-backend-fs.d.ts +26 -0
- package/dist/esm/json-backend-fs.d.ts.map +1 -0
- package/dist/esm/json-backend-fs.js +241 -0
- package/dist/esm/json-backend-fs.js.map +1 -0
- package/dist/esm/json-collection.d.ts +70 -0
- package/dist/esm/json-collection.d.ts.map +1 -0
- package/dist/esm/json-collection.js +346 -0
- package/dist/esm/json-collection.js.map +1 -0
- package/dist/esm/json-config.d.ts +87 -0
- package/dist/esm/json-config.d.ts.map +1 -0
- package/dist/esm/json-config.js +69 -0
- package/dist/esm/json-config.js.map +1 -0
- package/dist/esm/json-datasource.d.ts +35 -0
- package/dist/esm/json-datasource.d.ts.map +1 -0
- package/dist/esm/json-datasource.js +123 -0
- package/dist/esm/json-datasource.js.map +1 -0
- package/dist/esm/json-entity-meta.d.ts +42 -0
- package/dist/esm/json-entity-meta.d.ts.map +1 -0
- package/dist/esm/json-entity-meta.js +120 -0
- package/dist/esm/json-entity-meta.js.map +1 -0
- package/dist/esm/json-query-builder.d.ts +83 -0
- package/dist/esm/json-query-builder.d.ts.map +1 -0
- package/dist/esm/json-query-builder.js +473 -0
- package/dist/esm/json-query-builder.js.map +1 -0
- package/dist/esm/json-repository.d.ts +59 -0
- package/dist/esm/json-repository.d.ts.map +1 -0
- package/dist/esm/json-repository.js +304 -0
- package/dist/esm/json-repository.js.map +1 -0
- package/dist/esm/json-sql-expr.d.ts +107 -0
- package/dist/esm/json-sql-expr.d.ts.map +1 -0
- package/dist/esm/json-sql-expr.js +847 -0
- package/dist/esm/json-sql-expr.js.map +1 -0
- package/dist/esm/json-sql-select.d.ts +9 -0
- package/dist/esm/json-sql-select.d.ts.map +1 -0
- package/dist/esm/json-sql-select.js +429 -0
- package/dist/esm/json-sql-select.js.map +1 -0
- package/dist/esm/json-sql-shared.d.ts +16 -0
- package/dist/esm/json-sql-shared.d.ts.map +1 -0
- package/dist/esm/json-sql-shared.js +9 -0
- package/dist/esm/json-sql-shared.js.map +1 -0
- package/dist/esm/json-sql.d.ts +8 -0
- package/dist/esm/json-sql.d.ts.map +1 -0
- package/dist/esm/json-sql.js +319 -0
- package/dist/esm/json-sql.js.map +1 -0
- package/dist/esm/json-where.d.ts +54 -0
- package/dist/esm/json-where.d.ts.map +1 -0
- package/dist/esm/json-where.js +342 -0
- package/dist/esm/json-where.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/examples/01-basic-entity.ts +89 -0
- package/examples/02-query-builder.ts +114 -0
- package/examples/03-raw-sql.ts +105 -0
- package/examples/04-non-entity-table.ts +70 -0
- package/examples/05-custom-backend.ts +145 -0
- package/examples/06-find-operators.ts +75 -0
- package/examples/README.md +73 -0
- package/examples/tsconfig.json +20 -0
- package/package.json +53 -0
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TokenCursor = void 0;
|
|
4
|
+
exports.isFindOperator = isFindOperator;
|
|
5
|
+
exports.tokenizeSql = tokenizeSql;
|
|
6
|
+
exports.compareValues = compareValues;
|
|
7
|
+
exports.likeMatch = likeMatch;
|
|
8
|
+
exports.looseEqual = looseEqual;
|
|
9
|
+
exports.matchesWhere = matchesWhere;
|
|
10
|
+
/**
|
|
11
|
+
* 跨 typeorm 多副本安全的 FindOperator 判定。
|
|
12
|
+
* 本包与消费方(如 app/work-space)常因 pnpm 解析到不同 typeorm 副本,
|
|
13
|
+
* 导致 `instanceof FindOperator` 跨模块实例失效;改用运行时类名鸭子类型检测,
|
|
14
|
+
* 避免把 FindOperator 误判为普通值。
|
|
15
|
+
*/
|
|
16
|
+
function isFindOperator(value) {
|
|
17
|
+
return (value != null &&
|
|
18
|
+
typeof value === 'object' &&
|
|
19
|
+
!Array.isArray(value) &&
|
|
20
|
+
value.constructor?.name === 'FindOperator' &&
|
|
21
|
+
typeof value.type === 'string');
|
|
22
|
+
}
|
|
23
|
+
// 按长度降序:确保 `->>` 不被 `->` 抢先切分(否则 `->>` 永不可达且解析抛错)
|
|
24
|
+
const MULTI_OPS = ['>=', '<=', '<>', '!=', '->>', '->'];
|
|
25
|
+
const SINGLE_OPS = '=<>+-*/%';
|
|
26
|
+
function tokenizeSql(sql) {
|
|
27
|
+
const tokens = [];
|
|
28
|
+
let i = 0;
|
|
29
|
+
while (i < sql.length) {
|
|
30
|
+
const ch = sql[i];
|
|
31
|
+
if (/\s/.test(ch)) {
|
|
32
|
+
i += 1;
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
// 行注释
|
|
36
|
+
if (ch === '-' && sql[i + 1] === '-') {
|
|
37
|
+
while (i < sql.length && sql[i] !== '\n')
|
|
38
|
+
i += 1;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
// 字符串(单引号,'' 转义)与双引号字符串
|
|
42
|
+
if (ch === "'" || ch === '"') {
|
|
43
|
+
const quote = ch;
|
|
44
|
+
let v = '';
|
|
45
|
+
i += 1;
|
|
46
|
+
while (i < sql.length) {
|
|
47
|
+
if (sql[i] === quote) {
|
|
48
|
+
if (sql[i + 1] === quote) {
|
|
49
|
+
v += quote;
|
|
50
|
+
i += 2;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
i += 1;
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
v += sql[i];
|
|
57
|
+
i += 1;
|
|
58
|
+
}
|
|
59
|
+
tokens.push({ type: 'string', value: v, pos: i });
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
// 反引号标识符
|
|
63
|
+
if (ch === '`') {
|
|
64
|
+
const end = sql.indexOf('`', i + 1);
|
|
65
|
+
if (end < 0)
|
|
66
|
+
throw new Error(`[json-storage] SQL 分词失败:未闭合的反引号(${sql.slice(i, i + 20)}…)`);
|
|
67
|
+
tokens.push({ type: 'ident', value: sql.slice(i + 1, end), pos: i });
|
|
68
|
+
i = end + 1;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
// 命名参数 :name / 展开参数 :...name
|
|
72
|
+
if (ch === ':') {
|
|
73
|
+
let j = i + 1;
|
|
74
|
+
let spread = false;
|
|
75
|
+
if (sql.slice(j, j + 3) === '...') {
|
|
76
|
+
spread = true;
|
|
77
|
+
j += 3;
|
|
78
|
+
}
|
|
79
|
+
let name = '';
|
|
80
|
+
while (j < sql.length && /[A-Za-z0-9_$]/.test(sql[j])) {
|
|
81
|
+
name += sql[j];
|
|
82
|
+
j += 1;
|
|
83
|
+
}
|
|
84
|
+
if (!name)
|
|
85
|
+
throw new Error(`[json-storage] SQL 分词失败:非法参数占位符(位置 ${i})`);
|
|
86
|
+
tokens.push({ type: 'param', value: spread ? `...${name}` : name, pos: i });
|
|
87
|
+
i = j;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (ch === '?') {
|
|
91
|
+
tokens.push({ type: 'qmark', value: '?', pos: i });
|
|
92
|
+
i += 1;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (/[0-9]/.test(ch)) {
|
|
96
|
+
let v = '';
|
|
97
|
+
while (i < sql.length && /[0-9.]/.test(sql[i])) {
|
|
98
|
+
v += sql[i];
|
|
99
|
+
i += 1;
|
|
100
|
+
}
|
|
101
|
+
tokens.push({ type: 'number', value: v, pos: i });
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (/[A-Za-z_$]/.test(ch)) {
|
|
105
|
+
let v = '';
|
|
106
|
+
while (i < sql.length && /[A-Za-z0-9_$]/.test(sql[i])) {
|
|
107
|
+
v += sql[i];
|
|
108
|
+
i += 1;
|
|
109
|
+
}
|
|
110
|
+
tokens.push({ type: 'ident', value: v, pos: i });
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const two = sql.slice(i, i + 3);
|
|
114
|
+
const multi = MULTI_OPS.find(op => two.startsWith(op));
|
|
115
|
+
if (multi) {
|
|
116
|
+
tokens.push({ type: 'op', value: multi, pos: i });
|
|
117
|
+
i += multi.length;
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (SINGLE_OPS.includes(ch)) {
|
|
121
|
+
tokens.push({ type: 'op', value: ch, pos: i });
|
|
122
|
+
i += 1;
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (ch === '(') {
|
|
126
|
+
tokens.push({ type: 'lparen', value: ch, pos: i });
|
|
127
|
+
i += 1;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (ch === ')') {
|
|
131
|
+
tokens.push({ type: 'rparen', value: ch, pos: i });
|
|
132
|
+
i += 1;
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (ch === ',') {
|
|
136
|
+
tokens.push({ type: 'comma', value: ch, pos: i });
|
|
137
|
+
i += 1;
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (ch === '.') {
|
|
141
|
+
tokens.push({ type: 'dot', value: ch, pos: i });
|
|
142
|
+
i += 1;
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
throw new Error(`[json-storage] SQL 分词失败:不支持的字符 "${ch}"(位置 ${i})`);
|
|
146
|
+
}
|
|
147
|
+
tokens.push({ type: 'eof', value: '', pos: sql.length });
|
|
148
|
+
return tokens;
|
|
149
|
+
}
|
|
150
|
+
/** 分词游标(供条件/表达式解析共用) */
|
|
151
|
+
class TokenCursor {
|
|
152
|
+
tokens;
|
|
153
|
+
idx = 0;
|
|
154
|
+
constructor(tokens) {
|
|
155
|
+
this.tokens = tokens;
|
|
156
|
+
}
|
|
157
|
+
peek(offset = 0) {
|
|
158
|
+
return this.tokens[Math.min(this.idx + offset, this.tokens.length - 1)];
|
|
159
|
+
}
|
|
160
|
+
next() {
|
|
161
|
+
const t = this.tokens[this.idx];
|
|
162
|
+
if (t.type !== 'eof')
|
|
163
|
+
this.idx += 1;
|
|
164
|
+
return t;
|
|
165
|
+
}
|
|
166
|
+
/** 当前 ident 是否关键字(大小写不敏感) */
|
|
167
|
+
isKeyword(word, offset = 0) {
|
|
168
|
+
const t = this.peek(offset);
|
|
169
|
+
return t.type === 'ident' && t.value.toUpperCase() === word;
|
|
170
|
+
}
|
|
171
|
+
expectKeyword(word) {
|
|
172
|
+
if (!this.isKeyword(word)) {
|
|
173
|
+
throw new Error(`[json-storage] 解析失败:期望 ${word},实际 "${this.peek().value || this.peek().type}"`);
|
|
174
|
+
}
|
|
175
|
+
this.next();
|
|
176
|
+
}
|
|
177
|
+
expect(type, value) {
|
|
178
|
+
const t = this.peek();
|
|
179
|
+
if (t.type !== type || (value !== undefined && t.value !== value)) {
|
|
180
|
+
throw new Error(`[json-storage] 解析失败:期望 ${value ?? type},实际 "${t.value || t.type}"`);
|
|
181
|
+
}
|
|
182
|
+
return this.next();
|
|
183
|
+
}
|
|
184
|
+
atEnd() {
|
|
185
|
+
return this.peek().type === 'eof';
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
exports.TokenCursor = TokenCursor;
|
|
189
|
+
// ---------------- 值比较 / LIKE ----------------
|
|
190
|
+
/** 稳健比较:数字按数值、日期按时间戳、字符串按字典序;类型不可比时按字符串 */
|
|
191
|
+
function compareValues(a, b) {
|
|
192
|
+
// 任一侧为 Date:统一换算为时间戳比较(字符串先尝试 Date.parse,兼容 MySQL datetime 文本)
|
|
193
|
+
if (a instanceof Date || b instanceof Date) {
|
|
194
|
+
const ta = dateToTs(a);
|
|
195
|
+
const tb = dateToTs(b);
|
|
196
|
+
if (ta !== null && tb !== null)
|
|
197
|
+
return ta < tb ? -1 : ta > tb ? 1 : 0;
|
|
198
|
+
}
|
|
199
|
+
const na = toNumber(a);
|
|
200
|
+
const nb = toNumber(b);
|
|
201
|
+
if (na !== null && nb !== null) {
|
|
202
|
+
return na < nb ? -1 : na > nb ? 1 : 0;
|
|
203
|
+
}
|
|
204
|
+
const sa = String(a ?? '');
|
|
205
|
+
const sb = String(b ?? '');
|
|
206
|
+
return sa < sb ? -1 : sa > sb ? 1 : 0;
|
|
207
|
+
}
|
|
208
|
+
function dateToTs(v) {
|
|
209
|
+
if (v instanceof Date)
|
|
210
|
+
return Number.isNaN(v.getTime()) ? null : v.getTime();
|
|
211
|
+
if (typeof v === 'number')
|
|
212
|
+
return v;
|
|
213
|
+
if (typeof v === 'string' && v.trim() !== '') {
|
|
214
|
+
const t = Date.parse(v.replace(' ', 'T'));
|
|
215
|
+
return Number.isNaN(t) ? null : t;
|
|
216
|
+
}
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
function toNumber(v) {
|
|
220
|
+
if (typeof v === 'number')
|
|
221
|
+
return v;
|
|
222
|
+
if (typeof v === 'boolean')
|
|
223
|
+
return v ? 1 : 0;
|
|
224
|
+
if (v instanceof Date)
|
|
225
|
+
return v.getTime();
|
|
226
|
+
if (typeof v === 'string' && v.trim() !== '' && !Number.isNaN(Number(v)))
|
|
227
|
+
return Number(v);
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
/** SQL LIKE:`%` 任意串、`_` 单字符 */
|
|
231
|
+
function likeMatch(input, pattern) {
|
|
232
|
+
const escaped = pattern
|
|
233
|
+
.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
|
|
234
|
+
.replace(/%/g, '.*')
|
|
235
|
+
.replace(/_/g, '.');
|
|
236
|
+
// 转义已覆盖全部正则元字符,构造不会失败;不再保留「去 % 后子串包含」的误判兜底
|
|
237
|
+
return new RegExp(`^${escaped}$`, 'is').test(input);
|
|
238
|
+
}
|
|
239
|
+
/** 宽松等值(Date/ISO 字符串、数字/字符串数字) */
|
|
240
|
+
function looseEqual(a, b) {
|
|
241
|
+
if (a === b)
|
|
242
|
+
return true;
|
|
243
|
+
if (a === null || a === undefined || b === null || b === undefined)
|
|
244
|
+
return false;
|
|
245
|
+
if (a instanceof Date || b instanceof Date) {
|
|
246
|
+
const ta = a instanceof Date ? a.getTime() : Date.parse(String(a));
|
|
247
|
+
const tb = b instanceof Date ? b.getTime() : Date.parse(String(b));
|
|
248
|
+
return ta === tb && !Number.isNaN(ta);
|
|
249
|
+
}
|
|
250
|
+
const na = toNumber(a);
|
|
251
|
+
const nb = toNumber(b);
|
|
252
|
+
if (na !== null && nb !== null)
|
|
253
|
+
return na === nb;
|
|
254
|
+
// 对象/数组不得退化为 String() 比较:任意两个 {} 会得到 '[object Object]' 而误判相等,
|
|
255
|
+
// 使 upsert 冲突检测与唯一索引匹配把不相关的行判为冲突并错误合并到首行
|
|
256
|
+
if (typeof a === 'object' || typeof b === 'object')
|
|
257
|
+
return deepEqual(a, b);
|
|
258
|
+
return String(a) === String(b);
|
|
259
|
+
}
|
|
260
|
+
/** 结构化深比较(供 looseEqual 对对象/数组值使用) */
|
|
261
|
+
function deepEqual(a, b) {
|
|
262
|
+
if (a === b)
|
|
263
|
+
return true;
|
|
264
|
+
if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null)
|
|
265
|
+
return false;
|
|
266
|
+
if (Array.isArray(a) !== Array.isArray(b))
|
|
267
|
+
return false;
|
|
268
|
+
if (Array.isArray(a) && Array.isArray(b)) {
|
|
269
|
+
return a.length === b.length && a.every((v, i) => deepEqual(v, b[i]));
|
|
270
|
+
}
|
|
271
|
+
const ra = a;
|
|
272
|
+
const rb = b;
|
|
273
|
+
const ka = Object.keys(ra);
|
|
274
|
+
const kb = Object.keys(rb);
|
|
275
|
+
if (ka.length !== kb.length)
|
|
276
|
+
return false;
|
|
277
|
+
return ka.every(k => k in rb && deepEqual(ra[k], rb[k]));
|
|
278
|
+
}
|
|
279
|
+
// ---------------- FindOptionsWhere 对象匹配 ----------------
|
|
280
|
+
/**
|
|
281
|
+
* 匹配 FindOptionsWhere(对象或对象数组=OR)。
|
|
282
|
+
* 键为属性名(若为数据库列名则经 meta 映射),值支持原始值与 FindOperator。
|
|
283
|
+
*/
|
|
284
|
+
function matchesWhere(row, where, meta) {
|
|
285
|
+
if (where === null || where === undefined)
|
|
286
|
+
return true;
|
|
287
|
+
if (Array.isArray(where))
|
|
288
|
+
return where.some(w => matchesWhere(row, w, meta));
|
|
289
|
+
if (typeof where !== 'object') {
|
|
290
|
+
throw new Error(`[json-storage] 不支持的 where 形式:${JSON.stringify(where)}`);
|
|
291
|
+
}
|
|
292
|
+
for (const [key, expected] of Object.entries(where)) {
|
|
293
|
+
const prop = meta?.columnByDbName.get(key) ?? key;
|
|
294
|
+
const actual = row[prop];
|
|
295
|
+
if (isFindOperator(expected)) {
|
|
296
|
+
if (!evalFindOperator(expected, actual))
|
|
297
|
+
return false;
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
if (expected !== null && expected !== undefined && typeof expected === 'object' && !(expected instanceof Date)) {
|
|
301
|
+
throw new Error(`[json-storage] 不支持的 where 嵌套对象(属性 ${key})——JSON 回退模式暂不支持关系嵌套查询`);
|
|
302
|
+
}
|
|
303
|
+
if (expected === null || expected === undefined) {
|
|
304
|
+
if (actual !== null && actual !== undefined)
|
|
305
|
+
return false;
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
if (!looseEqual(actual, expected))
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
return true;
|
|
312
|
+
}
|
|
313
|
+
function evalFindOperator(op, actual) {
|
|
314
|
+
const type = op.type;
|
|
315
|
+
const child = op.child;
|
|
316
|
+
switch (type) {
|
|
317
|
+
case 'equal':
|
|
318
|
+
return looseEqual(actual, op.value);
|
|
319
|
+
case 'not':
|
|
320
|
+
if (child)
|
|
321
|
+
return !evalFindOperator(child, actual);
|
|
322
|
+
return !looseEqual(actual, op.value);
|
|
323
|
+
case 'like':
|
|
324
|
+
return likeMatch(String(actual ?? ''), String(op.value ?? ''));
|
|
325
|
+
case 'ilike':
|
|
326
|
+
return likeMatch(String(actual ?? '').toLowerCase(), String(op.value ?? '').toLowerCase());
|
|
327
|
+
case 'in':
|
|
328
|
+
case 'any': {
|
|
329
|
+
const arr = Array.isArray(op.value) ? op.value : [op.value];
|
|
330
|
+
return arr.some(v => looseEqual(actual, v));
|
|
331
|
+
}
|
|
332
|
+
case 'between': {
|
|
333
|
+
const arr = Array.isArray(op.value) ? op.value : [op.value];
|
|
334
|
+
return compareValues(actual, arr[0]) >= 0 && compareValues(actual, arr[1]) <= 0;
|
|
335
|
+
}
|
|
336
|
+
case 'lessThan':
|
|
337
|
+
return actual !== null && actual !== undefined && compareValues(actual, op.value) < 0;
|
|
338
|
+
case 'lessThanOrEqual':
|
|
339
|
+
return actual !== null && actual !== undefined && compareValues(actual, op.value) <= 0;
|
|
340
|
+
case 'moreThan':
|
|
341
|
+
return actual !== null && actual !== undefined && compareValues(actual, op.value) > 0;
|
|
342
|
+
case 'moreThanOrEqual':
|
|
343
|
+
return actual !== null && actual !== undefined && compareValues(actual, op.value) >= 0;
|
|
344
|
+
case 'isNull':
|
|
345
|
+
return actual === null || actual === undefined;
|
|
346
|
+
case 'raw':
|
|
347
|
+
throw new Error('[json-storage] Raw() 操作符在 JSON 回退模式不受支持(fail-loud)');
|
|
348
|
+
default:
|
|
349
|
+
throw new Error(`[json-storage] 不支持的 FindOperator 类型:${type}`);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=json-where.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-where.js","sourceRoot":"","sources":["../../src/json-where.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @cicctencent/json-orm 公开 API
|
|
3
|
+
*
|
|
4
|
+
* TypeORM 兼容的 JSON 文件存储引擎(框架无关、业务解耦):
|
|
5
|
+
* 使用前须先经 `configureJsonStorage()` 注入存储根目录(与非实体表注册),
|
|
6
|
+
* 详见 README。
|
|
7
|
+
*/
|
|
8
|
+
export { configureJsonStorage, resetJsonStorageForTest } from './json-config.js';
|
|
9
|
+
export type { JsonStorageOptions, NonEntityTableInfo, JsonStorageBackend, JsonStorageFileStat } from './json-config.js';
|
|
10
|
+
export { FsStorageBackend } from './json-backend-fs.js';
|
|
11
|
+
export { JsonDataSource, JsonEntityManager, getJsonDataSource, resetJsonDataSourceForTest, sqlTableFor, } from './json-datasource.js';
|
|
12
|
+
export { JsonRepository, createJsonRepository } from './json-repository.js';
|
|
13
|
+
export type { FindOptionsLoose } from './json-repository.js';
|
|
14
|
+
export { JsonQueryBuilder } from './json-query-builder.js';
|
|
15
|
+
export { executeRawQuery } from './json-sql.js';
|
|
16
|
+
export { toParams } from './json-sql-shared.js';
|
|
17
|
+
export type { SqlTable, GetSqlTable } from './json-sql-shared.js';
|
|
18
|
+
export { JsonCollection, getCollection, resetCollectionsForTest } from './json-collection.js';
|
|
19
|
+
export type { JsonRow } from './json-collection.js';
|
|
20
|
+
export { resolveEntityMeta, resolveEntityMetaByTable, isNonEntityTable, getNonEntityPrimaryColumn, getNonEntityUniqueColumns, listNonEntityTables, } from './json-entity-meta.js';
|
|
21
|
+
export type { JsonEntityMeta, JsonEntityColumn } from './json-entity-meta.js';
|
|
22
|
+
export { tokenizeSql, TokenCursor, matchesWhere, looseEqual, compareValues, likeMatch, } from './json-where.js';
|
|
23
|
+
export { parseExpr, evalExpr, truthy, hasAggregate, AGG_FUNCS, jsonPathGet, jsonUnquote, toDate, mysqlDatetime, } from './json-sql-expr.js';
|
|
24
|
+
export type { Expr, EvalContext, AliasInfo } from './json-sql-expr.js';
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AACjF,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACxH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,0BAA0B,EAC1B,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGlE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC9F,YAAY,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,gBAAgB,EAChB,yBAAyB,EACzB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG9E,OAAO,EACL,WAAW,EACX,WAAW,EACX,YAAY,EACZ,UAAU,EACV,aAAa,EACb,SAAS,GACV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,SAAS,EACT,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,SAAS,EACT,WAAW,EACX,WAAW,EACX,MAAM,EACN,aAAa,GACd,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @cicctencent/json-orm 公开 API
|
|
3
|
+
*
|
|
4
|
+
* TypeORM 兼容的 JSON 文件存储引擎(框架无关、业务解耦):
|
|
5
|
+
* 使用前须先经 `configureJsonStorage()` 注入存储根目录(与非实体表注册),
|
|
6
|
+
* 详见 README。
|
|
7
|
+
*/
|
|
8
|
+
// 配置注入
|
|
9
|
+
export { configureJsonStorage, resetJsonStorageForTest } from "./json-config.js";
|
|
10
|
+
export { FsStorageBackend } from "./json-backend-fs.js";
|
|
11
|
+
// 数据源
|
|
12
|
+
export { JsonDataSource, JsonEntityManager, getJsonDataSource, resetJsonDataSourceForTest, sqlTableFor, } from "./json-datasource.js";
|
|
13
|
+
// 仓库
|
|
14
|
+
export { JsonRepository, createJsonRepository } from "./json-repository.js";
|
|
15
|
+
// 查询构造与原始 SQL
|
|
16
|
+
export { JsonQueryBuilder } from "./json-query-builder.js";
|
|
17
|
+
export { executeRawQuery } from "./json-sql.js";
|
|
18
|
+
export { toParams } from "./json-sql-shared.js";
|
|
19
|
+
// 集合
|
|
20
|
+
export { JsonCollection, getCollection, resetCollectionsForTest } from "./json-collection.js";
|
|
21
|
+
// 实体元数据
|
|
22
|
+
export { resolveEntityMeta, resolveEntityMetaByTable, isNonEntityTable, getNonEntityPrimaryColumn, getNonEntityUniqueColumns, listNonEntityTables, } from "./json-entity-meta.js";
|
|
23
|
+
// SQL 词法与表达式工具
|
|
24
|
+
export { tokenizeSql, TokenCursor, matchesWhere, looseEqual, compareValues, likeMatch, } from "./json-where.js";
|
|
25
|
+
export { parseExpr, evalExpr, truthy, hasAggregate, AGG_FUNCS, jsonPathGet, jsonUnquote, toDate, mysqlDatetime, } from "./json-sql-expr.js";
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO;AACP,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAEjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM;AACN,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,0BAA0B,EAC1B,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAE9B,KAAK;AACL,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAG5E,cAAc;AACd,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD,KAAK;AACL,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAG9F,QAAQ;AACR,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,gBAAgB,EAChB,yBAAyB,EACzB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAG/B,eAAe;AACf,OAAO,EACL,WAAW,EACX,WAAW,EACX,YAAY,EACZ,UAAU,EACV,aAAa,EACb,SAAS,GACV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,SAAS,EACT,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,SAAS,EACT,WAAW,EACX,WAAW,EACX,MAAM,EACN,aAAa,GACd,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { JsonStorageBackend, JsonStorageFileStat } from './json-config.js';
|
|
2
|
+
export interface FsStorageBackendOptions {
|
|
3
|
+
/** 获取锁的总等待超时(ms),超时抛错;默认 5000 */
|
|
4
|
+
lockTimeoutMs?: number;
|
|
5
|
+
/** 锁文件 mtime 超过该阈值(ms)视为孤儿锁(持有者崩溃),强制回收;默认 30000 */
|
|
6
|
+
lockStaleMs?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare class FsStorageBackend implements JsonStorageBackend {
|
|
9
|
+
private readonly rootDir;
|
|
10
|
+
private readonly lockTimeoutMs;
|
|
11
|
+
private readonly lockStaleMs;
|
|
12
|
+
constructor(rootDir: string, options?: FsStorageBackendOptions);
|
|
13
|
+
private resolve;
|
|
14
|
+
readFile(relPath: string): Promise<string | null>;
|
|
15
|
+
writeFileAtomic(relPath: string, data: string): Promise<void>;
|
|
16
|
+
readDir(relPath: string): Promise<string[]>;
|
|
17
|
+
deleteFile(relPath: string): Promise<void>;
|
|
18
|
+
mkdir(relPath: string): Promise<void>;
|
|
19
|
+
stat(relPath: string): Promise<JsonStorageFileStat | null>;
|
|
20
|
+
withLock<T>(relPath: string, fn: () => Promise<T>): Promise<T>;
|
|
21
|
+
/** 释放锁:仅当锁内容中的令牌与本进程一致时删除(否则锁已被回收并被他人持有) */
|
|
22
|
+
private releaseLock;
|
|
23
|
+
nextId(relPath: string, key: string): Promise<number>;
|
|
24
|
+
ensureSeqAtLeast(relPath: string, key: string, value: number): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=json-backend-fs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-backend-fs.d.ts","sourceRoot":"","sources":["../../src/json-backend-fs.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEhF,MAAM,WAAW,uBAAuB;IACtC,iCAAiC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAgBD,qBAAa,gBAAiB,YAAW,kBAAkB;IAI7C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAER,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB;IAK/E,OAAO,CAAC,OAAO;IAOT,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IASjD,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4B7D,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAS3C,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB1C,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAU1D,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAsDpE,4CAA4C;YAC9B,WAAW;IAgBnB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBrD,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAkBnF"}
|