@aiao/rxdb-adapter-sqlite 0.0.4 → 0.0.6

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 (111) hide show
  1. package/dist/RxDBAdapterSqlite.d.ts +41 -20
  2. package/dist/RxDBAdapterSqlite.d.ts.map +1 -1
  3. package/dist/SqliteClient.d.ts +14 -9
  4. package/dist/SqliteClient.d.ts.map +1 -1
  5. package/dist/entity/delete_sql.d.ts +10 -0
  6. package/dist/entity/delete_sql.d.ts.map +1 -0
  7. package/dist/entity/deletes_sql.d.ts +7 -0
  8. package/dist/entity/deletes_sql.d.ts.map +1 -0
  9. package/dist/entity/insert_sql.d.ts +8 -0
  10. package/dist/entity/insert_sql.d.ts.map +1 -0
  11. package/dist/{generate_entity_inserts_sql.d.ts → entity/inserts_sql.d.ts} +2 -2
  12. package/dist/entity/inserts_sql.d.ts.map +1 -0
  13. package/dist/entity/remove_many_sql.d.ts +8 -0
  14. package/dist/entity/remove_many_sql.d.ts.map +1 -0
  15. package/dist/{rxdb_adapter_save_many.d.ts → entity/save_many_sql.d.ts} +3 -3
  16. package/dist/entity/save_many_sql.d.ts.map +1 -0
  17. package/dist/entity/update_sql.d.ts +8 -0
  18. package/dist/entity/update_sql.d.ts.map +1 -0
  19. package/dist/{execute_statement_helper.d.ts → execute_helper.d.ts} +2 -2
  20. package/dist/execute_helper.d.ts.map +1 -0
  21. package/dist/index.d.ts +1 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +1022 -1336
  24. package/dist/query/count_sql.d.ts +9 -0
  25. package/dist/query/count_sql.d.ts.map +1 -0
  26. package/dist/query/find_by_row_ids_sql.d.ts +9 -0
  27. package/dist/query/find_by_row_ids_sql.d.ts.map +1 -0
  28. package/dist/query/find_sql.d.ts +9 -0
  29. package/dist/query/find_sql.d.ts.map +1 -0
  30. package/dist/query/join_sql.d.ts +34 -0
  31. package/dist/query/join_sql.d.ts.map +1 -0
  32. package/dist/query/query_sql.d.ts +47 -0
  33. package/dist/query/query_sql.d.ts.map +1 -0
  34. package/dist/query/query_sql.utils.d.ts +50 -0
  35. package/dist/query/query_sql.utils.d.ts.map +1 -0
  36. package/dist/query/query_tree_sql.d.ts +35 -0
  37. package/dist/query/query_tree_sql.d.ts.map +1 -0
  38. package/dist/repository/SqliteRepository.d.ts +13 -0
  39. package/dist/repository/SqliteRepository.d.ts.map +1 -0
  40. package/dist/repository/SqliteRepositoryBase.d.ts +19 -0
  41. package/dist/repository/SqliteRepositoryBase.d.ts.map +1 -0
  42. package/dist/repository/SqliteTreeRepository.d.ts +12 -0
  43. package/dist/repository/SqliteTreeRepository.d.ts.map +1 -0
  44. package/dist/rxdb_adapter_switch_branch.d.ts.map +1 -1
  45. package/dist/rxdb_adapter_switch_transaction_id.d.ts +5 -0
  46. package/dist/rxdb_adapter_switch_transaction_id.d.ts.map +1 -0
  47. package/dist/rxdb_create_sqlite_client.d.ts +5 -0
  48. package/dist/rxdb_create_sqlite_client.d.ts.map +1 -0
  49. package/dist/sqlite-load.utils.d.ts +1 -1
  50. package/dist/sqlite-load.utils.d.ts.map +1 -1
  51. package/dist/sqlite.interface.d.ts +35 -8
  52. package/dist/sqlite.interface.d.ts.map +1 -1
  53. package/dist/sqlite.utils.d.ts +16 -15
  54. package/dist/sqlite.utils.d.ts.map +1 -1
  55. package/dist/table/create_sql.d.ts +8 -0
  56. package/dist/table/create_sql.d.ts.map +1 -0
  57. package/dist/table/create_tables_sql.d.ts +5 -0
  58. package/dist/table/create_tables_sql.d.ts.map +1 -0
  59. package/dist/table/trigger_sql.d.ts +25 -0
  60. package/dist/table/trigger_sql.d.ts.map +1 -0
  61. package/dist/{wa-sqlite.d.ts → wa-sqlite.interface.d.ts} +1 -1
  62. package/dist/wa-sqlite.interface.d.ts.map +1 -0
  63. package/package.json +4 -4
  64. package/dist/SqliteRepository.d.ts +0 -27
  65. package/dist/SqliteRepository.d.ts.map +0 -1
  66. package/dist/SqliteRepository.interface.d.ts +0 -94
  67. package/dist/SqliteRepository.interface.d.ts.map +0 -1
  68. package/dist/SqliteRepositoryBase.d.ts +0 -52
  69. package/dist/SqliteRepositoryBase.d.ts.map +0 -1
  70. package/dist/SqliteTreeRepository.d.ts +0 -21
  71. package/dist/SqliteTreeRepository.d.ts.map +0 -1
  72. package/dist/SqliteTreeRepository.interface.d.ts +0 -36
  73. package/dist/SqliteTreeRepository.interface.d.ts.map +0 -1
  74. package/dist/execute_statement_helper.d.ts.map +0 -1
  75. package/dist/generate_entity_delete_sql.d.ts +0 -10
  76. package/dist/generate_entity_delete_sql.d.ts.map +0 -1
  77. package/dist/generate_entity_find_tree_sql.d.ts +0 -58
  78. package/dist/generate_entity_find_tree_sql.d.ts.map +0 -1
  79. package/dist/generate_entity_insert_sql.d.ts +0 -10
  80. package/dist/generate_entity_insert_sql.d.ts.map +0 -1
  81. package/dist/generate_entity_inserts_sql.d.ts.map +0 -1
  82. package/dist/generate_entity_soft_delete_sql.d.ts +0 -10
  83. package/dist/generate_entity_soft_delete_sql.d.ts.map +0 -1
  84. package/dist/generate_entity_update_sql.d.ts +0 -10
  85. package/dist/generate_entity_update_sql.d.ts.map +0 -1
  86. package/dist/generate_query_find_sql.d.ts +0 -32
  87. package/dist/generate_query_find_sql.d.ts.map +0 -1
  88. package/dist/generate_table_create_sql.d.ts +0 -9
  89. package/dist/generate_table_create_sql.d.ts.map +0 -1
  90. package/dist/generate_table_trigger_sql.d.ts +0 -9
  91. package/dist/generate_table_trigger_sql.d.ts.map +0 -1
  92. package/dist/merge_create_cache.d.ts +0 -6
  93. package/dist/merge_create_cache.d.ts.map +0 -1
  94. package/dist/merge_remove_cache.d.ts +0 -5
  95. package/dist/merge_remove_cache.d.ts.map +0 -1
  96. package/dist/merge_tree_create_cache.d.ts +0 -7
  97. package/dist/merge_tree_create_cache.d.ts.map +0 -1
  98. package/dist/merge_tree_remove_cache.d.ts +0 -7
  99. package/dist/merge_tree_remove_cache.d.ts.map +0 -1
  100. package/dist/merge_tree_update_cache.d.ts +0 -7
  101. package/dist/merge_tree_update_cache.d.ts.map +0 -1
  102. package/dist/merge_update_cache.d.ts +0 -5
  103. package/dist/merge_update_cache.d.ts.map +0 -1
  104. package/dist/need_refresh_helper.d.ts +0 -18
  105. package/dist/need_refresh_helper.d.ts.map +0 -1
  106. package/dist/need_tree_refresh_helper.d.ts +0 -19
  107. package/dist/need_tree_refresh_helper.d.ts.map +0 -1
  108. package/dist/rxdb_adapter_create_tables_sql.d.ts +0 -5
  109. package/dist/rxdb_adapter_create_tables_sql.d.ts.map +0 -1
  110. package/dist/rxdb_adapter_save_many.d.ts.map +0 -1
  111. package/dist/wa-sqlite.d.ts.map +0 -1
