@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,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,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -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"}