@peers-app/peers-sdk 0.26.5 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/README.md +3 -1
  2. package/bin/peers-package.js +13 -0
  3. package/define/package.json +4 -0
  4. package/dist/contracts/__tests__/action-dispatch.test.js +56 -76
  5. package/dist/contracts/__tests__/also-implements.test.d.ts +1 -0
  6. package/dist/contracts/__tests__/also-implements.test.js +110 -0
  7. package/dist/contracts/__tests__/builder.test.js +45 -0
  8. package/dist/contracts/__tests__/contract-resolvers.test.js +134 -4
  9. package/dist/contracts/__tests__/frozen-contracts.test.d.ts +1 -0
  10. package/dist/contracts/__tests__/frozen-contracts.test.js +191 -0
  11. package/dist/contracts/__tests__/generic-tool-dispatch.test.js +13 -56
  12. package/dist/contracts/__tests__/host-contract-client.test.d.ts +1 -0
  13. package/dist/contracts/__tests__/host-contract-client.test.js +793 -0
  14. package/dist/contracts/__tests__/host-contract-transport.test.js +15 -0
  15. package/dist/contracts/__tests__/registry.test.js +68 -0
  16. package/dist/contracts/__tests__/target-dispatch.d.ts +11 -0
  17. package/dist/contracts/__tests__/target-dispatch.js +24 -0
  18. package/dist/contracts/__tests__/tool-catalog-service.test.js +37 -1
  19. package/dist/contracts/__tests__/tool-catalog.test.js +12 -3
  20. package/dist/contracts/__tests__/validate.test.js +177 -7
  21. package/dist/contracts/__tests__/workflow-context.test.js +0 -11
  22. package/dist/contracts/builder.d.ts +16 -2
  23. package/dist/contracts/builder.js +44 -3
  24. package/dist/contracts/contract-definition-schema.d.ts +251 -0
  25. package/dist/contracts/contract-definition-schema.js +48 -0
  26. package/dist/contracts/contract-provider-router.d.ts +2 -0
  27. package/dist/contracts/contract-provider-router.js +5 -2
  28. package/dist/contracts/contract-proxy.d.ts +52 -18
  29. package/dist/contracts/contract-proxy.js +144 -203
  30. package/dist/contracts/contract-resolvers.d.ts +6 -4
  31. package/dist/contracts/contract-resolvers.js +32 -9
  32. package/dist/contracts/frozen-contracts.d.ts +59 -0
  33. package/dist/contracts/frozen-contracts.js +86 -0
  34. package/dist/contracts/host-contract-client.d.ts +134 -0
  35. package/dist/contracts/host-contract-client.js +396 -0
  36. package/dist/contracts/host-contract-transport.d.ts +2 -0
  37. package/dist/contracts/host-contract-transport.js +8 -0
  38. package/dist/contracts/index.d.ts +6 -4
  39. package/dist/contracts/index.js +11 -5
  40. package/dist/contracts/registry.d.ts +31 -1
  41. package/dist/contracts/registry.js +100 -6
  42. package/dist/contracts/system/contract-catalog-contract.d.ts +61 -6
  43. package/dist/contracts/system/contract-catalog-contract.js +17 -5
  44. package/dist/contracts/tool-catalog-service.js +26 -6
  45. package/dist/contracts/tool-catalog.d.ts +1 -1
  46. package/dist/contracts/tool-catalog.js +4 -1
  47. package/dist/contracts/types.d.ts +32 -2
  48. package/dist/contracts/validate.d.ts +16 -1
  49. package/dist/contracts/validate.js +139 -25
  50. package/dist/data/change-tracking.d.ts +17 -5
  51. package/dist/data/change-tracking.js +22 -6
  52. package/dist/data/change-tracking.test.d.ts +1 -0
  53. package/dist/data/change-tracking.test.js +62 -0
  54. package/dist/data/group-members.d.ts +6 -1
  55. package/dist/data/group-members.js +12 -4
  56. package/dist/data/groups.d.ts +6 -1
  57. package/dist/data/groups.js +12 -4
  58. package/dist/data/orm/sql.data-source.d.ts +9 -0
  59. package/dist/data/orm/sql.data-source.js +47 -2
  60. package/dist/data/orm/sql.data-source.test.js +142 -0
  61. package/dist/data/orm/table-container.js +9 -9
  62. package/dist/data/orm/table-container.test.js +44 -0
  63. package/dist/data/orm/types.d.ts +41 -1
  64. package/dist/data/orm/types.js +159 -28
  65. package/dist/data/orm/types.test.js +129 -0
  66. package/dist/data/package-versions.d.ts +5 -1
  67. package/dist/data/package-versions.js +11 -4
  68. package/dist/data/packages.d.ts +7 -1
  69. package/dist/data/packages.js +13 -4
  70. package/dist/data/peer-types.d.ts +8 -62
  71. package/dist/data/persistent-vars.d.ts +4 -1
  72. package/dist/data/persistent-vars.js +7 -2
  73. package/dist/data/table-signing.test.d.ts +1 -0
  74. package/dist/data/table-signing.test.js +118 -0
  75. package/dist/data/tools.d.ts +29 -221
  76. package/dist/data/users.d.ts +1 -2
  77. package/dist/data/users.js +8 -5
  78. package/dist/define/also-implements.test.d.ts +1 -0
  79. package/dist/define/also-implements.test.js +123 -0
  80. package/dist/define/context.d.ts +77 -0
  81. package/dist/define/context.js +2 -0
  82. package/dist/define/contract-ref.d.ts +177 -0
  83. package/dist/define/contract-ref.js +67 -0
  84. package/dist/define/declare-contract.d.ts +167 -0
  85. package/dist/define/declare-contract.js +220 -0
  86. package/dist/define/declare-contract.test.d.ts +1 -0
  87. package/dist/define/declare-contract.test.js +573 -0
  88. package/dist/define/define-package.d.ts +203 -0
  89. package/dist/define/define-package.js +289 -0
  90. package/dist/define/define.test.d.ts +1 -0
  91. package/dist/define/define.test.js +1010 -0
  92. package/dist/define/empty-fields.d.ts +15 -0
  93. package/dist/define/empty-fields.js +134 -0
  94. package/dist/define/empty-fields.test.d.ts +1 -0
  95. package/dist/define/empty-fields.test.js +55 -0
  96. package/dist/define/events-observables.test.d.ts +1 -0
  97. package/dist/define/events-observables.test.js +1013 -0
  98. package/dist/define/events.d.ts +81 -0
  99. package/dist/define/events.js +81 -0
  100. package/dist/define/generated-field.d.ts +20 -0
  101. package/dist/define/generated-field.js +25 -0
  102. package/dist/define/index.d.ts +28 -0
  103. package/dist/define/index.js +62 -0
  104. package/dist/define/lazy-members.d.ts +8 -0
  105. package/dist/define/lazy-members.js +38 -0
  106. package/dist/define/manifest.d.ts +63 -0
  107. package/dist/define/manifest.js +653 -0
  108. package/dist/define/observables.d.ts +146 -0
  109. package/dist/define/observables.js +187 -0
  110. package/dist/define/serve-members.d.ts +21 -0
  111. package/dist/define/serve-members.js +152 -0
  112. package/dist/define/serve-members.test.d.ts +1 -0
  113. package/dist/define/serve-members.test.js +630 -0
  114. package/dist/define/serve.d.ts +22 -0
  115. package/dist/define/serve.js +58 -0
  116. package/dist/define/system-contracts.d.ts +41 -0
  117. package/dist/define/system-contracts.js +21 -0
  118. package/dist/define/table-handle.d.ts +13 -0
  119. package/dist/define/table-handle.js +36 -0
  120. package/dist/define/table.d.ts +128 -0
  121. package/dist/define/table.js +122 -0
  122. package/dist/define/tool.d.ts +129 -0
  123. package/dist/define/tool.js +91 -0
  124. package/dist/define/vars.d.ts +82 -0
  125. package/dist/define/vars.js +256 -0
  126. package/dist/define/vars.test.d.ts +1 -0
  127. package/dist/define/vars.test.js +39 -0
  128. package/dist/define/wire-value.d.ts +12 -0
  129. package/dist/define/wire-value.js +76 -0
  130. package/dist/define/worker-state.d.ts +15 -0
  131. package/dist/define/worker-state.js +45 -0
  132. package/dist/device/tx-encoding.test.js +10 -0
  133. package/dist/index.d.ts +3 -0
  134. package/dist/index.js +5 -1
  135. package/dist/observable.d.ts +42 -2
  136. package/dist/observable.js +25 -7
  137. package/dist/package-build/build-package.d.ts +60 -0
  138. package/dist/package-build/build-package.js +312 -0
  139. package/dist/package-build/build-package.test.d.ts +1 -0
  140. package/dist/package-build/build-package.test.js +204 -0
  141. package/dist/package-build/cli.d.ts +7 -0
  142. package/dist/package-build/cli.js +218 -0
  143. package/dist/package-build/contract-add.d.ts +35 -0
  144. package/dist/package-build/contract-add.js +97 -0
  145. package/dist/package-build/contract-add.test.d.ts +1 -0
  146. package/dist/package-build/contract-add.test.js +467 -0
  147. package/dist/package-build/contract-source.d.ts +59 -0
  148. package/dist/package-build/contract-source.js +471 -0
  149. package/dist/package-build/freeze-contracts.d.ts +56 -0
  150. package/dist/package-build/freeze-contracts.js +198 -0
  151. package/dist/package-build/freeze-contracts.test.d.ts +1 -0
  152. package/dist/package-build/freeze-contracts.test.js +355 -0
  153. package/dist/package-installer/package-creator.d.ts +4 -0
  154. package/dist/package-installer/package-creator.js +57 -16
  155. package/dist/package-installer/package-creator.test.js +86 -0
  156. package/dist/package-loader/contract-members.d.ts +53 -0
  157. package/dist/package-loader/contract-members.js +31 -0
  158. package/dist/package-loader/contract-package-loader.js +5 -1
  159. package/dist/package-loader/contract-package-loader.test.js +11 -0
  160. package/dist/package-loader/host-authority-loading.test.js +9 -5
  161. package/dist/package-loader/index.d.ts +1 -0
  162. package/dist/package-loader/index.js +1 -0
  163. package/dist/package-loader/isolated-artifact.d.ts +80 -17
  164. package/dist/package-loader/isolated-artifact.js +257 -51
  165. package/dist/package-loader/isolated-artifact.test.js +294 -21
  166. package/dist/package-loader/isolated-runtime.d.ts +22 -7
  167. package/dist/package-loader/isolated-table-gateway.js +30 -11
  168. package/dist/package-loader/isolated-table-gateway.test.js +243 -0
  169. package/dist/package-loader/package-loader.d.ts +8 -1
  170. package/dist/package-loader/package-loader.js +39 -20
  171. package/dist/package-loader/package-loader.test.js +47 -0
  172. package/dist/peer-id.d.ts +25 -0
  173. package/dist/peer-id.js +99 -0
  174. package/dist/serial-json.compat.test.d.ts +1 -0
  175. package/dist/serial-json.compat.test.js +369 -0
  176. package/dist/serial-json.d.ts +41 -5
  177. package/dist/serial-json.js +216 -157
  178. package/dist/serial-json.oracle.d.ts +21 -0
  179. package/dist/serial-json.oracle.js +222 -0
  180. package/dist/serial-json.test.js +315 -0
  181. package/dist/testing/index.d.ts +4 -0
  182. package/dist/testing/index.js +8 -0
  183. package/dist/testing/mock-host-contract.d.ts +123 -0
  184. package/dist/testing/mock-host-contract.js +434 -0
  185. package/dist/testing/mock-host-contract.test.d.ts +1 -0
  186. package/dist/testing/mock-host-contract.test.js +782 -0
  187. package/dist/types/field-type.d.ts +35 -18
  188. package/dist/types/field-type.js +4 -1
  189. package/dist/types/zod-types.d.ts +9 -0
  190. package/dist/types/zod-types.js +8 -2
  191. package/dist/utils.d.ts +1 -25
  192. package/dist/utils.js +10 -90
  193. package/package.json +9 -2
  194. package/testing/package.json +4 -0
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const field_type_1 = require("../../types/field-type");
4
+ const utils_1 = require("../../utils");
5
+ const frozen_contracts_1 = require("../frozen-contracts");
6
+ function contract(contractId, version, fieldType = field_type_1.FieldType.string) {
7
+ return {
8
+ contractId,
9
+ version,
10
+ devTag: "dev",
11
+ name: `Contract ${version}`,
12
+ description: "",
13
+ tables: [],
14
+ tools: [
15
+ {
16
+ name: "run",
17
+ usageDescription: "Run.",
18
+ inputFields: [{ name: "value", type: fieldType }],
19
+ outputFields: [],
20
+ },
21
+ ],
22
+ observables: [],
23
+ events: [],
24
+ };
25
+ }
26
+ describe("frozen contracts", () => {
27
+ const id = (0, utils_1.newid)();
28
+ it("freezes what a release provides, without its dev tag, and keeps what it froze before", () => {
29
+ const first = (0, frozen_contracts_1.freezeContracts)(undefined, [contract(id, 1)], "1.0.0");
30
+ expect(first.added.map((frozen) => [frozen.version, frozen.frozenBy])).toEqual([[1, "1.0.0"]]);
31
+ expect(first.frozen.contracts[0]).not.toHaveProperty("devTag");
32
+ const second = (0, frozen_contracts_1.freezeContracts)(first.frozen, [contract(id, 1), contract(id, 2)], "1.1.0");
33
+ expect(second.frozen.contracts.map((frozen) => [frozen.version, frozen.frozenBy])).toEqual([
34
+ [1, "1.0.0"],
35
+ [2, "1.1.0"],
36
+ ]);
37
+ expect(second.added.map((frozen) => frozen.version)).toEqual([2]);
38
+ });
39
+ it("refuses a changed shape, allows new descriptions, and notes a version no longer provided", () => {
40
+ const { frozen } = (0, frozen_contracts_1.freezeContracts)(undefined, [contract(id, 1), contract(id, 2)], "1.0.0");
41
+ const described = { ...contract(id, 1), description: "Use v2 instead." };
42
+ described.tools = [{ ...described.tools[0], usageDescription: "Deprecated." }];
43
+ expect((0, frozen_contracts_1.checkFrozenContracts)(frozen, [described, contract(id, 2)])).toEqual({
44
+ changed: [],
45
+ notProvided: [],
46
+ });
47
+ const changed = (0, frozen_contracts_1.checkFrozenContracts)(frozen, [contract(id, 1, field_type_1.FieldType.number)]);
48
+ expect(changed.changed.map(({ changes }) => changes)).toEqual([["tool run changed"]]);
49
+ expect(changed.notProvided.map((frozen) => frozen.version)).toEqual([2]);
50
+ expect((0, frozen_contracts_1.describeFrozenContractChanges)(changed)).toEqual([
51
+ `Contract 1 (${id}@1), frozen by 1.0.0: tool run changed. Declare a new version instead.`,
52
+ ]);
53
+ const refused = (0, frozen_contracts_1.freezeContracts)(frozen, [contract(id, 1, field_type_1.FieldType.number)], "1.1.0");
54
+ expect(refused.added).toEqual([]);
55
+ expect(refused.frozen).toBe(frozen);
56
+ });
57
+ it("rejects duplicate provided identities instead of hiding a changed shape or freezing duplicates", () => {
58
+ const original = contract(id, 1);
59
+ const changed = contract(id, 1, field_type_1.FieldType.number);
60
+ const { frozen } = (0, frozen_contracts_1.freezeContracts)(undefined, [original], "1.0.0");
61
+ for (const provided of [
62
+ [changed, original],
63
+ [original, changed],
64
+ [original, original],
65
+ ]) {
66
+ expect(() => (0, frozen_contracts_1.checkFrozenContracts)(frozen, provided)).toThrow(`Duplicate provided contract ${id}@1`);
67
+ expect(() => (0, frozen_contracts_1.freezeContracts)(undefined, provided, "1.0.0")).toThrow("Duplicate provided contract");
68
+ expect(() => (0, frozen_contracts_1.freezeContracts)(frozen, provided, "1.1.0")).toThrow("Duplicate provided contract");
69
+ }
70
+ });
71
+ });
72
+ const sample = {
73
+ contractId: (0, utils_1.newid)(),
74
+ version: 1,
75
+ name: "All members",
76
+ description: "",
77
+ tables: [
78
+ {
79
+ name: "Rows",
80
+ description: "",
81
+ primaryKeyName: "id",
82
+ fields: [{ name: "id", type: field_type_1.FieldType.id }],
83
+ },
84
+ ],
85
+ tools: [
86
+ {
87
+ name: "run",
88
+ usageDescription: "",
89
+ inputFields: [{ name: "mode", type: field_type_1.FieldType.string, enumValues: ["on", "off"] }],
90
+ outputFields: [
91
+ {
92
+ name: "result",
93
+ type: field_type_1.FieldType.object,
94
+ fields: [{ name: "ok", type: field_type_1.FieldType.boolean }],
95
+ },
96
+ ],
97
+ },
98
+ ],
99
+ observables: [
100
+ {
101
+ name: "state",
102
+ description: "",
103
+ valueType: field_type_1.FieldType.string,
104
+ writable: false,
105
+ value: { type: field_type_1.FieldType.string, enumValues: ["on", "off"] },
106
+ },
107
+ ],
108
+ events: [
109
+ { name: "changed", description: "", payloadFields: [{ name: "id", type: field_type_1.FieldType.id }] },
110
+ ],
111
+ };
112
+ test.each([
113
+ "tables",
114
+ "tools",
115
+ "observables",
116
+ "events",
117
+ ])("detects added and removed %s", (kind) => {
118
+ const { frozen } = (0, frozen_contracts_1.freezeContracts)(undefined, [sample], "1.0.0");
119
+ const removed = { ...sample, [kind]: [] };
120
+ const added = {
121
+ ...sample,
122
+ [kind]: [...(sample[kind] ?? []), { ...(sample[kind] ?? [])[0], name: "another" }],
123
+ };
124
+ for (const changed of [removed, added]) {
125
+ expect((0, frozen_contracts_1.checkFrozenContracts)(frozen, [changed]).changed).toHaveLength(1);
126
+ }
127
+ });
128
+ test.each([
129
+ [
130
+ "primary key",
131
+ (value) => {
132
+ value.tables[0].primaryKeyName = "other";
133
+ },
134
+ ],
135
+ [
136
+ "table field type",
137
+ (value) => {
138
+ value.tables[0].fields[0].type = field_type_1.FieldType.string;
139
+ },
140
+ ],
141
+ [
142
+ "tool optionality",
143
+ (value) => {
144
+ value.tools[0].inputFields[0].optional = true;
145
+ },
146
+ ],
147
+ [
148
+ "enum values",
149
+ (value) => {
150
+ value.tools[0].inputFields[0].enumValues = ["on"];
151
+ },
152
+ ],
153
+ [
154
+ "nested field",
155
+ (value) => {
156
+ (value.tools[0].outputFields[0].fields ?? [])[0].type = field_type_1.FieldType.string;
157
+ },
158
+ ],
159
+ [
160
+ "observable type",
161
+ (value) => {
162
+ value.observables[0].valueType = field_type_1.FieldType.object;
163
+ },
164
+ ],
165
+ [
166
+ "observable writability",
167
+ (value) => {
168
+ value.observables[0].writable = true;
169
+ },
170
+ ],
171
+ [
172
+ "observable enum",
173
+ (value) => {
174
+ value.observables[0].value = { type: field_type_1.FieldType.string, enumValues: ["on"] };
175
+ },
176
+ ],
177
+ [
178
+ "event field",
179
+ (value) => {
180
+ (value.events ?? [])[0].payloadFields[0].isArray = true;
181
+ },
182
+ ],
183
+ ])("detects changed %s", (_label, mutate) => {
184
+ const { frozen } = (0, frozen_contracts_1.freezeContracts)(undefined, [sample], "1.0.0");
185
+ const changed = structuredClone(sample);
186
+ mutate(changed);
187
+ expect((0, frozen_contracts_1.checkFrozenContracts)(frozen, [changed]).changed).toHaveLength(1);
188
+ });
189
+ test("does not freeze without a package version", () => {
190
+ expect(() => (0, frozen_contracts_1.freezeContracts)(undefined, [sample], "")).toThrow("no version");
191
+ });
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const index_1 = require("../../index");
4
- test("host admission for an omitted preserve level is None and the declared mode is honored", async () => {
4
+ const target_dispatch_1 = require("./target-dispatch");
5
+ test.each([
6
+ true,
7
+ false,
8
+ ])("host preserve admission is None and forwards context (explicit forwarding: %s)", async (forwardCallContext) => {
5
9
  const userId = (0, index_1.newid)();
6
10
  const groupId = (0, index_1.newid)();
7
11
  const contractId = (0, index_1.newid)();
@@ -23,9 +27,10 @@ test("host admission for an omitted preserve level is None and the declared mode
23
27
  getDataContext: () => dc,
24
28
  },
25
29
  });
30
+ const targetsId = (0, index_1.newid)();
26
31
  const route = {
27
32
  tool: { toolId: (0, index_1.newid)(), name: "route", authorityPropagation: "preserve" },
28
- toolFn: (name, ctx) => ctx.dispatchAction(name, {}),
33
+ toolFn: (name, ctx) => ctx.dispatchTool?.({ contractId: targetsId, version: 1, toolName: name }, {}),
29
34
  };
30
35
  const ordinary = {
31
36
  tool: { toolId: (0, index_1.newid)(), name: "ordinary" },
@@ -38,31 +43,25 @@ test("host admission for an omitted preserve level is None and the declared mode
38
43
  toolFn: () => "executed",
39
44
  },
40
45
  ]));