package/dist/index.js CHANGED
@@ -1,291 +1,111 @@
1
- import { RxDBError as Le, PropertyType as $, RelationKind as B, getEntityMetadata as N, RxDBChange as we, getEntityStatus as M, EntityCreateEvent as je, EntityUpdateEvent as Fe, RxDBBranch as ie, isEntityMatchWhere as Q, isEntityEffectOrderBy as ge, calculateOrderBy as $e, RepositoryBase as Ue, ENTITY_CREATE_EVENT as se, ENTITY_UPDATE_EVENT as ne, ENTITY_REMOVE_EVENT as V, DATABASE_DELETE as We, DATABASE_INSERT as Ve, DATABASE_UPDATE as Pe, TransactionBeginEvent as Ge, TransactionRollbackEvent as Qe, TransactionCommitEvent as Ke, RxDBAdapterLocalBase as He, uuid as Ye, RxDBAdapterUpdateChangeEvent as Je, RxDBAdapterInsertChangeEvent as Xe, RxDBAdapterDeleteChangeEvent as ze } from "@aiao/rxdb";
2
- import { proxy as Ze, wrap as et } from "comlink";
3
- import { firstValueFrom as g, Subject as z, debounceTime as Z, bufferWhen as pe, filter as G, map as w, shareReplay as U, ReplaySubject as re, BehaviorSubject as K, Observable as Re, takeUntil as Te, distinctUntilChanged as tt, tap as D, switchMap as E, take as ae, defer as st, catchError as nt, of as rt, from as me } from "rxjs";
4
- import { pickBy as Ne, isString as at, isFunction as Ae, traverseObjectKeys as ct, get as ot, once as T } from "@aiao/utils";
5
- import it from "object-hash";
6
- import { Factory as lt, SQLITE_ROW as ut, SQLITE_UTF8 as Ie, SQLITE_DETERMINISTIC as ve } from "wa-sqlite";
7
- const ht = (s) => `SELECT * FROM sqlite_master WHERE type='table' AND name='${s}' limit 1;`, dt = (s) => !!s.sql && (s.results.length === 0 || s.results[0].rows.length === 0), v = "_rowid", _t = (s) => {
8
- switch (s.type) {
9
- case $.uuid:
10
- case $.string:
11
- case $.json:
1
+ import { RxDBError as ye, PropertyType as p, getEntityStatus as A, getEntityMetadata as _, RelationKind as I, isRuleGroup as Q, RepositoryBase as we, RxDBChange as F, RxDBBranch as U, TransactionBeginEvent as ge, TransactionRollbackEvent as $e, TransactionCommitEvent as Ne, RxDBAdapterLocalBase as Te, uuid as Ie, EntityCreatedEvent as K, EntityRemovedEvent as be, EntityUpdatedEvent as Re } from "@aiao/rxdb";
2
+ import { pickBy as Z, isString as Ae, traverseObjectKeys as Se, isNil as Oe, EventDispatcher as Me, AsyncQueueExecutor as ee, get as ve, isFunction as te, nextMacroTask as Le } from "@aiao/utils";
3
+ import { wrap as H, proxy as qe } from "comlink";
4
+ import ne from "object-hash";
5
+ import { firstValueFrom as O } from "rxjs";
6
+ import { Factory as je, SQLITE_ROW as Ce, SQLITE_UTF8 as se, SQLITE_DETERMINISTIC as re } from "wa-sqlite";
7
+ const xe = (t) => `SELECT * FROM sqlite_master WHERE type='table' AND name='${t}' limit 1;`, De = (t) => !!t.sql && (t.results.length === 0 || t.results[0].rows.length === 0), b = "_rowid", Be = (t) => {
8
+ switch (t.type) {
9
+ case p.uuid:
10
+ case p.string:
11
+ case p.json:
12
+ case p.keyValue:
13
+ case p.stringArray:
14
+ case p.numberArray:
12
15
  return "TEXT";
13
- case $.number:
16
+ case p.number:
14
17
  return "REAL";
15
- case $.integer:
16
- case $.boolean:
18
+ case p.integer:
19
+ case p.boolean:
17
20
  return "INTEGER";
18
21
  default:
19
22
  return "TEXT";
20
23
  }
21
- }, ft = (s, e) => {
22
- if (s === null && e.nullable) return null;
23
- if (s !== void 0)
24
+ }, Fe = (t, e) => {
25
+ if (t === null && e.nullable) return null;
26
+ if (t !== void 0)
24
27
  switch (e.type) {
25
- case $.boolean:
26
- return s ? 1 : 0;
27
- case $.date:
28
- return s instanceof Date ? s.toISOString() : s;
28
+ case p.boolean:
29
+ return t ? 1 : 0;
30
+ case p.date:
31
+ return t instanceof Date ? t.toISOString() : t;
32
+ case p.keyValue:
33
+ case p.stringArray:
34
+ case p.numberArray:
35
+ case p.json:
36
+ return JSON.stringify(t);
29
37
  default:
30
- return s;
38
+ return t;
31
39
  }
32
- }, pt = (s, e) => {
33
- if (s === null && e.nullable) return null;
34
- if (s !== void 0)
40
+ }, ae = (t, e) => {
41
+ if (t === null && e.nullable) return null;
42
+ if (t !== void 0)
35
43
  switch (e.type) {
36
- case $.boolean:
37
- return !!s;
38
- case $.date:
39
- return new Date(s);
40
- case $.json:
41
- return s ? JSON.parse(s) : null;
44
+ case p.boolean:
45
+ return !!t;
46
+ case p.date:
47
+ return new Date(t);
48
+ case p.json:
49
+ case p.keyValue:
50
+ case p.stringArray:
51
+ case p.numberArray:
52
+ return t ? JSON.parse(t) : null;
42
53
  default:
43
- return s;
54
+ return t;
44
55
  }
45
- }, Oe = (s, e) => `${e}$${s}`, b = (s) => Oe(s.name, s.namespace), xe = (s, e) => `idx_${s.name}_${e.name}`;
46
- class R extends Error {
56
+ }, oe = (t, e) => `${e}$${t}`, ke = (t) => t.split("$"), E = (t) => oe(t.name, t.namespace), ie = (t, e) => `idx_${t.name}_${e.name}`;
57
+ class g extends ye {
47
58
  constructor(e) {
48
- super(e), this.name = "RxDBError", Object.setPrototypeOf(this, Le.prototype);
59
+ super(e);
49
60
  }
50
61
  }
51
- const H = (s, e) => {
52
- const n = {};
53
- return Object.keys(e).forEach((t) => {
54
- t.endsWith("Id") && (n[t] = e[t]);
55
- const r = s.propertyMap.get(t);
56
- r && (n[t] = ft(e[t], r));
57
- }), n;
58
- }, Se = (s, e) => Ne(e, (n, t) => s.propertyMap.has(t) || s.foreignKeyNames.includes(t)), mt = (s, e) => Ne(e, (n, t) => s.propertyMap.get(t)?.readonly !== !0), qe = (s) => at(s) ? `'${s}'` : s ?? "NULL", ee = (s, e = []) => {
59
- for (; s.includes("?"); ) {
60
- const n = qe(e.shift());
61
- s = s.replace("?", n);
62
+ const V = (t, e) => {
63
+ const n = {}, s = Object.keys(e);
64
+ for (let r = 0; r < s.length; r++) {
65
+ const a = s[r];
66
+ if (a.endsWith("Id")) {
67
+ n[a] = e[a];
68
+ continue;
69
+ }
70
+ const i = t.propertyMap.get(a);
71
+ i && (n[a] = Fe(e[a], i));
62
72
  }
63
- return s;
64
- }, ce = (s, e, n) => {
65
- const t = {};
73
+ return n;
74
+ }, ce = (t, e) => Z(e, (n, s) => t.propertyMap.has(s) || t.foreignKeyNames.includes(s)), Pe = (t, e) => Z(e, (n, s) => t.propertyMap.get(s)?.readonly !== !0), w = (t) => Ae(t) ? `'${t.replaceAll("'", "''")}'` : t ?? "NULL", B = (t, e = []) => t.replace(/\?/g, () => w(e.shift())), k = (t, e, n) => {
75
+ const s = {};
66
76
  return n.forEach((r, a) => {
67
- const c = e[a];
68
- if (s.isForeignKey(c))
69
- t[c] = r;
77
+ const i = e[a];
78
+ if (t.isForeignKey(i))
79
+ s[i] = r;
70
80
  else {
71
- const o = s.propertyMap.get(c);
72
- o && (t[c] = pt(r, o));
73
- }
74
- }), t;
75
- }, Et = async (s, e, n) => {
76
- const t = s.localRxDBBranch(), r = s.localRxDBChange();
77
- let a = !1;
78
- try {
79
- await g(t.get(e)), a = !0;
80
- } catch {
81
- }
82
- if (a) throw new R(`Branch ID (${e}) already exists`);
83
- let c;
84
- if (n ? c = await g(
85
- t.findOne({
86
- where: {
87
- combinator: "and",
88
- rules: [{ field: "changes.id", operator: "=", value: n }]
89
- }
90
- })
91
- ) : c = await g(
92
- t.findOne({
93
- where: {
94
- combinator: "and",
95
- rules: [{ field: "activated", operator: "=", value: !0 }]
96
- }
97
- })
98
- ), !c) throw new R("Source branch not found");
99
- n || (n = (await g(
100
- r.findOne({
101
- where: {
102
- combinator: "and",
103
- rules: [
104
- { field: "branchId", operator: "=", value: c.id },
105
- {
106
- field: "revertChangedAt",
107
- operator: "=",
108
- value: null
109
- }
110
- ]
111
- },
112
- orderBy: [{ field: "id", sort: "desc" }]
113
- })
114
- ))?.id), console.log("创建分支", {
115
- fromBranch: c,
116
- fromChangeId: n,
117
- newBranchId: e
118
- });
119
- }, Be = (s, e, n) => {
120
- const t = b(s), r = n?.userId && s.propertyMap.has("createdBy"), a = n?.userId && s.propertyMap.has("updatedBy"), c = [...s.propertyMap.keys(), ...s.foreignKeyNames], o = [];
121
- e.forEach((u) => {
122
- const l = Se(s, u);
123
- r && (l.createdBy = n.userId), a && (l.updatedBy = n.userId);
124
- const h = H(s, l), _ = [];
125
- c.forEach((f) => {
126
- const p = qe(h[f]);
127
- _.push(p);
128
- }), o.push(_);
129
- });
130
- const i = o.map((u) => `(${u.join(",")})`).join(",");
131
- return `INSERT INTO "${t}" (${c.join(",")}) VALUES ${i};`;
132
- }, yt = (s, e) => {
133
- let n = "";
134
- const t = b(e);
135
- return Array.from(e.relationMap.values()).forEach((r) => {
136
- switch (r.kind) {
137
- case B.ONE_TO_ONE:
138
- case B.MANY_TO_ONE:
139
- {
140
- const a = `${r.name}Id`;
141
- if (n += `
142
- ALTER TABLE "${t}" ADD COLUMN "${a}" TEXT`, r.nullable || (n += " NOT NULL"), r.kind === B.MANY_TO_ONE && Reflect.get(r, "default") !== void 0) {
143
- const c = r;
144
- let o = c.default;
145
- Ae(c.default) && (o = c.default()), n += ` DEFAULT ${o}`;
146
- }
147
- if (r.mappedEntity) {
148
- const c = Oe(r.mappedEntity, r.mappedNamespace);
149
- n += ` REFERENCES ${c}(id)`;
150
- }
151
- r.kind === B.MANY_TO_ONE && (n += " ON DELETE CASCADE"), n += ";", (r.unique || r.kind === B.ONE_TO_ONE) && (n += `
152
- CREATE UNIQUE INDEX ${xe(e, r)} on "${t}"(${a});`);
153
- }
154
- break;
155
- }
156
- }), n;
157
- }, bt = (s, e) => {
158
- const n = b(e);
159
- let t = `CREATE TABLE "${n}" (`;
160
- const r = [], a = [], c = [];
161
- e.propertyMap.forEach((i) => {
162
- let u = `"${i.name}" ${_t(i)}`;
163
- if (i.type === $.integer && i.primary ? u += " PRIMARY KEY AUTOINCREMENT" : (i.type === $.uuid || i.type === $.string) && i.primary && (u += " PRIMARY KEY"), !i.nullable) u += " NOT NULL";
164
- else if (Reflect.get(i, "default") !== void 0) {
165
- let l = i.default;
166
- Ae(i.default) && (l = i.default()), l === "CURRENT_TIMESTAMP" ? u += " DEFAULT(strftime('%FT%H:%M:%fZ'))" : u += ` DEFAULT ${String(l)}`;
167
- }
168
- switch (i.type) {
169
- case $.json:
170
- a.push(`CHECK ( JSON_VALID(${i.name})=1 )`);
171
- break;
172
- case $.boolean:
173
- a.push(`CHECK (${i.name} in(0,1))`);
174
- break;
175
- }
176
- i.unique && r.push(
177
- `CREATE UNIQUE INDEX ${xe(e, i)} on "${n}"(${i.name});`
178
- ), c.push(u);
179
- });
180
- const o = [...c, ...a];
181
- if (o.length)
182
- t += o.map((i) => `
183
- ${i}`).join(","), t += `
184
- );`;
185
- else
186
- throw new R("columns is empty!");
187
- return r.length && (t += `
188
- ` + r.join(`
189
- `)), t;
190
- }, wt = (s, e) => {
191
- let n = "";
192
- return n += bt(s, e), n += yt(s, e), n;
193
- }, le = (s, e, n = "main", t = null) => {
194
- const r = b(e), a = N(we), c = b(a), { propertyMap: o, name: i, foreignKeyNames: u, namespace: l } = e, h = [...o.keys(), ...u].filter((d) => ["id", "updatedAt"].includes(d) === !1), _ = "namespace, entity, type, branchId, parentId, entityId, inversePatch, patch", f = t !== null && t >= 0 ? t : "NULL", p = `
195
- DROP TRIGGER IF EXISTS ${r}_insert;
196
- CREATE TRIGGER ${r}_insert AFTER INSERT ON "${r}"
197
- BEGIN
198
- INSERT INTO ${c} (${_}) VALUES (
199
- '${l}', '${i}', 'INSERT', '${n}', ${f}, NEW.id, NULL,
200
- json_object(${h.map((d) => `'${d}', NEW.${d}`).join(`,
201
- `)})
202
- );
203
- END;`, m = `
204
- DROP TRIGGER IF EXISTS ${r}_update;
205
- CREATE TRIGGER ${r}_update AFTER UPDATE ON "${r}"
206
- WHEN ( ${h.map((d) => `OLD.${d} IS NOT NEW.${d}`).join(` OR
207
- `)} )
208
- BEGIN
209
- INSERT INTO ${c} (${_}) VALUES (
210
- '${l}','${i}','UPDATE', '${n}', ${f}, NEW.id,
211
- (
212
- SELECT json_group_object(key, value) FROM (
213
- ${h.map((d) => `SELECT '${d}' AS key, OLD.${d} AS value WHERE OLD.${d} IS NOT NEW.${d}`).join(`
214
- UNION `)}
215
- )
216
- ),
217
- (
218
- SELECT json_group_object(key, value) FROM (
219
- ${h.map((d) => `SELECT '${d}' AS key, NEW.${d} AS value WHERE OLD.${d} IS NOT NEW.${d}`).join(`
220
- UNION `)}
221
- )
222
- )
223
- );
224
- END;`, A = `
225
- DROP TRIGGER IF EXISTS ${r}_delete;
226
- CREATE TRIGGER ${r}_delete AFTER DELETE ON "${r}"
227
- BEGIN
228
- INSERT INTO ${c} (${_}) VALUES (
229
- '${l}', '${i}', 'DELETE', '${n}', ${f}, OLD.id,
230
- json_object(${h.map((d) => `'${d}', OLD.${d}`).join(`,
231
- `)}), NULL
232
- );
233
- END;`;
234
- return p + `
235
- ` + m + `
236
- ` + A;
237
- }, gt = (s, e, n) => {
238
- let t = "";
239
- for (let r = 0; r < e.length; r++) {
240
- const a = e[r], c = N(a);
241
- if (t += `
242
- ` + wt(s, c), c.log !== !1) {
243
- const o = le(s, c);
244
- t += `
245
- ` + o;
81
+ const o = t.propertyMap.get(i);
82
+ o && (s[i] = ae(r, o));
246
83
  }
247
- }
248
- if (n) {
249
- const r = /* @__PURE__ */ new Map();
250
- n.forEach((a) => {
251
- const c = N(a);
252
- r.has(c) === !1 && r.set(c, /* @__PURE__ */ new Set()), r.get(c).add(a);
253
- });
254
- for (const a of r.keys()) {
255
- const c = Be(
256
- a,
257
- Array.from(r.get(a)),
258
- s.rxdb.context
259
- );
260
- t += `
261
- ` + c;
84
+ }), s;
85
+ }, Y = (t, e) => (Object.keys(e).forEach((n) => {
86
+ const s = e[n], r = t.propertyMap.get(n);
87
+ r && (e[n] = ae(s, r));
88
+ }), e), We = (t, e) => {
89
+ const n = E(t), s = e.map((r) => `'${r.id}'`).join(",");
90
+ return `DELETE FROM "${n}" WHERE id in (${s});`;
91
+ }, J = async (t, e, n) => {
92
+ const s = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
93
+ for (let i = 0; i < e.length; i++) {
94
+ const o = e[i];
95
+ if (A(o).local) {
96
+ let l = [];
97
+ s.has(o.constructor) ? l = s.get(o.constructor) : s.set(o.constructor, l), l.push(o);
262
98
  }
263
99
  }
264
- return t;
265
- }, ke = (s, e, n, t) => {
266
- const r = mt(s, n);
267
- s.propertyMap.has("updatedAt") && (r.updatedAt = t?.updatedAt ?? /* @__PURE__ */ new Date()), t?.userId && s.propertyMap.has("updatedBy") && (r.updatedBy = t.userId);
268
- const a = H(s, r), c = Object.keys(r).map((h) => `${h} = ?`).join(","), o = [...Object.values(a)], i = b(s), u = Array.isArray(e) ? e : [e];
269
- let l = `UPDATE "${i}" SET ${c} WHERE id `;
270
- return Array.isArray(e) ? l += `in (${u.map((h) => `'${h.id}'`).join(",")})` : (o.push(e.id), l += "= ?"), t?.returning !== !1 ? l += ` RETURNING rowid as ${v}, *;` : l += ";", {
271
- sql: l,
272
- params: o
273
- };
274
- }, ue = (s) => s?.map((e) => `_."${e.field}" ${e.sort}`).join(", "), L = (s, e = /* @__PURE__ */ new Map()) => {
275
- const n = s.rules.map((t) => Ee(t) ? L(t, e) : $t(t, e)).filter(Boolean);
276
- return n.length === 0 ? "" : n.length === 1 ? n[0] : `(${n.join(Ee(s) ? ` ${s.combinator} ` : " ")})`;
277
- }, $t = (s, e) => {
278
- let n, t;
279
- if (s?.value === null ? s.operator === "=" ? (n = "", t = "is null") : s.operator === "!=" && (n = "", t = "is not null") : (n = Tt(s.operator).toLowerCase(), t = Nt(s)), !t && ["in", "notIn", "between", "notBetween"].includes(s.operator)) return "";
280
- let r = String(s.field);
281
- if (e.has(r))
282
- r = e.get(r);
283
- else if (r.includes(".")) {
284
- const a = r.lastIndexOf("."), c = r.slice(0, a), o = r.slice(a + 1);
285
- r = `'${c}'.${o}`;
286
- }
287
- return `${r} ${n} ${t}`.replaceAll(/ +/g, " ").trim();
288
- }, Ee = (s) => "rules" in s && "combinator" in s, Rt = {
100
+ let a = "";
101
+ return s.forEach((i, o) => {
102
+ const c = _(o), l = We(c, i);
103
+ i.map((u) => u.id).forEach((u) => r.set(u, o)), a += l;
104
+ }), await t.query(a), r.clear(), s.clear(), e.forEach((i) => {
105
+ const o = A(i);
106
+ i.removedAt = /* @__PURE__ */ new Date(), o.origin = structuredClone({ ...i }), o.modified = !1, o.removed = !0;
107
+ }), e;
108
+ }, N = "_", Ue = {
289
109
  "=": "=",
290
110
  "!=": "!=",
291
111
  ">": ">",
@@ -297,253 +117,558 @@ ${i}`).join(","), t += `
297
117
  between: "BETWEEN",
298
118
  notBetween: "NOT BETWEEN",
299
119
  contains: "LIKE",
300
- notContain: "NOT LIKE",
301
- beginWith: "LIKE",
302
- notBeginWith: "NOT LIKE",
303
- endWith: "LIKE",
304
- notEndWith: "NOT LIKE"
305
- }, Tt = (s) => Rt[s] || s, Nt = (s) => {
306
- switch (s.operator) {
120
+ notContains: "NOT LIKE",
121
+ startsWith: "LIKE",
122
+ notStartsWith: "NOT LIKE",
123
+ endsWith: "LIKE",
124
+ notEndsWith: "NOT LIKE"
125
+ }, Ve = (t, e) => {
126
+ if (e) return e;
127
+ if (!t.includes(".")) return t;
128
+ const n = t.lastIndexOf(".");
129
+ return `"${t.slice(0, n)}".${t.slice(n + 1)}`;
130
+ }, le = (t) => {
131
+ const { operator: e, value: n } = t;
132
+ switch (e) {
307
133
  case "in":
308
134
  case "notIn":
309
- return `(${s.value.map((e) => `'${e}'`).join(", ")})`;
135
+ return Qe(n);
310
136
  case "between":
311
- case "notBetween": {
312
- const [e, n] = s.value;
313
- return `'${e}' and '${n}'`;
314
- }
137
+ case "notBetween":
138
+ return Ke(n);
315
139
  case "contains":
316
- case "notContain":
317
- return `'%${s.value}%'`;
318
- case "beginWith":
319
- case "notBeginWith":
320
- return `'${s.value}%'`;
321
- case "endWith":
322
- case "notEndWith":
323
- return `'%${s.value}'`;
324
- }
325
- return typeof s.value == "boolean" ? s.value ? "1" : "0" : typeof s.value == "string" ? `'${s.value}'` : typeof s.value == "number" ? s.value.toString() : s.value instanceof Date ? `'${s.value.toISOString()}'` : `'${s.value}'`;
326
- }, Y = (s, e, n) => {
327
- const t = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set(), a = /* @__PURE__ */ new Map(), c = /* @__PURE__ */ new Map(), o = (l) => {
328
- let h = l, _ = 1;
329
- for (; r.has(h); )
330
- h = `${l}_${_}`, _++;
331
- return r.add(h), h;
332
- }, i = (l) => {
333
- if (c.has(l))
334
- return c.get(l);
335
- const h = l.includes("_") ? l : l.split("_")[0], _ = o(h);
336
- return c.set(l, _), _;
140
+ case "notContains":
141
+ return w(`%${n}%`);
142
+ case "startsWith":
143
+ case "notStartsWith":
144
+ return w(`${n}%`);
145
+ case "endsWith":
146
+ case "notEndsWith":
147
+ return w(`%${n}`);
148
+ default:
149
+ return He(n);
150
+ }
151
+ }, Ge = (t) => Ue[t] || t, L = (t, e, n) => t.length === 1 ? n.name : `${e}_${n.name}`, Qe = (t) => Array.isArray(t) ? t.length ? `(${t.map(w).join(", ")})` : "(NULL)" : "", Ke = (t) => {
152
+ const [e, n] = t, s = e instanceof Date ? e.toISOString() : e, r = n instanceof Date ? n.toISOString() : n;
153
+ return `${w(s)} and ${w(r)}`;
154
+ }, He = (t) => typeof t == "boolean" ? t ? "1" : "0" : typeof t == "string" ? w(t) : typeof t == "number" ? t.toString() : t instanceof Date ? w(t.toISOString()) : w(t), Ye = (t, e, n) => {
155
+ const s = t.propertyMap.get(e);
156
+ if (!s || s.type !== p.keyValue || typeof n.value != "object" || Array.isArray(n.value)) return null;
157
+ const r = Object.entries(n.value).filter(([, c]) => c != null);
158
+ if (!r.length) return "";
159
+ const a = n.operator === "notContains" ? "NOT LIKE" : "LIKE", i = n.operator === "contains" ? " OR " : " AND ";
160
+ return `(${r.map(([c, l]) => {
161
+ const d = l instanceof Date ? l.toISOString() : typeof l == "string" ? l : String(l);
162
+ return `json_extract(${N}."${e}", '$.${c}') ${a} ${w(`%${d}%`)}`;
163
+ }).join(i)})`;
164
+ }, Je = (t, e, n) => {
165
+ const s = t.propertyMap.get(e);
166
+ if (!s || s.type !== p.stringArray && s.type !== p.numberArray) return null;
167
+ const r = le(n), a = `EXISTS (SELECT 1 FROM json_each(${N}."${e}") WHERE json_each.value IN ${r})`;
168
+ return n.operator === "notIn" ? `NOT ${a}` : a;
169
+ }, Xe = (t, e, n) => {
170
+ const s = t.value === null, r = s ? "" : Ge(t.operator).toLowerCase(), a = s ? t.operator === "=" ? "IS NULL" : t.operator === "!=" ? "IS NOT NULL" : "" : le(t);
171
+ if (!a && ["in", "notIn", "between", "notBetween"].includes(t.operator)) return "";
172
+ const i = String(t.field), o = e.get(i);
173
+ if (n && !i.includes(".") && (t.operator === "contains" || t.operator === "notContains")) {
174
+ const l = Ye(n, i, t);
175
+ if (l !== null) return l;
176
+ }
177
+ if (n && !i.includes(".") && (t.operator === "in" || t.operator === "notIn")) {
178
+ const l = Je(n, i, t);
179
+ if (l !== null) return l;
180
+ }
181
+ return `${Ve(i, o)} ${r} ${a}`.replace(/\s+/g, " ").trim();
182
+ }, G = (t) => t === N ? t : `"${t}"`, q = (t, e) => {
183
+ if (t.relationAliasMap.has(e))
184
+ return t.relationAliasMap.get(e);
185
+ const n = e.includes("_") ? e : e.split("_")[0], s = ue(t, n);
186
+ return t.relationAliasMap.set(e, s), s;
187
+ }, ze = (t, e, n, s) => {
188
+ const r = n.slice(0, s);
189
+ let a = e;
190
+ const i = [];
191
+ for (const o of r) {
192
+ if (!a?.relationMap.has(o))
193
+ return { relPairs: [] };
194
+ const c = a.relationMap.get(o);
195
+ i.push({ metadata: a, relation: c }), a = t.rxdb.schemaManager.getEntityMetadata(c.mappedEntity, c.mappedNamespace);
196
+ }
197
+ return { metaWalker: a, relPairs: i };
198
+ }, Ze = (t, e, n, s, r) => {
199
+ for (let a = r.length - 1; a > 0; a--) {
200
+ const i = r.slice(a);
201
+ if (i.length === 0) continue;
202
+ const { metaWalker: o, relPairs: c } = ze(t, n, r, a);
203
+ if (!o || c.length === 0) continue;
204
+ const l = i[0], d = i.slice(1).join("."), u = o.propertyMap.get(l);
205
+ if (u && u.type === p.keyValue) {
206
+ const h = r.slice(0, a).join(".");
207
+ de(t, e, c, h);
208
+ const m = c[c.length - 1].relation, y = L(c, h, m), $ = q(e, y), T = d ? `$.${d}` : "$";
209
+ return e.fieldAliasMap.set(s, `json_extract("${$}"."${l}", '${T}')`), !0;
210
+ }
211
+ }
212
+ return !1;
213
+ }, de = (t, e, n, s) => {
214
+ n.forEach(({ metadata: r, relation: a }, i) => {
215
+ const o = t.rxdb.schemaManager.findMappedRelation(r, a);
216
+ if (!o) throw new g("mappedRelation not found");
217
+ const c = L(n, s, a), l = q(e, c);
218
+ let d = N;
219
+ if (i > 0) {
220
+ const u = n[i - 1], h = L(n, s, u.relation);
221
+ d = q(e, h);
222
+ }
223
+ switch (a.kind) {
224
+ case I.ONE_TO_MANY:
225
+ et(e, o, l, d);
226
+ break;
227
+ case I.ONE_TO_ONE:
228
+ case I.MANY_TO_ONE:
229
+ tt(e, o, l, d, a);
230
+ break;
231
+ case I.MANY_TO_MANY:
232
+ nt(t, e, o, l, d, a);
233
+ break;
234
+ }
235
+ });
236
+ }, et = (t, e, n, s) => {
237
+ j(t, e.metadata).push({
238
+ joinTableName: n,
239
+ on: `"${n}".${e.relation.name}Id = ${G(s)}.id`
240
+ });
241
+ }, tt = (t, e, n, s, r) => {
242
+ j(t, e.metadata).push({
243
+ joinTableName: n,
244
+ on: `"${n}".id = ${G(s)}.${r.name}Id`
245
+ });
246
+ }, nt = (t, e, n, s, r, a) => {
247
+ const i = _(a.junctionEntityType), o = j(e, i), c = ue(e, `${a.name}_m_n`);
248
+ o.push({
249
+ joinTableName: c,
250
+ on: `"${c}".${n.relation.name}Id = ${G(r)}.id`
251
+ }), j(e, n.metadata).push({
252
+ joinTableName: s,
253
+ on: `"${s}".id = "${c}".${a.name}Id`
254
+ });
255
+ }, j = (t, e) => (t.joinMap.has(e) || t.joinMap.set(e, []), t.joinMap.get(e)), ue = (t, e) => {
256
+ let n = e, s = 1;
257
+ for (; t.usedAliases.has(n); )
258
+ n = `${e}_${s}`, s++;
259
+ return t.usedAliases.add(n), n;
260
+ }, st = (t) => {
261
+ if (t?.length)
262
+ return t.map((e) => `${N}."${e.field}" ${e.sort}`).join(", ");
263
+ }, C = (t, e = /* @__PURE__ */ new Map(), n) => {
264
+ const s = t.rules.map(
265
+ (r) => Q(r) ? C(r, e, n) : Xe(r, e, n)
266
+ ).filter(Boolean);
267
+ return s.length ? s.length === 1 ? s[0] : `(${s.join(Q(t) ? ` ${t.combinator} ` : " ")})` : "";
268
+ }, he = (t) => {
269
+ const { tableName: e, where: n, limit: s, offset: r, orderBy: a, join: i } = t, o = [
270
+ `SELECT ${N}.rowid as ${b}, ${N}.* FROM "${e}" ${N}`
271
+ ];
272
+ return i && o.push(i), n && o.push(` WHERE ${n}`), a && o.push(` ORDER BY ${a}`), s && o.push(` LIMIT ${s}`), r && o.push(` OFFSET ${r}`), o.join("") + ";";
273
+ }, pe = (t, e, n) => {
274
+ const s = {
275
+ joinMap: /* @__PURE__ */ new Map(),
276
+ usedAliases: /* @__PURE__ */ new Set(),
277
+ fieldAliasMap: /* @__PURE__ */ new Map(),
278
+ relationAliasMap: /* @__PURE__ */ new Map()
337
279
  };
338
- ct(n, (l, h, _) => {
339
- const f = h;
340
- if (l !== "field" || f.includes(".") === !1) return;
341
- const { relations: p, isForeignKey: m, propertyName: A } = s.rxdb.schemaManager.getFieldRelations(
342
- e,
343
- h
344
- );
345
- if (m) {
346
- _.field = A;
280
+ Se(n, (a, i, o) => {
281
+ const c = i;
282
+ a !== "field" || !c.includes(".") || at(t, s, e, c, o);
283
+ });
284
+ const r = [];
285
+ for (const [a, i] of s.joinMap.entries()) {
286
+ const o = E(a);
287
+ for (const c of i)
288
+ r.push(` LEFT JOIN "${o}" "${c.joinTableName}" ON ${c.on}`);
289
+ }
290
+ return { joinSQL: r.join(""), fieldAliasMap: s.fieldAliasMap };
291
+ }, rt = (t, e, n, s) => {
292
+ if (s.length <= 1) return !1;
293
+ const [r, ...a] = s, i = e.propertyMap.get(r);
294
+ if (i && i.type === p.keyValue && a.length > 0) {
295
+ const o = a.join(".");
296
+ return t.fieldAliasMap.set(n, `json_extract(${N}."${r}", '$.${o}')`), !0;
297
+ }
298
+ return !1;
299
+ }, at = (t, e, n, s, r) => {
300
+ const a = s.split(".");
301
+ try {
302
+ const i = t.rxdb.schemaManager.getFieldRelations(n, s);
303
+ if (i.isForeignKey) {
304
+ r.field = i.propertyName;
347
305
  return;
348
306
  }
349
- const d = f.replace(`.${A}`, ""), y = (O) => p.length === 1 ? O.name : `${d}_${O.name}`, k = (O) => (t.has(O) || t.set(O, []), t.get(O));
350
- p.forEach(({ metadata: O, relation: S }, _e) => {
351
- const W = s.rxdb.schemaManager.findMappedRelation(O, S);
352
- if (!W) throw new R("mappedRelation not found");
353
- const X = () => {
354
- const q = k(W.metadata), I = y(S), F = i(I);
355
- return {
356
- joinArray: q,
357
- uniqueAlias: F
358
- };
359
- };
360
- let x = "_";
361
- if (_e > 0) {
362
- const q = p[_e - 1], I = y(q.relation);
363
- x = i(I);
364
- }
365
- switch (S.kind) {
366
- case B.ONE_TO_ONE:
367
- case B.ONE_TO_MANY:
368
- {
369
- const { joinArray: q, uniqueAlias: I } = X();
370
- q.push({
371
- joinTableName: I,
372
- on: `'${I}'.${W.relation.name}Id = ${x === "_" ? x : `'${x}'`}.id`
373
- });
374
- }
375
- break;
376
- case B.MANY_TO_ONE:
377
- {
378
- const { joinArray: q, uniqueAlias: I } = X();
379
- q.push({
380
- joinTableName: I,
381
- on: `'${I}'.id = ${x === "_" ? x : `'${x}'`}.${S.name}Id`
382
- });
383
- }
384
- break;
385
- case B.MANY_TO_MANY:
386
- {
387
- const q = N(S.junctionEntityType), I = k(q), F = o(`${S.name}_m_n`);
388
- I.push({
389
- joinTableName: F,
390
- on: `'${F}'.${W.relation.name}Id = ${x === "_" ? x : `'${x}'`}.id`
391
- });
392
- const { joinArray: De, uniqueAlias: fe } = X();
393
- De.push({
394
- joinTableName: fe,
395
- on: `'${fe}'.id = '${F}'.${S.name}Id`
396
- });
397
- }
398
- break;
399
- }
400
- });
401
- const C = p[p.length - 1];
402
- if (s.rxdb.schemaManager.findMappedRelation(
403
- C.metadata,
404
- C.relation
307
+ const o = s.replace(`.${i.propertyName}`, "");
308
+ de(t, e, i.relations, o);
309
+ const c = i.relations[i.relations.length - 1];
310
+ if (t.rxdb.schemaManager.findMappedRelation(
311
+ c.metadata,
312
+ c.relation
405
313
  )) {
406
- const O = y(C.relation), S = i(O);
407
- a.set(f, `'${S}'.${A}`);
314
+ const d = L(i.relations, o, c.relation), u = q(e, d);
315
+ e.fieldAliasMap.set(s, `"${u}".${i.propertyName}`);
408
316
  }
317
+ return;
318
+ } catch {
319
+ }
320
+ rt(e, n, s, a) || Ze(t, e, n, s, a);
321
+ }, P = (t, e, n) => {
322
+ const { joinSQL: s, fieldAliasMap: r } = pe(t, e, n.where);
323
+ return { sql: he({
324
+ tableName: E(e),
325
+ where: C(n.where, r, e),
326
+ orderBy: st(n.orderBy),
327
+ join: s
328
+ }) };
329
+ }, fe = (t, e, n) => {
330
+ const s = E(t), r = n?.userId && t.propertyMap.has("createdBy"), a = n?.userId && t.propertyMap.has("updatedBy"), i = [...t.propertyMap.keys(), ...t.foreignKeyNames], o = [];
331
+ e.forEach((l) => {
332
+ const d = ce(t, l);
333
+ r && (d.createdBy = n.userId), a && (d.updatedBy = n.userId);
334
+ const u = V(t, d), h = [];
335
+ i.forEach((m) => {
336
+ const y = w(u[m]);
337
+ h.push(y);
338
+ }), o.push(h);
409
339
  });
410
- let u = "";
411
- for (const [l, h] of t.entries()) {
412
- const _ = b(l);
413
- for (const f of h)
414
- u += ` LEFT JOIN "${_}" "${f.joinTableName}" ON ${f.on}`;
415
- }
416
- return { joinSQL: u, fieldAliasMap: a };
417
- }, J = (s) => {
418
- const { tableName: e, where: n, limit: t, offset: r, orderBy: a, join: c } = s;
419
- let o = `SELECT _.rowid as ${v}, _.* FROM '${e}' _`;
420
- return c && (o += c), n && (o += ` where ${n}`), a && (o += ` order by ${a}`), t && (o += ` limit ${t}`), r && (o += ` offset ${r}`), o += ";", o;
421
- }, At = (s, e, n) => {
422
- const t = n.where, { joinSQL: r, fieldAliasMap: a } = Y(s, e, t), c = b(e), o = L(t, a), i = ue(n?.orderBy), u = n?.limit || 100, l = n?.offset || 0;
423
- return {
424
- sql: J({ tableName: c, where: o, orderBy: i, join: r, limit: u, offset: l }),
425
- params: []
426
- };
427
- }, oe = (s, e, n) => {
428
- const t = n.where, { joinSQL: r, fieldAliasMap: a } = Y(s, e, t), c = b(e), o = L(t, a), i = ue(n?.orderBy);
429
- return {
430
- sql: J({ tableName: c, where: o, orderBy: i, join: r }),
431
- params: []
432
- };
433
- }, It = (s, e, n) => {
434
- const t = n.where, { joinSQL: r, fieldAliasMap: a } = Y(s, e, t), c = b(e), o = L(t, a);
435
- let i = `SELECT count(_.rowid) as count FROM "${c}" _`;
436
- return n?.groupBy, r && (i += r), o && (i += ` where ${o}`), {
437
- sql: i,
438
- params: []
439
- };
440
- }, te = (s, e, n) => {
441
- const t = n.where, { joinSQL: r, fieldAliasMap: a } = Y(s, e, t), c = b(e), o = L(t, a), i = ue(n?.orderBy);
442
- return {
443
- sql: J({ tableName: c, where: o, orderBy: i, join: r, limit: 1 }),
444
- params: []
445
- };
446
- }, vt = (s, e) => {
447
- const n = `${v} IN (${e.join(",")})`, t = b(s);
448
- return {
449
- sql: J({ tableName: t, where: n }),
450
- params: []
340
+ const c = o.map((l) => `(${l.join(",")})`).join(",");
341
+ return `INSERT INTO "${s}" (${i.join(",")}) VALUES ${c};`;
342
+ }, _e = (t, e, n, s) => {
343
+ const r = Pe(t, n);
344
+ t.propertyMap.has("updatedAt") && (r.updatedAt = s?.updatedAt ?? /* @__PURE__ */ new Date()), s?.userId && t.propertyMap.has("updatedBy") && (r.updatedBy = s.userId);
345
+ const a = V(t, r), i = Object.keys(r).map((u) => `${u} = ?`).join(","), o = [...Object.values(a)], c = E(t), l = Array.isArray(e) ? e : [e];
346
+ let d = `UPDATE "${c}" SET ${i} WHERE id `;
347
+ return Array.isArray(e) ? d += `in (${l.map((u) => `'${u.id}'`).join(",")})` : (o.push(e.id), d += "= ?"), s?.returning !== !1 ? d += ` RETURNING rowid as ${b}, *;` : d += ";", {
348
+ sql: d,
349
+ params: o
451
350
  };
452
- }, ye = async (s, e) => {
453
- const n = /* @__PURE__ */ new Map(), t = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
351
+ }, X = async (t, e) => {
352
+ const n = /* @__PURE__ */ new Map(), s = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
454
353
  for (let o = 0; o < e.length; o++) {
455
- const i = e[o];
456
- if (M(i).local) {
457
- let l = [];
458
- t.has(i.constructor) ? l = t.get(i.constructor) : t.set(i.constructor, l), l.push(i);
354
+ const c = e[o];
355
+ if (A(c).local) {
356
+ let d = [];
357
+ s.has(c.constructor) ? d = s.get(c.constructor) : s.set(c.constructor, d), d.push(c);
459
358
  } else {
460
- let l = [];
461
- n.has(i.constructor) ? l = n.get(i.constructor) : n.set(i.constructor, l), l.push(i);
359
+ let d = [];
360
+ n.has(c.constructor) ? d = n.get(c.constructor) : n.set(c.constructor, d), d.push(c);
462
361
  }
463
362
  }
464
363
  let a = "";
465
- return n.forEach((o, i) => {
466
- const u = N(i), l = Be(u, o, s.rxdb.context), h = o.map((m) => m.id);
467
- h.forEach((m) => r.set(m, i));
468
- const { sql: _, params: f } = oe(s, u, {
364
+ return n.forEach((o, c) => {
365
+ const l = _(c), d = fe(l, o, t.rxdb.context), u = o.map(($) => $.id);
366
+ u.forEach(($) => r.set($, c));
367
+ const { sql: h, params: m } = P(t, l, {
469
368
  where: {
470
369
  combinator: "and",
471
370
  rules: [
472
371
  {
473
372
  field: "id",
474
373
  operator: "in",
475
- value: h
374
+ value: u
476
375
  }
477
376
  ]
478
377
  }
479
- }), p = ee(_, f);
480
- a += l + p;
481
- }), t.forEach((o, i) => {
482
- const u = N(i), l = Object.groupBy(o, (h) => {
483
- const _ = M(h);
484
- return it(_.patch);
378
+ }), y = B(h, m);
379
+ a += d + y;
380
+ }), s.forEach((o, c) => {
381
+ const l = _(c), d = Object.groupBy(o, (u) => {
382
+ const h = A(u);
383
+ return ne(h.patch);
485
384
  });
486
- Object.values(l).forEach((h) => {
487
- const _ = h[0], f = M(_), p = /* @__PURE__ */ new Date(), m = ke(u, h, f.patch, {
488
- ...s.rxdb.context,
385
+ Object.values(d).forEach((u) => {
386
+ const h = u[0], m = A(h), y = /* @__PURE__ */ new Date(), $ = _e(l, u, m.patch, {
387
+ ...t.rxdb.context,
489
388
  returning: !1,
490
- updatedAt: p
491
- }), A = ee(m.sql, m.params);
492
- a += A;
493
- const d = h.map((C) => C.id);
494
- d.forEach((C) => r.set(C, i));
495
- const y = oe(s, u, {
389
+ updatedAt: y
390
+ }), T = B($.sql, $.params);
391
+ a += T;
392
+ const R = u.map((v) => v.id);
393
+ R.forEach((v) => r.set(v, c));
394
+ const S = P(t, l, {
496
395
  where: {
497
396
  combinator: "and",
498
397
  rules: [
499
398
  {
500
399
  field: "id",
501
400
  operator: "in",
502
- value: d
401
+ value: R
503
402
  }
504
403
  ]
505
404
  }
506
- }), k = ee(y.sql, y.params);
507
- a += k;
405
+ }), M = B(S.sql, S.params);
406
+ a += M;
508
407
  });
509
- }), (await g(s.execute(a))).results.forEach(({ columns: o, rows: i }) => {
510
- const u = o.findIndex((_) => _ === "id"), l = o.findIndex((_) => _ === v), h = s.rxdb.entityManager;
511
- i.forEach((_) => {
512
- const f = _[u], p = r.get(f), m = N(p);
513
- let A;
514
- if (h.hasEntityRef(p, f)) {
515
- A = h.getEntityRef(p, f);
516
- const d = ce(m, o, _);
517
- s.getRepository(p).updateEntity(A, d);
518
- const y = M(A);
519
- y.local = !0, l !== -1 && (y.rowId = BigInt(_[l])), y.modified = !1;
408
+ }), (await t.query(a)).results.forEach(({ columns: o, rows: c }) => {
409
+ const l = o.findIndex((h) => h === "id"), d = o.findIndex((h) => h === b), u = t.rxdb.entityManager;
410
+ c.forEach((h) => {
411
+ const m = h[l], y = r.get(m), $ = _(y);
412
+ let T;
413
+ if (u.hasEntityRef(y, m)) {
414
+ T = u.getEntityRef(y, m);
415
+ const R = k($, o, h);
416
+ t.getRepository(y).updateEntity(T, R);
417
+ const S = A(T);
418
+ if (S.local = !0, d !== -1) {
419
+ const M = BigInt(h[d]);
420
+ t.cacheRowIdEntity(M, T);
421
+ }
422
+ S.modified = !1;
520
423
  }
521
424
  });
522
- }), n.forEach((o) => {
523
- s.rxdb.dispatchEvent(new je(o));
524
- }), t.forEach((o) => {
525
- s.rxdb.dispatchEvent(new Fe(o));
526
- }), r.clear(), n.clear(), t.clear(), e;
527
- }, Ot = (s, e, n) => {
528
- let t = "";
529
- if (s.rxdb.options.entities.forEach((r) => {
530
- const a = N(r);
425
+ }), r.clear(), n.clear(), s.clear(), e;
426
+ }, ot = (t, e) => {
427
+ const n = E(t), s = [e.id];
428
+ return {
429
+ sql: `DELETE FROM "${n}" WHERE id = ?;`,
430
+ params: s
431
+ };
432
+ }, it = (t, e, n) => {
433
+ const s = E(t), r = ce(t, e);
434
+ n?.userId && (t.propertyMap.has("createdBy") && (r.createdBy = n.userId), t.propertyMap.has("updatedBy") && (r.updatedBy = n.userId));
435
+ const a = Object.keys(r), i = V(t, r), o = Array(a.length).fill("?").join(","), c = Object.values(i);
436
+ let l = `INSERT INTO "${s}" (${a.join(",")}) VALUES (${o})`;
437
+ return n?.returning !== !1 ? l += ` RETURNING rowid as ${b}, *;` : l += ";", {
438
+ sql: l,
439
+ params: c
440
+ };
441
+ }, ct = (t, e, n) => {
442
+ if (n.groupBy)
443
+ throw new g("groupBy not supported yet");
444
+ const { joinSQL: s, fieldAliasMap: r } = pe(t, e, n.where), a = E(e), i = C(n.where, r, e), o = [`SELECT COUNT(${N}.rowid) AS count FROM "${a}" ${N}`];
445
+ return s && o.push(s), i && o.push(` WHERE ${i}`), { sql: o.join("") };
446
+ }, lt = (t, e) => ({ sql: he({
447
+ tableName: E(t),
448
+ where: `${b} IN (${e.join(",")})`
449
+ }) });
450
+ class dt extends we {
451
+ constructor(e, n) {
452
+ super(e.rxdb, n), this.adapter = e, this.metadata = _(n);
453
+ }
454
+ metadata;
455
+ async findByRowIds(e) {
456
+ const { sql: n, params: s } = lt(this.metadata, e), r = await this.adapter.query(n, s);
457
+ return this.addQueryCache(r);
458
+ }
459
+ /**
460
+ * 添加缓存
461
+ * @param sqliteSuccessResult
462
+ * @param forcedUpdate 强制刷新,在数据有的情况下也会更新数据,在修改数据的情况下需要
463
+ */
464
+ addQueryCache(e, n = !1) {
465
+ const s = [];
466
+ return e.results.forEach(({ columns: r, rows: a }) => {
467
+ const i = r.findIndex((c) => c === "id"), o = r.findIndex((c) => c === b);
468
+ a.forEach((c) => {
469
+ const l = c[i];
470
+ let d;
471
+ if (super.hasEntityRef(l)) {
472
+ if (d = super.getEntityRef(l), s.push(d), n) {
473
+ const h = k(this.metadata, r, c);
474
+ super.updateEntity(d, h);
475
+ }
476
+ } else {
477
+ const h = k(this.metadata, r, c);
478
+ d = this.createEntityRef(h), s.push(d);
479
+ }
480
+ const u = A(d);
481
+ if (u.local = !0, o !== -1) {
482
+ const h = BigInt(c[o]);
483
+ this.adapter.cacheRowIdEntity(h, d);
484
+ }
485
+ u.modified = !1;
486
+ });
487
+ }), s;
488
+ }
489
+ }
490
+ class Ee extends dt {
491
+ async find(e) {
492
+ const { sql: n, params: s } = P(this.adapter, this.metadata, e), r = await this.adapter.query(n, s);
493
+ return this.addQueryCache(r);
494
+ }
495
+ async count(e) {
496
+ const { sql: n, params: s } = ct(this.adapter, this.metadata, e);
497
+ return (await this.adapter.query(n, s)).results[0].rows[0][0];
498
+ }
499
+ async create(e) {
500
+ const { sql: n, params: s } = it(this.metadata, e, this.rxdb.context), r = await this.adapter.query(n, s);
501
+ return this.addQueryCache(r, !0), e;
502
+ }
503
+ async update(e, n) {
504
+ const { sql: s, params: r } = _e(this.metadata, e, n, this.rxdb.context), a = await this.adapter.query(s, r);
505
+ return this.addQueryCache(a, !0), e;
506
+ }
507
+ async remove(e) {
508
+ const n = A(e), s = () => {
509
+ this.rxdb.context?.userId && (e.removedBy = this.rxdb.context.userId), n.origin = structuredClone({ ...e }), n.modified = !1, e.removedAt = /* @__PURE__ */ new Date(), n.removed = !0;
510
+ };
511
+ if (n.local === !0) {
512
+ const { sql: a, params: i } = ot(this.metadata, e);
513
+ return await this.adapter.query(a, i), s(), e;
514
+ } else
515
+ s();
516
+ const r = _(e);
517
+ throw new g(`Remove Error${r.name}(${e.id}) not saved local.`);
518
+ }
519
+ }
520
+ const x = (t, e) => {
521
+ const { isCount: n, isFindDescendants: s, entityId: r, where: a } = e, i = !r, o = E(t);
522
+ let c = "";
523
+ const d = [`c.level < ${e.level || 0}`, a && C(a)].filter(Boolean).join(" AND ");
524
+ d && (c = `WHERE ${d}`);
525
+ let u = "*";
526
+ n && (i ? u = "count(*)" : u = "count(*)-1");
527
+ const h = i ? "parentId is null" : `id = '${r}'`;
528
+ return {
529
+ sql: `WITH RECURSIVE __children AS (
530
+ SELECT *,rowid as ${b}, 0 AS level
531
+ FROM "${o}"
532
+ WHERE ${h}
533
+ UNION ALL
534
+ SELECT children.*,children.rowid as ${b}, c.level + 1
535
+ FROM "${o}" children
536
+ JOIN __children c ON ${s ? "children.parentId = c.id" : "children.id = c.parentId"}
537
+ ${c}
538
+ )
539
+
540
+ SELECT ${u} FROM __children ORDER BY level, id;`
541
+ };
542
+ }, ut = (t, e) => x(t, { ...e, isFindDescendants: !0 }), ht = (t, e) => x(t, { ...e, isFindDescendants: !0, isCount: !0 }), pt = (t, e) => x(t, { ...e, isFindDescendants: !1 }), ft = (t, e) => x(t, { ...e, isFindDescendants: !1, isCount: !0 });
543
+ class _t extends Ee {
544
+ async findDescendants(e) {
545
+ const { sql: n } = ut(this.metadata, e), s = await this.adapter.query(n);
546
+ return this.addQueryCache(s);
547
+ }
548
+ async countDescendants(e) {
549
+ const { sql: n } = ht(this.metadata, e);
550
+ return (await this.adapter.query(n)).results[0].rows[0][0];
551
+ }
552
+ async findAncestors(e) {
553
+ const { sql: n } = pt(this.metadata, e), s = await this.adapter.query(n);
554
+ return this.addQueryCache(s);
555
+ }
556
+ async countAncestors(e) {
557
+ const { sql: n } = ft(this.metadata, e);
558
+ return (await this.adapter.query(n)).results[0].rows[0][0];
559
+ }
560
+ }
561
+ const Et = async (t, e, n) => {
562
+ const s = t.localRxDBBranch(), r = t.localRxDBChange();
563
+ let a = !1;
564
+ try {
565
+ await O(s.get(e)), a = !0;
566
+ } catch {
567
+ }
568
+ if (a) throw new g(`Branch ID (${e}) already exists`);
569
+ let i;
570
+ if (n ? i = await O(
571
+ s.findOne({
572
+ where: {
573
+ combinator: "and",
574
+ rules: [{ field: "changes.id", operator: "=", value: n }]
575
+ }
576
+ })
577
+ ) : i = await O(
578
+ s.findOne({
579
+ where: {
580
+ combinator: "and",
581
+ rules: [{ field: "activated", operator: "=", value: !0 }]
582
+ }
583
+ })
584
+ ), !i) throw new g("Source branch not found");
585
+ n || (n = (await O(
586
+ r.findOne({
587
+ where: {
588
+ combinator: "and",
589
+ rules: [
590
+ { field: "branchId", operator: "=", value: i.id },
591
+ {
592
+ field: "revertChangedAt",
593
+ operator: "=",
594
+ value: null
595
+ }
596
+ ]
597
+ },
598
+ orderBy: [{ field: "id", sort: "desc" }]
599
+ })
600
+ ))?.id), console.log("创建分支", {
601
+ fromBranch: i,
602
+ fromChangeId: n,
603
+ newBranchId: e
604
+ });
605
+ }, D = (t, e = {}) => {
606
+ const n = E(t), s = _(F), r = E(s), { propertyMap: a, name: i, foreignKeyNames: o, namespace: c } = t, l = [...a.keys(), ...o].filter((f) => ["id"].includes(f) === !1), d = " type, namespace, entity, branchId, transactionId, parentId, entityId, inversePatch, patch", { parentId: u, transactionId: h, branchId: m } = e, y = Oe(u) === !1 && u >= 0 ? u : "NULL", $ = w(h), T = w(m || "main"), R = `'${c}','${i}',${T},${$},${y}`, S = `
607
+ DROP TRIGGER IF EXISTS ${n}_insert;
608
+ CREATE TRIGGER ${n}_insert AFTER INSERT ON "${n}"
609
+ BEGIN
610
+ INSERT INTO ${r} (${d}) VALUES (
611
+ 'INSERT',${R}, NEW.id, NULL,
612
+ json_object(${l.map((f) => `'${f}', NEW.${f}`).join(`,
613
+ `)})
614
+ );
615
+ END;`, M = `
616
+ DROP TRIGGER IF EXISTS ${n}_update;
617
+ CREATE TRIGGER ${n}_update AFTER UPDATE ON "${n}"
618
+ WHEN ( ${l.map((f) => `OLD.${f} IS NOT NEW.${f}`).join(` OR
619
+ `)} )
620
+ BEGIN
621
+ INSERT INTO ${r} (${d}) VALUES (
622
+ 'UPDATE',${R}, NEW.id,
623
+ (
624
+ SELECT json_group_object(key, value) FROM (
625
+ ${l.map((f) => `SELECT '${f}' AS key, OLD.${f} AS value WHERE OLD.${f} IS NOT NEW.${f}`).join(`
626
+ UNION `)}
627
+ )
628
+ ),
629
+ (
630
+ SELECT json_group_object(key, value) FROM (
631
+ ${l.map((f) => `SELECT '${f}' AS key, NEW.${f} AS value WHERE OLD.${f} IS NOT NEW.${f}`).join(`
632
+ UNION `)}
633
+ )
634
+ )
635
+ );
636
+ END;`, v = `
637
+ DROP TRIGGER IF EXISTS ${n}_delete;
638
+ CREATE TRIGGER ${n}_delete AFTER DELETE ON "${n}"
639
+ BEGIN
640
+ INSERT INTO ${r} (${d}) VALUES (
641
+ 'DELETE',${R}, OLD.id,
642
+ json_object(${l.map((f) => `'${f}', OLD.${f}`).join(`,
643
+ `)}), NULL
644
+ );
645
+ END;`;
646
+ return S + `
647
+ ` + M + `
648
+ ` + v;
649
+ }, mt = (t, e, n) => {
650
+ let s = "";
651
+ if (t.rxdb.options.entities.forEach((r) => {
652
+ const a = _(r);
531
653
  if (a.log !== !1) {
532
- const c = le(s, a, e, n);
533
- t += `
534
- ` + c;
654
+ const i = D(a, {
655
+ branchId: e,
656
+ parentId: n
657
+ });
658
+ s += `
659
+ ` + i;
535
660
  }
536
- }), t) {
537
- const r = N(ie), a = b(r);
538
- t = `
539
- ${t}
540
- UPDATE "${a}" SET activated = 1 WHERE id = '${e}' and activated != 1 RETURNING rowid as ${v},*;
541
- UPDATE "${a}" SET activated = 0 WHERE id != '${e}' and activated = 1 RETURNING rowid as ${v},*;
661
+ }), s) {
662
+ const r = _(U), a = E(r);
663
+ s = `
664
+ ${s}
665
+ UPDATE "${a}" SET activated = 1 WHERE id = '${e}' and activated != 1 RETURNING rowid as ${b},*;
666
+ UPDATE "${a}" SET activated = 0 WHERE id != '${e}' and activated = 1 RETURNING rowid as ${b},*;
542
667
  `;
543
668
  }
544
- return t;
545
- }, xt = async (s, e) => {
546
- const n = s.localRxDBBranch(), t = s.localRxDBChange(), r = await g(
669
+ return s;
670
+ }, yt = async (t, e) => {
671
+ const n = t.localRxDBBranch(), s = t.localRxDBChange(), r = await O(
547
672
  n.findOne({
548
673
  where: {
549
674
  combinator: "and",
@@ -551,10 +676,10 @@ ${i}`).join(","), t += `
551
676
  }
552
677
  })
553
678
  );
554
- if (!r) throw new R("Current branch not found");
679
+ if (!r) throw new g("Current branch not found");
555
680
  if (r.id === e) return;
556
- const a = await g(
557
- t.findOne({
681
+ const a = await O(
682
+ s.findOne({
558
683
  where: {
559
684
  combinator: "and",
560
685
  rules: [
@@ -570,8 +695,8 @@ ${i}`).join(","), t += `
570
695
  })
571
696
  );
572
697
  a && (a.parentId ? console.log("把当前分支的数据切换记录到:", a.parentId) : console.log("不应该出现这个情况,如果为空,应该还原所有记录"));
573
- const c = await g(
574
- t.findOne({
698
+ const i = await O(
699
+ s.findOne({
575
700
  where: {
576
701
  combinator: "and",
577
702
  rules: [{ field: "branchId", operator: "=", value: e }]
@@ -580,28 +705,44 @@ ${i}`).join(","), t += `
580
705
  })
581
706
  );
582
707
  let o = "";
583
- if (s.rxdb.options.entities.forEach((i) => {
584
- const u = N(i);
585
- if (u.log !== !1) {
586
- const l = le(s, u, e, c?.id);
708
+ if (t.rxdb.options.entities.forEach((c) => {
709
+ const l = _(c);
710
+ if (l.log !== !1) {
711
+ const d = D(l, {
712
+ branchId: e,
713
+ parentId: i?.id
714
+ });
587
715
  o += `
588
- ` + l;
716
+ ` + d;
589
717
  }
590
718
  }), o) {
591
719
  o = `
592
720
  BEGIN;
593
- ${Ot(s, e, c?.id)}
721
+ ${mt(t, e, i?.id)}
594
722
  COMMIT;
595
723
  `;
596
- const u = await g(s.execute(o));
597
- s.getRepository(ie).addQueryCache(u, !0);
724
+ const l = await t.query(o);
725
+ t.getRepository(U).addQueryCache(l, !0);
598
726
  }
727
+ }, z = (t, e, n) => {
728
+ let s = "";
729
+ return t.rxdb.options.entities.forEach((r) => {
730
+ const a = _(r);
731
+ if (a.log !== !1) {
732
+ const i = D(a, {
733
+ branchId: e,
734
+ transactionId: n
735
+ });
736
+ s += `
737
+ ` + i;
738
+ }
739
+ }), s;
599
740
  };
600
- var P = /* @__PURE__ */ ((s) => (s[s.SQLITE_DELETE = 9] = "SQLITE_DELETE", s[s.SQLITE_INSERT = 18] = "SQLITE_INSERT", s[s.SQLITE_UPDATE = 23] = "SQLITE_UPDATE", s))(P || {});
601
- const St = "sqlite", qt = () => import("wa-sqlite/dist/wa-sqlite-async.mjs").then((s) => s.default), Bt = () => import("wa-sqlite/dist/wa-sqlite.mjs").then((s) => s.default), kt = [
741
+ var W = /* @__PURE__ */ ((t) => (t[t.SQLITE_DELETE = 9] = "SQLITE_DELETE", t[t.SQLITE_INSERT = 18] = "SQLITE_INSERT", t[t.SQLITE_UPDATE = 23] = "SQLITE_UPDATE", t))(W || {});
742
+ const wt = "sqlite", gt = () => import("wa-sqlite/dist/wa-sqlite-async.mjs").then((t) => t.default), $t = () => import("wa-sqlite/dist/wa-sqlite.mjs").then((t) => t.default), Nt = [
602
743
  {
603
744
  name: "MemoryVFS",
604
- vfsModule: () => import("wa-sqlite/src/examples/MemoryVFS.js").then((s) => s.MemoryVFS),
745
+ vfsModule: () => import("wa-sqlite/src/examples/MemoryVFS.js").then((t) => t.MemoryVFS),
605
746
  sync: !0,
606
747
  async: !0,
607
748
  worker: !0,
@@ -611,7 +752,7 @@ const St = "sqlite", qt = () => import("wa-sqlite/dist/wa-sqlite-async.mjs").the
611
752
  },
612
753
  {
613
754
  name: "MemoryAsyncVFS",
614
- vfsModule: () => import("wa-sqlite/src/examples/MemoryAsyncVFS.js").then((s) => s.MemoryAsyncVFS),
755
+ vfsModule: () => import("wa-sqlite/src/examples/MemoryAsyncVFS.js").then((t) => t.MemoryAsyncVFS),
615
756
  sync: !1,
616
757
  async: !0,
617
758
  worker: !0,
@@ -621,7 +762,7 @@ const St = "sqlite", qt = () => import("wa-sqlite/dist/wa-sqlite-async.mjs").the
621
762
  },
622
763
  {
623
764
  name: "IDBBatchAtomicVFS",
624
- vfsModule: () => import("wa-sqlite/src/examples/IDBBatchAtomicVFS.js").then((s) => s.IDBBatchAtomicVFS),
765
+ vfsModule: () => import("wa-sqlite/src/examples/IDBBatchAtomicVFS.js").then((t) => t.IDBBatchAtomicVFS),
625
766
  vfsOptions: { lockPolicy: "shared+hint" },
626
767
  sync: !1,
627
768
  async: !0,
@@ -632,7 +773,7 @@ const St = "sqlite", qt = () => import("wa-sqlite/dist/wa-sqlite-async.mjs").the
632
773
  },
633
774
  {
634
775
  name: "OPFSAdaptiveVFS",
635
- vfsModule: () => import("wa-sqlite/src/examples/OPFSAdaptiveVFS.js").then((s) => s.OPFSAdaptiveVFS),
776
+ vfsModule: () => import("wa-sqlite/src/examples/OPFSAdaptiveVFS.js").then((t) => t.OPFSAdaptiveVFS),
636
777
  vfsOptions: { lockPolicy: "shared+hint" },
637
778
  sync: !1,
638
779
  async: !0,
@@ -643,7 +784,7 @@ const St = "sqlite", qt = () => import("wa-sqlite/dist/wa-sqlite-async.mjs").the
643
784
  },
644
785
  {
645
786
  name: "AccessHandlePoolVFS",
646
- vfsModule: () => import("wa-sqlite/src/examples/AccessHandlePoolVFS.js").then((s) => s.AccessHandlePoolVFS),
787
+ vfsModule: () => import("wa-sqlite/src/examples/AccessHandlePoolVFS.js").then((t) => t.AccessHandlePoolVFS),
647
788
  sync: !0,
648
789
  async: !0,
649
790
  worker: !0,
@@ -653,7 +794,7 @@ const St = "sqlite", qt = () => import("wa-sqlite/dist/wa-sqlite-async.mjs").the
653
794
  },
654
795
  {
655
796
  name: "OPFSAnyContextVFS",
656
- vfsModule: () => import("wa-sqlite/src/examples/OPFSAnyContextVFS.js").then((s) => s.OPFSAnyContextVFS),
797
+ vfsModule: () => import("wa-sqlite/src/examples/OPFSAnyContextVFS.js").then((t) => t.OPFSAnyContextVFS),
657
798
  vfsOptions: { lockPolicy: "shared+hint" },
658
799
  sync: !1,
659
800
  async: !0,
@@ -664,7 +805,7 @@ const St = "sqlite", qt = () => import("wa-sqlite/dist/wa-sqlite-async.mjs").the
664
805
  },
665
806
  {
666
807
  name: "OPFSCoopSyncVFS",
667
- vfsModule: () => import("wa-sqlite/src/examples/OPFSCoopSyncVFS.js").then((s) => s.OPFSCoopSyncVFS),
808
+ vfsModule: () => import("wa-sqlite/src/examples/OPFSCoopSyncVFS.js").then((t) => t.OPFSCoopSyncVFS),
668
809
  sync: !0,
669
810
  async: !0,
670
811
  worker: !0,
@@ -674,7 +815,7 @@ const St = "sqlite", qt = () => import("wa-sqlite/dist/wa-sqlite-async.mjs").the
674
815
  },
675
816
  {
676
817
  name: "OPFSPermutedVFS",
677
- vfsModule: () => import("wa-sqlite/src/examples/OPFSPermutedVFS.js").then((s) => s.OPFSPermutedVFS),
818
+ vfsModule: () => import("wa-sqlite/src/examples/OPFSPermutedVFS.js").then((t) => t.OPFSPermutedVFS),
678
819
  sync: !1,
679
820
  async: !0,
680
821
  worker: !0,
@@ -682,96 +823,99 @@ const St = "sqlite", qt = () => import("wa-sqlite/dist/wa-sqlite-async.mjs").the
682
823
  jsContext: !1,
683
824
  multipleConnections: !0
684
825
  }
685
- ], Ce = (s) => {
686
- const e = kt.find((a) => a.name === s.vfs), { vfs: n, async: t, worker: r } = s;
687
- if (!e) throw new R(`vfs ${n} not found`);
688
- if (t !== t) throw new R(`vfs ${n} not support async: ${t}`);
689
- if (r && !e.worker) throw new R(`vfs ${n} not support worker`);
690
- if (!r && !e.jsContext) throw new R(`vfs ${n} only support worker`);
826
+ ], me = (t) => {
827
+ const e = Nt.find((a) => a.name === t.vfs), { vfs: n, async: s, worker: r } = t;
828
+ if (!e) throw new g(`vfs ${n} not found`);
829
+ if (s !== void 0 && s !== e.async)
830
+ throw new g(`vfs ${n} not support async: ${s}`);
831
+ if (r && !e.worker) throw new g(`vfs ${n} not support worker`);
832
+ if (!r && !e.jsContext) throw new g(`vfs ${n} only support worker`);
691
833
  return e;
692
- }, Ct = async (s) => {
693
- const e = Ce(s), n = s.async ?? !0;
694
- let t;
695
- n ? t = qt : t = Bt;
696
- const [r, a] = await Promise.all([t(), e.vfsModule()]), c = {};
697
- s.locateFile ? c.locateFile = s.locateFile : s.wasmPath && (c.locateFile = () => s.wasmPath);
698
- const o = await r(c), i = lt(o), u = await a.create(s.vfs, o, e.vfsOptions);
699
- return i.vfs_register(u, !0), i;
700
- }, Mt = async (s, e, n, t) => {
701
- const r = performance.now(), a = t ? [t] : [[]], c = [];
834
+ }, Tt = async (t) => {
835
+ const e = me(t), n = t.async ?? !0;
836
+ let s;
837
+ n ? s = gt : s = $t;
838
+ const [r, a] = await Promise.all([s(), e.vfsModule()]), i = {};
839
+ t.locateFile ? i.locateFile = t.locateFile : t.wasmPath && (i.locateFile = () => t.wasmPath);
840
+ const o = await r(i), c = je(o), l = await a.create(t.vfs, o, e.vfsOptions);
841
+ return c.vfs_register(l, !0), c;
842
+ }, It = async (t, e, n, s) => {
843
+ const r = performance.now(), a = s ? [s] : [[]], i = [];
702
844
  let o = 0;
703
- const i = {
845
+ const c = {
704
846
  sql: n,
705
- results: c
847
+ results: i
706
848
  };
707
- for await (const u of s.statements(e, n)) {
708
- if (t)
709
- for (const _ of a)
710
- s.reset(u), t && s.bind_collection(u, _);
711
- const l = [];
712
- for (; await s.step(u) === ut; ) {
713
- const _ = s.row(u);
714
- l.push(_);
849
+ for await (const l of t.statements(e, n)) {
850
+ if (s)
851
+ for (const h of a)
852
+ t.reset(l), s && t.bind_collection(l, h);
853
+ const d = [];
854
+ for (; await t.step(l) === Ce; ) {
855
+ const h = t.row(l);
856
+ d.push(h);
715
857
  }
716
- const h = s.column_names(u);
717
- h.length && c.push({ columns: h, rows: l }), o += s.changes(e);
858
+ const u = t.column_names(l);
859
+ u.length && i.push({ columns: u, rows: d }), o += t.changes(e);
718
860
  }
719
861
  return {
720
- ...i,
862
+ ...c,
721
863
  rowsAffected: o,
722
864
  elapsed: performance.now() - r
723
865
  };
724
- }, Dt = (s, e) => s.create_function(e, "regexp", 2, Ie | ve, 0, (n, t) => {
725
- const r = new RegExp(s.value_text(t[0])), a = s.value_text(t[1]);
726
- s.result(n, r.test(a) ? 1 : 0);
727
- }), Lt = (s, e) => s.create_function(e, "regexp_replace", -1, Ie | ve, 0, (n, t) => {
728
- if (t.length < 3) {
729
- s.result(n, "");
730
- return;
731
- }
732
- const r = s.value_text(t[0]), a = s.value_text(t[1]), c = s.value_text(t[2]), o = t.length > 3 ? s.value_text(t[3]) : "";
733
- s.result(n, a.replace(new RegExp(r, o), c));
734
- });
735
- class jt {
736
- #e;
866
+ };
867
+ class bt extends Me {
737
868
  #t;
738
- #r = [];
869
+ #e;
870
+ #n = !1;
871
+ #o = !1;
872
+ /**
873
+ * 任务执行器
874
+ */
739
875
  #s;
740
- #n;
741
- set onChange(e) {
742
- this.#n = e;
743
- }
876
+ #i = [];
877
+ #r;
878
+ /**
879
+ * 批量发送间隔,单位 ms
880
+ * 默认 16ms
881
+ */
882
+ #c = 16;
883
+ /**
884
+ * 初始化数据库
885
+ * @param dbName 数据库名称
886
+ * @param options 加载选项
887
+ * @returns
888
+ */
744
889
  async init(e, n) {
745
- const t = await Ct(n), r = e + ".sqlite";
746
- this.#t = await t.open_v2(r), this.#e = t, Dt(t, this.#t), Lt(t, this.#t);
747
- const a = n?.cacheSizeKb || 50 * 1024;
748
- await this.execute(`
890
+ if (this.#n) return;
891
+ this.#n = !0, this.#s = new ee(1);
892
+ const s = await Tt(n), r = e + ".sqlite";
893
+ this.#e = await s.open_v2(r), this.#t = s, Rt(s, this.#e), At(s, this.#e), await this.execute(`
749
894
  PRAGMA temp_store = memory;
750
- PRAGMA journal_mode = delete;
751
895
  PRAGMA foreign_keys = ON;
752
- PRAGMA cache_size = -${a};
753
- `), this.#e.update_hook(
754
- this.#t,
755
- (c, o, i, u) => {
756
- if (i !== "public$RxDBChange" || !o || !i || !this.#n) return;
896
+ PRAGMA cache_size = -${n?.cacheSizeKb || 50 * 1024};
897
+ `), this.#t.update_hook(
898
+ this.#e,
899
+ (a, i, o, c) => {
900
+ if (o !== "public$RxDBChange" || !i || !o) return;
757
901
  const l = {
758
- type: c,
759
- dbName: o,
760
- tableName: i,
761
- rowId: u
902
+ type: a,
903
+ dbName: i,
904
+ tableName: o,
905
+ rowId: c
762
906
  };
763
- this.#r.push(l), this.#s && clearTimeout(this.#s), this.#s = setTimeout(() => {
764
- this.#a(), this.#s = void 0;
765
- });
907
+ this.#i.push(l), this.#r && clearTimeout(this.#r), this.#r = setTimeout(() => {
908
+ this.#a(), this.#r = void 0;
909
+ }, this.#c);
766
910
  }
767
911
  );
768
912
  }
769
913
  async version() {
770
914
  const e = await this.execute("SELECT sqlite_version()");
771
- return ot(e, "results[0].rows[0][0]");
915
+ return ve(e, "results[0].rows[0][0]");
772
916
  }
773
917
  async disconnect() {
774
- await this.#e.close(this.#t);
918
+ this.#o = !0, await this.#s.waitForAll(), await this.#t.close(this.#e);
775
919
  }
776
920
  /**
777
921
  * 执行 sql
@@ -780,748 +924,190 @@ class jt {
780
924
  * @returns
781
925
  */
782
926
  async execute(e, n) {
783
- return Mt(this.#e, this.#t, e, n);
927
+ if (this.#o)
928
+ throw new Error("SqliteClient has been disconnected");
929
+ return this.#s.addTask(() => It(this.#t, this.#e, e, n));
784
930
  }
785
931
  #a() {
786
- const e = Object.groupBy(this.#r, (n) => `${n.type}_${n.dbName}_${n.tableName}`);
787
- Object.values(e).forEach((n) => {
788
- const t = n[0], r = n.map((a) => a.rowId);
789
- this.#n?.({
790
- type: t.type,
791
- dbName: t.dbName,
792
- tableName: t.tableName,
793
- rowIds: r,
932
+ const e = Object.groupBy(this.#i, (s) => `${s.type}_${s.dbName}_${s.tableName}`), n = Object.entries(e);
933
+ for (let s = 0; s < n.length; s++) {
934
+ const [, r] = n[s];
935
+ if (!r || r.length === 0) continue;
936
+ const a = r[0], i = r.map((c) => c.rowId), o = {
937
+ type: a.type,
938
+ dbName: a.dbName,
939
+ tableName: a.tableName,
940
+ rowIds: i,
794
941
  recordAt: /* @__PURE__ */ new Date()
795
- });
796
- }), this.#r.length = 0;
797
- }
798
- }
799
- const Ft = (s, e, n) => {
800
- const t = b(s), r = [e.id];
801
- return {
802
- sql: `DELETE FROM "${t}" WHERE id = ?;`,
803
- params: r
804
- };
805
- }, Ut = (s, e, n) => {
806
- const t = b(s), r = Se(s, e);
807
- n?.userId && (s.propertyMap.has("createdBy") && (r.createdBy = n.userId), s.propertyMap.has("updatedBy") && (r.updatedBy = n.userId));
808
- const a = Object.keys(r), c = H(s, r), o = Array(a.length).fill("?").join(","), i = Object.values(c);
809
- let u = `INSERT INTO "${t}" (${a.join(",")}) VALUES (${o})`;
810
- return n?.returning !== !1 ? u += ` RETURNING rowid as ${v}, *;` : u += ";", {
811
- sql: u,
812
- params: i
813
- };
814
- }, Wt = (s, e, n) => {
815
- const t = {};
816
- s.propertyMap.has("removedAt") && (t.removedAt = /* @__PURE__ */ new Date()), n?.userId && s.propertyMap.has("removedBy") && (t.removedBy = n.userId);
817
- const r = b(s), c = Object.keys(t).map((l) => `${l} = ?`).join(","), o = H(s, t), i = [...Object.values(o), e.id];
818
- let u = `UPDATE "${r}" SET ${c} WHERE id = ? and removedAt is null and removedBy is null`;
819
- return n?.returning !== !1 ? u += ` RETURNING rowid as ${v}, *;` : u += ";", {
820
- sql: u,
821
- params: i
822
- };
823
- }, he = (s, e, n, t, r) => {
824
- if (s.length === 0 && e.length === 0) return { refresh: !1, recalculate: !1 };
825
- const { options: a } = n, c = t.resultEntityIds, o = T(() => r.map((d) => d.id)), i = T(() => r.some((d) => Q(d, a.where))), u = T(
826
- () => a.orderBy && r.some(
827
- (d) => ge(d, t.resultEntities || [], a.orderBy)
828
- )
829
- ), l = T(() => u() !== !1), h = T(() => i() === !1), _ = T(
830
- () => c ? c.some((d) => o().includes(d)) : !0
831
- ), f = T(() => _() === !1), p = {
832
- match_where: i,
833
- not_match_where: h,
834
- match_order_by: l,
835
- result_contains: _,
836
- result_not_contains: f
837
- }, m = e.some(
838
- (d) => d.every((y) => p[y]())
839
- );
840
- return {
841
- refresh: m === !1 && s.some(
842
- (d) => d.every((y) => p[y]())
843
- ),
844
- recalculate: m
845
- };
846
- }, Vt = (s, e, n) => {
847
- switch (e.type) {
848
- case "findAll":
849
- {
850
- const { options: t } = e;
851
- let r = s.resultEntities;
852
- r = r.concat(n), r = r.filter((a) => Q(a, e.options.where)), t.orderBy && t.orderBy.length && (r = $e(r, t.orderBy)), s.updateResult(r), e.refresh();
853
- }
854
- break;
855
- }
856
- }, Pt = (s, e, n) => {
857
- const t = [], r = [];
858
- switch (e.type) {
859
- case "find":
860
- t.push(["match_where"]);
861
- break;
862
- case "findAll":
863
- r.push(["match_where"]);
864
- break;
865
- case "findOne":
866
- case "findOneOrFail":
867
- case "count":
868
- t.push(["match_where"]);
869
- break;
870
- }
871
- const a = he(t, r, e, s, n);
872
- a.refresh ? s.refresh() : a.recalculate && Vt(s, e, n);
873
- }, Gt = (s, e, n) => {
874
- if (Array.isArray(s.result)) {
875
- const t = s.result.filter((r) => !n.includes(r));
876
- s.updateResult(t), e.refresh();
877
- }
878
- }, Qt = (s, e, n) => {
879
- const t = [], r = [];
880
- switch (e.type) {
881
- case "find":
882
- t.push(["match_where"], ["not_match_where", "result_contains"]);
883
- break;
884
- case "findAll":
885
- r.push(["result_contains"]);
886
- break;
887
- case "findOne":
888
- case "findOneOrFail":
889
- case "count":
890
- t.push(["match_where"]);
891
- break;
892
- }
893
- const a = he(t, r, e, s, n);
894
- a.refresh ? s.refresh() : a.recalculate && Gt(s, e, n);
895
- }, Kt = (s, e) => {
896
- switch (e.type) {
897
- case "findOne":
898
- case "findOneOrFail":
899
- case "find":
900
- case "findAll": {
901
- let n = s.resultEntities;
902
- n = n.filter((t) => Q(t, e.options.where)), e.options.orderBy && e.options.orderBy.length && (n = $e(n, e.options.orderBy)), s.updateResult(n), e.refresh();
903
- return;
942
+ };
943
+ this.dispatchEvent(o);
904
944
  }
945
+ this.#i.length = 0;
905
946
  }
906
- }, Ht = (s, e, n) => {
907
- const t = [], r = [];
908
- switch (e.type) {
909
- case "find":
910
- t.push(["match_where"], ["not_match_where", "result_contains"]);
911
- break;
912
- case "findAll":
913
- r.push(["match_where"], ["not_match_where", "result_contains"]);
914
- break;
915
- case "findOne":
916
- case "findOneOrFail":
917
- case "count":
918
- t.push(["match_where"], ["not_match_where", "result_contains"]);
919
- break;
920
- }
921
- const a = he(t, r, e, s, n);
922
- a.refresh ? s.refresh() : a.recalculate && Kt(s, e);
923
- }, be = (s, e = []) => s + e.join(",");
924
- class Yt extends Ue {
925
- constructor(e, n, t) {
926
- super(e.rxdb, t), this.adapter = e, this.client$ = n, this.metadata = N(t), this.run_task$.subscribe(() => this.#e());
927
- const r = (c) => {
928
- const o = c.entities.filter((i) => i.constructor === t);
929
- o.length && this.db_changes_sub.next({ ...c, entities: o });
930
- };
931
- this.rxdb.addEventListener(se, (c) => r(c)), this.rxdb.addEventListener(ne, (c) => r(c)), this.rxdb.addEventListener(V, (c) => r(c));
932
- const a = (c, o) => {
933
- if (o.EntityType !== t || this.cache_query_task_map.size === 0) return;
934
- const { rowIds: i, recordAt: u } = o.data, l = [], h = [];
935
- if (i.forEach((f) => {
936
- const p = this.rxdb.entityManager.getEntityByRowId(t, f);
937
- p ? l.push(p) : h.push(f);
938
- }), c === V && l.length) {
939
- this.db_changes_sub.next({ type: c, entities: l });
940
- return;
941
- }
942
- h.length && this.db_checks_sub.next({ type: c, changes: o.data }), l.filter(
943
- (f) => f.updatedAt && f.updatedAt.getTime && u.getTime() - f.updatedAt.getTime() > 500
944
- ).length && this.db_checks_sub.next({ type: c, changes: o.data });
945
- };
946
- this.rxdb.addEventListener(We, (c) => a(V, c)), this.rxdb.addEventListener(Ve, (c) => a(se, c)), this.rxdb.addEventListener(Pe, (c) => a(ne, c));
947
+ }
948
+ const Rt = (t, e) => t.create_function(e, "regexp", 2, se | re, 0, (n, s) => {
949
+ const r = new RegExp(t.value_text(s[0])), a = t.value_text(s[1]);
950
+ t.result(n, r.test(a) ? 1 : 0);
951
+ }), At = (t, e) => t.create_function(e, "regexp_replace", -1, se | re, 0, (n, s) => {
952
+ if (s.length < 3) {
953
+ t.result(n, "");
954
+ return;
947
955
  }
948
- metadata;
949
- // 任务队列
950
- need_run_task = new z();
951
- run_task$ = this.need_run_task.asObservable().pipe(Z(0));
952
- // 根据条件缓存的任务
953
- cache_query_task_map = /* @__PURE__ */ new Map();
954
- // 任务队列
955
- queue_tasks = [];
956
- // db changes
957
- db_changes_sub = new z();
958
- db_changes_next$ = this.db_changes_sub.asObservable().pipe(Z(16));
959
- db_changes$ = this.db_changes_sub.asObservable().pipe(
960
- pe(() => this.db_changes_next$),
961
- G((e) => e.length > 0),
962
- w((e) => {
963
- const n = /* @__PURE__ */ new Map();
964
- e.forEach(({ type: r, entities: a }) => {
965
- n.has(r) || n.set(r, /* @__PURE__ */ new Set()), a.forEach((c) => n.get(r).add(c));
966
- });
967
- const t = Array.from(n.entries()).map(([r, a]) => ({
968
- type: r,
969
- entities: Array.from(a)
970
- }));
971
- return n.clear(), t;
972
- }),
973
- U(1)
974
- );
975
- // db checks
976
- db_checks_sub = new z();
977
- db_checks_next$ = this.db_checks_sub.asObservable().pipe(Z(16));
978
- db_checks$ = this.db_checks_sub.asObservable().pipe(
979
- pe(() => this.db_checks_next$),
980
- G((e) => e.length > 0),
981
- w((e) => {
982
- const n = /* @__PURE__ */ new Map();
983
- return e.forEach(({ type: t, changes: r }) => {
984
- n.has(t) || n.set(t, /* @__PURE__ */ new Set());
985
- const a = n.get(t);
986
- r.rowIds.forEach((c) => a.add(c));
987
- }), Array.from(n.entries()).map(([t, r]) => ({
988
- type: t,
989
- rowIds: Array.from(r)
990
- }));
991
- }),
992
- U(1)
993
- );
994
- /**
995
- * 添加缓存
996
- * @param sqliteSuccessResult
997
- * @param forcedUpdate 强制刷新,在数据有的情况下也会更新数据,在修改数据的情况下需要
998
- */
999
- addQueryCache(e, n = !1) {
1000
- const t = [];
1001
- return e.results.forEach(({ columns: r, rows: a }) => {
1002
- const c = r.findIndex((i) => i === "id"), o = r.findIndex((i) => i === v);
1003
- a.forEach((i) => {
1004
- const u = i[c];
1005
- let l;
1006
- if (this.hasEntityRef(u)) {
1007
- if (l = this.getEntityRef(u), t.push(l), n) {
1008
- const _ = ce(this.metadata, r, i);
1009
- this.updateEntity(l, _);
956
+ const r = t.value_text(s[0]), a = t.value_text(s[1]), i = t.value_text(s[2]), o = s.length > 3 ? t.value_text(s[3]) : "";
957
+ t.result(n, a.replace(new RegExp(r, o), i));
958
+ }), St = async (t, e) => {
959
+ const { vfs: n, async: s, worker: r, wasmPath: a, locateFile: i, workerInstance: o, sharedWorkerInstance: c, sharedWorker: l } = e, d = {
960
+ vfs: n,
961
+ async: s,
962
+ worker: r,
963
+ wasmPath: a,
964
+ locateFile: i
965
+ };
966
+ me(d);
967
+ let u;
968
+ return r && o ? u = H(o) : l && c ? u = H(c.port) : u = new bt(), await u.init(t, d), u;
969
+ }, Ot = (t) => {
970
+ let e = "";
971
+ const n = E(t);
972
+ return Array.from(t.relationMap.values()).forEach((s) => {
973
+ switch (s.kind) {
974
+ case I.ONE_TO_ONE:
975
+ case I.MANY_TO_ONE:
976
+ {
977
+ const r = `${s.name}Id`;
978
+ if (e += `
979
+ ALTER TABLE "${n}" ADD COLUMN "${r}" TEXT`, s.nullable || (e += " NOT NULL"), s.kind === I.MANY_TO_ONE && Reflect.get(s, "default") !== void 0) {
980
+ const a = s;
981
+ let i = a.default;
982
+ te(a.default) && (i = a.default()), e += ` DEFAULT ${i}`;
1010
983
  }
1011
- } else {
1012
- const _ = ce(this.metadata, r, i);
1013
- l = this.createEntityRef(_), t.push(l);
1014
- }
1015
- const h = M(l);
1016
- h.local = !0, o !== -1 && (h.rowId = BigInt(i[o])), h.modified = !1;
1017
- });
1018
- }), t;
1019
- }
1020
- /**
1021
- * 创建查询任务
1022
- */
1023
- create_query_task(e) {
1024
- const { sql: n, params: t } = e, r = be(n, t), a = /* @__PURE__ */ new Set();
1025
- let c = !1;
1026
- const o = new re(), i = o.asObservable(), u = new K(0), l = u.asObservable();
1027
- let h;
1028
- if (this.cache_query_task_map.has(r) === !1) {
1029
- const _ = new Re((p) => (f.observerCount++, h && p.next(h), a.add(p), c || (c = !0, this.queue_tasks.push(f), this.need_run_task.next()), () => {
1030
- if (f.observerCount--, f.observerCount <= 0) {
1031
- o.next(), o.complete(), u.unsubscribe(), o.unsubscribe(), a.delete(p), this.cache_query_task_map.delete(r);
1032
- const m = this.queue_tasks.indexOf(f);
1033
- m >= 0 && this.queue_tasks.splice(m, 1);
984
+ if (s.mappedEntity) {
985
+ const a = oe(s.mappedEntity, s.mappedNamespace);
986
+ e += ` REFERENCES ${a}(id)`, s.kind === I.MANY_TO_ONE ? e += " ON DELETE CASCADE" : s.kind === I.ONE_TO_ONE && (e += s.nullable ? " ON DELETE SET NULL" : " ON DELETE CASCADE");
987
+ }
988
+ e += ";", (s.unique || s.kind === I.ONE_TO_ONE) && (e += `
989
+ CREATE UNIQUE INDEX ${ie(t, s)} on "${n}"(${r});`);
1034
990
  }
1035
- })), f = {
1036
- sql: n,
1037
- params: t,
1038
- observerCount: 0,
1039
- refreshCount: 0,
1040
- result$: _,
1041
- destroy$: i,
1042
- refresh$: l,
1043
- resultEntities: [],
1044
- resultEntityIds: [],
1045
- refresh: () => u.next(f.refreshCount + 1),
1046
- updateResult: (p) => {
1047
- f.result = p, Array.isArray(p) && (f.resultEntities = p, f.resultEntityIds = p.map((m) => m.id));
1048
- },
1049
- next: (p) => {
1050
- h = p, a.forEach((m) => m.next(p));
1051
- },
1052
- error: (p) => a.forEach((m) => m.error(p))
1053
- };
1054
- return this.cache_query_task_map.set(r, f), f;
991
+ break;
992
+ }
993
+ }), e;
994
+ }, Mt = (t) => {
995
+ const e = E(t);
996
+ let n = `CREATE TABLE "${e}" (`;
997
+ const s = [], r = [], a = [];
998
+ t.propertyMap.forEach((o) => {
999
+ let c = `"${o.name}" ${Be(o)}`;
1000
+ if (o.type === p.integer && o.primary ? c += " PRIMARY KEY AUTOINCREMENT" : (o.type === p.uuid || o.type === p.string) && o.primary && (c += " PRIMARY KEY"), !o.nullable) c += " NOT NULL";
1001
+ else if (Reflect.get(o, "default") !== void 0) {
1002
+ let l = o.default;
1003
+ te(o.default) && (l = o.default()), l === "CURRENT_TIMESTAMP" ? c += " DEFAULT(strftime('%FT%H:%M:%fZ'))" : c += ` DEFAULT ${String(l)}`;
1004
+ }
1005
+ switch (o.type) {
1006
+ case p.json:
1007
+ case p.keyValue:
1008
+ case p.stringArray:
1009
+ case p.numberArray:
1010
+ r.push(`CHECK ( JSON_VALID(${o.name})=1 )`);
1011
+ break;
1012
+ case p.boolean:
1013
+ r.push(`CHECK (${o.name} in(0,1))`);
1014
+ break;
1015
+ }
1016
+ o.unique && s.push(
1017
+ `CREATE UNIQUE INDEX ${ie(t, o)} on "${e}"(${o.name});`
1018
+ ), a.push(c);
1019
+ });
1020
+ const i = [...a, ...r];
1021
+ if (i.length)
1022
+ n += i.map((o) => `
1023
+ ${o}`).join(","), n += `
1024
+ );`;
1025
+ else
1026
+ throw new g("columns is empty!");
1027
+ return s.length && (n += `
1028
+ ` + s.join(`
1029
+ `)), n;
1030
+ }, vt = (t) => {
1031
+ let e = "";
1032
+ return e += Mt(t), e += Ot(t), e;
1033
+ }, Lt = (t, e, n) => {
1034
+ let s = "";
1035
+ for (let r = 0; r < e.length; r++) {
1036
+ const a = e[r], i = _(a);
1037
+ if (s += `
1038
+ ` + vt(i), i.log !== !1) {
1039
+ const o = D(i);
1040
+ s += `
1041
+ ` + o;
1055
1042
  }
1056
- return this.cache_query_task_map.get(r);
1057
- }
1058
- delete_task(e) {
1059
- const n = be(e.sql, e.params);
1060
- this.cache_query_task_map.delete(n);
1061
- }
1062
- /**
1063
- * 队列执行任务
1064
- */
1065
- #e() {
1066
- const e = this.queue_tasks.shift();
1067
- if (!e) return;
1068
- const { sql: n, params: t, refresh$: r } = e;
1069
- r.pipe(
1070
- Te(e.destroy$),
1071
- tt(),
1072
- D(() => e.refreshCount++),
1073
- E(
1074
- () => this.client$.pipe(
1075
- ae(1),
1076
- E(() => this.adapter.execute(n, t))
1077
- )
1078
- )
1079
- ).subscribe({
1080
- next: (a) => e.next(a),
1081
- error: (a) => e.error(a)
1082
- });
1083
1043
  }
1084
- }
1085
- class Me extends Yt {
1086
- #e = /* @__PURE__ */ new Map();
1087
- constructor(e, n, t) {
1088
- super(e, n, t), this.db_changes$.subscribe((r) => {
1089
- for (let a = 0; a < r.length; a++) {
1090
- const { type: c, entities: o } = r[a];
1091
- for (const i of this.cache_query_task_map.values()) {
1092
- if (!i.resultEntityIds) return;
1093
- this.merge_cache(c, i, o);
1094
- }
1095
- }
1096
- }), this.db_checks$.subscribe((r) => {
1097
- for (let a = 0; a < r.length; a++) {
1098
- const { type: c, rowIds: o } = r[a];
1099
- for (const i of this.cache_query_task_map.values()) {
1100
- if (!i.resultEntityIds || !this.#e.get(i)) return;
1101
- const l = () => setTimeout(() => h.unsubscribe(), 0), h = this.findByRowIds(o, !0).subscribe({
1102
- next: (_) => {
1103
- _.length && this.db_changes_sub.next({ type: c, entities: _ }), l();
1104
- },
1105
- complete: l
1106
- });
1107
- }
1108
- }
1044
+ if (n) {
1045
+ const r = /* @__PURE__ */ new Map();
1046
+ n.forEach((a) => {
1047
+ const i = _(a);
1048
+ r.has(i) === !1 && r.set(i, /* @__PURE__ */ new Set()), r.get(i).add(a);
1109
1049
  });
1110
- }
1111
- get(e) {
1112
- const n = {
1113
- where: {
1114
- combinator: "and",
1115
- rules: [
1116
- {
1117
- field: "id",
1118
- operator: "=",
1119
- value: e
1120
- }
1121
- ]
1122
- }
1123
- }, t = te(this.adapter, this.metadata, n), r = this.create_query_task(t), a = this.#s(r, { type: "get", options: n });
1124
- return r.result$.pipe(
1125
- E((c) => a.calculate(c)),
1126
- w((c) => {
1127
- if (c.length === 0) throw new R("not found");
1128
- return c[0];
1129
- })
1130
- );
1131
- }
1132
- findOne(e) {
1133
- const n = te(this.adapter, this.metadata, e), t = this.create_query_task(n), r = this.#s(t, { type: "findOne", options: e });
1134
- return t.result$.pipe(
1135
- E((a) => r.calculate(a)),
1136
- w((a) => a[0])
1137
- );
1138
- }
1139
- findOneOrFail(e) {
1140
- const n = te(this.adapter, this.metadata, e), t = this.create_query_task(n), r = this.#s(t, { type: "findOneOrFail", options: e });
1141
- return t.result$.pipe(
1142
- E((a) => r.calculate(a)),
1143
- w((a) => {
1144
- if (a.length === 0)
1145
- throw new R("not found");
1146
- return a[0];
1147
- })
1148
- );
1149
- }
1150
- find(e) {
1151
- const n = At(this.adapter, this.metadata, e), t = this.create_query_task(n), r = this.#s(t, { type: "find", options: e });
1152
- return t.result$.pipe(E((a) => r.calculate(a)));
1153
- }
1154
- findAll(e) {
1155
- const n = oe(this.adapter, this.metadata, e), t = this.create_query_task(n), r = this.#s(t, { type: "findAll", options: e });
1156
- return t.result$.pipe(E((a) => r.calculate(a)));
1157
- }
1158
- findByRowIds(e, n = !1) {
1159
- const t = vt(this.metadata, e), r = this.create_query_task(t);
1160
- return r.result$.pipe(w((a) => this.transform_query_result(r, a, n)));
1161
- }
1162
- count(e) {
1163
- const n = It(this.adapter, this.metadata, e), t = this.create_query_task(n), r = this.#s(t, { type: "count", options: e });
1164
- return t.result$.pipe(E((a) => r.calculate(a)));
1165
- }
1166
- create(e) {
1167
- return g(this.#t(e));
1168
- }
1169
- update(e, n) {
1170
- return g(this.#r(e, n));
1171
- }
1172
- remove(e) {
1173
- const n = M(e), t = () => {
1174
- this.rxdb.context?.userId && (e.removedBy = this.rxdb.context.userId), n.origin = structuredClone({ ...e }), n.modified = !1, e.removedAt = /* @__PURE__ */ new Date(), n.removed = !0;
1175
- };
1176
- if (n.local === !0) {
1177
- const { sql: a, params: c } = Ft(this.metadata, e, this.rxdb.context), o = this.client$.pipe(
1178
- ae(1),
1179
- E(() => this.adapter.execute(a, c)),
1180
- w(() => (t(), e))
1181
- );
1182
- return g(o);
1183
- } else if (n.remote === !0) {
1184
- const { sql: a, params: c } = Wt(this.metadata, e, this.rxdb.context), o = this.#n(a, c).pipe(
1185
- D(() => t()),
1186
- w((i) => i[0])
1050
+ for (const a of r.keys()) {
1051
+ const i = fe(
1052
+ a,
1053
+ Array.from(r.get(a)),
1054
+ t.rxdb.context
1187
1055
  );
1188
- return g(o);
1056
+ s += `
1057
+ ` + i;
1189
1058
  }
1190
- const r = N(e);
1191
- throw new R(`Remove Error${r.name}(${e.id}) not saved local.`);
1192
- }
1193
- merge_cache(e, n, t) {
1194
- const r = this.#e.get(n);
1195
- if (r)
1196
- switch (e) {
1197
- case se:
1198
- Pt(n, r, t);
1199
- break;
1200
- case ne:
1201
- Ht(n, r, t);
1202
- break;
1203
- case V:
1204
- Qt(n, r, t);
1205
- break;
1206
- }
1207
1059
  }
1208
- transform_query_result(e, n, t = !1) {
1209
- const r = this.addQueryCache(n, t);
1210
- return e.resultEntities = r, e.resultEntityIds = r.map((a) => a.id), r;
1211
- }
1212
- #t(e) {
1213
- const { sql: n, params: t } = Ut(this.metadata, e, this.rxdb.context);
1214
- return this.#n(n, t).pipe(w((r) => r[0]));
1215
- }
1216
- #r(e, n) {
1217
- const { sql: t, params: r } = ke(this.metadata, e, n, this.rxdb.context);
1218
- return this.#n(t, r).pipe(w((a) => a[0]));
1219
- }
1220
- #s(e, n) {
1221
- this.#e.set(e, n), e.destroy$.subscribe(() => this.#e.delete(e));
1222
- const t = new K(0), r = t.asObservable(), a = n;
1223
- return a.refresh = () => t.next(t.value + 1), a.calculate = (c) => {
1224
- switch (n.type) {
1225
- case "get":
1226
- case "find":
1227
- case "findAll":
1228
- case "findOne":
1229
- case "findOneOrFail":
1230
- {
1231
- const o = this.addQueryCache(c);
1232
- e.updateResult(o);
1233
- }
1234
- break;
1235
- case "count":
1236
- e.updateResult(c.results[0].rows[0][0]);
1237
- break;
1238
- }
1239
- return r.pipe(w(() => e.result));
1240
- }, a;
1241
- }
1242
- /**
1243
- * 执行修改语句
1244
- */
1245
- #n(e, n) {
1246
- return this.client$.pipe(
1247
- ae(1),
1248
- E(() => this.adapter.execute(e, n)),
1249
- w((t) => this.addQueryCache(t, !0))
1250
- );
1251
- }
1252
- }
1253
- const j = (s, e) => {
1254
- const n = e.where, t = e.isFindRoot ?? !1, r = e?.level || 0, a = b(s), c = `c.level < ${r}`;
1255
- let o = "";
1256
- const i = [c, n && L(n)].filter(Boolean).join(" AND ");
1257
- i && (o = `WHERE ${i}`);
1258
- let u = "*";
1259
- return e.count && (e.isFindRoot ? u = "count(*)" : u = "count(*)-1"), {
1260
- sql: `WITH RECURSIVE __children AS (
1261
- SELECT *,rowid as ${v}, 0 AS level
1262
- FROM "${a}"
1263
- WHERE ${t ? "parentId is null" : "id = ?"}
1264
- UNION ALL
1265
- SELECT children.*,children.rowid as ${v}, c.level + 1
1266
- FROM "${a}" children
1267
- JOIN __children c ON ${e.descendants ? "children.parentId = c.id" : "children.id = c.parentId"}
1268
- ${o}
1269
- )
1270
-
1271
- SELECT ${u} FROM __children ORDER BY level, id;`,
1272
- params: t ? [] : [e.entity && e.entity.id || e.entity]
1273
- };
1274
- }, Jt = (s, e) => j(s, { ...e, isFindRoot: !0, descendants: !0 }), Xt = (s, e) => j(s, { ...e, isFindRoot: !0, descendants: !0, count: !0 }), zt = (s, e) => j(s, { ...e, descendants: !0 }), Zt = (s, e) => j(s, { ...e, descendants: !0, count: !0 }), es = (s, e) => j(s, { ...e, descendants: !1 }), ts = (s, e) => j(s, { ...e, descendants: !1, count: !0 }), de = (s, e, n, t, r) => {
1275
- if (s.length === 0 && e.length === 0) return { refresh: !1, recalculate: !1 };
1276
- const { options: a } = n, c = t.resultEntityIds, o = T(() => r.map((d) => d.id)), i = T(
1277
- () => a?.where ? r.some((d) => Q(d, a.where)) : !0
1278
- ), u = T(
1279
- () => a.orderBy && r.some(
1280
- (d) => ge(d, t.resultEntities || [], a.orderBy)
1281
- )
1282
- ), l = T(() => u() !== !1), h = T(() => i() === !1), _ = T(
1283
- () => c ? c.some((d) => o().includes(d)) : !0
1284
- ), f = T(() => _() === !1), p = {
1285
- match_where: i,
1286
- not_match_where: h,
1287
- match_order_by: l,
1288
- result_contains: _,
1289
- result_not_contains: f
1290
- }, m = e.some(
1291
- (d) => d.every((y) => p[y]())
1292
- );
1293
- return {
1294
- refresh: m === !1 && s.some(
1295
- (d) => d.every((y) => p[y]())
1296
- ),
1297
- recalculate: m
1298
- };
1299
- }, ss = (s, e, n) => {
1300
- e.type;
1301
- }, ns = (s, e, n) => {
1302
- const t = [], r = [];
1303
- switch (e.type) {
1304
- case "countRoot":
1305
- case "countAncestors":
1306
- case "countDescendants":
1307
- t.push(["match_where"]);
1308
- break;
1309
- case "findRoot":
1310
- case "findDescendants":
1311
- case "findAncestors":
1312
- t.push(["match_where"]);
1313
- break;
1314
- }
1315
- const a = de(t, r, e, s, n);
1316
- a.refresh ? s.refresh() : a.recalculate && ss(s, e);
1317
- }, rs = (s, e, n) => {
1318
- e.type;
1319
- }, as = (s, e, n) => {
1320
- const t = [], r = [];
1321
- switch (e.type) {
1322
- case "countRoot":
1323
- case "countAncestors":
1324
- case "countDescendants":
1325
- t.push(["match_where"]);
1326
- break;
1327
- case "findRoot":
1328
- case "findDescendants":
1329
- case "findAncestors":
1330
- t.push(["match_where"]);
1331
- break;
1332
- }
1333
- const a = de(t, r, e, s, n);
1334
- a.refresh ? s.refresh() : a.recalculate && rs(s, e);
1335
- }, cs = (s, e, n) => {
1336
- e.type;
1337
- }, os = (s, e, n) => {
1338
- const t = [], r = [];
1339
- switch (e.type) {
1340
- case "countRoot":
1341
- case "countAncestors":
1342
- case "countDescendants":
1343
- t.push(["match_where"]);
1344
- break;
1345
- case "findRoot":
1346
- case "findDescendants":
1347
- case "findAncestors":
1348
- t.push(["match_where"]);
1349
- break;
1350
- }
1351
- const a = de(t, r, e, s, n);
1352
- a.refresh ? s.refresh() : a.recalculate && cs(s, e);
1060
+ return s;
1353
1061
  };
1354
- class is extends Me {
1355
- #e = /* @__PURE__ */ new Map();
1356
- findRoot(e) {
1357
- const n = Jt(this.metadata, e), t = this.create_query_task(n), r = this.#t(t, { type: "findRoot", options: e });
1358
- return t.result$.pipe(E((a) => r.calculate(a)));
1359
- }
1360
- countRoot(e) {
1361
- const n = Xt(this.metadata, e), t = this.create_query_task(n), r = this.#t(t, { type: "countRoot", options: e });
1362
- return t.result$.pipe(E((a) => r.calculate(a)));
1363
- }
1364
- findDescendants(e) {
1365
- const n = zt(this.metadata, e), t = this.create_query_task(n), r = this.#t(t, { type: "findDescendants", options: e });
1366
- return t.result$.pipe(E((a) => r.calculate(a)));
1367
- }
1368
- countDescendants(e) {
1369
- const n = Zt(this.metadata, e), t = this.create_query_task(n), r = this.#t(t, { type: "countDescendants", options: e });
1370
- return t.result$.pipe(E((a) => r.calculate(a)));
1371
- }
1372
- findAncestors(e) {
1373
- const n = es(this.metadata, e), t = this.create_query_task(n), r = this.#t(t, { type: "findAncestors", options: e });
1374
- return t.result$.pipe(E((a) => r.calculate(a)));
1375
- }
1376
- countAncestors(e) {
1377
- const n = ts(this.metadata, e), t = this.create_query_task(n), r = this.#t(t, { type: "countAncestors", options: e });
1378
- return t.result$.pipe(E((a) => r.calculate(a)));
1379
- }
1380
- /**
1381
- * 根据 type 计算主动更新缓存策略
1382
- */
1383
- merge_cache(e, n, t) {
1384
- super.merge_cache(e, n, t);
1385
- const r = this.#e.get(n);
1386
- if (r)
1387
- switch (e) {
1388
- case "create":
1389
- ns(n, r, t);
1390
- break;
1391
- case "update":
1392
- os(n, r, t);
1393
- break;
1394
- case "remove":
1395
- as(n, r, t);
1396
- break;
1397
- }
1398
- }
1399
- #t(e, n) {
1400
- this.#e.set(e, n), e.destroy$.subscribe(() => this.#e.delete(e));
1401
- const t = new K(0), r = t.asObservable(), a = n;
1402
- return a.calculate = (c) => {
1403
- switch (a.refresh = () => t.next(t.value + 1), n.type) {
1404
- case "findRoot":
1405
- case "findDescendants":
1406
- case "findAncestors":
1407
- {
1408
- const o = this.addQueryCache(c);
1409
- e.updateResult(o);
1410
- }
1411
- break;
1412
- case "countRoot":
1413
- case "countAncestors":
1414
- case "countDescendants":
1415
- e.updateResult(c.results[0].rows[0][0]);
1416
- break;
1417
- }
1418
- return r.pipe(w(() => e.result));
1419
- }, a;
1420
- }
1421
- }
1422
- class bs extends He {
1062
+ class Wt extends Te {
1423
1063
  constructor(e, n) {
1424
1064
  super(e), this.options = n;
1425
- const t = (r) => {
1426
- const { tableName: a, rowIds: c, recordAt: o } = r, [i, u] = a.split("$"), l = this.rxdb.schemaManager.getEntityType(u, i);
1427
- if (!l) return;
1428
- const h = {
1429
- rowIds: c,
1430
- recordAt: o
1431
- };
1432
- setTimeout(() => {
1433
- switch (r.type) {
1434
- case P.SQLITE_DELETE:
1435
- this.rxdb.dispatchEvent(new ze(l, h));
1436
- break;
1437
- case P.SQLITE_INSERT:
1438
- this.rxdb.dispatchEvent(new Xe(l, h));
1439
- break;
1440
- case P.SQLITE_UPDATE:
1441
- this.rxdb.dispatchEvent(new Je(l, h));
1442
- break;
1443
- }
1444
- }, 100);
1445
- };
1446
- this.#c.subscribe((r) => r.onChange = Ze(t)), this.#_.pipe(Te(this.#e)).subscribe();
1065
+ const s = qe(this.#u.bind(this));
1066
+ this.#a().then((r) => {
1067
+ r.addEventListener(W.SQLITE_INSERT, s);
1068
+ });
1447
1069
  }
1448
- #e = new re();
1070
+ // 实体仓库缓存
1449
1071
  #t = /* @__PURE__ */ new Map();
1450
- #r;
1451
- #s = !1;
1452
- // 查询缓存
1453
- #n = [];
1454
- #a = /* @__PURE__ */ new Map();
1455
- #o = !1;
1456
- #i = new K(0);
1457
- #h = this.#i.asObservable();
1072
+ // SQLite 客户端缓存
1073
+ #e;
1074
+ // 事务锁
1075
+ #n = !1;
1076
+ // RowId 与实体缓存映射
1077
+ /**
1078
+ * 行ID映射
1079
+ * 存储数据库行ID到实体UUID的映射关系
1080
+ * 用于在数据库操作中快速查找实体
1081
+ */
1082
+ #o = /* @__PURE__ */ new Map();
1083
+ #s = /* @__PURE__ */ new WeakMap();
1084
+ // 查询任务队列执行器
1085
+ #i = new ee(1);
1458
1086
  // sqlite 客户端
1459
- #c = new Re((e) => {
1460
- const { vfs: n, async: t, worker: r, wasmPath: a, locateFile: c, workerInstance: o } = this.options, i = {
1461
- vfs: n,
1462
- async: t,
1463
- worker: r,
1464
- wasmPath: a,
1465
- locateFile: c
1466
- };
1467
- Ce(i);
1468
- let u;
1469
- r && o ? u = et(o) : u = new jt(), this.#r = u, u.init(this.rxdb.options.dbName, i).then(() => e.next(u));
1470
- }).pipe(U(1));
1471
- // 已连接
1472
- #d = st(() => this.rxdb.connect(this.name)).pipe(U(1));
1473
- // 队列
1474
- #_ = this.#h.pipe(
1475
- G(() => this.#o === !1),
1476
- w(() => this.#n.shift()),
1477
- G(Boolean),
1478
- D(() => this.#o = !0),
1479
- E((e) => {
1480
- const n = this.#a.get(e.key);
1481
- return this.#d.pipe(
1482
- E(() => this.#c),
1483
- E((t) => t.execute(e.sql, e.bindings)),
1484
- D((t) => n.next(t)),
1485
- D(
1486
- () => setTimeout(() => {
1487
- this.#a.get(e.key)?.unsubscribe(), this.#a.delete(e.key);
1488
- }, 0)
1489
- ),
1490
- nt((t) => {
1491
- const r = t.message || "执行错误";
1492
- return n.error(new R(`${r} ${e.sql} ${JSON.stringify(e.bindings)}`)), rt({ error: t });
1493
- })
1494
- );
1495
- }),
1496
- D(() => {
1497
- this.#o = !1, this.#l();
1498
- })
1499
- );
1500
- name = St;
1087
+ #r;
1088
+ // 是否已断开连接
1089
+ #c = !1;
1501
1090
  /**
1502
- * 数据库版本
1091
+ * 适配器名称
1503
1092
  */
1504
- version$ = this.#c.pipe(
1505
- E((e) => me(e.version())),
1506
- U(1)
1507
- );
1093
+ name = wt;
1508
1094
  /**
1509
1095
  * 连接 wab sqlite
1510
1096
  */
1511
- connect() {
1512
- return this.#c.pipe(w(() => this));
1097
+ async connect() {
1098
+ return await this.#a(), this;
1513
1099
  }
1514
1100
  /**
1515
1101
  * 断开连接
1516
1102
  */
1517
1103
  async disconnect() {
1518
- this.#r && (await this.#r.disconnect(), this.#e.next(), this.#e.complete());
1104
+ this.#c = !0, await this.#i.waitForAll(), this.#e && await this.#e.disconnect();
1519
1105
  }
1520
1106
  /**
1521
1107
  * 获取版本
1522
1108
  */
1523
- version() {
1524
- return g(this.version$);
1109
+ async version() {
1110
+ return await (await this.#a()).version();
1525
1111
  }
1526
1112
  /**
1527
1113
  * 获取实体仓库
@@ -1529,19 +1115,19 @@ class bs extends He {
1529
1115
  */
1530
1116
  getRepository(e) {
1531
1117
  if (!this.#t.has(e)) {
1532
- const n = N(e);
1533
- let t;
1118
+ const n = _(e);
1119
+ let s;
1534
1120
  switch (n.repository) {
1535
1121
  case "Repository":
1536
- t = new Me(this, this.#c, e);
1122
+ s = new Ee(this, e);
1537
1123
  break;
1538
1124
  case "TreeRepository":
1539
- t = new is(this, this.#c, e);
1125
+ s = new _t(this, e);
1540
1126
  break;
1541
1127
  default:
1542
- throw new R("Unsupported repository type: " + n.repository);
1128
+ throw new g("Unsupported repository type: " + n.repository);
1543
1129
  }
1544
- return this.#t.set(e, t), t;
1130
+ return this.#t.set(e, s), s;
1545
1131
  }
1546
1132
  return this.#t.get(e);
1547
1133
  }
@@ -1551,22 +1137,23 @@ class bs extends He {
1551
1137
  * @param entities
1552
1138
  */
1553
1139
  async saveMany(e) {
1554
- return this.#s ? await ye(this, e) : e.length > 1 ? await this.transaction(() => ye(this, e)) : e.length === 1 && await e[0].save(), e;
1140
+ return this.#n ? await X(this, e) : e.length > 1 ? await this.transaction(() => X(this, e)) : e.length === 1 && await e[0].save(), e;
1555
1141
  }
1556
1142
  /**
1557
- * 判断表是否存在
1558
- * @param EntityType
1143
+ * 删除多个实例
1144
+ * @param entities
1145
+ * @returns
1559
1146
  */
1560
- isTableExisted(e) {
1561
- return g(this.isTableExisted$(e));
1147
+ async removeMany(e) {
1148
+ return this.#n ? await J(this, e) : e.length > 1 ? await this.transaction(() => J(this, e)) : e.length === 1 && await e[0].remove(), e;
1562
1149
  }
1563
1150
  /**
1564
1151
  * 判断表是否存在
1565
1152
  * @param EntityType
1566
1153
  */
1567
- isTableExisted$(e) {
1568
- const n = N(e), t = b(n);
1569
- return this.#u(ht(t)).pipe(w((r) => dt(r) === !1));
1154
+ async isTableExisted(e) {
1155
+ const n = _(e), s = E(n), r = await this.#d(xe(s));
1156
+ return De(r) === !1;
1570
1157
  }
1571
1158
  /**
1572
1159
  * 创建表和初始化数据
@@ -1574,9 +1161,9 @@ class bs extends He {
1574
1161
  * @param data 视图数据
1575
1162
  * @returns
1576
1163
  */
1577
- createTables(e, n) {
1578
- const t = gt(this, e, n);
1579
- return g(this.#u(t).pipe(w(() => !0)));
1164
+ async createTables(e, n) {
1165
+ const s = Lt(this, e, n);
1166
+ return await this.#d(s), !0;
1580
1167
  }
1581
1168
  /**
1582
1169
  * 创建分支
@@ -1592,7 +1179,39 @@ class bs extends He {
1592
1179
  * @returns
1593
1180
  */
1594
1181
  async switchBranch(e) {
1595
- return xt(this, e);
1182
+ return yt(this, e);
1183
+ }
1184
+ /**
1185
+ * 缓存 RowId 与实体映射
1186
+ * @param rowId
1187
+ * @param entity
1188
+ */
1189
+ cacheRowIdEntity(e, n) {
1190
+ this.#l(n.constructor).set(e, n), this.#s.set(n, e);
1191
+ }
1192
+ /**
1193
+ * 移除缓存实体映射
1194
+ * @param entity
1195
+ */
1196
+ removeCacheEntity(e) {
1197
+ const n = this.#s.get(e);
1198
+ n !== void 0 && (this.#l(e.constructor).delete(n), this.#s.delete(e));
1199
+ }
1200
+ /**
1201
+ * 根据 RowId 获取实体
1202
+ * @param rowId
1203
+ * @returns
1204
+ */
1205
+ getEntityByRowId(e, n) {
1206
+ return this.#l(n).get(e);
1207
+ }
1208
+ /**
1209
+ * 根据实体获取 RowId
1210
+ * @param entity
1211
+ * @returns
1212
+ */
1213
+ getRowIdByEntity(e) {
1214
+ return this.#s.get(e);
1596
1215
  }
1597
1216
  /**
1598
1217
  * 恢复某个实体
@@ -1603,81 +1222,148 @@ class bs extends He {
1603
1222
  throw new Error("Method not implemented.");
1604
1223
  }
1605
1224
  /**
1606
- * 执行 sql
1607
- * @param sql
1608
- * @param bindings
1225
+ * 执行 SQL 语句
1609
1226
  */
1610
- execute(e, n) {
1611
- const t = e + n?.join(",");
1612
- if (!this.#a.has(t)) {
1613
- const r = new re(1);
1614
- this.#a.set(t, r), this.#n.push({ key: t, sql: e, bindings: n }), this.#l();
1615
- }
1616
- return this.#a.get(t).asObservable();
1227
+ query(e, n) {
1228
+ return this.#i.addTask(
1229
+ async () => (await this.rxdb.connect(this.name), (await this.#a()).execute(e, n)),
1230
+ ne([e, n])
1231
+ );
1617
1232
  }
1618
1233
  /**
1619
- * 处理事务
1620
- * @param callback
1234
+ * 执行事务
1235
+ * @param transactionFun 事务方法
1236
+ * @param transactionLog 是否生成事务日志
1237
+ * @returns
1621
1238
  */
1622
- transaction(e) {
1623
- return g(this.transaction$(e));
1624
- }
1625
- transaction$(e, n = !0) {
1626
- return this.rxdb.connect(this.name).pipe(
1627
- E(() => this.#c),
1628
- E(async (t) => {
1629
- this.#s = !0, this.rxdb.dispatchEvent(ls);
1630
- let r = "", a = "";
1631
- if (n) {
1632
- const c = Ye(), o = (i) => `INSERT INTO "public$RxDBChange" (type,branchId,transactionId) VALUES ('${i}','main','${c}');`;
1633
- r = o("TRANSACTION_BEGIN"), a = o("TRANSACTION_COMMIT");
1634
- }
1635
- await t.execute(`
1239
+ async transaction(e, n = !0) {
1240
+ await this.rxdb.connect(this.name);
1241
+ const s = await this.#a();
1242
+ this.#n = !0, this.rxdb.dispatchEvent(qt);
1243
+ let r = "", a = "";
1244
+ if (n) {
1245
+ const i = Ie();
1246
+ r = z(this, "main", i), a = z(this, "main");
1247
+ }
1248
+ await s.execute(`
1636
1249
  BEGIN;
1637
1250
  PRAGMA defer_foreign_keys = ON;
1638
1251
  ${r}
1639
1252
  `);
1640
- try {
1641
- const c = await e();
1642
- return await t.execute(`${a}
1643
- COMMIT;`), this.#s = !1, this.rxdb.dispatchEvent(hs), c;
1644
- } catch (c) {
1645
- await t.execute("ROLLBACK"), this.#s = !1, this.rxdb.dispatchEvent(us);
1646
- const o = c?.message || "Transaction Error";
1647
- throw new R(o);
1648
- }
1649
- })
1650
- );
1253
+ try {
1254
+ const i = await e();
1255
+ return await s.execute(`${a}
1256
+ COMMIT;`), this.#n = !1, this.rxdb.dispatchEvent(Ct), i;
1257
+ } catch (i) {
1258
+ await s.execute("ROLLBACK"), this.#n = !1, this.rxdb.dispatchEvent(jt);
1259
+ const o = i?.message || "Transaction Error";
1260
+ throw new g(o);
1261
+ }
1651
1262
  }
1652
1263
  /**
1653
1264
  * 本地分支仓库
1654
1265
  */
1655
1266
  localRxDBBranch() {
1656
- return this.getRepository(ie);
1267
+ return this.getRepository(U);
1657
1268
  }
1658
1269
  /**
1659
1270
  * 本地变更仓库
1660
1271
  */
1661
1272
  localRxDBChange() {
1662
- return this.getRepository(we);
1273
+ return this.getRepository(F);
1663
1274
  }
1664
- #l() {
1665
- this.#i.next(this.#i.value + 1);
1275
+ /**
1276
+ * 获取 SQLite 客户端
1277
+ */
1278
+ #a() {
1279
+ return this.#r || (this.#r = St(this.rxdb.options.dbName, this.options).then(
1280
+ (e) => (this.#e = e, e)
1281
+ )), this.#r;
1666
1282
  }
1667
1283
  /**
1668
- * 内部执行的 sql
1284
+ * 内部执行 sql
1285
+ * 直接调用不会走队列
1669
1286
  * @param sql
1670
1287
  * @param bindings
1671
1288
  */
1672
- #u(e, n) {
1673
- return this.#c.pipe(E((t) => me(t.execute(e, n))));
1289
+ async #d(e, n) {
1290
+ return await (await this.#a()).execute(e, n);
1291
+ }
1292
+ /**
1293
+ * 处理数据变化
1294
+ * @param event
1295
+ * @returns
1296
+ */
1297
+ #u(e) {
1298
+ if (this.#c) return;
1299
+ const { tableName: n } = e, [s, r] = ke(n), a = this.rxdb.schemaManager.getEntityType(r, s);
1300
+ if (!a) return;
1301
+ const i = this.getRepository(a), o = _(F);
1302
+ e.type === W.SQLITE_INSERT && i.findByRowIds(e.rowIds).then((c) => {
1303
+ const l = this.#h(c);
1304
+ this.#p(l), Le(() => {
1305
+ const d = l.map((u) => ({
1306
+ namespace: o.namespace,
1307
+ entity: o.name,
1308
+ type: u.type,
1309
+ id: u.id,
1310
+ patch: { ...u },
1311
+ inversePatch: null,
1312
+ recordAt: u.createdAt
1313
+ }));
1314
+ this.rxdb.dispatchEvent(new K(d));
1315
+ });
1316
+ }).catch(() => {
1317
+ console.error("Failed to handle RxDBChange insert event");
1318
+ });
1319
+ }
1320
+ /**
1321
+ * 转换实体值从 SQLite 到 JS 格式
1322
+ * @param result
1323
+ * @returns
1324
+ */
1325
+ #h(e) {
1326
+ return e.map((n) => {
1327
+ const s = this.rxdb.schemaManager.getEntityMetadata(n.entity, n.namespace);
1328
+ return s ? (n.inversePatch && Y(s, n.inversePatch), n.patch && Y(s, n.patch)) : console.warn(`Entity metadata not found for ${n.namespace}.${n.entity}`), n;
1329
+ });
1330
+ }
1331
+ #l(e) {
1332
+ return this.#o.has(e) === !1 && this.#o.set(e, /* @__PURE__ */ new Map()), this.#o.get(e);
1333
+ }
1334
+ #p(e) {
1335
+ const n = Object.groupBy(e, (r) => r.type), s = Object.entries(n);
1336
+ for (let r = 0; r < s.length; r++) {
1337
+ const [a, i] = s[r], o = i.map(
1338
+ (c) => ({
1339
+ namespace: c.namespace,
1340
+ entity: c.entity,
1341
+ type: c.type,
1342
+ id: c.entityId,
1343
+ patch: c.patch,
1344
+ inversePatch: c.inversePatch,
1345
+ recordAt: c.createdAt
1346
+ })
1347
+ );
1348
+ switch (a) {
1349
+ case "INSERT":
1350
+ this.rxdb.dispatchEvent(new K(o));
1351
+ break;
1352
+ case "UPDATE":
1353
+ this.rxdb.dispatchEvent(new Re(o));
1354
+ break;
1355
+ case "DELETE":
1356
+ this.rxdb.dispatchEvent(new be(o));
1357
+ break;
1358
+ }
1359
+ }
1674
1360
  }
1675
1361
  }
1676
- const ls = new Ge(), us = new Qe(), hs = new Ke();
1362
+ const qt = new ge(), jt = new $e(), Ct = new Ne();
1677
1363
  export {
1678
- bs as RxDBAdapterSqlite,
1679
- R as RxdbAdapterSqliteError,
1680
- jt as SqliteClient,
1681
- kt as WA_SQLITE_VFS_LIST,
1682
- Ct as sqliteLoad
1364
+ Wt as RxDBAdapterSqlite,
1365
+ g as RxdbAdapterSqliteError,
1366
+ bt as SqliteClient,
1367
+ Nt as WA_SQLITE_VFS_LIST,
1368
+ Tt as sqliteLoad
1683
1369
  };