@peers-app/peers-sdk 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/context/data-context.d.ts +31 -0
- package/dist/context/data-context.js +56 -0
- package/dist/context/index.d.ts +3 -0
- package/dist/context/index.js +19 -0
- package/dist/context/user-context-singleton.d.ts +11 -0
- package/dist/context/user-context-singleton.js +121 -0
- package/dist/context/user-context.d.ts +55 -0
- package/dist/context/user-context.js +205 -0
- package/dist/data/assistants.d.ts +68 -0
- package/dist/data/assistants.js +64 -0
- package/dist/data/change-tracking.d.ts +219 -0
- package/dist/data/change-tracking.js +119 -0
- package/dist/data/channels.d.ts +29 -0
- package/dist/data/channels.js +25 -0
- package/dist/data/data-locks.d.ts +37 -0
- package/dist/data/data-locks.js +180 -0
- package/dist/data/data-locks.test.d.ts +1 -0
- package/dist/data/data-locks.test.js +456 -0
- package/dist/data/device-sync-info.d.ts +19 -0
- package/dist/data/device-sync-info.js +24 -0
- package/dist/data/devices.d.ts +51 -0
- package/dist/data/devices.js +36 -0
- package/dist/data/embeddings.d.ts +47 -0
- package/dist/data/embeddings.js +36 -0
- package/dist/data/files/file-read-stream.d.ts +27 -0
- package/dist/data/files/file-read-stream.js +195 -0
- package/dist/data/files/file-write-stream.d.ts +20 -0
- package/dist/data/files/file-write-stream.js +113 -0
- package/dist/data/files/file.types.d.ts +47 -0
- package/dist/data/files/file.types.js +55 -0
- package/dist/data/files/files.d.ts +28 -0
- package/dist/data/files/files.js +127 -0
- package/dist/data/files/files.test.d.ts +1 -0
- package/dist/data/files/files.test.js +728 -0
- package/dist/data/files/index.d.ts +4 -0
- package/dist/data/files/index.js +23 -0
- package/dist/data/group-member-roles.d.ts +9 -0
- package/dist/data/group-member-roles.js +25 -0
- package/dist/data/group-members.d.ts +39 -0
- package/dist/data/group-members.js +68 -0
- package/dist/data/group-members.test.d.ts +1 -0
- package/dist/data/group-members.test.js +287 -0
- package/dist/data/group-permissions.d.ts +8 -0
- package/dist/data/group-permissions.js +73 -0
- package/dist/data/group-share.d.ts +50 -0
- package/dist/data/group-share.js +196 -0
- package/dist/data/groups.d.ts +50 -0
- package/dist/data/groups.js +73 -0
- package/dist/data/groups.test.d.ts +1 -0
- package/dist/data/groups.test.js +153 -0
- package/dist/data/index.d.ts +31 -0
- package/dist/data/index.js +47 -0
- package/dist/data/knowledge/knowledge-frames.d.ts +34 -0
- package/dist/data/knowledge/knowledge-frames.js +34 -0
- package/dist/data/knowledge/knowledge-links.d.ts +30 -0
- package/dist/data/knowledge/knowledge-links.js +25 -0
- package/dist/data/knowledge/knowledge-values.d.ts +35 -0
- package/dist/data/knowledge/knowledge-values.js +35 -0
- package/dist/data/knowledge/peer-types.d.ts +112 -0
- package/dist/data/knowledge/peer-types.js +27 -0
- package/dist/data/knowledge/predicates.d.ts +34 -0
- package/dist/data/knowledge/predicates.js +27 -0
- package/dist/data/messages.d.ts +57 -0
- package/dist/data/messages.js +97 -0
- package/dist/data/orm/client-proxy.data-source.d.ts +27 -0
- package/dist/data/orm/client-proxy.data-source.js +65 -0
- package/dist/data/orm/cursor.d.ts +25 -0
- package/dist/data/orm/cursor.js +47 -0
- package/dist/data/orm/cursor.test.d.ts +1 -0
- package/dist/data/orm/cursor.test.js +315 -0
- package/dist/data/orm/data-query.d.ts +96 -0
- package/dist/data/orm/data-query.js +208 -0
- package/dist/data/orm/data-query.mongo.d.ts +17 -0
- package/dist/data/orm/data-query.mongo.js +267 -0
- package/dist/data/orm/data-query.mongo.test.d.ts +1 -0
- package/dist/data/orm/data-query.mongo.test.js +398 -0
- package/dist/data/orm/data-query.sqlite.d.ts +14 -0
- package/dist/data/orm/data-query.sqlite.js +297 -0
- package/dist/data/orm/data-query.sqlite.test.d.ts +1 -0
- package/dist/data/orm/data-query.sqlite.test.js +377 -0
- package/dist/data/orm/data-query.test.d.ts +1 -0
- package/dist/data/orm/data-query.test.js +553 -0
- package/dist/data/orm/decorators.d.ts +6 -0
- package/dist/data/orm/decorators.js +21 -0
- package/dist/data/orm/dependency-injection.test.d.ts +1 -0
- package/dist/data/orm/dependency-injection.test.js +171 -0
- package/dist/data/orm/doc.d.ts +26 -0
- package/dist/data/orm/doc.js +124 -0
- package/dist/data/orm/event-registry.d.ts +24 -0
- package/dist/data/orm/event-registry.js +40 -0
- package/dist/data/orm/event-registry.test.d.ts +1 -0
- package/dist/data/orm/event-registry.test.js +44 -0
- package/dist/data/orm/factory.d.ts +8 -0
- package/dist/data/orm/factory.js +147 -0
- package/dist/data/orm/index.d.ts +16 -0
- package/dist/data/orm/index.js +32 -0
- package/dist/data/orm/multi-cursors.d.ts +11 -0
- package/dist/data/orm/multi-cursors.js +146 -0
- package/dist/data/orm/multi-cursors.test.d.ts +1 -0
- package/dist/data/orm/multi-cursors.test.js +455 -0
- package/dist/data/orm/sql-db.d.ts +6 -0
- package/dist/data/orm/sql-db.js +2 -0
- package/dist/data/orm/sql.data-source.d.ts +38 -0
- package/dist/data/orm/sql.data-source.js +379 -0
- package/dist/data/orm/sql.data-source.test.d.ts +1 -0
- package/dist/data/orm/sql.data-source.test.js +406 -0
- package/dist/data/orm/subscribable.data-source.d.ts +25 -0
- package/dist/data/orm/subscribable.data-source.js +72 -0
- package/dist/data/orm/table-container-events.test.d.ts +1 -0
- package/dist/data/orm/table-container-events.test.js +93 -0
- package/dist/data/orm/table-container.d.ts +39 -0
- package/dist/data/orm/table-container.js +96 -0
- package/dist/data/orm/table-definitions.system.d.ts +9 -0
- package/dist/data/orm/table-definitions.system.js +29 -0
- package/dist/data/orm/table-definitions.type.d.ts +19 -0
- package/dist/data/orm/table-definitions.type.js +2 -0
- package/dist/data/orm/table-dependencies.d.ts +32 -0
- package/dist/data/orm/table-dependencies.js +2 -0
- package/dist/data/orm/table.d.ts +42 -0
- package/dist/data/orm/table.event-source.test.d.ts +1 -0
- package/dist/data/orm/table.event-source.test.js +341 -0
- package/dist/data/orm/table.js +244 -0
- package/dist/data/orm/types.d.ts +20 -0
- package/dist/data/orm/types.js +115 -0
- package/dist/data/orm/types.test.d.ts +1 -0
- package/dist/data/orm/types.test.js +71 -0
- package/dist/data/package-permissions.d.ts +7 -0
- package/dist/data/package-permissions.js +18 -0
- package/dist/data/packages.d.ts +92 -0
- package/dist/data/packages.js +90 -0
- package/dist/data/peer-events/peer-event-handlers.d.ts +21 -0
- package/dist/data/peer-events/peer-event-handlers.js +28 -0
- package/dist/data/peer-events/peer-event-types.d.ts +119 -0
- package/dist/data/peer-events/peer-event-types.js +29 -0
- package/dist/data/peer-events/peer-events.d.ts +41 -0
- package/dist/data/peer-events/peer-events.js +102 -0
- package/dist/data/persistent-vars.d.ts +87 -0
- package/dist/data/persistent-vars.js +230 -0
- package/dist/data/tool-tests.d.ts +37 -0
- package/dist/data/tool-tests.js +27 -0
- package/dist/data/tools.d.ts +358 -0
- package/dist/data/tools.js +48 -0
- package/dist/data/user-permissions.d.ts +15 -0
- package/dist/data/user-permissions.js +39 -0
- package/dist/data/user-permissions.test.d.ts +1 -0
- package/dist/data/user-permissions.test.js +252 -0
- package/dist/data/users.d.ts +38 -0
- package/dist/data/users.js +73 -0
- package/dist/data/workflow-logs.d.ts +106 -0
- package/dist/data/workflow-logs.js +67 -0
- package/dist/data/workflow-runs.d.ts +103 -0
- package/dist/data/workflow-runs.js +313 -0
- package/dist/data/workflows.d.ts +16 -0
- package/dist/data/workflows.js +21 -0
- package/dist/device/connection.d.ts +41 -0
- package/dist/device/connection.js +249 -0
- package/dist/device/connection.test.d.ts +1 -0
- package/dist/device/connection.test.js +292 -0
- package/dist/device/device-election.d.ts +36 -0
- package/dist/device/device-election.js +137 -0
- package/dist/device/device.d.ts +22 -0
- package/dist/device/device.js +110 -0
- package/dist/device/device.test.d.ts +1 -0
- package/dist/device/device.test.js +203 -0
- package/dist/device/get-trust-level.d.ts +3 -0
- package/dist/device/get-trust-level.js +87 -0
- package/dist/device/socket.type.d.ts +20 -0
- package/dist/device/socket.type.js +15 -0
- package/dist/device/streamed-socket.d.ts +27 -0
- package/dist/device/streamed-socket.js +154 -0
- package/dist/device/streamed-socket.test.d.ts +1 -0
- package/dist/device/streamed-socket.test.js +44 -0
- package/dist/events.d.ts +35 -0
- package/dist/events.js +128 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.js +50 -0
- package/dist/keys.d.ts +51 -0
- package/dist/keys.js +234 -0
- package/dist/keys.test.d.ts +1 -0
- package/dist/keys.test.js +215 -0
- package/dist/mentions.d.ts +9 -0
- package/dist/mentions.js +46 -0
- package/dist/observable.d.ts +19 -0
- package/dist/observable.js +112 -0
- package/dist/observable.test.d.ts +1 -0
- package/dist/observable.test.js +183 -0
- package/dist/package-loader/get-require.d.ts +10 -0
- package/dist/package-loader/get-require.js +31 -0
- package/dist/package-loader/index.d.ts +1 -0
- package/dist/package-loader/index.js +17 -0
- package/dist/package-loader/package-loader.d.ts +16 -0
- package/dist/package-loader/package-loader.js +102 -0
- package/dist/peers-ui/peers-ui.d.ts +15 -0
- package/dist/peers-ui/peers-ui.js +23 -0
- package/dist/peers-ui/peers-ui.types.d.ts +35 -0
- package/dist/peers-ui/peers-ui.types.js +3 -0
- package/dist/rpc-types.d.ts +45 -0
- package/dist/rpc-types.js +47 -0
- package/dist/serial-json.d.ts +5 -0
- package/dist/serial-json.js +186 -0
- package/dist/serial-json.test.d.ts +1 -0
- package/dist/serial-json.test.js +86 -0
- package/dist/system-ids.d.ts +6 -0
- package/dist/system-ids.js +10 -0
- package/dist/tools/index.d.ts +1 -0
- package/dist/tools/index.js +17 -0
- package/dist/tools/tools-factory.d.ts +5 -0
- package/dist/tools/tools-factory.js +34 -0
- package/dist/types/app-nav.d.ts +18 -0
- package/dist/types/app-nav.js +10 -0
- package/dist/types/assistant-runner-args.d.ts +9 -0
- package/dist/types/assistant-runner-args.js +2 -0
- package/dist/types/field-type.d.ts +37 -0
- package/dist/types/field-type.js +26 -0
- package/dist/types/peer-device.d.ts +40 -0
- package/dist/types/peer-device.js +14 -0
- package/dist/types/peers-package.d.ts +23 -0
- package/dist/types/peers-package.js +2 -0
- package/dist/types/workflow-logger.d.ts +2 -0
- package/dist/types/workflow-logger.js +2 -0
- package/dist/types/workflow-run-context.d.ts +12 -0
- package/dist/types/workflow-run-context.js +2 -0
- package/dist/types/workflow.d.ts +72 -0
- package/dist/types/workflow.js +24 -0
- package/dist/types/zod-types.d.ts +7 -0
- package/dist/types/zod-types.js +12 -0
- package/dist/users.query.d.ts +13 -0
- package/dist/users.query.js +134 -0
- package/dist/utils.d.ts +39 -0
- package/dist/utils.js +240 -0
- package/dist/utils.test.d.ts +1 -0
- package/dist/utils.test.js +140 -0
- package/package.json +50 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const _1 = require(".");
|
|
4
|
+
const field_type_1 = require("../../types/field-type");
|
|
5
|
+
const data_context_1 = require("../../context/data-context");
|
|
6
|
+
const zod_1 = require("zod");
|
|
7
|
+
describe('Dependency Injection Pattern', () => {
|
|
8
|
+
const testSchema = zod_1.z.object({
|
|
9
|
+
id: zod_1.z.string(),
|
|
10
|
+
name: zod_1.z.string(),
|
|
11
|
+
});
|
|
12
|
+
const testMetaData = {
|
|
13
|
+
name: 'TestTable',
|
|
14
|
+
description: 'Test table for DI pattern',
|
|
15
|
+
primaryKeyName: 'id',
|
|
16
|
+
fields: [
|
|
17
|
+
{ name: 'id', type: field_type_1.FieldType.string, description: 'ID field' },
|
|
18
|
+
{ name: 'name', type: field_type_1.FieldType.string, description: 'Name field' },
|
|
19
|
+
],
|
|
20
|
+
};
|
|
21
|
+
it('should create table using new DI constructor', () => {
|
|
22
|
+
// Create mock dependencies
|
|
23
|
+
const mockDeps = {
|
|
24
|
+
dataSource: {
|
|
25
|
+
tableName: 'TestTable',
|
|
26
|
+
primaryKeyName: 'id',
|
|
27
|
+
list: jest.fn().mockResolvedValue([]),
|
|
28
|
+
get: jest.fn().mockResolvedValue(null),
|
|
29
|
+
save: jest.fn().mockResolvedValue({}),
|
|
30
|
+
insert: jest.fn().mockResolvedValue({}),
|
|
31
|
+
update: jest.fn().mockResolvedValue({}),
|
|
32
|
+
delete: jest.fn().mockResolvedValue(undefined),
|
|
33
|
+
},
|
|
34
|
+
eventRegistry: {
|
|
35
|
+
getEmitter: jest.fn().mockReturnValue({
|
|
36
|
+
event: { subscribe: jest.fn() },
|
|
37
|
+
emit: jest.fn()
|
|
38
|
+
})
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
// Create table using new DI pattern
|
|
42
|
+
const table = new _1.Table(testMetaData, mockDeps);
|
|
43
|
+
// Verify table was created correctly
|
|
44
|
+
expect(table.tableName).toBe('TestTable');
|
|
45
|
+
expect(table.primaryKeyName).toBe('id');
|
|
46
|
+
// Verify schema works by parsing test data successfully
|
|
47
|
+
const testData = { id: 'test-id', name: 'test-name' };
|
|
48
|
+
expect(() => table.schema.parse(testData)).not.toThrow();
|
|
49
|
+
expect(table.metaData).toBe(testMetaData);
|
|
50
|
+
expect(table.dataSource).toBe(mockDeps.dataSource);
|
|
51
|
+
});
|
|
52
|
+
it('should allow easy custom table extension with DI pattern', () => {
|
|
53
|
+
// Example custom table class
|
|
54
|
+
class CustomTable extends _1.Table {
|
|
55
|
+
constructor(metaData, deps) {
|
|
56
|
+
super(metaData, deps);
|
|
57
|
+
}
|
|
58
|
+
// Custom business method
|
|
59
|
+
async findByName(name) {
|
|
60
|
+
return this.list({ name });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const mockDeps = {
|
|
64
|
+
dataSource: {
|
|
65
|
+
tableName: 'CustomTable',
|
|
66
|
+
primaryKeyName: 'id',
|
|
67
|
+
list: jest.fn().mockResolvedValue([{ id: '1', name: 'test' }]),
|
|
68
|
+
get: jest.fn(),
|
|
69
|
+
save: jest.fn(),
|
|
70
|
+
insert: jest.fn(),
|
|
71
|
+
update: jest.fn(),
|
|
72
|
+
delete: jest.fn(),
|
|
73
|
+
},
|
|
74
|
+
eventRegistry: {
|
|
75
|
+
getEmitter: jest.fn().mockReturnValue({
|
|
76
|
+
event: { subscribe: jest.fn() },
|
|
77
|
+
emit: jest.fn()
|
|
78
|
+
})
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
const customTable = new CustomTable(testMetaData, mockDeps);
|
|
82
|
+
// Verify custom table works
|
|
83
|
+
expect(customTable).toBeInstanceOf(_1.Table);
|
|
84
|
+
expect(customTable).toBeInstanceOf(CustomTable);
|
|
85
|
+
// Verify custom method exists
|
|
86
|
+
expect(typeof customTable.findByName).toBe('function');
|
|
87
|
+
});
|
|
88
|
+
it('should create table dependencies using DataContext factory method', () => {
|
|
89
|
+
// Create mock DataContext
|
|
90
|
+
const mockUserContext = {
|
|
91
|
+
userId: () => 'test-user',
|
|
92
|
+
dataSourceFactory: jest.fn().mockReturnValue({
|
|
93
|
+
tableName: 'TestTable',
|
|
94
|
+
primaryKeyName: 'id',
|
|
95
|
+
list: jest.fn(),
|
|
96
|
+
})
|
|
97
|
+
};
|
|
98
|
+
const dataContext = new data_context_1.DataContext(mockUserContext);
|
|
99
|
+
// Use factory method to create dependencies
|
|
100
|
+
const deps = dataContext.createTableDependencies(testMetaData, testSchema);
|
|
101
|
+
// Verify dependencies were created correctly
|
|
102
|
+
expect(deps.dataSource).toBeDefined();
|
|
103
|
+
expect(deps.eventRegistry).toBeDefined();
|
|
104
|
+
expect(deps.schema).toBe(testSchema); // Schema should be passed through when explicitly provided
|
|
105
|
+
expect(deps.eventRegistry).toBe(dataContext.eventRegistry);
|
|
106
|
+
});
|
|
107
|
+
it('should compute schema from metaData when not provided in dependencies', () => {
|
|
108
|
+
// Create mock dependencies without schema
|
|
109
|
+
const mockDeps = {
|
|
110
|
+
dataSource: {
|
|
111
|
+
tableName: 'TestTable',
|
|
112
|
+
primaryKeyName: 'id',
|
|
113
|
+
list: jest.fn().mockResolvedValue([]),
|
|
114
|
+
get: jest.fn().mockResolvedValue(null),
|
|
115
|
+
save: jest.fn().mockResolvedValue({}),
|
|
116
|
+
insert: jest.fn().mockResolvedValue({}),
|
|
117
|
+
update: jest.fn().mockResolvedValue({}),
|
|
118
|
+
delete: jest.fn().mockResolvedValue(undefined),
|
|
119
|
+
},
|
|
120
|
+
eventRegistry: {
|
|
121
|
+
getEmitter: jest.fn().mockReturnValue({
|
|
122
|
+
event: { subscribe: jest.fn() },
|
|
123
|
+
emit: jest.fn()
|
|
124
|
+
})
|
|
125
|
+
}
|
|
126
|
+
// Note: no schema provided
|
|
127
|
+
};
|
|
128
|
+
// Create table - schema should be computed from metaData.fields
|
|
129
|
+
const table = new _1.Table(testMetaData, mockDeps);
|
|
130
|
+
// Verify schema was computed correctly by testing it works
|
|
131
|
+
const testData = { id: 'test-id', name: 'test-name' };
|
|
132
|
+
expect(() => table.schema.parse(testData)).not.toThrow();
|
|
133
|
+
});
|
|
134
|
+
it('should create tables using DataContext convenience method', () => {
|
|
135
|
+
// Create mock DataContext
|
|
136
|
+
const mockUserContext = {
|
|
137
|
+
userId: () => 'test-user',
|
|
138
|
+
dataSourceFactory: jest.fn().mockReturnValue({
|
|
139
|
+
tableName: 'TestTable',
|
|
140
|
+
primaryKeyName: 'id',
|
|
141
|
+
list: jest.fn(),
|
|
142
|
+
})
|
|
143
|
+
};
|
|
144
|
+
const dataContext = new data_context_1.DataContext(mockUserContext);
|
|
145
|
+
// Use convenience method to create table
|
|
146
|
+
const table = dataContext.createTable(testMetaData, testSchema);
|
|
147
|
+
// Verify table was created correctly
|
|
148
|
+
expect(table).toBeInstanceOf(_1.Table);
|
|
149
|
+
expect(table.tableName).toBe('TestTable');
|
|
150
|
+
expect(table.schema).toBe(testSchema);
|
|
151
|
+
});
|
|
152
|
+
it('should create tables through TableFactory using new DI pattern internally', () => {
|
|
153
|
+
// Create mock DataContext
|
|
154
|
+
const mockUserContext = {
|
|
155
|
+
userId: () => 'test-user',
|
|
156
|
+
dataSourceFactory: jest.fn().mockReturnValue({
|
|
157
|
+
tableName: 'TestTable',
|
|
158
|
+
primaryKeyName: 'id',
|
|
159
|
+
list: jest.fn(),
|
|
160
|
+
})
|
|
161
|
+
};
|
|
162
|
+
const dataContext = new data_context_1.DataContext(mockUserContext);
|
|
163
|
+
// Use TableFactory (which should internally use DI pattern now)
|
|
164
|
+
const table = dataContext.tableContainer.getTable(testMetaData, testSchema);
|
|
165
|
+
// Verify table was created correctly through TableFactory
|
|
166
|
+
expect(table).toBeInstanceOf(_1.Table);
|
|
167
|
+
expect(table.tableName).toBe('TestTable');
|
|
168
|
+
expect(table.schema).toBe(testSchema);
|
|
169
|
+
expect(table.metaData).toBe(testMetaData);
|
|
170
|
+
});
|
|
171
|
+
});
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Table } from "./table";
|
|
2
|
+
import { Observable } from "../../observable";
|
|
3
|
+
export type IDoc<T extends {
|
|
4
|
+
[key: string]: any;
|
|
5
|
+
}> = {
|
|
6
|
+
load: (objOrId?: any) => Promise<IDoc<T>>;
|
|
7
|
+
save: () => Promise<IDoc<T>>;
|
|
8
|
+
delete: () => Promise<IDoc<T>>;
|
|
9
|
+
toJS: () => T;
|
|
10
|
+
validate: () => T;
|
|
11
|
+
validationError: Observable<any>;
|
|
12
|
+
table: Table<T>;
|
|
13
|
+
qs: {
|
|
14
|
+
[K in keyof T]-?: Observable<T[K]>;
|
|
15
|
+
};
|
|
16
|
+
q: Observable<number>;
|
|
17
|
+
displayValue: (() => string);
|
|
18
|
+
primaryKey: (() => string | number);
|
|
19
|
+
isNew: boolean;
|
|
20
|
+
hasChanges: () => boolean;
|
|
21
|
+
} & {
|
|
22
|
+
[key in keyof T]: T[key];
|
|
23
|
+
};
|
|
24
|
+
export declare function initDoc<T extends {
|
|
25
|
+
[key: string]: any;
|
|
26
|
+
}>(data: T, table: Table<T>): IDoc<T>;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.initDoc = initDoc;
|
|
4
|
+
const lodash_1 = require("lodash");
|
|
5
|
+
const observable_1 = require("../../observable");
|
|
6
|
+
function initDoc(data, table) {
|
|
7
|
+
const columns = [...table.metaData.fields];
|
|
8
|
+
// @ts-ignore
|
|
9
|
+
const doc = {
|
|
10
|
+
isNew: true,
|
|
11
|
+
table,
|
|
12
|
+
q: (0, observable_1.observable)(0),
|
|
13
|
+
// @ts-ignore
|
|
14
|
+
qs: {},
|
|
15
|
+
load: async (objOrId) => {
|
|
16
|
+
let loadedFromDb = false;
|
|
17
|
+
if (typeof objOrId !== 'object') {
|
|
18
|
+
// @ts-ignore
|
|
19
|
+
const id = objOrId || doc[table.metaData.primaryKeyName];
|
|
20
|
+
if (!id) {
|
|
21
|
+
return doc;
|
|
22
|
+
}
|
|
23
|
+
objOrId = await table.get(id);
|
|
24
|
+
if (!objOrId) {
|
|
25
|
+
throw new Error(`Could not find doc for ${table.tableName}:${id}`);
|
|
26
|
+
}
|
|
27
|
+
loadedFromDb = true;
|
|
28
|
+
}
|
|
29
|
+
const fieldNames = Object.keys(objOrId);
|
|
30
|
+
for (const fieldName of fieldNames) {
|
|
31
|
+
if (objOrId[fieldName] !== undefined) {
|
|
32
|
+
// note that this won't create new observables for fields that weren't in the original data
|
|
33
|
+
// @ts-ignore
|
|
34
|
+
doc[fieldName] = objOrId[fieldName];
|
|
35
|
+
// @ts-ignore
|
|
36
|
+
data[fieldName] = objOrId[fieldName];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (loadedFromDb) {
|
|
40
|
+
doc.isNew = false;
|
|
41
|
+
doc.q(0);
|
|
42
|
+
}
|
|
43
|
+
return doc;
|
|
44
|
+
},
|
|
45
|
+
toJS: () => {
|
|
46
|
+
const _data = (0, lodash_1.cloneDeep)(data);
|
|
47
|
+
for (const field of table.metaData.fields) {
|
|
48
|
+
// @ts-ignore
|
|
49
|
+
_data[field.name] = doc[field.name];
|
|
50
|
+
}
|
|
51
|
+
return _data;
|
|
52
|
+
},
|
|
53
|
+
validationError: (0, observable_1.observable)(null),
|
|
54
|
+
validate: () => {
|
|
55
|
+
try {
|
|
56
|
+
const _data = doc.toJS();
|
|
57
|
+
doc.validationError(null);
|
|
58
|
+
table.schema.parse(_data);
|
|
59
|
+
return _data;
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
doc.validationError(err);
|
|
63
|
+
throw err;
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
save: async () => {
|
|
67
|
+
let _data = doc.validate();
|
|
68
|
+
const src = await table.save(_data);
|
|
69
|
+
return doc.load(src).then(() => {
|
|
70
|
+
doc.isNew = false;
|
|
71
|
+
doc.q(0);
|
|
72
|
+
return doc;
|
|
73
|
+
});
|
|
74
|
+
},
|
|
75
|
+
delete: async () => {
|
|
76
|
+
doc.q(0);
|
|
77
|
+
// @ts-ignore
|
|
78
|
+
await table.delete(doc[table.metaData.primaryKeyName]);
|
|
79
|
+
return doc;
|
|
80
|
+
},
|
|
81
|
+
displayValue: () => {
|
|
82
|
+
let displayValue = null; //table.entity.displayValue;
|
|
83
|
+
if (!displayValue) {
|
|
84
|
+
displayValue = table.metaData.fields.find(c => c.type === 'string')?.name;
|
|
85
|
+
}
|
|
86
|
+
return displayValue || 'display value not configured';
|
|
87
|
+
// if (typeof displayValue === 'function') {
|
|
88
|
+
// return displayValue(doc);
|
|
89
|
+
// } else if (displayValue) {
|
|
90
|
+
// return doc[displayValue]
|
|
91
|
+
// } else {
|
|
92
|
+
// return doc[collection.primaryKey.name];
|
|
93
|
+
// }
|
|
94
|
+
},
|
|
95
|
+
// @ts-ignore
|
|
96
|
+
primaryKey: () => doc[table.metaData.primaryKeyName],
|
|
97
|
+
hasChanges: () => doc.isNew || doc.q() !== 0,
|
|
98
|
+
};
|
|
99
|
+
const fieldNames = (0, lodash_1.uniq)([...columns.map(c => c.name), ...Object.keys(data)]);
|
|
100
|
+
fieldNames.forEach(fieldName => {
|
|
101
|
+
const fieldQ = (0, observable_1.observable)(data[fieldName]);
|
|
102
|
+
fieldQ.subscribe(() => {
|
|
103
|
+
// @ts-ignore
|
|
104
|
+
data[fieldName] = fieldQ();
|
|
105
|
+
doc.q(doc.q() + 1);
|
|
106
|
+
});
|
|
107
|
+
// @ts-ignore
|
|
108
|
+
doc.qs[fieldName] = fieldQ;
|
|
109
|
+
Object.defineProperty(doc, fieldName, {
|
|
110
|
+
get: () => {
|
|
111
|
+
return fieldQ();
|
|
112
|
+
},
|
|
113
|
+
set: value => {
|
|
114
|
+
// @ts-ignore
|
|
115
|
+
data[fieldName] = value;
|
|
116
|
+
fieldQ(value);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
return doc;
|
|
121
|
+
}
|
|
122
|
+
//@ts-ignore
|
|
123
|
+
if (typeof window !== 'undefined')
|
|
124
|
+
window.initDoc = initDoc;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Emitter } from '../../events';
|
|
2
|
+
/**
|
|
3
|
+
* Registry for managing shared event emitters across table instances.
|
|
4
|
+
* Ensures that tables with the same name share the same event emitter,
|
|
5
|
+
* enabling cross-package event subscription.
|
|
6
|
+
*/
|
|
7
|
+
export declare class EventRegistry {
|
|
8
|
+
private dataContextId;
|
|
9
|
+
private emitters;
|
|
10
|
+
constructor(dataContextId: string);
|
|
11
|
+
/**
|
|
12
|
+
* Gets or creates an emitter for the given event name.
|
|
13
|
+
* Multiple calls with the same eventName will return the same emitter instance.
|
|
14
|
+
*/
|
|
15
|
+
getEmitter<T>(eventName: string): Emitter<T>;
|
|
16
|
+
/**
|
|
17
|
+
* Clear all emitters. Primarily for testing.
|
|
18
|
+
*/
|
|
19
|
+
clear(): void;
|
|
20
|
+
/**
|
|
21
|
+
* Get count of registered emitters. Primarily for testing.
|
|
22
|
+
*/
|
|
23
|
+
getEmitterCount(): number;
|
|
24
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EventRegistry = void 0;
|
|
4
|
+
const events_1 = require("../../events");
|
|
5
|
+
/**
|
|
6
|
+
* Registry for managing shared event emitters across table instances.
|
|
7
|
+
* Ensures that tables with the same name share the same event emitter,
|
|
8
|
+
* enabling cross-package event subscription.
|
|
9
|
+
*/
|
|
10
|
+
class EventRegistry {
|
|
11
|
+
dataContextId;
|
|
12
|
+
emitters = new Map();
|
|
13
|
+
constructor(dataContextId) {
|
|
14
|
+
this.dataContextId = dataContextId;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Gets or creates an emitter for the given event name.
|
|
18
|
+
* Multiple calls with the same eventName will return the same emitter instance.
|
|
19
|
+
*/
|
|
20
|
+
getEmitter(eventName) {
|
|
21
|
+
eventName += `_${this.dataContextId}`;
|
|
22
|
+
if (!this.emitters.has(eventName)) {
|
|
23
|
+
this.emitters.set(eventName, new events_1.Emitter(eventName));
|
|
24
|
+
}
|
|
25
|
+
return this.emitters.get(eventName);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Clear all emitters. Primarily for testing.
|
|
29
|
+
*/
|
|
30
|
+
clear() {
|
|
31
|
+
this.emitters.clear();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get count of registered emitters. Primarily for testing.
|
|
35
|
+
*/
|
|
36
|
+
getEmitterCount() {
|
|
37
|
+
return this.emitters.size;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.EventRegistry = EventRegistry;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const event_registry_1 = require("./event-registry");
|
|
4
|
+
describe('EventRegistry', () => {
|
|
5
|
+
let registry;
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
const mockDataContext = {
|
|
8
|
+
dataContextId: 'test-context'
|
|
9
|
+
};
|
|
10
|
+
registry = new event_registry_1.EventRegistry(mockDataContext);
|
|
11
|
+
});
|
|
12
|
+
it('should return the same emitter for the same event name', () => {
|
|
13
|
+
const emitter1 = registry.getEmitter('test-event');
|
|
14
|
+
const emitter2 = registry.getEmitter('test-event');
|
|
15
|
+
expect(emitter1).toBe(emitter2);
|
|
16
|
+
expect(registry.getEmitterCount()).toBe(1);
|
|
17
|
+
});
|
|
18
|
+
it('should return different emitters for different event names', () => {
|
|
19
|
+
const emitter1 = registry.getEmitter('event-1');
|
|
20
|
+
const emitter2 = registry.getEmitter('event-2');
|
|
21
|
+
expect(emitter1).not.toBe(emitter2);
|
|
22
|
+
expect(registry.getEmitterCount()).toBe(2);
|
|
23
|
+
});
|
|
24
|
+
it('should clear all emitters', () => {
|
|
25
|
+
registry.getEmitter('event-1');
|
|
26
|
+
registry.getEmitter('event-2');
|
|
27
|
+
expect(registry.getEmitterCount()).toBe(2);
|
|
28
|
+
registry.clear();
|
|
29
|
+
expect(registry.getEmitterCount()).toBe(0);
|
|
30
|
+
});
|
|
31
|
+
it('should handle event emission and subscription across shared emitters', async () => {
|
|
32
|
+
const emitter1 = registry.getEmitter('shared-event');
|
|
33
|
+
const emitter2 = registry.getEmitter('shared-event');
|
|
34
|
+
// They should be the same instance
|
|
35
|
+
expect(emitter1).toBe(emitter2);
|
|
36
|
+
// Test event flow
|
|
37
|
+
let receivedData;
|
|
38
|
+
emitter1.event.subscribe((data) => {
|
|
39
|
+
receivedData = data;
|
|
40
|
+
});
|
|
41
|
+
await emitter2.emit('test-data');
|
|
42
|
+
expect(receivedData).toBe('test-data');
|
|
43
|
+
});
|
|
44
|
+
});
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { DataFilter } from "./data-query";
|
|
2
|
+
import { Table } from "./table";
|
|
3
|
+
import { ITableMetaData } from "./types";
|
|
4
|
+
export declare function arrayAsTable<T extends Record<string, any>>(ary: T[], opts?: Partial<ITableMetaData>): Table<T>;
|
|
5
|
+
/**
|
|
6
|
+
* WARNING: this is an incomplete implementation of applyFilterToItem
|
|
7
|
+
*/
|
|
8
|
+
export declare function applyFilterToItem(item: Record<string, any>, filter: DataFilter<any>): boolean;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.arrayAsTable = arrayAsTable;
|
|
4
|
+
exports.applyFilterToItem = applyFilterToItem;
|
|
5
|
+
const lodash_1 = require("lodash");
|
|
6
|
+
const table_1 = require("./table");
|
|
7
|
+
const field_type_1 = require("../../types/field-type");
|
|
8
|
+
let inMemoryTableCount = 0;
|
|
9
|
+
function arrayAsTable(ary, opts = {}) {
|
|
10
|
+
let fields = opts.fields;
|
|
11
|
+
delete opts.fields;
|
|
12
|
+
if (!fields) {
|
|
13
|
+
const fieldNames = (0, lodash_1.uniq)(ary.map(item => Object.keys(item)).flat());
|
|
14
|
+
fields = fieldNames.map(name => {
|
|
15
|
+
const firstValue = ary.find(item => item[name] !== undefined && item[name] !== null)?.[name];
|
|
16
|
+
const valueType = typeof firstValue;
|
|
17
|
+
let dataType = field_type_1.FieldType.any;
|
|
18
|
+
if (valueType !== 'object' && valueType !== 'function' && valueType !== 'symbol') {
|
|
19
|
+
dataType = valueType;
|
|
20
|
+
}
|
|
21
|
+
let optional = false;
|
|
22
|
+
return {
|
|
23
|
+
name,
|
|
24
|
+
description: '',
|
|
25
|
+
type: dataType,
|
|
26
|
+
optional
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
const metaData = {
|
|
31
|
+
name: `inMemoryTable_${inMemoryTableCount++}`,
|
|
32
|
+
description: 'In-memory table',
|
|
33
|
+
primaryKeyName: fields.find(f => f.type === 'id')?.name || 'id',
|
|
34
|
+
fields,
|
|
35
|
+
...opts,
|
|
36
|
+
};
|
|
37
|
+
const dataSource = {
|
|
38
|
+
tableName: metaData.name,
|
|
39
|
+
primaryKeyName: metaData.primaryKeyName,
|
|
40
|
+
list: async (filter = {}, opts = {}) => {
|
|
41
|
+
const filteredArray = ary.filter(item => applyFilterToItem(item, filter));
|
|
42
|
+
if (opts.pageSize) {
|
|
43
|
+
const page = opts.page || 1;
|
|
44
|
+
const pageSize = opts.pageSize;
|
|
45
|
+
const subAry = filteredArray.slice((page - 1) * opts.pageSize, (page - 1) * pageSize + pageSize);
|
|
46
|
+
return [...subAry];
|
|
47
|
+
}
|
|
48
|
+
return [...filteredArray];
|
|
49
|
+
},
|
|
50
|
+
count: async (filter = {}) => {
|
|
51
|
+
return ary.filter(item => applyFilterToItem(item, filter)).length;
|
|
52
|
+
},
|
|
53
|
+
get: async (id) => ary.find(item => item[metaData.primaryKeyName] === id),
|
|
54
|
+
save: async (record) => {
|
|
55
|
+
const existing = ary.find(item => item[metaData.primaryKeyName] === record[metaData.primaryKeyName]);
|
|
56
|
+
if (existing) {
|
|
57
|
+
return dataSource.update(record);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
return dataSource.insert(record);
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
insert: async (record) => {
|
|
64
|
+
ary.push(record);
|
|
65
|
+
return record;
|
|
66
|
+
},
|
|
67
|
+
update: async (record) => {
|
|
68
|
+
const existing = ary.find(item => item[metaData.primaryKeyName] === record[metaData.primaryKeyName]);
|
|
69
|
+
if (existing) {
|
|
70
|
+
Object.assign(existing, record);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
throw new Error(`Record with id ${record[metaData.primaryKeyName]} not found`);
|
|
74
|
+
}
|
|
75
|
+
return record;
|
|
76
|
+
},
|
|
77
|
+
delete: async (id) => {
|
|
78
|
+
if (typeof id === 'object') {
|
|
79
|
+
id = id[metaData.primaryKeyName];
|
|
80
|
+
}
|
|
81
|
+
const index = ary.findIndex(item => item[metaData.primaryKeyName] === id);
|
|
82
|
+
if (index >= 0) {
|
|
83
|
+
ary.splice(index, 1);
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
const mockDataContextForRegistry = {
|
|
88
|
+
dataContextId: 'array-table-context'
|
|
89
|
+
};
|
|
90
|
+
const eventRegistry = new (require('./event-registry').EventRegistry)(mockDataContextForRegistry);
|
|
91
|
+
const deps = {
|
|
92
|
+
dataSource,
|
|
93
|
+
eventRegistry
|
|
94
|
+
};
|
|
95
|
+
return new table_1.Table(metaData, deps);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* WARNING: this is an incomplete implementation of applyFilterToItem
|
|
99
|
+
*/
|
|
100
|
+
function applyFilterToItem(item, filter) {
|
|
101
|
+
const _filter = filter;
|
|
102
|
+
if (!Object.keys(_filter).length) {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
for (const key in filter) {
|
|
106
|
+
if (key === '$and') {
|
|
107
|
+
return _filter.$and.every((subFilter) => applyFilterToItem(item, subFilter));
|
|
108
|
+
}
|
|
109
|
+
if (key === '$or') {
|
|
110
|
+
return _filter.$or.some((subFilter) => applyFilterToItem(item, subFilter));
|
|
111
|
+
}
|
|
112
|
+
if (key === '$lt') {
|
|
113
|
+
return item < _filter.$lt;
|
|
114
|
+
}
|
|
115
|
+
if (key === '$lte') {
|
|
116
|
+
return item <= _filter.$lte;
|
|
117
|
+
}
|
|
118
|
+
if (key === '$gt') {
|
|
119
|
+
return item > _filter.$gt;
|
|
120
|
+
}
|
|
121
|
+
if (key === '$gte') {
|
|
122
|
+
return item >= _filter.$gte;
|
|
123
|
+
}
|
|
124
|
+
if (key === '$ne') {
|
|
125
|
+
return item !== _filter.$ne;
|
|
126
|
+
}
|
|
127
|
+
if (key === '$in') {
|
|
128
|
+
return _filter.$in.includes(item);
|
|
129
|
+
}
|
|
130
|
+
if (key === '$nin') {
|
|
131
|
+
return !_filter.$nin.includes(item);
|
|
132
|
+
}
|
|
133
|
+
if (key.startsWith('$')) {
|
|
134
|
+
throw new Error(`Unsupported filter key: ${key}`);
|
|
135
|
+
}
|
|
136
|
+
const subFilter = _filter[key];
|
|
137
|
+
const value = item[key];
|
|
138
|
+
if ((0, lodash_1.isArray)(subFilter)) {
|
|
139
|
+
return subFilter.includes(value);
|
|
140
|
+
}
|
|
141
|
+
if (typeof subFilter === 'object') {
|
|
142
|
+
return applyFilterToItem(value, subFilter);
|
|
143
|
+
}
|
|
144
|
+
return value === subFilter;
|
|
145
|
+
}
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export * from "./data-query";
|
|
2
|
+
export * from "./sql-db";
|
|
3
|
+
export * from "./doc";
|
|
4
|
+
export * from "./factory";
|
|
5
|
+
export * from "./table";
|
|
6
|
+
export * from "./table-dependencies";
|
|
7
|
+
export * from "./types";
|
|
8
|
+
export * from "./sql.data-source";
|
|
9
|
+
export * from "./client-proxy.data-source";
|
|
10
|
+
export * from "./table-container";
|
|
11
|
+
export * from "./subscribable.data-source";
|
|
12
|
+
export * from "./event-registry";
|
|
13
|
+
export * from "./table-definitions.type";
|
|
14
|
+
export * from "./multi-cursors";
|
|
15
|
+
export * from "./cursor";
|
|
16
|
+
export * from "./decorators";
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./data-query"), exports);
|
|
18
|
+
__exportStar(require("./sql-db"), exports);
|
|
19
|
+
__exportStar(require("./doc"), exports);
|
|
20
|
+
__exportStar(require("./factory"), exports);
|
|
21
|
+
__exportStar(require("./table"), exports);
|
|
22
|
+
__exportStar(require("./table-dependencies"), exports);
|
|
23
|
+
__exportStar(require("./types"), exports);
|
|
24
|
+
__exportStar(require("./sql.data-source"), exports);
|
|
25
|
+
__exportStar(require("./client-proxy.data-source"), exports);
|
|
26
|
+
__exportStar(require("./table-container"), exports);
|
|
27
|
+
__exportStar(require("./subscribable.data-source"), exports);
|
|
28
|
+
__exportStar(require("./event-registry"), exports);
|
|
29
|
+
__exportStar(require("./table-definitions.type"), exports);
|
|
30
|
+
__exportStar(require("./multi-cursors"), exports);
|
|
31
|
+
__exportStar(require("./cursor"), exports);
|
|
32
|
+
__exportStar(require("./decorators"), exports);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ICursorIterable, DataFilter, IDataQueryParams } from './data-query';
|
|
2
|
+
export declare function cursorUnion<T>(cursors: ICursorIterable<T>[]): ICursorIterable<T>;
|
|
3
|
+
export declare function sortLikeSQL(sortByFields: string[], valueA: any, valueB: any): 0 | 1 | -1;
|
|
4
|
+
export declare function queryMerge<T extends {
|
|
5
|
+
[key: string]: any;
|
|
6
|
+
}>(dataSources: {
|
|
7
|
+
list: (filter?: DataFilter<T>, opts?: IDataQueryParams<T>) => Promise<T[]>;
|
|
8
|
+
primaryKeyName: string;
|
|
9
|
+
}[], filter?: DataFilter<T>, opts?: IDataQueryParams<T>): ICursorIterable<T>;
|
|
10
|
+
export declare function cursorMap<T, U>(sourceCursor: ICursorIterable<T>, mapFn: (item: T) => U | Promise<U>): ICursorIterable<U>;
|
|
11
|
+
export declare function cursorFilter<T>(sourceCursor: ICursorIterable<T>, filterFn: (item: T) => boolean | Promise<boolean>): ICursorIterable<T>;
|