41
- const provider = (0, index_1.createContractProvider)({
42
- contractId,
43
- version: 1,
44
- tools: { route, ordinary },
45
- actionAliases: { zero: "0", reader: "20" },
46
- actionTools: targets,
47
- });
48
- const call = (name, action = "zero") => provider({
46
+ const provider = (0, index_1.createContractProvider)({ contractId, version: 1, forwardCallContext, tools: { route, ordinary } }, { dispatchTool: (0, target_dispatch_1.targetDispatch)(targetsId, targets) });
47
+ const call = (name, target = "0") => provider({
49
48
  contractId,
50
49
  version: 1,
51
50
  member: "tool",
52
51
  name,
53
52
  operation: "run",
54
- args: [action],
53
+ args: [target],
55
54
  dataContextId: groupId,
56
55
  }, { callerUserId: userId, dataContext: dc });
57
56
  role = index_1.GroupMemberRole.None;
58
57
  await expect(call("route")).resolves.toBe("executed");
59
- await expect(call("route", "reader")).rejects.toThrow(/Permission denied/);
58
+ await expect(call("route", "20")).rejects.toThrow(/Permission denied/);
60
59
  await expect(call("ordinary")).rejects.toThrow(/Permission denied/);
61
60
  role = index_1.GroupMemberRole.Admin;
62
- await expect(call("route", "reader")).resolves.toBe("executed");
61
+ await expect(call("route", "20")).resolves.toBe("executed");
63
62
  // The same wrapper without a preserve declaration is an ordinary unclassified (Self) tool.
64
63
  route.tool.authorityPropagation = undefined;
65
- await expect(call("route", "reader")).rejects.toThrow(/Permission denied/);
64
+ await expect(call("route", "20")).rejects.toThrow(/Permission denied/);
66
65
  });
