@peers-app/peers-sdk 0.27.2 → 0.27.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 (260) hide show
  1. package/dist/contracts/contract-proxy.d.ts +7 -0
  2. package/dist/contracts/contract-proxy.js +19 -2
  3. package/dist/contracts/create-local-consumer.js +16 -1
  4. package/dist/contracts/index.d.ts +2 -0
  5. package/dist/contracts/index.js +2 -0
  6. package/dist/contracts/system/index.d.ts +2 -0
  7. package/dist/contracts/system/index.js +2 -0
  8. package/dist/contracts/system/invites-contract.js +2 -1
  9. package/dist/contracts/system/sync-check-contract.d.ts +97 -0
  10. package/dist/contracts/system/sync-check-contract.js +115 -0
  11. package/dist/contracts/tool-arguments.d.ts +15 -0
  12. package/dist/contracts/tool-arguments.js +41 -0
  13. package/dist/contracts/tool-catalog-service.js +2 -12
  14. package/dist/data/change-tracking.d.ts +40 -0
  15. package/dist/data/change-tracking.js +89 -0
  16. package/dist/data/orm/types.d.ts +24 -7
  17. package/dist/data/orm/types.js +97 -24
  18. package/dist/data/persistent-vars.d.ts +5 -0
  19. package/dist/data/persistent-vars.js +24 -6
  20. package/dist/define/manifest.js +6 -34
  21. package/dist/package-loader/package-loader.js +27 -22
  22. package/dist/system-ids.d.ts +5 -0
  23. package/dist/system-ids.js +6 -1
  24. package/package.json +4 -2
  25. package/dist/context/user-context-identity.test.d.ts +0 -1
  26. package/dist/context/user-context-identity.test.js +0 -220
  27. package/dist/contracts/__tests__/action-dispatch.test.d.ts +0 -1
  28. package/dist/contracts/__tests__/action-dispatch.test.js +0 -319
  29. package/dist/contracts/__tests__/also-implements.test.d.ts +0 -1
  30. package/dist/contracts/__tests__/also-implements.test.js +0 -110
  31. package/dist/contracts/__tests__/builder.test.d.ts +0 -1
  32. package/dist/contracts/__tests__/builder.test.js +0 -669
  33. package/dist/contracts/__tests__/contract-events.test.d.ts +0 -1
  34. package/dist/contracts/__tests__/contract-events.test.js +0 -199
  35. package/dist/contracts/__tests__/contract-observables.test.d.ts +0 -1
  36. package/dist/contracts/__tests__/contract-observables.test.js +0 -290
  37. package/dist/contracts/__tests__/contract-provider-router.test.d.ts +0 -1
  38. package/dist/contracts/__tests__/contract-provider-router.test.js +0 -315
  39. package/dist/contracts/__tests__/contract-proxy.test.d.ts +0 -1
  40. package/dist/contracts/__tests__/contract-proxy.test.js +0 -657
  41. package/dist/contracts/__tests__/contract-resolvers.test.d.ts +0 -1
  42. package/dist/contracts/__tests__/contract-resolvers.test.js +0 -758
  43. package/dist/contracts/__tests__/contract-subscription-lifecycle.test.d.ts +0 -1
  44. package/dist/contracts/__tests__/contract-subscription-lifecycle.test.js +0 -353
  45. package/dist/contracts/__tests__/contract-table-events.test.d.ts +0 -1
  46. package/dist/contracts/__tests__/contract-table-events.test.js +0 -209
  47. package/dist/contracts/__tests__/contract-transport.test.d.ts +0 -1
  48. package/dist/contracts/__tests__/contract-transport.test.js +0 -163
  49. package/dist/contracts/__tests__/extract.test.d.ts +0 -1
  50. package/dist/contracts/__tests__/extract.test.js +0 -145
  51. package/dist/contracts/__tests__/frozen-contracts.test.d.ts +0 -1
  52. package/dist/contracts/__tests__/frozen-contracts.test.js +0 -191
  53. package/dist/contracts/__tests__/generic-tool-dispatch.test.d.ts +0 -1
  54. package/dist/contracts/__tests__/generic-tool-dispatch.test.js +0 -130
  55. package/dist/contracts/__tests__/host-contract-client.test.d.ts +0 -1
  56. package/dist/contracts/__tests__/host-contract-client.test.js +0 -793
  57. package/dist/contracts/__tests__/host-contract-consumer.test.d.ts +0 -1
  58. package/dist/contracts/__tests__/host-contract-consumer.test.js +0 -163
  59. package/dist/contracts/__tests__/host-contract-transport.test.d.ts +0 -1
  60. package/dist/contracts/__tests__/host-contract-transport.test.js +0 -66
  61. package/dist/contracts/__tests__/integration.test.d.ts +0 -1
  62. package/dist/contracts/__tests__/integration.test.js +0 -348
  63. package/dist/contracts/__tests__/legacy-removal.test.d.ts +0 -1
  64. package/dist/contracts/__tests__/legacy-removal.test.js +0 -128
  65. package/dist/contracts/__tests__/persistent-registry.test.d.ts +0 -1
  66. package/dist/contracts/__tests__/persistent-registry.test.js +0 -109
  67. package/dist/contracts/__tests__/playground.test.d.ts +0 -1
  68. package/dist/contracts/__tests__/playground.test.js +0 -216
  69. package/dist/contracts/__tests__/registry.test.d.ts +0 -1
  70. package/dist/contracts/__tests__/registry.test.js +0 -238
  71. package/dist/contracts/__tests__/remote-contract-transport.test.d.ts +0 -1
  72. package/dist/contracts/__tests__/remote-contract-transport.test.js +0 -119
  73. package/dist/contracts/__tests__/system-contracts.test.d.ts +0 -1
  74. package/dist/contracts/__tests__/system-contracts.test.js +0 -247
  75. package/dist/contracts/__tests__/target-dispatch.d.ts +0 -11
  76. package/dist/contracts/__tests__/target-dispatch.js +0 -24
  77. package/dist/contracts/__tests__/tool-catalog-inventory.test.d.ts +0 -1
  78. package/dist/contracts/__tests__/tool-catalog-inventory.test.js +0 -44
  79. package/dist/contracts/__tests__/tool-catalog-service.test.d.ts +0 -1
  80. package/dist/contracts/__tests__/tool-catalog-service.test.js +0 -482
  81. package/dist/contracts/__tests__/tool-catalog.test.d.ts +0 -1
  82. package/dist/contracts/__tests__/tool-catalog.test.js +0 -1199
  83. package/dist/contracts/__tests__/validate.test.d.ts +0 -1
  84. package/dist/contracts/__tests__/validate.test.js +0 -991
  85. package/dist/contracts/__tests__/workflow-context.test.d.ts +0 -1
  86. package/dist/contracts/__tests__/workflow-context.test.js +0 -50
  87. package/dist/data/access-level.test.d.ts +0 -1
  88. package/dist/data/access-level.test.js +0 -53
  89. package/dist/data/change-tracking.test.d.ts +0 -1
  90. package/dist/data/change-tracking.test.js +0 -62
  91. package/dist/data/files/files.test.d.ts +0 -1
  92. package/dist/data/files/files.test.js +0 -770
  93. package/dist/data/group-members.test.d.ts +0 -1
  94. package/dist/data/group-members.test.js +0 -336
  95. package/dist/data/group-share.test.d.ts +0 -1
  96. package/dist/data/group-share.test.js +0 -110
  97. package/dist/data/groups.test.d.ts +0 -1
  98. package/dist/data/groups.test.js +0 -153
  99. package/dist/data/orm/cursor.test.d.ts +0 -1
  100. package/dist/data/orm/cursor.test.js +0 -314
  101. package/dist/data/orm/data-query.mongo.test.d.ts +0 -1
  102. package/dist/data/orm/data-query.mongo.test.js +0 -367
  103. package/dist/data/orm/data-query.sqlite.test.d.ts +0 -1
  104. package/dist/data/orm/data-query.sqlite.test.js +0 -365
  105. package/dist/data/orm/data-query.test.d.ts +0 -1
  106. package/dist/data/orm/data-query.test.js +0 -545
  107. package/dist/data/orm/dependency-injection.test.d.ts +0 -1
  108. package/dist/data/orm/dependency-injection.test.js +0 -171
  109. package/dist/data/orm/event-registry.test.d.ts +0 -1
  110. package/dist/data/orm/event-registry.test.js +0 -44
  111. package/dist/data/orm/multi-cursors.test.d.ts +0 -1
  112. package/dist/data/orm/multi-cursors.test.js +0 -463
  113. package/dist/data/orm/sql.data-source.test.d.ts +0 -1
  114. package/dist/data/orm/sql.data-source.test.js +0 -731
  115. package/dist/data/orm/table-container-events.test.d.ts +0 -1
  116. package/dist/data/orm/table-container-events.test.js +0 -101
  117. package/dist/data/orm/table-container.test.d.ts +0 -1
  118. package/dist/data/orm/table-container.test.js +0 -273
  119. package/dist/data/orm/table.event-source.test.d.ts +0 -1
  120. package/dist/data/orm/table.event-source.test.js +0 -331
  121. package/dist/data/orm/types.test.d.ts +0 -1
  122. package/dist/data/orm/types.test.js +0 -409
  123. package/dist/data/package-table-identity.test.d.ts +0 -1
  124. package/dist/data/package-table-identity.test.js +0 -46
  125. package/dist/data/package-version-permissions.test.d.ts +0 -1
  126. package/dist/data/package-version-permissions.test.js +0 -107
  127. package/dist/data/package-version-resolver.test.d.ts +0 -4
  128. package/dist/data/package-version-resolver.test.js +0 -543
  129. package/dist/data/package-versions.test.d.ts +0 -1
  130. package/dist/data/package-versions.test.js +0 -227
  131. package/dist/data/persistent-vars.conflict.test.d.ts +0 -1
  132. package/dist/data/persistent-vars.conflict.test.js +0 -126
  133. package/dist/data/persistent-vars.migration.test.d.ts +0 -1
  134. package/dist/data/persistent-vars.migration.test.js +0 -133
  135. package/dist/data/persistent-vars.package-scope.test.d.ts +0 -1
  136. package/dist/data/persistent-vars.package-scope.test.js +0 -27
  137. package/dist/data/sync-recovery-queue.test.d.ts +0 -1
  138. package/dist/data/sync-recovery-queue.test.js +0 -215
  139. package/dist/data/table-signing.test.d.ts +0 -1
  140. package/dist/data/table-signing.test.js +0 -118
  141. package/dist/data/tool-access.test.d.ts +0 -1
  142. package/dist/data/tool-access.test.js +0 -166
  143. package/dist/data/user-permissions.test.d.ts +0 -1
  144. package/dist/data/user-permissions.test.js +0 -305
  145. package/dist/data/user-trust-levels.test.d.ts +0 -1
  146. package/dist/data/user-trust-levels.test.js +0 -37
  147. package/dist/define/also-implements.test.d.ts +0 -1
  148. package/dist/define/also-implements.test.js +0 -123
  149. package/dist/define/declare-contract.test.d.ts +0 -1
  150. package/dist/define/declare-contract.test.js +0 -573
  151. package/dist/define/define.test.d.ts +0 -1
  152. package/dist/define/define.test.js +0 -1010
  153. package/dist/define/empty-fields.test.d.ts +0 -1
  154. package/dist/define/empty-fields.test.js +0 -55
  155. package/dist/define/events-observables.test.d.ts +0 -1
  156. package/dist/define/events-observables.test.js +0 -1013
  157. package/dist/define/serve-members.test.d.ts +0 -1
  158. package/dist/define/serve-members.test.js +0 -630
  159. package/dist/define/vars.test.d.ts +0 -1
  160. package/dist/define/vars.test.js +0 -39
  161. package/dist/device/binary-peer-connection-v2.test.d.ts +0 -1
  162. package/dist/device/binary-peer-connection-v2.test.js +0 -730
  163. package/dist/device/binary-peer-connection.test.d.ts +0 -1
  164. package/dist/device/binary-peer-connection.test.js +0 -184
  165. package/dist/device/connection.test.d.ts +0 -1
  166. package/dist/device/connection.test.js +0 -613
  167. package/dist/device/device-election.test.d.ts +0 -1
  168. package/dist/device/device-election.test.js +0 -516
  169. package/dist/device/device.test.d.ts +0 -1
  170. package/dist/device/device.test.js +0 -243
  171. package/dist/device/frame-cipher.test.d.ts +0 -1
  172. package/dist/device/frame-cipher.test.js +0 -219
  173. package/dist/device/get-trust-level-fn.test.d.ts +0 -1
  174. package/dist/device/get-trust-level-fn.test.js +0 -685
  175. package/dist/device/streamed-socket.test.d.ts +0 -1
  176. package/dist/device/streamed-socket.test.js +0 -216
  177. package/dist/device/tx-encoding.test.d.ts +0 -1
  178. package/dist/device/tx-encoding.test.js +0 -295
  179. package/dist/device-pairing/cpace.test.d.ts +0 -1
  180. package/dist/device-pairing/cpace.test.js +0 -116
  181. package/dist/device-pairing/device-pairing.test.d.ts +0 -1
  182. package/dist/device-pairing/device-pairing.test.js +0 -211
  183. package/dist/hlc.test.d.ts +0 -1
  184. package/dist/hlc.test.js +0 -45
  185. package/dist/host-credentials.test.d.ts +0 -1
  186. package/dist/host-credentials.test.js +0 -88
  187. package/dist/identity/account-email.test.d.ts +0 -1
  188. package/dist/identity/account-email.test.js +0 -59
  189. package/dist/identity/anchor-document.test.d.ts +0 -1
  190. package/dist/identity/anchor-document.test.js +0 -16
  191. package/dist/identity/anchor-resolution.test.d.ts +0 -1
  192. package/dist/identity/anchor-resolution.test.js +0 -130
  193. package/dist/identity/key-change.test.d.ts +0 -1
  194. package/dist/identity/key-change.test.js +0 -811
  195. package/dist/invites/group-approval.test.d.ts +0 -1
  196. package/dist/invites/group-approval.test.js +0 -223
  197. package/dist/invites/invite-token.test.d.ts +0 -1
  198. package/dist/invites/invite-token.test.js +0 -123
  199. package/dist/keys.test.d.ts +0 -1
  200. package/dist/keys.test.js +0 -336
  201. package/dist/logging/console-logger.test.d.ts +0 -1
  202. package/dist/logging/console-logger.test.js +0 -300
  203. package/dist/logging/console-logs.table.test.d.ts +0 -1
  204. package/dist/logging/console-logs.table.test.js +0 -156
  205. package/dist/observable.test.d.ts +0 -1
  206. package/dist/observable.test.js +0 -309
  207. package/dist/package-build/build-package.test.d.ts +0 -1
  208. package/dist/package-build/build-package.test.js +0 -204
  209. package/dist/package-build/contract-add.test.d.ts +0 -1
  210. package/dist/package-build/contract-add.test.js +0 -467
  211. package/dist/package-build/freeze-contracts.test.d.ts +0 -1
  212. package/dist/package-build/freeze-contracts.test.js +0 -355
  213. package/dist/package-installer/package-author-signing.test.d.ts +0 -1
  214. package/dist/package-installer/package-author-signing.test.js +0 -200
  215. package/dist/package-installer/package-cloner.test.d.ts +0 -1
  216. package/dist/package-installer/package-cloner.test.js +0 -278
  217. package/dist/package-installer/package-creator.test.d.ts +0 -1
  218. package/dist/package-installer/package-creator.test.js +0 -908
  219. package/dist/package-installer/package-dev-tools.test.d.ts +0 -1
  220. package/dist/package-installer/package-dev-tools.test.js +0 -64
  221. package/dist/package-installer/package-installer.test.d.ts +0 -1
  222. package/dist/package-installer/package-installer.test.js +0 -882
  223. package/dist/package-installer/package-propagation.test.d.ts +0 -1
  224. package/dist/package-installer/package-propagation.test.js +0 -1269
  225. package/dist/package-installer/package-publisher.test.d.ts +0 -1
  226. package/dist/package-installer/package-publisher.test.js +0 -153
  227. package/dist/package-installer/package-remote-checker.test.d.ts +0 -1
  228. package/dist/package-installer/package-remote-checker.test.js +0 -334
  229. package/dist/package-installer/package-seed-installer.test.d.ts +0 -1
  230. package/dist/package-installer/package-seed-installer.test.js +0 -123
  231. package/dist/package-installer/package-tarball.test.d.ts +0 -1
  232. package/dist/package-installer/package-tarball.test.js +0 -75
  233. package/dist/package-installer/peers-core-installer.test.d.ts +0 -1
  234. package/dist/package-installer/peers-core-installer.test.js +0 -49
  235. package/dist/package-installer/peers-core-trust-anchor.test.d.ts +0 -1
  236. package/dist/package-installer/peers-core-trust-anchor.test.js +0 -155
  237. package/dist/package-loader/contract-package-loader.test.d.ts +0 -1
  238. package/dist/package-loader/contract-package-loader.test.js +0 -274
  239. package/dist/package-loader/host-authority-loading.test.d.ts +0 -1
  240. package/dist/package-loader/host-authority-loading.test.js +0 -104
  241. package/dist/package-loader/host-dispatch-policy.test.d.ts +0 -1
  242. package/dist/package-loader/host-dispatch-policy.test.js +0 -56
  243. package/dist/package-loader/isolated-artifact.test.d.ts +0 -1
  244. package/dist/package-loader/isolated-artifact.test.js +0 -688
  245. package/dist/package-loader/isolated-persistent-var-gateway.test.d.ts +0 -1
  246. package/dist/package-loader/isolated-persistent-var-gateway.test.js +0 -56
  247. package/dist/package-loader/isolated-table-gateway.test.d.ts +0 -1
  248. package/dist/package-loader/isolated-table-gateway.test.js +0 -633
  249. package/dist/package-loader/package-loader.test.d.ts +0 -1
  250. package/dist/package-loader/package-loader.test.js +0 -1764
  251. package/dist/package-loader/resolve-consumed-contracts.test.d.ts +0 -1
  252. package/dist/package-loader/resolve-consumed-contracts.test.js +0 -166
  253. package/dist/serial-json.compat.test.d.ts +0 -1
  254. package/dist/serial-json.compat.test.js +0 -369
  255. package/dist/serial-json.test.d.ts +0 -1
  256. package/dist/serial-json.test.js +0 -401
  257. package/dist/testing/mock-host-contract.test.d.ts +0 -1
  258. package/dist/testing/mock-host-contract.test.js +0 -782
  259. package/dist/utils.test.d.ts +0 -1
  260. package/dist/utils.test.js +0 -232
