@peers-app/peers-sdk 0.14.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/context/data-context.d.ts +4 -4
- package/dist/context/data-context.js +1 -1
- package/dist/context/index.d.ts +3 -3
- package/dist/context/index.js +4 -0
- package/dist/context/user-context-singleton.js +13 -14
- package/dist/context/user-context.d.ts +4 -4
- package/dist/context/user-context.js +48 -31
- package/dist/data/assistants.d.ts +1 -1
- package/dist/data/assistants.js +35 -24
- package/dist/data/change-tracking.d.ts +8 -8
- package/dist/data/change-tracking.js +45 -39
- package/dist/data/channels.js +5 -5
- package/dist/data/data-locks.d.ts +2 -2
- package/dist/data/data-locks.js +21 -23
- package/dist/data/data-locks.test.js +73 -75
- package/dist/data/device-sync-info.d.ts +1 -1
- package/dist/data/device-sync-info.js +4 -4
- package/dist/data/devices.d.ts +1 -1
- package/dist/data/devices.js +9 -12
- package/dist/data/embeddings.js +14 -11
- package/dist/data/files/file-read-stream.d.ts +2 -2
- package/dist/data/files/file-read-stream.js +23 -14
- package/dist/data/files/file-write-stream.d.ts +2 -2
- package/dist/data/files/file-write-stream.js +8 -8
- package/dist/data/files/file.types.d.ts +2 -2
- package/dist/data/files/file.types.js +17 -11
- package/dist/data/files/files.d.ts +6 -6
- package/dist/data/files/files.js +17 -19
- package/dist/data/files/files.test.js +213 -214
- package/dist/data/files/index.d.ts +4 -4
- package/dist/data/files/index.js +4 -4
- package/dist/data/group-member-roles.js +2 -2
- package/dist/data/group-members.d.ts +5 -5
- package/dist/data/group-members.js +27 -18
- package/dist/data/group-members.test.js +73 -73
- package/dist/data/group-permissions.d.ts +3 -3
- package/dist/data/group-permissions.js +13 -11
- package/dist/data/group-share.d.ts +2 -2
- package/dist/data/group-share.js +29 -24
- package/dist/data/groups.d.ts +4 -4
- package/dist/data/groups.js +27 -19
- package/dist/data/groups.test.js +44 -44
- package/dist/data/index.d.ts +6 -6
- package/dist/data/index.js +6 -6
- package/dist/data/knowledge/peer-types.js +9 -9
- package/dist/data/messages.d.ts +5 -5
- package/dist/data/messages.js +43 -30
- package/dist/data/orm/client-proxy.data-source.d.ts +4 -4
- package/dist/data/orm/client-proxy.data-source.js +10 -12
- package/dist/data/orm/cursor.d.ts +1 -1
- package/dist/data/orm/cursor.js +2 -2
- package/dist/data/orm/cursor.test.js +92 -93
- package/dist/data/orm/data-query.d.ts +3 -3
- package/dist/data/orm/data-query.js +24 -18
- package/dist/data/orm/data-query.mongo.d.ts +1 -1
- package/dist/data/orm/data-query.mongo.js +49 -51
- package/dist/data/orm/data-query.mongo.test.js +173 -204
- package/dist/data/orm/data-query.sqlite.d.ts +1 -1
- package/dist/data/orm/data-query.sqlite.js +84 -73
- package/dist/data/orm/data-query.sqlite.test.js +164 -176
- package/dist/data/orm/data-query.test.js +216 -224
- package/dist/data/orm/decorators.js +3 -3
- package/dist/data/orm/dependency-injection.test.js +53 -56
- package/dist/data/orm/doc.d.ts +4 -4
- package/dist/data/orm/doc.js +17 -21
- package/dist/data/orm/event-registry.d.ts +1 -1
- package/dist/data/orm/event-registry.test.js +16 -16
- package/dist/data/orm/factory.d.ts +2 -2
- package/dist/data/orm/factory.js +33 -33
- package/dist/data/orm/index.d.ts +10 -10
- package/dist/data/orm/index.js +10 -10
- package/dist/data/orm/multi-cursors.d.ts +1 -1
- package/dist/data/orm/multi-cursors.js +6 -6
- package/dist/data/orm/multi-cursors.test.js +152 -144
- package/dist/data/orm/sql.data-source.d.ts +7 -7
- package/dist/data/orm/sql.data-source.js +88 -93
- package/dist/data/orm/sql.data-source.test.js +109 -101
- package/dist/data/orm/subscribable.data-source.d.ts +4 -4
- package/dist/data/orm/subscribable.data-source.js +5 -5
- package/dist/data/orm/table-container-events.test.js +34 -26
- package/dist/data/orm/table-container.d.ts +6 -6
- package/dist/data/orm/table-container.js +33 -21
- package/dist/data/orm/table-container.test.js +64 -53
- package/dist/data/orm/table-definitions.system.d.ts +3 -3
- package/dist/data/orm/table-definitions.system.js +3 -3
- package/dist/data/orm/table-definitions.type.d.ts +5 -5
- package/dist/data/orm/table-dependencies.d.ts +2 -2
- package/dist/data/orm/table.d.ts +5 -5
- package/dist/data/orm/table.event-source.test.js +105 -115
- package/dist/data/orm/table.js +35 -34
- package/dist/data/orm/types.d.ts +3 -3
- package/dist/data/orm/types.js +26 -25
- package/dist/data/orm/types.test.js +166 -92
- package/dist/data/package-permissions.d.ts +1 -1
- package/dist/data/package-permissions.js +2 -2
- package/dist/data/package-version-permissions.d.ts +1 -1
- package/dist/data/package-version-permissions.js +2 -2
- package/dist/data/package-versions.d.ts +9 -9
- package/dist/data/package-versions.js +47 -33
- package/dist/data/packages.d.ts +2 -2
- package/dist/data/packages.js +36 -18
- package/dist/data/packages.utils.d.ts +2 -2
- package/dist/data/packages.utils.js +4 -4
- package/dist/data/persistent-vars.d.ts +15 -15
- package/dist/data/persistent-vars.js +165 -154
- package/dist/data/table-definitions-table.d.ts +5 -5
- package/dist/data/table-definitions-table.js +13 -12
- package/dist/data/tool-tests.js +6 -6
- package/dist/data/tools.js +29 -19
- package/dist/data/user-permissions.d.ts +1 -1
- package/dist/data/user-permissions.js +5 -5
- package/dist/data/user-permissions.test.js +90 -88
- package/dist/data/user-trust-levels.js +10 -10
- package/dist/data/users.d.ts +4 -4
- package/dist/data/users.js +16 -15
- package/dist/data/voice-messages.d.ts +2 -2
- package/dist/data/voice-messages.js +13 -13
- package/dist/data/welcome-modal.pvar.js +3 -1
- package/dist/data/workflow-logs.js +26 -18
- package/dist/data/workflow-runs.d.ts +6 -6
- package/dist/data/workflow-runs.js +70 -44
- package/dist/data/workflows.d.ts +2 -2
- package/dist/data/workflows.js +7 -9
- package/dist/device/binary-peer-connection-v2.d.ts +7 -7
- package/dist/device/binary-peer-connection-v2.js +32 -28
- package/dist/device/binary-peer-connection-v2.test.js +80 -67
- package/dist/device/binary-peer-connection.d.ts +7 -7
- package/dist/device/binary-peer-connection.js +29 -28
- package/dist/device/binary-peer-connection.test.js +35 -31
- package/dist/device/connection.d.ts +5 -5
- package/dist/device/connection.js +59 -48
- package/dist/device/connection.test.js +74 -68
- package/dist/device/device-election.d.ts +2 -2
- package/dist/device/device-election.js +25 -20
- package/dist/device/device-election.test.js +35 -36
- package/dist/device/device.d.ts +2 -2
- package/dist/device/device.js +10 -4
- package/dist/device/device.test.js +16 -17
- package/dist/device/get-trust-level-fn.d.ts +2 -2
- package/dist/device/get-trust-level-fn.js +22 -11
- package/dist/device/get-trust-level-fn.test.js +58 -58
- package/dist/device/socket-io-binary-peer.d.ts +1 -1
- package/dist/device/socket-io-binary-peer.js +16 -13
- package/dist/device/socket.type.d.ts +2 -2
- package/dist/device/streamed-socket.d.ts +2 -2
- package/dist/device/streamed-socket.js +8 -8
- package/dist/device/streamed-socket.test.js +40 -40
- package/dist/device/tx-encoding.test.js +77 -77
- package/dist/events.d.ts +1 -1
- package/dist/events.js +5 -2
- package/dist/group-invite/group-invite.js +110 -19
- package/dist/group-invite/group-invite.pvars.d.ts +2 -2
- package/dist/group-invite/group-invite.pvars.js +21 -13
- package/dist/group-invite/group-invite.types.d.ts +1 -1
- package/dist/group-invite/index.d.ts +3 -3
- package/dist/group-invite/index.js +1 -1
- package/dist/index.d.ts +25 -24
- package/dist/index.js +30 -25
- package/dist/keys.d.ts +3 -3
- package/dist/keys.js +31 -30
- package/dist/keys.test.js +69 -61
- package/dist/logging/console-logger.d.ts +1 -1
- package/dist/logging/console-logger.js +35 -40
- package/dist/logging/console-logger.test.js +115 -115
- package/dist/logging/console-logs.table.d.ts +3 -3
- package/dist/logging/console-logs.table.js +28 -23
- package/dist/mentions.js +16 -12
- package/dist/observable.d.ts +2 -2
- package/dist/observable.js +15 -9
- package/dist/observable.test.js +47 -47
- package/dist/package-loader/get-require.js +3 -4
- package/dist/package-loader/package-loader.d.ts +2 -2
- package/dist/package-loader/package-loader.js +52 -34
- package/dist/peers-ui/peers-ui.d.ts +2 -2
- package/dist/peers-ui/peers-ui.js +2 -4
- package/dist/peers-ui/peers-ui.types.d.ts +3 -3
- package/dist/peers-ui/peers-ui.types.js +0 -1
- package/dist/rpc-types.d.ts +61 -59
- package/dist/rpc-types.js +61 -55
- package/dist/serial-json.d.ts +1 -1
- package/dist/serial-json.js +50 -43
- package/dist/serial-json.test.js +22 -22
- package/dist/system-ids.js +8 -8
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/tools-factory.d.ts +1 -1
- package/dist/tools/tools-factory.js +2 -2
- package/dist/types/assistant-runner-args.d.ts +3 -3
- package/dist/types/peer-device.d.ts +1 -1
- package/dist/types/peers-package.d.ts +3 -3
- package/dist/types/workflow-logger.d.ts +1 -1
- package/dist/types/workflow-run-context.d.ts +4 -4
- package/dist/types/workflow.d.ts +4 -4
- package/dist/types/workflow.js +27 -14
- package/dist/types/zod-types.d.ts +2 -1
- package/dist/types/zod-types.js +9 -3
- package/dist/user-connect/connection-code.d.ts +1 -1
- package/dist/user-connect/connection-code.js +7 -7
- package/dist/user-connect/connection-code.test.js +106 -106
- package/dist/user-connect/index.d.ts +3 -3
- package/dist/user-connect/index.js +1 -1
- package/dist/user-connect/user-connect.pvars.js +13 -11
- package/dist/user-connect/user-connect.types.d.ts +3 -3
- package/dist/users.query.d.ts +2 -2
- package/dist/users.query.js +40 -30
- package/dist/utils.d.ts +2 -2
- package/dist/utils.js +34 -32
- package/dist/utils.test.js +12 -8
- package/dist/workflow-log-formatter.d.ts +1 -1
- package/dist/workflow-log-formatter.js +17 -18
- package/package.json +14 -8
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TableContainer = void 0;
|
|
4
4
|
exports.checkVersionedUpdate = checkVersionedUpdate;
|
|
5
|
-
const
|
|
5
|
+
const rpc_types_1 = require("../../rpc-types");
|
|
6
|
+
const utils_1 = require("../../utils");
|
|
6
7
|
const table_1 = require("./table");
|
|
7
8
|
const table_definitions_system_1 = require("./table-definitions.system");
|
|
8
|
-
const
|
|
9
|
-
const rpc_types_1 = require("../../rpc-types");
|
|
9
|
+
const types_1 = require("./types");
|
|
10
10
|
/**
|
|
11
11
|
* Normalize metaData for structural comparison by stripping fields that can differ
|
|
12
12
|
* between in-memory and DB-serialized representations without representing a real schema change.
|
|
@@ -27,16 +27,17 @@ function normalizeMetaDataForComparison(metaData) {
|
|
|
27
27
|
*/
|
|
28
28
|
function checkVersionedUpdate(existingVersion, incomingVersion, existingMetaData, incomingMetaData) {
|
|
29
29
|
if (existingVersion < incomingVersion) {
|
|
30
|
-
return
|
|
30
|
+
return "update";
|
|
31
31
|
}
|
|
32
32
|
if (existingVersion === incomingVersion) {
|
|
33
|
-
const sameDefinition = (0, utils_1.simpleObjectHash)(normalizeMetaDataForComparison(existingMetaData)) ===
|
|
33
|
+
const sameDefinition = (0, utils_1.simpleObjectHash)(normalizeMetaDataForComparison(existingMetaData)) ===
|
|
34
|
+
(0, utils_1.simpleObjectHash)(normalizeMetaDataForComparison(incomingMetaData));
|
|
34
35
|
if (!sameDefinition) {
|
|
35
36
|
const tableName = (0, utils_1.getFullTableName)(existingMetaData);
|
|
36
37
|
console.error(`Table "${tableName}" has two different definitions with the same versionNumber (${existingMetaData.versionNumber}). Skipping update. Increment versionNumber when changing table definitions.`);
|
|
37
38
|
}
|
|
38
39
|
}
|
|
39
|
-
return
|
|
40
|
+
return "skip";
|
|
40
41
|
// commenting this out for now, it's too likely to end up in an infinite loop
|
|
41
42
|
// if (existingVersion > incomingVersion) {
|
|
42
43
|
// return 'skip';
|
|
@@ -81,7 +82,8 @@ class TableContainer {
|
|
|
81
82
|
}
|
|
82
83
|
if (existing && opts?.overwrite) {
|
|
83
84
|
const existingDef = this.tableDefinitions[tableName];
|
|
84
|
-
if (existingDef &&
|
|
85
|
+
if (existingDef &&
|
|
86
|
+
(0, utils_1.simpleObjectHash)(existingDef.metaData) === (0, utils_1.simpleObjectHash)(tableDefinition.metaData)) {
|
|
85
87
|
return; // definition hasn't changed, no need to overwrite
|
|
86
88
|
}
|
|
87
89
|
console.warn(`Overwriting table definition for ${tableName}.`);
|
|
@@ -95,7 +97,7 @@ class TableContainer {
|
|
|
95
97
|
*/
|
|
96
98
|
setTable(table, opts) {
|
|
97
99
|
if (!(0, utils_1.isid)(table.metaData.tableId)) {
|
|
98
|
-
throw new Error(
|
|
100
|
+
throw new Error("Table must have a valid tableId in its metadata. Only system tables are allowed to have an empty tableId.");
|
|
99
101
|
}
|
|
100
102
|
const tableName = (0, utils_1.getFullTableName)(table.metaData);
|
|
101
103
|
if (this.tableInstances[tableName]) {
|
|
@@ -109,7 +111,7 @@ class TableContainer {
|
|
|
109
111
|
this.tableInstances[tableName] = table;
|
|
110
112
|
}
|
|
111
113
|
getTable(metaDataOrTableName, schema, tableConstructor) {
|
|
112
|
-
if (typeof metaDataOrTableName ===
|
|
114
|
+
if (typeof metaDataOrTableName === "string") {
|
|
113
115
|
return this.getTableByName(metaDataOrTableName);
|
|
114
116
|
}
|
|
115
117
|
const metaData = metaDataOrTableName;
|
|
@@ -135,7 +137,7 @@ class TableContainer {
|
|
|
135
137
|
return;
|
|
136
138
|
if (!metaData.tableId)
|
|
137
139
|
return; // system tables don't need to be saved
|
|
138
|
-
if (metaData.name ===
|
|
140
|
+
if (metaData.name === "TableDefinitions")
|
|
139
141
|
return; // avoid recursion
|
|
140
142
|
if (this.savingDefinitions)
|
|
141
143
|
return; // guard against re-entrant calls
|
|
@@ -143,7 +145,7 @@ class TableContainer {
|
|
|
143
145
|
const tableName = (0, utils_1.getFullTableName)(metaData);
|
|
144
146
|
try {
|
|
145
147
|
// Lazy import to avoid circular dependency at module load time
|
|
146
|
-
const { TableDefinitions } = require(
|
|
148
|
+
const { TableDefinitions } = require("../table-definitions-table");
|
|
147
149
|
const tableDefsTable = TableDefinitions();
|
|
148
150
|
const record = {
|
|
149
151
|
tableId: metaData.tableId,
|
|
@@ -152,17 +154,21 @@ class TableContainer {
|
|
|
152
154
|
versionNumber: metaData.versionNumber ?? 0,
|
|
153
155
|
};
|
|
154
156
|
// Fire-and-forget: check if existing record has a newer versionNumber
|
|
155
|
-
tableDefsTable
|
|
157
|
+
tableDefsTable
|
|
158
|
+
.get(metaData.tableId)
|
|
159
|
+
.then((existing) => {
|
|
156
160
|
if (existing) {
|
|
157
161
|
const result = checkVersionedUpdate(existing.versionNumber, record.versionNumber, existing.metaData, record.metaData);
|
|
158
|
-
if (result ===
|
|
162
|
+
if (result === "skip") {
|
|
159
163
|
return;
|
|
160
164
|
}
|
|
161
165
|
}
|
|
162
166
|
return tableDefsTable.save(record, { restoreIfDeleted: true, saveAsSnapshot: true });
|
|
163
|
-
})
|
|
167
|
+
})
|
|
168
|
+
.catch((err) => {
|
|
164
169
|
console.warn(`Failed to save table definition for ${tableName}:`, err);
|
|
165
|
-
})
|
|
170
|
+
})
|
|
171
|
+
.finally(() => {
|
|
166
172
|
this.savingDefinitions = false;
|
|
167
173
|
});
|
|
168
174
|
}
|
|
@@ -212,14 +218,14 @@ class TableContainer {
|
|
|
212
218
|
this.fallbackInstances[tableName] = table;
|
|
213
219
|
return table;
|
|
214
220
|
}
|
|
215
|
-
const tableDefsTable = this.tableInstances
|
|
221
|
+
const tableDefsTable = this.tableInstances.TableDefinitions;
|
|
216
222
|
if (!tableDefsTable)
|
|
217
223
|
return null;
|
|
218
224
|
// Subscribe once so future changes are picked up automatically
|
|
219
225
|
if (!this.fallbackSubscribed) {
|
|
220
226
|
this.fallbackSubscribed = true;
|
|
221
227
|
tableDefsTable.dataChanged.subscribe((event) => {
|
|
222
|
-
if (event.op ===
|
|
228
|
+
if (event.op === "delete") {
|
|
223
229
|
const md = event.dataObject?.metaData;
|
|
224
230
|
if (md) {
|
|
225
231
|
const name = (0, utils_1.getFullTableName)(md);
|
|
@@ -264,7 +270,7 @@ class TableContainer {
|
|
|
264
270
|
const existingVersion = existing.metaData.versionNumber ?? 0;
|
|
265
271
|
const incomingVersion = record.versionNumber ?? 0;
|
|
266
272
|
const result = checkVersionedUpdate(existingVersion, incomingVersion, existing.metaData, metaData);
|
|
267
|
-
if (result ===
|
|
273
|
+
if (result === "skip") {
|
|
268
274
|
return;
|
|
269
275
|
}
|
|
270
276
|
// Remove old fallback instance so it gets re-created with the new schema
|
|
@@ -279,10 +285,13 @@ class TableContainer {
|
|
|
279
285
|
*
|
|
280
286
|
* This is primarily intended to be used by the peer-device sync operation which needs all
|
|
281
287
|
* tables to be able to apply changes correctly.
|
|
282
|
-
|
|
288
|
+
*/
|
|
283
289
|
getAllTables() {
|
|
284
290
|
// 1. Instantiate all full definitions (system + code-registered)
|
|
285
|
-
const fullDefinitions = [
|
|
291
|
+
const fullDefinitions = [
|
|
292
|
+
...Object.values(table_definitions_system_1.systemTableDefinitions),
|
|
293
|
+
...Object.values(this.tableDefinitions),
|
|
294
|
+
];
|
|
286
295
|
for (const tableDefinition of fullDefinitions) {
|
|
287
296
|
const { metaData, schema, tableConstructor } = tableDefinition;
|
|
288
297
|
this.getTable(metaData, schema, tableConstructor);
|
|
@@ -296,7 +305,10 @@ class TableContainer {
|
|
|
296
305
|
}
|
|
297
306
|
}
|
|
298
307
|
// 3. Merge: full instances take precedence, then add fallbacks for tables not in full
|
|
299
|
-
const result = {
|
|
308
|
+
const result = {
|
|
309
|
+
...this.fallbackInstances,
|
|
310
|
+
...this.tableInstances,
|
|
311
|
+
};
|
|
300
312
|
return Object.values(result);
|
|
301
313
|
}
|
|
302
314
|
}
|
|
@@ -1,62 +1,73 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const zod_1 = require("zod");
|
|
4
|
-
const table_container_1 = require("./table-container");
|
|
5
|
-
const event_registry_1 = require("./event-registry");
|
|
6
|
-
const client_proxy_data_source_1 = require("./client-proxy.data-source");
|
|
7
|
-
const table_1 = require("./table");
|
|
8
4
|
const field_type_1 = require("../../types/field-type");
|
|
9
5
|
const utils_1 = require("../../utils");
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
6
|
+
const client_proxy_data_source_1 = require("./client-proxy.data-source");
|
|
7
|
+
const event_registry_1 = require("./event-registry");
|
|
8
|
+
const table_1 = require("./table");
|
|
9
|
+
const table_container_1 = require("./table-container");
|
|
10
|
+
describe("checkVersionedUpdate", () => {
|
|
11
|
+
const metaA = {
|
|
12
|
+
name: "TestTable",
|
|
13
|
+
fields: [{ name: "id", type: "string" }],
|
|
14
|
+
};
|
|
15
|
+
const metaAReordered = {
|
|
16
|
+
fields: [{ name: "id", type: "string" }],
|
|
17
|
+
name: "TestTable",
|
|
18
|
+
};
|
|
19
|
+
const metaB = {
|
|
20
|
+
name: "TestTable",
|
|
21
|
+
fields: [{ name: "id", type: "number" }],
|
|
22
|
+
};
|
|
23
|
+
it("should skip when existing version is strictly newer", () => {
|
|
24
|
+
expect((0, table_container_1.checkVersionedUpdate)(200, 100, metaA, metaB)).toBe("skip");
|
|
16
25
|
});
|
|
17
|
-
it(
|
|
18
|
-
expect((0, table_container_1.checkVersionedUpdate)(100, 200, metaA, metaB)).toBe(
|
|
26
|
+
it("should update when incoming version is strictly newer", () => {
|
|
27
|
+
expect((0, table_container_1.checkVersionedUpdate)(100, 200, metaA, metaB)).toBe("update");
|
|
19
28
|
});
|
|
20
|
-
it(
|
|
21
|
-
expect((0, table_container_1.checkVersionedUpdate)(100, 100, metaA, metaA)).toBe(
|
|
29
|
+
it("should skip when same non-zero version and same definition", () => {
|
|
30
|
+
expect((0, table_container_1.checkVersionedUpdate)(100, 100, metaA, metaA)).toBe("skip");
|
|
22
31
|
});
|
|
23
|
-
it(
|
|
24
|
-
expect((0, table_container_1.checkVersionedUpdate)(100, 100, metaA, metaAReordered)).toBe(
|
|
32
|
+
it("should skip when same non-zero version and same definition with different key order", () => {
|
|
33
|
+
expect((0, table_container_1.checkVersionedUpdate)(100, 100, metaA, metaAReordered)).toBe("skip");
|
|
25
34
|
});
|
|
26
|
-
it(
|
|
27
|
-
expect((0, table_container_1.checkVersionedUpdate)(100, 100, metaA, metaB)).toBe(
|
|
35
|
+
it("should skip when same non-zero version but different definitions", () => {
|
|
36
|
+
expect((0, table_container_1.checkVersionedUpdate)(100, 100, metaA, metaB)).toBe("skip");
|
|
28
37
|
});
|
|
29
|
-
it(
|
|
30
|
-
expect((0, table_container_1.checkVersionedUpdate)(0, 0, metaA, metaA)).toBe(
|
|
38
|
+
it("should skip when both versions are 0 and definitions are the same", () => {
|
|
39
|
+
expect((0, table_container_1.checkVersionedUpdate)(0, 0, metaA, metaA)).toBe("skip");
|
|
31
40
|
});
|
|
32
|
-
it(
|
|
33
|
-
expect((0, table_container_1.checkVersionedUpdate)(0, 0, metaA, metaAReordered)).toBe(
|
|
41
|
+
it("should skip when both versions are 0 and definitions are the same with different key order", () => {
|
|
42
|
+
expect((0, table_container_1.checkVersionedUpdate)(0, 0, metaA, metaAReordered)).toBe("skip");
|
|
34
43
|
});
|
|
35
|
-
it(
|
|
36
|
-
expect((0, table_container_1.checkVersionedUpdate)(0, 0, metaA, metaB)).toBe(
|
|
44
|
+
it("should skip when both versions are 0 and definitions differ", () => {
|
|
45
|
+
expect((0, table_container_1.checkVersionedUpdate)(0, 0, metaA, metaB)).toBe("skip");
|
|
37
46
|
});
|
|
38
|
-
it(
|
|
39
|
-
expect((0, table_container_1.checkVersionedUpdate)(50, 100, metaA, metaA)).toBe(
|
|
40
|
-
expect((0, table_container_1.checkVersionedUpdate)(50, 100, metaA, metaB)).toBe(
|
|
47
|
+
it("should update when incoming is newer regardless of definition content", () => {
|
|
48
|
+
expect((0, table_container_1.checkVersionedUpdate)(50, 100, metaA, metaA)).toBe("update");
|
|
49
|
+
expect((0, table_container_1.checkVersionedUpdate)(50, 100, metaA, metaB)).toBe("update");
|
|
41
50
|
});
|
|
42
|
-
it(
|
|
43
|
-
expect((0, table_container_1.checkVersionedUpdate)(100, 50, metaA, metaA)).toBe(
|
|
44
|
-
expect((0, table_container_1.checkVersionedUpdate)(100, 50, metaA, metaB)).toBe(
|
|
51
|
+
it("should skip when existing is newer regardless of definition content", () => {
|
|
52
|
+
expect((0, table_container_1.checkVersionedUpdate)(100, 50, metaA, metaA)).toBe("skip");
|
|
53
|
+
expect((0, table_container_1.checkVersionedUpdate)(100, 50, metaA, metaB)).toBe("skip");
|
|
45
54
|
});
|
|
46
55
|
});
|
|
47
56
|
// --- Tiered table instance tests ---
|
|
48
57
|
// Custom Table subclass for testing
|
|
49
58
|
class CustomTestTable extends table_1.Table {
|
|
50
59
|
customMethod() {
|
|
51
|
-
return
|
|
60
|
+
return "custom";
|
|
52
61
|
}
|
|
53
62
|
}
|
|
54
63
|
function createTestHarness() {
|
|
55
|
-
const mockDataContext = { dataContextId:
|
|
64
|
+
const mockDataContext = { dataContextId: "test-context" };
|
|
56
65
|
const eventRegistry = new event_registry_1.EventRegistry(mockDataContext);
|
|
57
|
-
const tableFactory = jest
|
|
66
|
+
const tableFactory = jest
|
|
67
|
+
.fn()
|
|
68
|
+
.mockImplementation((metaData, schema, TableClass) => {
|
|
58
69
|
const deps = {
|
|
59
|
-
dataSource: new client_proxy_data_source_1.ClientProxyDataSource(metaData, schema,
|
|
70
|
+
dataSource: new client_proxy_data_source_1.ClientProxyDataSource(metaData, schema, "test-context"),
|
|
60
71
|
eventRegistry,
|
|
61
72
|
};
|
|
62
73
|
return new (TableClass || table_1.Table)(metaData, deps);
|
|
@@ -65,12 +76,12 @@ function createTestHarness() {
|
|
|
65
76
|
const tableId = (0, utils_1.newid)();
|
|
66
77
|
const testMetaData = {
|
|
67
78
|
tableId,
|
|
68
|
-
name:
|
|
69
|
-
description:
|
|
70
|
-
primaryKeyName:
|
|
79
|
+
name: "TestPkgTable",
|
|
80
|
+
description: "A package-defined table",
|
|
81
|
+
primaryKeyName: "id",
|
|
71
82
|
fields: [
|
|
72
|
-
{ name:
|
|
73
|
-
{ name:
|
|
83
|
+
{ name: "id", type: field_type_1.FieldType.id },
|
|
84
|
+
{ name: "title", type: field_type_1.FieldType.string },
|
|
74
85
|
],
|
|
75
86
|
};
|
|
76
87
|
const testSchema = zod_1.z.object({
|
|
@@ -85,8 +96,8 @@ function createTestHarness() {
|
|
|
85
96
|
};
|
|
86
97
|
return { container, testMetaData, testSchema, defRecord, tableFactory };
|
|
87
98
|
}
|
|
88
|
-
describe(
|
|
89
|
-
it(
|
|
99
|
+
describe("Tiered table instances", () => {
|
|
100
|
+
it("bare-bones fallback instance should NOT block full instance with custom constructor", () => {
|
|
90
101
|
const { container, testMetaData, testSchema, defRecord } = createTestHarness();
|
|
91
102
|
// Simulate sync: register from a TableDefinitionRecord (no custom constructor)
|
|
92
103
|
// (method is private — normally auto-called via dataChanged subscription)
|
|
@@ -99,9 +110,9 @@ describe('Tiered table instances', () => {
|
|
|
99
110
|
const fullTable = container.getTable(testMetaData, testSchema, CustomTestTable);
|
|
100
111
|
// The full instance should be a CustomTestTable, NOT the bare-bones Table
|
|
101
112
|
expect(fullTable).toBeInstanceOf(CustomTestTable);
|
|
102
|
-
expect(fullTable.customMethod()).toBe(
|
|
113
|
+
expect(fullTable.customMethod()).toBe("custom");
|
|
103
114
|
});
|
|
104
|
-
it(
|
|
115
|
+
it("getTableByName should return full instance when one exists", () => {
|
|
105
116
|
const { container, testMetaData, testSchema, defRecord } = createTestHarness();
|
|
106
117
|
// Register fallback definition (private — normally auto-called)
|
|
107
118
|
container.registerFromTableDefinitionRecord(defRecord);
|
|
@@ -113,7 +124,7 @@ describe('Tiered table instances', () => {
|
|
|
113
124
|
expect(byName).toBe(fullTable);
|
|
114
125
|
expect(byName).toBeInstanceOf(CustomTestTable);
|
|
115
126
|
});
|
|
116
|
-
it(
|
|
127
|
+
it("getTableByName should return fallback instance when no full instance exists", () => {
|
|
117
128
|
const { container, defRecord } = createTestHarness();
|
|
118
129
|
// Only register from definition record -- no full definition available (private — normally auto-called)
|
|
119
130
|
container.registerFromTableDefinitionRecord(defRecord);
|
|
@@ -122,18 +133,18 @@ describe('Tiered table instances', () => {
|
|
|
122
133
|
expect(table).toBeInstanceOf(table_1.Table);
|
|
123
134
|
expect(table).not.toBeInstanceOf(CustomTestTable);
|
|
124
135
|
});
|
|
125
|
-
it(
|
|
136
|
+
it("getAllTables should prefer full instances over fallback instances", () => {
|
|
126
137
|
const { container, testMetaData, testSchema, defRecord, tableFactory } = createTestHarness();
|
|
127
138
|
// Create a second table that will only have a fallback definition
|
|
128
139
|
const tableId2 = (0, utils_1.newid)();
|
|
129
140
|
const metaData2 = {
|
|
130
141
|
tableId: tableId2,
|
|
131
|
-
name:
|
|
132
|
-
description:
|
|
133
|
-
primaryKeyName:
|
|
142
|
+
name: "OtherTable",
|
|
143
|
+
description: "Another table",
|
|
144
|
+
primaryKeyName: "id",
|
|
134
145
|
fields: [
|
|
135
|
-
{ name:
|
|
136
|
-
{ name:
|
|
146
|
+
{ name: "id", type: field_type_1.FieldType.id },
|
|
147
|
+
{ name: "value", type: field_type_1.FieldType.string },
|
|
137
148
|
],
|
|
138
149
|
};
|
|
139
150
|
const defRecord2 = {
|
|
@@ -149,14 +160,14 @@ describe('Tiered table instances', () => {
|
|
|
149
160
|
container.getTable(testMetaData, testSchema, CustomTestTable);
|
|
150
161
|
// getAllTables should include both tables
|
|
151
162
|
const allTables = container.getAllTables();
|
|
152
|
-
const tableNames = allTables.map(t => t.tableName);
|
|
163
|
+
const tableNames = allTables.map((t) => t.tableName);
|
|
153
164
|
expect(tableNames).toContain(defRecord.name);
|
|
154
165
|
expect(tableNames).toContain(defRecord2.name);
|
|
155
166
|
// The first table should be the full CustomTestTable instance
|
|
156
|
-
const firstTable = allTables.find(t => t.tableName === defRecord.name);
|
|
167
|
+
const firstTable = allTables.find((t) => t.tableName === defRecord.name);
|
|
157
168
|
expect(firstTable).toBeInstanceOf(CustomTestTable);
|
|
158
169
|
// The second table should be a bare-bones Table (fallback)
|
|
159
|
-
const secondTable = allTables.find(t => t.tableName === defRecord2.name);
|
|
170
|
+
const secondTable = allTables.find((t) => t.tableName === defRecord2.name);
|
|
160
171
|
expect(secondTable).toBeInstanceOf(table_1.Table);
|
|
161
172
|
expect(secondTable).not.toBeInstanceOf(CustomTestTable);
|
|
162
173
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { z } from
|
|
2
|
-
import { ITableDefinition, TableConstructor } from
|
|
3
|
-
import { ITableMetaData } from
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { ITableDefinition, TableConstructor } from "./table-definitions.type";
|
|
3
|
+
import { type ITableMetaData } from "./types";
|
|
4
4
|
export declare const systemTableDefinitions: {
|
|
5
5
|
[tableName: string]: ITableDefinition<any>;
|
|
6
6
|
};
|
|
@@ -3,15 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.systemTableDefinitions = void 0;
|
|
4
4
|
exports.registerSystemTableDefinition = registerSystemTableDefinition;
|
|
5
5
|
const keys_1 = require("../../keys");
|
|
6
|
-
const types_1 = require("./types");
|
|
7
6
|
const utils_1 = require("../../utils");
|
|
7
|
+
const types_1 = require("./types");
|
|
8
8
|
exports.systemTableDefinitions = {};
|
|
9
9
|
function registerSystemTableDefinition(metaData, schema, tableConstructor) {
|
|
10
10
|
const tableName = (0, utils_1.getFullTableName)(metaData);
|
|
11
11
|
const def = {
|
|
12
12
|
metaData,
|
|
13
13
|
schema,
|
|
14
|
-
tableConstructor
|
|
14
|
+
tableConstructor,
|
|
15
15
|
};
|
|
16
16
|
if (exports.systemTableDefinitions[tableName]) {
|
|
17
17
|
const s1 = (0, keys_1.stableStringify)(exports.systemTableDefinitions[tableName].metaData);
|
|
@@ -19,7 +19,7 @@ function registerSystemTableDefinition(metaData, schema, tableConstructor) {
|
|
|
19
19
|
if (s1 !== s2) {
|
|
20
20
|
console.warn(`Attempt to register new metadata for system table ${tableName}, it will be ignored`, {
|
|
21
21
|
registered: exports.systemTableDefinitions[tableName].metaData,
|
|
22
|
-
incoming: metaData
|
|
22
|
+
incoming: metaData,
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
25
|
return;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
import type { ITableDependencies } from
|
|
5
|
-
import {
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { IDataSource } from "./data-query";
|
|
3
|
+
import type { Table } from "./table";
|
|
4
|
+
import type { ITableDependencies } from "./table-dependencies";
|
|
5
|
+
import type { ITableMetaData } from "./types";
|
|
6
6
|
export type DataSourceFactory = (metaData: ITableMetaData, schema?: z.AnyZodObject, groupId?: string) => IDataSource<any>;
|
|
7
7
|
export type TableConstructor<T extends {
|
|
8
8
|
[key: string]: any;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { UserContext } from "../../context/user-context";
|
|
2
3
|
import type { IDataSource } from "./data-query";
|
|
3
4
|
import type { EventRegistry } from "./event-registry";
|
|
4
|
-
import type { UserContext } from "../../context/user-context";
|
|
5
5
|
import type { DataSourceFactory } from "./table-definitions.type";
|
|
6
6
|
/**
|
|
7
7
|
* Dependencies required by Table instances.
|
package/dist/data/orm/table.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { Emitter, Event } from "../../events";
|
|
3
|
-
import { DataFilter, ICursorIterable, IDataQueryParams, IDataSource, ISaveOptions } from "./data-query";
|
|
4
|
-
import { IDataChangedEvent } from "./subscribable.data-source";
|
|
5
|
-
import { ITableMetaData } from "./types";
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { Emitter, Event } from "../../events";
|
|
3
|
+
import { type DataFilter, type ICursorIterable, type IDataQueryParams, type IDataSource, type ISaveOptions } from "./data-query";
|
|
4
|
+
import { type IDataChangedEvent } from "./subscribable.data-source";
|
|
6
5
|
import type { ITableDependencies } from "./table-dependencies";
|
|
6
|
+
import { type ITableMetaData } from "./types";
|
|
7
7
|
export declare class Table<T extends {
|
|
8
8
|
[key: string]: any;
|
|
9
9
|
}> implements IDataSource<T> {
|