@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.
Files changed (234) hide show
  1. package/README.md +1 -0
  2. package/dist/context/data-context.d.ts +31 -0
  3. package/dist/context/data-context.js +56 -0
  4. package/dist/context/index.d.ts +3 -0
  5. package/dist/context/index.js +19 -0
  6. package/dist/context/user-context-singleton.d.ts +11 -0
  7. package/dist/context/user-context-singleton.js +121 -0
  8. package/dist/context/user-context.d.ts +55 -0
  9. package/dist/context/user-context.js +205 -0
  10. package/dist/data/assistants.d.ts +68 -0
  11. package/dist/data/assistants.js +64 -0
  12. package/dist/data/change-tracking.d.ts +219 -0
  13. package/dist/data/change-tracking.js +119 -0
  14. package/dist/data/channels.d.ts +29 -0
  15. package/dist/data/channels.js +25 -0
  16. package/dist/data/data-locks.d.ts +37 -0
  17. package/dist/data/data-locks.js +180 -0
  18. package/dist/data/data-locks.test.d.ts +1 -0
  19. package/dist/data/data-locks.test.js +456 -0
  20. package/dist/data/device-sync-info.d.ts +19 -0
  21. package/dist/data/device-sync-info.js +24 -0
  22. package/dist/data/devices.d.ts +51 -0
  23. package/dist/data/devices.js +36 -0
  24. package/dist/data/embeddings.d.ts +47 -0
  25. package/dist/data/embeddings.js +36 -0
  26. package/dist/data/files/file-read-stream.d.ts +27 -0
  27. package/dist/data/files/file-read-stream.js +195 -0
  28. package/dist/data/files/file-write-stream.d.ts +20 -0
  29. package/dist/data/files/file-write-stream.js +113 -0
  30. package/dist/data/files/file.types.d.ts +47 -0
  31. package/dist/data/files/file.types.js +55 -0
  32. package/dist/data/files/files.d.ts +28 -0
  33. package/dist/data/files/files.js +127 -0
  34. package/dist/data/files/files.test.d.ts +1 -0
  35. package/dist/data/files/files.test.js +728 -0
  36. package/dist/data/files/index.d.ts +4 -0
  37. package/dist/data/files/index.js +23 -0
  38. package/dist/data/group-member-roles.d.ts +9 -0
  39. package/dist/data/group-member-roles.js +25 -0
  40. package/dist/data/group-members.d.ts +39 -0
  41. package/dist/data/group-members.js +68 -0
  42. package/dist/data/group-members.test.d.ts +1 -0
  43. package/dist/data/group-members.test.js +287 -0
  44. package/dist/data/group-permissions.d.ts +8 -0
  45. package/dist/data/group-permissions.js +73 -0
  46. package/dist/data/group-share.d.ts +50 -0
  47. package/dist/data/group-share.js +196 -0
  48. package/dist/data/groups.d.ts +50 -0
  49. package/dist/data/groups.js +73 -0
  50. package/dist/data/groups.test.d.ts +1 -0
  51. package/dist/data/groups.test.js +153 -0
  52. package/dist/data/index.d.ts +31 -0
  53. package/dist/data/index.js +47 -0
  54. package/dist/data/knowledge/knowledge-frames.d.ts +34 -0
  55. package/dist/data/knowledge/knowledge-frames.js +34 -0
  56. package/dist/data/knowledge/knowledge-links.d.ts +30 -0
  57. package/dist/data/knowledge/knowledge-links.js +25 -0
  58. package/dist/data/knowledge/knowledge-values.d.ts +35 -0
  59. package/dist/data/knowledge/knowledge-values.js +35 -0
  60. package/dist/data/knowledge/peer-types.d.ts +112 -0
  61. package/dist/data/knowledge/peer-types.js +27 -0
  62. package/dist/data/knowledge/predicates.d.ts +34 -0
  63. package/dist/data/knowledge/predicates.js +27 -0
  64. package/dist/data/messages.d.ts +57 -0
  65. package/dist/data/messages.js +97 -0
  66. package/dist/data/orm/client-proxy.data-source.d.ts +27 -0
  67. package/dist/data/orm/client-proxy.data-source.js +65 -0
  68. package/dist/data/orm/cursor.d.ts +25 -0
  69. package/dist/data/orm/cursor.js +47 -0
  70. package/dist/data/orm/cursor.test.d.ts +1 -0
  71. package/dist/data/orm/cursor.test.js +315 -0
  72. package/dist/data/orm/data-query.d.ts +96 -0
  73. package/dist/data/orm/data-query.js +208 -0
  74. package/dist/data/orm/data-query.mongo.d.ts +17 -0
  75. package/dist/data/orm/data-query.mongo.js +267 -0
  76. package/dist/data/orm/data-query.mongo.test.d.ts +1 -0
  77. package/dist/data/orm/data-query.mongo.test.js +398 -0
  78. package/dist/data/orm/data-query.sqlite.d.ts +14 -0
  79. package/dist/data/orm/data-query.sqlite.js +297 -0
  80. package/dist/data/orm/data-query.sqlite.test.d.ts +1 -0
  81. package/dist/data/orm/data-query.sqlite.test.js +377 -0
  82. package/dist/data/orm/data-query.test.d.ts +1 -0
  83. package/dist/data/orm/data-query.test.js +553 -0
  84. package/dist/data/orm/decorators.d.ts +6 -0
  85. package/dist/data/orm/decorators.js +21 -0
  86. package/dist/data/orm/dependency-injection.test.d.ts +1 -0
  87. package/dist/data/orm/dependency-injection.test.js +171 -0
  88. package/dist/data/orm/doc.d.ts +26 -0
  89. package/dist/data/orm/doc.js +124 -0
  90. package/dist/data/orm/event-registry.d.ts +24 -0
  91. package/dist/data/orm/event-registry.js +40 -0
  92. package/dist/data/orm/event-registry.test.d.ts +1 -0
  93. package/dist/data/orm/event-registry.test.js +44 -0
  94. package/dist/data/orm/factory.d.ts +8 -0
  95. package/dist/data/orm/factory.js +147 -0
  96. package/dist/data/orm/index.d.ts +16 -0
  97. package/dist/data/orm/index.js +32 -0
  98. package/dist/data/orm/multi-cursors.d.ts +11 -0
  99. package/dist/data/orm/multi-cursors.js +146 -0
  100. package/dist/data/orm/multi-cursors.test.d.ts +1 -0
  101. package/dist/data/orm/multi-cursors.test.js +455 -0
  102. package/dist/data/orm/sql-db.d.ts +6 -0
  103. package/dist/data/orm/sql-db.js +2 -0
  104. package/dist/data/orm/sql.data-source.d.ts +38 -0
  105. package/dist/data/orm/sql.data-source.js +379 -0
  106. package/dist/data/orm/sql.data-source.test.d.ts +1 -0
  107. package/dist/data/orm/sql.data-source.test.js +406 -0
  108. package/dist/data/orm/subscribable.data-source.d.ts +25 -0
  109. package/dist/data/orm/subscribable.data-source.js +72 -0
  110. package/dist/data/orm/table-container-events.test.d.ts +1 -0
  111. package/dist/data/orm/table-container-events.test.js +93 -0
  112. package/dist/data/orm/table-container.d.ts +39 -0
  113. package/dist/data/orm/table-container.js +96 -0
  114. package/dist/data/orm/table-definitions.system.d.ts +9 -0
  115. package/dist/data/orm/table-definitions.system.js +29 -0
  116. package/dist/data/orm/table-definitions.type.d.ts +19 -0
  117. package/dist/data/orm/table-definitions.type.js +2 -0
  118. package/dist/data/orm/table-dependencies.d.ts +32 -0
  119. package/dist/data/orm/table-dependencies.js +2 -0
  120. package/dist/data/orm/table.d.ts +42 -0
  121. package/dist/data/orm/table.event-source.test.d.ts +1 -0
  122. package/dist/data/orm/table.event-source.test.js +341 -0
  123. package/dist/data/orm/table.js +244 -0
  124. package/dist/data/orm/types.d.ts +20 -0
  125. package/dist/data/orm/types.js +115 -0
  126. package/dist/data/orm/types.test.d.ts +1 -0
  127. package/dist/data/orm/types.test.js +71 -0
  128. package/dist/data/package-permissions.d.ts +7 -0
  129. package/dist/data/package-permissions.js +18 -0
  130. package/dist/data/packages.d.ts +92 -0
  131. package/dist/data/packages.js +90 -0
  132. package/dist/data/peer-events/peer-event-handlers.d.ts +21 -0
  133. package/dist/data/peer-events/peer-event-handlers.js +28 -0
  134. package/dist/data/peer-events/peer-event-types.d.ts +119 -0
  135. package/dist/data/peer-events/peer-event-types.js +29 -0
  136. package/dist/data/peer-events/peer-events.d.ts +41 -0
  137. package/dist/data/peer-events/peer-events.js +102 -0
  138. package/dist/data/persistent-vars.d.ts +87 -0
  139. package/dist/data/persistent-vars.js +230 -0
  140. package/dist/data/tool-tests.d.ts +37 -0
  141. package/dist/data/tool-tests.js +27 -0
  142. package/dist/data/tools.d.ts +358 -0
  143. package/dist/data/tools.js +48 -0
  144. package/dist/data/user-permissions.d.ts +15 -0
  145. package/dist/data/user-permissions.js +39 -0
  146. package/dist/data/user-permissions.test.d.ts +1 -0
  147. package/dist/data/user-permissions.test.js +252 -0
  148. package/dist/data/users.d.ts +38 -0
  149. package/dist/data/users.js +73 -0
  150. package/dist/data/workflow-logs.d.ts +106 -0
  151. package/dist/data/workflow-logs.js +67 -0
  152. package/dist/data/workflow-runs.d.ts +103 -0
  153. package/dist/data/workflow-runs.js +313 -0
  154. package/dist/data/workflows.d.ts +16 -0
  155. package/dist/data/workflows.js +21 -0
  156. package/dist/device/connection.d.ts +41 -0
  157. package/dist/device/connection.js +249 -0
  158. package/dist/device/connection.test.d.ts +1 -0
  159. package/dist/device/connection.test.js +292 -0
  160. package/dist/device/device-election.d.ts +36 -0
  161. package/dist/device/device-election.js +137 -0
  162. package/dist/device/device.d.ts +22 -0
  163. package/dist/device/device.js +110 -0
  164. package/dist/device/device.test.d.ts +1 -0
  165. package/dist/device/device.test.js +203 -0
  166. package/dist/device/get-trust-level.d.ts +3 -0
  167. package/dist/device/get-trust-level.js +87 -0
  168. package/dist/device/socket.type.d.ts +20 -0
  169. package/dist/device/socket.type.js +15 -0
  170. package/dist/device/streamed-socket.d.ts +27 -0
  171. package/dist/device/streamed-socket.js +154 -0
  172. package/dist/device/streamed-socket.test.d.ts +1 -0
  173. package/dist/device/streamed-socket.test.js +44 -0
  174. package/dist/events.d.ts +35 -0
  175. package/dist/events.js +128 -0
  176. package/dist/index.d.ts +33 -0
  177. package/dist/index.js +50 -0
  178. package/dist/keys.d.ts +51 -0
  179. package/dist/keys.js +234 -0
  180. package/dist/keys.test.d.ts +1 -0
  181. package/dist/keys.test.js +215 -0
  182. package/dist/mentions.d.ts +9 -0
  183. package/dist/mentions.js +46 -0
  184. package/dist/observable.d.ts +19 -0
  185. package/dist/observable.js +112 -0
  186. package/dist/observable.test.d.ts +1 -0
  187. package/dist/observable.test.js +183 -0
  188. package/dist/package-loader/get-require.d.ts +10 -0
  189. package/dist/package-loader/get-require.js +31 -0
  190. package/dist/package-loader/index.d.ts +1 -0
  191. package/dist/package-loader/index.js +17 -0
  192. package/dist/package-loader/package-loader.d.ts +16 -0
  193. package/dist/package-loader/package-loader.js +102 -0
  194. package/dist/peers-ui/peers-ui.d.ts +15 -0
  195. package/dist/peers-ui/peers-ui.js +23 -0
  196. package/dist/peers-ui/peers-ui.types.d.ts +35 -0
  197. package/dist/peers-ui/peers-ui.types.js +3 -0
  198. package/dist/rpc-types.d.ts +45 -0
  199. package/dist/rpc-types.js +47 -0
  200. package/dist/serial-json.d.ts +5 -0
  201. package/dist/serial-json.js +186 -0
  202. package/dist/serial-json.test.d.ts +1 -0
  203. package/dist/serial-json.test.js +86 -0
  204. package/dist/system-ids.d.ts +6 -0
  205. package/dist/system-ids.js +10 -0
  206. package/dist/tools/index.d.ts +1 -0
  207. package/dist/tools/index.js +17 -0
  208. package/dist/tools/tools-factory.d.ts +5 -0
  209. package/dist/tools/tools-factory.js +34 -0
  210. package/dist/types/app-nav.d.ts +18 -0
  211. package/dist/types/app-nav.js +10 -0
  212. package/dist/types/assistant-runner-args.d.ts +9 -0
  213. package/dist/types/assistant-runner-args.js +2 -0
  214. package/dist/types/field-type.d.ts +37 -0
  215. package/dist/types/field-type.js +26 -0
  216. package/dist/types/peer-device.d.ts +40 -0
  217. package/dist/types/peer-device.js +14 -0
  218. package/dist/types/peers-package.d.ts +23 -0
  219. package/dist/types/peers-package.js +2 -0
  220. package/dist/types/workflow-logger.d.ts +2 -0
  221. package/dist/types/workflow-logger.js +2 -0
  222. package/dist/types/workflow-run-context.d.ts +12 -0
  223. package/dist/types/workflow-run-context.js +2 -0
  224. package/dist/types/workflow.d.ts +72 -0
  225. package/dist/types/workflow.js +24 -0
  226. package/dist/types/zod-types.d.ts +7 -0
  227. package/dist/types/zod-types.js +12 -0
  228. package/dist/users.query.d.ts +13 -0
  229. package/dist/users.query.js +134 -0
  230. package/dist/utils.d.ts +39 -0
  231. package/dist/utils.js +240 -0
  232. package/dist/utils.test.d.ts +1 -0
  233. package/dist/utils.test.js +140 -0
  234. 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>;