@@ -1,669 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const zod_1 = require("zod");
4
- const types_1 = require("../../data/orm/types");
5
- const field_type_1 = require("../../types/field-type");
6
- const utils_1 = require("../../utils");
7
- const builder_1 = require("../builder");
8
- const extract_1 = require("../extract");
9
- const types_2 = require("../types");
10
- beforeAll(() => {
11
- (0, extract_1.setSchemaToFieldsFn)(types_1.schemaToFields);
12
- });
13
- const TEST_PKG_ID = (0, utils_1.newid)();
14
- const TASKS_ID = (0, utils_1.newid)();
15
- const NOTES_ID = (0, utils_1.newid)();
16
- const AUTH_ID = (0, utils_1.newid)();
17
- const PROJECTS_ID = (0, utils_1.newid)();
18
- const FANCY_TASKS_ID = (0, utils_1.newid)();
19
- const GENERIC_ID = (0, utils_1.newid)();
20
- describe("definePackage", () => {
21
- it("carries a contract's description, or an empty one", () => {
22
- const result = (0, builder_1.definePackage)((pkg) => {
23
- pkg.packageId = TEST_PKG_ID;
24
- pkg.contract(TASKS_ID, 1, "Tasks", "Your tasks, by status.");
25
- pkg.contract(NOTES_ID, 1, "Notes");
26
- });
27
- expect(result.contracts.map(({ name, description }) => [name, description])).toEqual([
28
- ["Tasks", "Your tasks, by status."],
29
- ["Notes", ""],
30
- ]);
31
- });
32
- it("produces a contract definition from a single contract with tables and tools", () => {
33
- const result = (0, builder_1.definePackage)((pkg) => {
34
- pkg.packageId = TEST_PKG_ID;
35
- const tasks = pkg.contract(TASKS_ID, 1, "Tasks");
36
- tasks.tables = [
37
- {
38
- metaData: {
39
- name: "Tasks",
40
- description: "Task tracking",
41
- primaryKeyName: "taskId",
42
- fields: [],
43
- },
44
- schema: zod_1.z.object({
45
- taskId: zod_1.z.string().describe("PK"),
46
- title: zod_1.z.string().describe("Title"),
47
- }),
48
- },
49
- ];
50
- tasks.tools = [
51
- {
52
- tool: {
53
- name: "create-task",
54
- usageDescription: "Creates a task",
55
- inputSchema: {
56
- fields: [{ name: "title", type: field_type_1.FieldType.string, description: "Title" }],
57
- },
58
- outputSchema: {
59
- fields: [{ name: "taskId", type: field_type_1.FieldType.id, description: "ID" }],
60
- },
61
- },
62
- },
63
- ];
64
- });
65
- expect(result.contracts).toHaveLength(1);
66
- const contract = result.contracts[0];
67
- expect(contract.contractId).toBe(TASKS_ID);
68
- expect(contract.version).toBe(1);
69
- expect(contract.name).toBe("Tasks");
70
- expect(contract.description).toBe("");
71
- expect(contract.devTag).toBe("dev");
72
- expect(contract.tables).toHaveLength(1);
73
- expect(contract.tables[0].name).toBe("Tasks");
74
- expect(contract.tables[0].fields).toHaveLength(2);
75
- expect(contract.tools).toHaveLength(1);
76
- expect(contract.tools[0].name).toBe("create-task");
77
- expect(contract.tools[0].inputFields).toHaveLength(1);
78
- expect(contract.tools[0].outputFields).toHaveLength(1);
79
- });
80
- it("supports multiple contracts from one package", () => {
81
- const result = (0, builder_1.definePackage)((pkg) => {
82
- pkg.packageId = TEST_PKG_ID;
83
- const tasks = pkg.contract(TASKS_ID, 1, "Tasks");
84
- tasks.tables = [
85
- {
86
- metaData: {
87
- name: "Tasks",
88
- description: "d",
89
- primaryKeyName: "taskId",
90
- fields: [{ name: "taskId", type: field_type_1.FieldType.id }],
91
- },
92
- },
93
- ];
94
- const notes = pkg.contract(NOTES_ID, 1, "Notes");
95
- notes.tables = [
96
- {
97
- metaData: {
98
- name: "Notes",
99
- description: "d",
100
- primaryKeyName: "noteId",
101
- fields: [{ name: "noteId", type: field_type_1.FieldType.id }],
102
- },
103
- },
104
- ];
105
- });
106
- expect(result.contracts).toHaveLength(2);
107
- expect(result.contracts[0].contractId).toBe(TASKS_ID);
108
- expect(result.contracts[1].contractId).toBe(NOTES_ID);
109
- });
110
- it("records consumed contracts", () => {
111
- let tasksHandle;
112
- let authHandle;
113
- const result = (0, builder_1.definePackage)((pkg) => {
114
- pkg.packageId = TEST_PKG_ID;
115
- tasksHandle = pkg.consumes(TASKS_ID, 1);
116
- authHandle = pkg.consumes(AUTH_ID, 2);
117
- const projects = pkg.contract(PROJECTS_ID, 1, "Projects");
118
- projects.tables = [
119
- {
120
- metaData: {
121
- name: "Projects",
122
- description: "d",
123
- primaryKeyName: "projectId",
124
- fields: [{ name: "projectId", type: field_type_1.FieldType.id }],
125
- },
126
- },
127
- ];
128
- });
129
- expect(result.consumes).toHaveLength(2);
130
- expect(result.consumes[0].contractId).toBe(TASKS_ID);
131
- expect(result.consumes[0].version).toBe(1);
132
- expect(result.consumes[0].handle).toBe(tasksHandle);
133
- expect(result.consumes[1].contractId).toBe(AUTH_ID);
134
- expect(result.consumes[1].version).toBe(2);
135
- expect(result.consumes[1].handle).toBe(authHandle);
136
- });
137
- it("records remote contracts as deferred handles without requiring a consume", () => {
138
- let remoteHandle;
139
- const result = (0, builder_1.definePackage)((pkg) => {
140
- pkg.packageId = TEST_PKG_ID;
141
- // A package may target its own contract on other devices.
142
- const projects = pkg.contract(PROJECTS_ID, 1, "Projects");
143
- projects.tools = [];
144
- remoteHandle = pkg.remote(PROJECTS_ID, 1);
145
- });
146
- expect(result.consumes).toHaveLength(0);
147
- expect(result.remotes).toHaveLength(1);
148
- expect(result.remotes?.[0]).toMatchObject({ contractId: PROJECTS_ID, version: 1 });
149
- expect(result.remotes?.[0].handle).toBe(remoteHandle);
150
- expect(remoteHandle?.consumer).toBeInstanceOf(Promise);
151
- });
152
- it("validates remote declarations", () => {
153
- expect(() => (0, builder_1.definePackage)((pkg) => {
154
- pkg.packageId = TEST_PKG_ID;
155
- pkg.remote("not-an-id", 1);
156
- })).toThrow("remote contractId must be a valid peer ID");
157
- expect(() => (0, builder_1.definePackage)((pkg) => {
158
- pkg.packageId = TEST_PKG_ID;
159
- pkg.remote(TASKS_ID, 0);
160
- })).toThrow("remote version must be a positive integer");
161
- });
162
- it("preserves consume options and returns a deferred handle", () => {
163
- const preferredProviderId = (0, utils_1.newid)();
164
- const result = (0, builder_1.definePackage)((pkg) => {
165
- pkg.packageId = TEST_PKG_ID;
166
- pkg.consumes(TASKS_ID, 1, {
167
- providerPackageIds: [preferredProviderId],
168
- fallbackToDefaultProvider: true,
169
- });
170
- pkg.consumes(AUTH_ID, 2, {
171
- optional: true,
172
- providerPackageIds: [preferredProviderId],
173
- fallbackToDefaultProvider: false,
174
- });
175
- });
176
- const [required, optional] = result.consumes;
177
- expect(required).toMatchObject({
178
- contractId: TASKS_ID,
179
- version: 1,
180
- providerPackageIds: [preferredProviderId],
181
- fallbackToDefaultProvider: true,
182
- });
183
- expect(required.optional).toBeUndefined();
184
- expect(required.handle).toBeDefined();
185
- expect(typeof required.handle?.consumer.then).toBe("function");
186
- // Handle itself must not be thenable (naive await on the return value must not wait).
187
- expect(required.handle.then).toBeUndefined();
188
- expect(optional).toMatchObject({
189
- contractId: AUTH_ID,
190
- version: 2,
191
- optional: true,
192
- providerPackageIds: [preferredProviderId],
193
- fallbackToDefaultProvider: false,
194
- });
195
- expect(optional.handle).toBeDefined();
196
- });
197
- it("accepts a type argument that narrows the resolved consumer", () => {
198
- (0, builder_1.definePackage)((pkg) => {
199
- pkg.packageId = TEST_PKG_ID;
200
- const required = pkg.consumes(TASKS_ID, 1);
201
- const optional = pkg.consumes(AUTH_ID, 1, { optional: true });
202
- // Compile-time checks: required → TypedConsumer; optional → TypedConsumer | undefined.
203
- void (async () => {
204
- const requiredConsumer = await required.consumer;
205
- const optionalConsumer = await optional.consumer;
206
- void requiredConsumer;
207
- void optionalConsumer;
208
- // Named table methods (not only dataChanged) must be present on ITableProxy.
209
- const _list = requiredConsumer.tables.ConsoleLogs.list;
210
- const _deleteOldLogs = requiredConsumer.tables.ConsoleLogs.deleteOldLogs;
211
- void _list;
212
- void _deleteOldLogs;
213
- // Typed consumers may omit empty bags — these must not exist on TypedConsumer.
214
- // @ts-expect-error no tools bag on slim typed consumer
215
- void requiredConsumer.tools;
216
- // @ts-expect-error no events bag on slim typed consumer
217
- void requiredConsumer.events;
218
- // @ts-expect-error no observables bag on slim typed consumer
219
- void requiredConsumer.observables;
220
- // @ts-expect-error optional consume must allow undefined
221
- const tooNarrow = await optional.consumer;
222
- void tooNarrow;
223
- })();
224
- });
225
- });
226
- it("ILogsConsumer exposes ConsoleLogs as ITableProxy without empty bags", () => {
227
- (0, builder_1.definePackage)((pkg) => {
228
- pkg.packageId = TEST_PKG_ID;
229
- const handle = pkg.consumes(TASKS_ID, 1, { optional: true });
230
- void (async () => {
231
- const logs = await handle.consumer;
232
- if (!logs)
233
- return;
234
- const _list = logs.tables.ConsoleLogs.list;
235
- const _deleteOldLogs = logs.tables.ConsoleLogs.deleteOldLogs;
236
- void _list;
237
- void _deleteOldLogs;
238
- // @ts-expect-error ILogsConsumer has no tools bag
239
- void logs.tools;
240
- // @ts-expect-error ILogsConsumer has no events bag
241
- void logs.events;
242
- // @ts-expect-error ILogsConsumer has no observables bag
243
- void logs.observables;
244
- })();
245
- });
246
- });
247
- it("settles required handles with a consumer and optional handles with undefined", async () => {
248
- const { settleConsumedContractHandle, rejectConsumedContractHandle } = await Promise.resolve().then(() => require("../builder"));
249
- const result = (0, builder_1.definePackage)((pkg) => {
250
- pkg.packageId = TEST_PKG_ID;
251
- pkg.consumes(TASKS_ID, 1);
252
- pkg.consumes(AUTH_ID, 1, { optional: true });
253
- });
254
- const requiredHandle = result.consumes[0].handle;
255
- const optionalHandle = result.consumes[1].handle;
256
- expect(requiredHandle).toBeDefined();
257
- expect(optionalHandle).toBeDefined();
258
- if (!requiredHandle || !optionalHandle) {
259
- throw new Error("expected consumes handles");
260
- }
261
- const fakeConsumer = {
262
- contractId: TASKS_ID,
263
- version: 1,
264
- tables: {},
265
- tools: {},
266
- observables: {},
267
- events: {},
268
- loadingPromise: Promise.resolve(),
269
- dispose: () => { },
270
- };
271
- settleConsumedContractHandle(requiredHandle, fakeConsumer);
272
- settleConsumedContractHandle(optionalHandle, undefined);
273
- await expect(requiredHandle.consumer).resolves.toBe(fakeConsumer);
274
- await expect(optionalHandle.consumer).resolves.toBeUndefined();
275
- expect(() => settleConsumedContractHandle(requiredHandle, fakeConsumer)).toThrow("already been settled");
276
- expect(() => rejectConsumedContractHandle(optionalHandle, new Error("late"))).toThrow("already been settled");
277
- });
278
- it("rejects a required consume handle once", async () => {
279
- const { rejectConsumedContractHandle } = await Promise.resolve().then(() => require("../builder"));
280
- const result = (0, builder_1.definePackage)((pkg) => {
281
- pkg.packageId = TEST_PKG_ID;
282
- pkg.consumes(TASKS_ID, 1);
283
- });
284
- const requiredHandle = result.consumes[0].handle;
285
- expect(requiredHandle).toBeDefined();
286
- if (!requiredHandle) {
287
- throw new Error("expected consumes handle");
288
- }
289
- const err = new Error("No provider for Tasks");
290
- rejectConsumedContractHandle(requiredHandle, err);
291
- await expect(requiredHandle.consumer).rejects.toThrow("No provider for Tasks");
292
- expect(() => rejectConsumedContractHandle(requiredHandle, err)).toThrow("already been settled");
293
- });
294
- it("throws when consumes providerPackageIds contains an invalid peer ID", () => {
295
- expect(() => {
296
- (0, builder_1.definePackage)((pkg) => {
297
- pkg.packageId = TEST_PKG_ID;
298
- pkg.consumes(TASKS_ID, 1, { providerPackageIds: ["not-valid"] });
299
- });
300
- }).toThrow("providerPackageIds");
301
- });
302
- it("throws when consumes version is not a positive integer", () => {
303
- expect(() => {
304
- (0, builder_1.definePackage)((pkg) => {
305
- pkg.packageId = TEST_PKG_ID;
306
- pkg.consumes(TASKS_ID, 0);
307
- });
308
- }).toThrow("positive integer");
309
- });
310
- it("records alsoImplements declarations", () => {
311
- const result = (0, builder_1.definePackage)((pkg) => {
312
- pkg.packageId = TEST_PKG_ID;
313
- const fancy = pkg.contract(FANCY_TASKS_ID, 1, "Fancy Tasks");
314
- fancy.alsoImplements(TASKS_ID, 1);
315
- fancy.alsoImplements(TASKS_ID, { from: 1, to: 3 });
316
- fancy.tables = [
317
- {
318
- metaData: {
319
- name: "Tasks",
320
- description: "d",
321
- primaryKeyName: "taskId",
322
- fields: [{ name: "taskId", type: field_type_1.FieldType.id }],
323
- },
324
- },
325
- ];
326
- });
327
- const key = (0, types_2.contractKey)(FANCY_TASKS_ID, 1);
328
- expect(result.alsoImplements.has(key)).toBe(true);
329
- const decls = result.alsoImplements.get(key) ?? [];
330
- expect(decls).toHaveLength(2);
331
- expect(decls[0]).toEqual({ contractId: TASKS_ID, version: 1 });
332
- expect(decls[1]).toEqual({ contractId: TASKS_ID, version: { from: 1, to: 3 } });
333
- });
334
- it("records the contracts a hub implementation exposes", () => {
335
- const hubId = (0, utils_1.newid)();
336
- const result = (0, builder_1.definePackage)((pkg) => {
337
- pkg.packageId = TEST_PKG_ID;
338
- pkg.contract(GENERIC_ID, 1, "Generic");
339
- const hub = pkg.contract(hubId, 2, "Hub");
340
- hub.exposes(GENERIC_ID, 1);
341
- });
342
- expect(result.exposes?.get((0, types_2.contractKey)(hubId, 2))).toEqual([
343
- { contractId: GENERIC_ID, version: 1 },
344
- ]);
345
- expect(result.exposes?.has((0, types_2.contractKey)(GENERIC_ID, 1))).toBe(false);
346
- expect(result.contracts.find((contract) => contract.contractId === hubId)).not.toHaveProperty("exposes");
347
- const hub = (0, builder_1.definePackage)((pkg) => {
348
- pkg.packageId = TEST_PKG_ID;
349
- const contract = pkg.contract(hubId, 2, "Hub");
350
- expect(() => contract.exposes("short", 1)).toThrow("valid peer ID");
351
- expect(() => contract.exposes(GENERIC_ID, 0)).toThrow("positive integer");
352
- });
353
- expect(hub.exposes?.size).toBe(0);
354
- });
355
- it("rejects invalid legacy exposures before installation", () => {
356
- const hubId = (0, utils_1.newid)();
357
- const build = (targets) => (0, builder_1.definePackage)((pkg) => {
358
- pkg.packageId = TEST_PKG_ID;
359
- pkg.contract(GENERIC_ID, 1, "Generic");
360
- const hub = pkg.contract(hubId, 1, "Hub");
361
- for (const target of targets)
362
- hub.exposes(target, 1);
363
- });
364
- expect(() => build([(0, utils_1.newid)()])).toThrow("doesn't provide");
365
- expect(() => build([hubId])).toThrow("can't expose itself");
366
- expect(() => build([GENERIC_ID, GENERIC_ID])).toThrow("twice");
367
- });
368
- it("includes package-level assistants and appNavs", () => {
369
- const assistant = { id: "asst1", name: "Task Bot" };
370
- const nav = { name: "Tasks", iconClassName: "bi bi-list-task", navigationPath: "app" };
371
- const result = (0, builder_1.definePackage)((pkg) => {
372
- pkg.packageId = TEST_PKG_ID;
373
- pkg.assistants = [assistant];
374
- pkg.appNavs = [nav];
375
- const c = pkg.contract(GENERIC_ID, 1, "Generic");
376
- c.tables = [
377
- {
378
- metaData: {
379
- name: "T",
380
- description: "d",
381
- primaryKeyName: "id",
382
- fields: [{ name: "id", type: field_type_1.FieldType.id }],
383
- },
384
- },
385
- ];
386
- });
387
- expect(result.assistants).toEqual([assistant]);
388
- expect(result.appNavs).toEqual([nav]);
389
- });
390
- it("always assigns devTag 'dev' to contracts from definePackage", () => {
391
- const devContractId = (0, utils_1.newid)();
392
- const result = (0, builder_1.definePackage)((pkg) => {
393
- pkg.packageId = TEST_PKG_ID;
394
- const c = pkg.contract(devContractId, 1, "Dev Contract");
395
- c.tables = [
396
- {
397
- metaData: {
398
- name: "T",
399
- description: "d",
400
- primaryKeyName: "id",
401
- fields: [{ name: "id", type: field_type_1.FieldType.id }],
402
- },
403
- },
404
- ];
405
- });
406
- expect(result.contracts[0].devTag).toBe("dev");
407
- });
408
- it("supports observables on contracts", () => {
409
- const obsContractId = (0, utils_1.newid)();
410
- const result = (0, builder_1.definePackage)((pkg) => {
411
- pkg.packageId = TEST_PKG_ID;
412
- const c = pkg.contract(obsContractId, 1, "Observable Contract");
413
- c.tables = [
414
- {
415
- metaData: {
416
- name: "T",
417
- description: "d",
418
- primaryKeyName: "id",
419
- fields: [{ name: "id", type: field_type_1.FieldType.id }],
420
- },
421
- },
422
- ];
423
- c.observables = [
424
- {
425
- name: "taskCount",
426
- description: "Count of tasks",
427
- valueType: field_type_1.FieldType.number,
428
- writable: false,
429
- },
430
- ];
431
- });
432
- expect(result.contracts[0].observables).toHaveLength(1);
433
- expect(result.contracts[0].observables[0].name).toBe("taskCount");
434
- });
435
- it("emits contract events without sharing or mutating the caller's array", () => {
436
- const eventContractId = (0, utils_1.newid)();
437
- const events = [
438
- {
439
- name: "taskChanged",
440
- description: "A task changed",
441
- payloadFields: [{ name: "taskId", type: field_type_1.FieldType.id }],
442
- },
443
- ];
444
- const result = (0, builder_1.definePackage)((pkg) => {
445
- pkg.packageId = TEST_PKG_ID;
446
- const contract = pkg.contract(eventContractId, 1, "Event Contract");
447
- contract.events = events;
448
- });
449
- const emittedEvents = result.contracts[0].events;
450
- expect(emittedEvents).toEqual(events);
451
- expect(emittedEvents).not.toBe(events);
452
- emittedEvents?.push({
453
- name: "otherEvent",
454
- description: "Another event",
455
- payloadFields: [],
456
- });
457
- expect(events).toHaveLength(1);
458
- });
459
- it("uses provided name and description on the contract definition", () => {
460
- const cid = (0, utils_1.newid)();
461
- const result = (0, builder_1.definePackage)((pkg) => {
462
- pkg.packageId = TEST_PKG_ID;
463
- const c = pkg.contract(cid, 1, "Human-Readable Name");
464
- c.tables = [
465
- {
466
- metaData: {
467
- name: "T",
468
- description: "d",
469
- primaryKeyName: "id",
470
- fields: [{ name: "id", type: field_type_1.FieldType.id }],
471
- },
472
- },
473
- ];
474
- });
475
- expect(result.contracts[0].name).toBe("Human-Readable Name");
476
- expect(result.contracts[0].description).toBe("");
477
- });
478
- it("includes packageId and version in the result", () => {
479
- const cid = (0, utils_1.newid)();
480
- const result = (0, builder_1.definePackage)((pkg) => {
481
- pkg.packageId = TEST_PKG_ID;
482
- pkg.version = "1.2.3";
483
- const c = pkg.contract(cid, 1, "C");
484
- c.tables = [
485
- {
486
- metaData: {
487
- name: "T",
488
- description: "d",
489
- primaryKeyName: "id",
490
- fields: [{ name: "id", type: field_type_1.FieldType.id }],
491
- },
492
- },
493
- ];
494
- });
495
- expect(result.packageId).toBe(TEST_PKG_ID);
496
- expect(result.version).toBe("1.2.3");
497
- });
498
- it("leaves version undefined when not set", () => {
499
- const cid = (0, utils_1.newid)();
500
- const result = (0, builder_1.definePackage)((pkg) => {
501
- pkg.packageId = TEST_PKG_ID;
502
- const c = pkg.contract(cid, 1, "C");
503
- c.tables = [
504
- {
505
- metaData: {
506
- name: "T",
507
- description: "d",
508
- primaryKeyName: "id",
509
- fields: [{ name: "id", type: field_type_1.FieldType.id }],
510
- },
511
- },
512
- ];
513
- });
514
- expect(result.packageId).toBe(TEST_PKG_ID);
515
- expect(result.version).toBeUndefined();
516
- });
517
- });
518
- describe("definePackage — error cases", () => {
519
- it("throws when packageId is not set", () => {
520
- const cid = (0, utils_1.newid)();
521
- expect(() => {
522
- (0, builder_1.definePackage)((pkg) => {
523
- pkg.contract(cid, 1, "C");
524
- });
525
- }).toThrow("must set packageId");
526
- });
527
- it("throws when packageId is not a valid peer ID", () => {
528
- expect(() => {
529
- (0, builder_1.definePackage)((pkg) => {
530
- pkg.packageId = "not-valid";
531
- });
532
- }).toThrow("valid peer ID");
533
- });
534
- it("allows package with no contracts (UI-only)", () => {
535
- const nav = { name: "Game", iconClassName: "bi-controller", navigationPath: "play" };
536
- const result = (0, builder_1.definePackage)((pkg) => {
537
- pkg.packageId = TEST_PKG_ID;
538
- pkg.appNavs = [nav];
539
- });
540
- expect(result.contracts).toHaveLength(0);
541
- expect(result.consumes).toHaveLength(0);
542
- expect(result.tableDefinitions).toHaveLength(0);
543
- expect(result.appNavs).toEqual([nav]);
544
- });
545
- it("allows consumes-only package with no defined contracts", () => {
546
- const result = (0, builder_1.definePackage)((pkg) => {
547
- pkg.packageId = TEST_PKG_ID;
548
- pkg.consumes(TASKS_ID, 1);
549
- });
550
- expect(result.contracts).toHaveLength(0);
551
- expect(result.consumes).toHaveLength(1);
552
- expect(result.tableDefinitions).toHaveLength(0);
553
- });
554
- it("throws on duplicate contract ID + version", () => {
555
- const dupId = (0, utils_1.newid)();
556
- expect(() => {
557
- (0, builder_1.definePackage)((pkg) => {
558
- pkg.packageId = TEST_PKG_ID;
559
- pkg.contract(dupId, 1, "First");
560
- pkg.contract(dupId, 1, "Second");
561
- });
562
- }).toThrow("Duplicate contract");
563
- });
564
- it("allows same contractId with different versions", () => {
565
- const cid = (0, utils_1.newid)();
566
- expect(() => {
567
- (0, builder_1.definePackage)((pkg) => {
568
- pkg.packageId = TEST_PKG_ID;
569
- const v1 = pkg.contract(cid, 1, "V1");
570
- v1.tables = [
571
- {
572
- metaData: {
573
- name: "T",
574
- description: "d",
575
- primaryKeyName: "id",
576
- fields: [{ name: "id", type: field_type_1.FieldType.id }],
577
- },
578
- },
579
- ];
580
- const v2 = pkg.contract(cid, 2, "V2");
581
- v2.tables = [
582
- {
583
- metaData: {
584
- name: "T",
585
- description: "d",
586
- primaryKeyName: "id",
587
- fields: [{ name: "id", type: field_type_1.FieldType.id }],
588
- },
589
- },
590
- ];
591
- });
592
- }).not.toThrow();
593
- });
594
- it("throws on non-integer version", () => {
595
- const cid = (0, utils_1.newid)();
596
- expect(() => {
597
- (0, builder_1.definePackage)((pkg) => {
598
- pkg.packageId = TEST_PKG_ID;
599
- pkg.contract(cid, 1.5, "Bad Version");
600
- });
601
- }).toThrow("positive integer");
602
- });
603
- it("throws on zero version", () => {
604
- const cid = (0, utils_1.newid)();
605
- expect(() => {
606
- (0, builder_1.definePackage)((pkg) => {
607
- pkg.packageId = TEST_PKG_ID;
608
- pkg.contract(cid, 0, "Zero");
609
- });
610
- }).toThrow("positive integer");
611
- });
612
- it("throws on negative version", () => {
613
- const cid = (0, utils_1.newid)();
614
- expect(() => {
615
- (0, builder_1.definePackage)((pkg) => {
616
- pkg.packageId = TEST_PKG_ID;
617
- pkg.contract(cid, -1, "Negative");
618
- });
619
- }).toThrow("positive integer");
620
- });
621
- it("throws when contractId is not a valid peer ID", () => {
622
- expect(() => {
623
- (0, builder_1.definePackage)((pkg) => {
624
- pkg.packageId = TEST_PKG_ID;
625
- pkg.contract("tasks001", 1, "Bad ID");
626
- });
627
- }).toThrow("valid peer ID");
628
- });
629
- it("throws when consumes contractId is not a valid peer ID", () => {
630
- const cid = (0, utils_1.newid)();
631
- expect(() => {
632
- (0, builder_1.definePackage)((pkg) => {
633
- pkg.packageId = TEST_PKG_ID;
634
- pkg.consumes("not-a-peer-id", 1);
635
- const c = pkg.contract(cid, 1, "C");
636
- c.tables = [
637
- {
638
- metaData: {
639
- name: "T",
640
- description: "d",
641
- primaryKeyName: "id",
642
- fields: [{ name: "id", type: field_type_1.FieldType.id }],
643
- },
644
- },
645
- ];
646
- });
647
- }).toThrow("valid peer ID");
648
- });
649
- it("throws when alsoImplements targetContractId is not a valid peer ID", () => {
650
- const cid = (0, utils_1.newid)();
651
- expect(() => {
652
- (0, builder_1.definePackage)((pkg) => {
653
- pkg.packageId = TEST_PKG_ID;
654
- const c = pkg.contract(cid, 1, "C");
655
- c.alsoImplements("invalid-id", 1);
656
- c.tables = [
657
- {
658
- metaData: {
659
- name: "T",
660
- description: "d",
661
- primaryKeyName: "id",
662
- fields: [{ name: "id", type: field_type_1.FieldType.id }],
663
- },
664
- },
665
- ];
666
- });
667
- }).toThrow("valid peer ID");
668
- });
669
- });
@@ -1 +0,0 @@
1
- export {};