@peers-app/peers-sdk 0.27.3 → 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 (258) 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/define/manifest.js +6 -34
  19. package/dist/package-loader/package-loader.js +27 -22
  20. package/dist/system-ids.d.ts +5 -0
  21. package/dist/system-ids.js +6 -1
  22. package/package.json +4 -2
  23. package/dist/context/user-context-identity.test.d.ts +0 -1
  24. package/dist/context/user-context-identity.test.js +0 -220
  25. package/dist/contracts/__tests__/action-dispatch.test.d.ts +0 -1
  26. package/dist/contracts/__tests__/action-dispatch.test.js +0 -319
  27. package/dist/contracts/__tests__/also-implements.test.d.ts +0 -1
  28. package/dist/contracts/__tests__/also-implements.test.js +0 -110
  29. package/dist/contracts/__tests__/builder.test.d.ts +0 -1
  30. package/dist/contracts/__tests__/builder.test.js +0 -669
  31. package/dist/contracts/__tests__/contract-events.test.d.ts +0 -1
  32. package/dist/contracts/__tests__/contract-events.test.js +0 -199
  33. package/dist/contracts/__tests__/contract-observables.test.d.ts +0 -1
  34. package/dist/contracts/__tests__/contract-observables.test.js +0 -290
  35. package/dist/contracts/__tests__/contract-provider-router.test.d.ts +0 -1
  36. package/dist/contracts/__tests__/contract-provider-router.test.js +0 -315
  37. package/dist/contracts/__tests__/contract-proxy.test.d.ts +0 -1
  38. package/dist/contracts/__tests__/contract-proxy.test.js +0 -657
  39. package/dist/contracts/__tests__/contract-resolvers.test.d.ts +0 -1
  40. package/dist/contracts/__tests__/contract-resolvers.test.js +0 -758
  41. package/dist/contracts/__tests__/contract-subscription-lifecycle.test.d.ts +0 -1
  42. package/dist/contracts/__tests__/contract-subscription-lifecycle.test.js +0 -353
  43. package/dist/contracts/__tests__/contract-table-events.test.d.ts +0 -1
  44. package/dist/contracts/__tests__/contract-table-events.test.js +0 -209
  45. package/dist/contracts/__tests__/contract-transport.test.d.ts +0 -1
  46. package/dist/contracts/__tests__/contract-transport.test.js +0 -163
  47. package/dist/contracts/__tests__/extract.test.d.ts +0 -1
  48. package/dist/contracts/__tests__/extract.test.js +0 -145
  49. package/dist/contracts/__tests__/frozen-contracts.test.d.ts +0 -1
  50. package/dist/contracts/__tests__/frozen-contracts.test.js +0 -191
  51. package/dist/contracts/__tests__/generic-tool-dispatch.test.d.ts +0 -1
  52. package/dist/contracts/__tests__/generic-tool-dispatch.test.js +0 -130
  53. package/dist/contracts/__tests__/host-contract-client.test.d.ts +0 -1
  54. package/dist/contracts/__tests__/host-contract-client.test.js +0 -793
  55. package/dist/contracts/__tests__/host-contract-consumer.test.d.ts +0 -1
  56. package/dist/contracts/__tests__/host-contract-consumer.test.js +0 -163
  57. package/dist/contracts/__tests__/host-contract-transport.test.d.ts +0 -1
  58. package/dist/contracts/__tests__/host-contract-transport.test.js +0 -66
  59. package/dist/contracts/__tests__/integration.test.d.ts +0 -1
  60. package/dist/contracts/__tests__/integration.test.js +0 -348
  61. package/dist/contracts/__tests__/legacy-removal.test.d.ts +0 -1
  62. package/dist/contracts/__tests__/legacy-removal.test.js +0 -128
  63. package/dist/contracts/__tests__/persistent-registry.test.d.ts +0 -1
  64. package/dist/contracts/__tests__/persistent-registry.test.js +0 -109
  65. package/dist/contracts/__tests__/playground.test.d.ts +0 -1
  66. package/dist/contracts/__tests__/playground.test.js +0 -216
  67. package/dist/contracts/__tests__/registry.test.d.ts +0 -1
  68. package/dist/contracts/__tests__/registry.test.js +0 -238
  69. package/dist/contracts/__tests__/remote-contract-transport.test.d.ts +0 -1
  70. package/dist/contracts/__tests__/remote-contract-transport.test.js +0 -119
  71. package/dist/contracts/__tests__/system-contracts.test.d.ts +0 -1
  72. package/dist/contracts/__tests__/system-contracts.test.js +0 -247
  73. package/dist/contracts/__tests__/target-dispatch.d.ts +0 -11
  74. package/dist/contracts/__tests__/target-dispatch.js +0 -24
  75. package/dist/contracts/__tests__/tool-catalog-inventory.test.d.ts +0 -1
  76. package/dist/contracts/__tests__/tool-catalog-inventory.test.js +0 -44
  77. package/dist/contracts/__tests__/tool-catalog-service.test.d.ts +0 -1
  78. package/dist/contracts/__tests__/tool-catalog-service.test.js +0 -482
  79. package/dist/contracts/__tests__/tool-catalog.test.d.ts +0 -1
  80. package/dist/contracts/__tests__/tool-catalog.test.js +0 -1199
  81. package/dist/contracts/__tests__/validate.test.d.ts +0 -1
  82. package/dist/contracts/__tests__/validate.test.js +0 -991
  83. package/dist/contracts/__tests__/workflow-context.test.d.ts +0 -1
  84. package/dist/contracts/__tests__/workflow-context.test.js +0 -50
  85. package/dist/data/access-level.test.d.ts +0 -1
  86. package/dist/data/access-level.test.js +0 -53
  87. package/dist/data/change-tracking.test.d.ts +0 -1
  88. package/dist/data/change-tracking.test.js +0 -62
  89. package/dist/data/files/files.test.d.ts +0 -1
  90. package/dist/data/files/files.test.js +0 -770
  91. package/dist/data/group-members.test.d.ts +0 -1
  92. package/dist/data/group-members.test.js +0 -336
  93. package/dist/data/group-share.test.d.ts +0 -1
  94. package/dist/data/group-share.test.js +0 -110
  95. package/dist/data/groups.test.d.ts +0 -1
  96. package/dist/data/groups.test.js +0 -153
  97. package/dist/data/orm/cursor.test.d.ts +0 -1
  98. package/dist/data/orm/cursor.test.js +0 -314
  99. package/dist/data/orm/data-query.mongo.test.d.ts +0 -1
  100. package/dist/data/orm/data-query.mongo.test.js +0 -367
  101. package/dist/data/orm/data-query.sqlite.test.d.ts +0 -1
  102. package/dist/data/orm/data-query.sqlite.test.js +0 -365
  103. package/dist/data/orm/data-query.test.d.ts +0 -1
  104. package/dist/data/orm/data-query.test.js +0 -545
  105. package/dist/data/orm/dependency-injection.test.d.ts +0 -1
  106. package/dist/data/orm/dependency-injection.test.js +0 -171
  107. package/dist/data/orm/event-registry.test.d.ts +0 -1
  108. package/dist/data/orm/event-registry.test.js +0 -44
  109. package/dist/data/orm/multi-cursors.test.d.ts +0 -1
  110. package/dist/data/orm/multi-cursors.test.js +0 -463
  111. package/dist/data/orm/sql.data-source.test.d.ts +0 -1
  112. package/dist/data/orm/sql.data-source.test.js +0 -731
  113. package/dist/data/orm/table-container-events.test.d.ts +0 -1
  114. package/dist/data/orm/table-container-events.test.js +0 -101
  115. package/dist/data/orm/table-container.test.d.ts +0 -1
  116. package/dist/data/orm/table-container.test.js +0 -273
  117. package/dist/data/orm/table.event-source.test.d.ts +0 -1
  118. package/dist/data/orm/table.event-source.test.js +0 -331
  119. package/dist/data/orm/types.test.d.ts +0 -1
  120. package/dist/data/orm/types.test.js +0 -409
  121. package/dist/data/package-table-identity.test.d.ts +0 -1
  122. package/dist/data/package-table-identity.test.js +0 -46
  123. package/dist/data/package-version-permissions.test.d.ts +0 -1
  124. package/dist/data/package-version-permissions.test.js +0 -107
  125. package/dist/data/package-version-resolver.test.d.ts +0 -4
  126. package/dist/data/package-version-resolver.test.js +0 -543
  127. package/dist/data/package-versions.test.d.ts +0 -1
  128. package/dist/data/package-versions.test.js +0 -227
  129. package/dist/data/persistent-vars.conflict.test.d.ts +0 -1
  130. package/dist/data/persistent-vars.conflict.test.js +0 -126
  131. package/dist/data/persistent-vars.migration.test.d.ts +0 -1
  132. package/dist/data/persistent-vars.migration.test.js +0 -133
  133. package/dist/data/persistent-vars.package-scope.test.d.ts +0 -1
  134. package/dist/data/persistent-vars.package-scope.test.js +0 -27
  135. package/dist/data/sync-recovery-queue.test.d.ts +0 -1
  136. package/dist/data/sync-recovery-queue.test.js +0 -215
  137. package/dist/data/table-signing.test.d.ts +0 -1
  138. package/dist/data/table-signing.test.js +0 -118
  139. package/dist/data/tool-access.test.d.ts +0 -1
  140. package/dist/data/tool-access.test.js +0 -166
  141. package/dist/data/user-permissions.test.d.ts +0 -1
  142. package/dist/data/user-permissions.test.js +0 -305
  143. package/dist/data/user-trust-levels.test.d.ts +0 -1
  144. package/dist/data/user-trust-levels.test.js +0 -37
  145. package/dist/define/also-implements.test.d.ts +0 -1
  146. package/dist/define/also-implements.test.js +0 -123
  147. package/dist/define/declare-contract.test.d.ts +0 -1
  148. package/dist/define/declare-contract.test.js +0 -573
  149. package/dist/define/define.test.d.ts +0 -1
  150. package/dist/define/define.test.js +0 -1010
  151. package/dist/define/empty-fields.test.d.ts +0 -1
  152. package/dist/define/empty-fields.test.js +0 -55
  153. package/dist/define/events-observables.test.d.ts +0 -1
  154. package/dist/define/events-observables.test.js +0 -1013
  155. package/dist/define/serve-members.test.d.ts +0 -1
  156. package/dist/define/serve-members.test.js +0 -630
  157. package/dist/define/vars.test.d.ts +0 -1
  158. package/dist/define/vars.test.js +0 -39
  159. package/dist/device/binary-peer-connection-v2.test.d.ts +0 -1
  160. package/dist/device/binary-peer-connection-v2.test.js +0 -730
  161. package/dist/device/binary-peer-connection.test.d.ts +0 -1
  162. package/dist/device/binary-peer-connection.test.js +0 -184
  163. package/dist/device/connection.test.d.ts +0 -1
  164. package/dist/device/connection.test.js +0 -613
  165. package/dist/device/device-election.test.d.ts +0 -1
  166. package/dist/device/device-election.test.js +0 -516
  167. package/dist/device/device.test.d.ts +0 -1
  168. package/dist/device/device.test.js +0 -243
  169. package/dist/device/frame-cipher.test.d.ts +0 -1
  170. package/dist/device/frame-cipher.test.js +0 -219
  171. package/dist/device/get-trust-level-fn.test.d.ts +0 -1
  172. package/dist/device/get-trust-level-fn.test.js +0 -685
  173. package/dist/device/streamed-socket.test.d.ts +0 -1
  174. package/dist/device/streamed-socket.test.js +0 -216
  175. package/dist/device/tx-encoding.test.d.ts +0 -1
  176. package/dist/device/tx-encoding.test.js +0 -295
  177. package/dist/device-pairing/cpace.test.d.ts +0 -1
  178. package/dist/device-pairing/cpace.test.js +0 -116
  179. package/dist/device-pairing/device-pairing.test.d.ts +0 -1
  180. package/dist/device-pairing/device-pairing.test.js +0 -211
  181. package/dist/hlc.test.d.ts +0 -1
  182. package/dist/hlc.test.js +0 -45
  183. package/dist/host-credentials.test.d.ts +0 -1
  184. package/dist/host-credentials.test.js +0 -88
  185. package/dist/identity/account-email.test.d.ts +0 -1
  186. package/dist/identity/account-email.test.js +0 -59
  187. package/dist/identity/anchor-document.test.d.ts +0 -1
  188. package/dist/identity/anchor-document.test.js +0 -16
  189. package/dist/identity/anchor-resolution.test.d.ts +0 -1
  190. package/dist/identity/anchor-resolution.test.js +0 -130
  191. package/dist/identity/key-change.test.d.ts +0 -1
  192. package/dist/identity/key-change.test.js +0 -811
  193. package/dist/invites/group-approval.test.d.ts +0 -1
  194. package/dist/invites/group-approval.test.js +0 -223
  195. package/dist/invites/invite-token.test.d.ts +0 -1
  196. package/dist/invites/invite-token.test.js +0 -123
  197. package/dist/keys.test.d.ts +0 -1
  198. package/dist/keys.test.js +0 -336
  199. package/dist/logging/console-logger.test.d.ts +0 -1
  200. package/dist/logging/console-logger.test.js +0 -300
  201. package/dist/logging/console-logs.table.test.d.ts +0 -1
  202. package/dist/logging/console-logs.table.test.js +0 -156
  203. package/dist/observable.test.d.ts +0 -1
  204. package/dist/observable.test.js +0 -309
  205. package/dist/package-build/build-package.test.d.ts +0 -1
  206. package/dist/package-build/build-package.test.js +0 -204
  207. package/dist/package-build/contract-add.test.d.ts +0 -1
  208. package/dist/package-build/contract-add.test.js +0 -467
  209. package/dist/package-build/freeze-contracts.test.d.ts +0 -1
  210. package/dist/package-build/freeze-contracts.test.js +0 -355
  211. package/dist/package-installer/package-author-signing.test.d.ts +0 -1
  212. package/dist/package-installer/package-author-signing.test.js +0 -200
  213. package/dist/package-installer/package-cloner.test.d.ts +0 -1
  214. package/dist/package-installer/package-cloner.test.js +0 -278
  215. package/dist/package-installer/package-creator.test.d.ts +0 -1
  216. package/dist/package-installer/package-creator.test.js +0 -908
  217. package/dist/package-installer/package-dev-tools.test.d.ts +0 -1
  218. package/dist/package-installer/package-dev-tools.test.js +0 -64
  219. package/dist/package-installer/package-installer.test.d.ts +0 -1
  220. package/dist/package-installer/package-installer.test.js +0 -882
  221. package/dist/package-installer/package-propagation.test.d.ts +0 -1
  222. package/dist/package-installer/package-propagation.test.js +0 -1269
  223. package/dist/package-installer/package-publisher.test.d.ts +0 -1
  224. package/dist/package-installer/package-publisher.test.js +0 -153
  225. package/dist/package-installer/package-remote-checker.test.d.ts +0 -1
  226. package/dist/package-installer/package-remote-checker.test.js +0 -334
  227. package/dist/package-installer/package-seed-installer.test.d.ts +0 -1
  228. package/dist/package-installer/package-seed-installer.test.js +0 -123
  229. package/dist/package-installer/package-tarball.test.d.ts +0 -1
  230. package/dist/package-installer/package-tarball.test.js +0 -75
  231. package/dist/package-installer/peers-core-installer.test.d.ts +0 -1
  232. package/dist/package-installer/peers-core-installer.test.js +0 -49
  233. package/dist/package-installer/peers-core-trust-anchor.test.d.ts +0 -1
  234. package/dist/package-installer/peers-core-trust-anchor.test.js +0 -155
  235. package/dist/package-loader/contract-package-loader.test.d.ts +0 -1
  236. package/dist/package-loader/contract-package-loader.test.js +0 -274
  237. package/dist/package-loader/host-authority-loading.test.d.ts +0 -1
  238. package/dist/package-loader/host-authority-loading.test.js +0 -104
  239. package/dist/package-loader/host-dispatch-policy.test.d.ts +0 -1
  240. package/dist/package-loader/host-dispatch-policy.test.js +0 -56
  241. package/dist/package-loader/isolated-artifact.test.d.ts +0 -1
  242. package/dist/package-loader/isolated-artifact.test.js +0 -688
  243. package/dist/package-loader/isolated-persistent-var-gateway.test.d.ts +0 -1
  244. package/dist/package-loader/isolated-persistent-var-gateway.test.js +0 -56
  245. package/dist/package-loader/isolated-table-gateway.test.d.ts +0 -1
  246. package/dist/package-loader/isolated-table-gateway.test.js +0 -633
  247. package/dist/package-loader/package-loader.test.d.ts +0 -1
  248. package/dist/package-loader/package-loader.test.js +0 -1764
  249. package/dist/package-loader/resolve-consumed-contracts.test.d.ts +0 -1
  250. package/dist/package-loader/resolve-consumed-contracts.test.js +0 -166
  251. package/dist/serial-json.compat.test.d.ts +0 -1
  252. package/dist/serial-json.compat.test.js +0 -369
  253. package/dist/serial-json.test.d.ts +0 -1
  254. package/dist/serial-json.test.js +0 -401
  255. package/dist/testing/mock-host-contract.test.d.ts +0 -1
  256. package/dist/testing/mock-host-contract.test.js +0 -782
  257. package/dist/utils.test.d.ts +0 -1
  258. 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 {};