67
66
  test("host tool schema retains omitted admission for request-based defaults", () => {
68
67
  const tool = index_1.toolSchema.parse({
@@ -129,45 +128,3 @@ test("generic dispatch binds a capped strict frame and rejects cross-context and
129
128
  await expect(call({ ...selected, targetDeviceId: (0, index_1.newid)() })).rejects.toThrow("cannot target another device");
130
129
  expect(bridge).toHaveBeenCalledTimes(1);
131
130
  });
132
- test("host catalogs use declared preservation for an omitted target admission level", async () => {
133
- const { authorizedContractActionNames } = await Promise.resolve().then(() => require("../../index"));
134
- const userId = (0, index_1.newid)();
135
- const groupId = (0, index_1.newid)();
136
- const contractId = (0, index_1.newid)();
137
- const dc = {
138
- dataContextId: groupId,
139
- groupId,
140
- tableContainer: {
141
- getTable: (meta) => meta.name === "Groups"
142
- ? { get: async () => ({ founderUserId: (0, index_1.newid)() }) }
143
- : { findOne: async () => ({ role: index_1.GroupMemberRole.Reader }) },
144
- },
145
- };
146
- Object.assign(dc, {
147
- userContext: {
148
- userId,
149
- loadingPromise: Promise.resolve(),
150
- userDataContext: dc,
151
- getDataContext: () => dc,
152
- },
153
- });
154
- const zero = {
155
- tool: { name: "zero", toolId: (0, index_1.newid)(), authorityPropagation: "preserve" },
156
- toolFn: () => "executed",
157
- };
158
- const route = {
159
- tool: { name: "route", toolId: (0, index_1.newid)(), accessLevel: 20, authorityPropagation: "preserve" },
160
- toolFn: (_, ctx) => ctx.dispatchAction("none", {}),
161
- };
162
- const resolution = {
163
- contractId,
164
- version: 1,
165
- tools: { route, zero },
166
- actionAliases: { none: "zero" },
167
- actionTools: { zero },
168
- };
169
- const context = { callerUserId: userId, dataContext: dc };
170
- expect(await authorizedContractActionNames(resolution, context)).toEqual(["none"]);
171
- const provider = (0, index_1.createContractProvider)(resolution);
172
- await expect(provider({ contractId, version: 1, member: "tool", name: "route", operation: "run", args: [{}] }, context)).resolves.toBe("executed");
173
- });