@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.
- package/dist/contracts/contract-proxy.d.ts +7 -0
- package/dist/contracts/contract-proxy.js +19 -2
- package/dist/contracts/create-local-consumer.js +16 -1
- package/dist/contracts/index.d.ts +2 -0
- package/dist/contracts/index.js +2 -0
- package/dist/contracts/system/index.d.ts +2 -0
- package/dist/contracts/system/index.js +2 -0
- package/dist/contracts/system/invites-contract.js +2 -1
- package/dist/contracts/system/sync-check-contract.d.ts +97 -0
- package/dist/contracts/system/sync-check-contract.js +115 -0
- package/dist/contracts/tool-arguments.d.ts +15 -0
- package/dist/contracts/tool-arguments.js +41 -0
- package/dist/contracts/tool-catalog-service.js +2 -12
- package/dist/data/change-tracking.d.ts +40 -0
- package/dist/data/change-tracking.js +89 -0
- package/dist/data/orm/types.d.ts +24 -7
- package/dist/data/orm/types.js +97 -24
- package/dist/define/manifest.js +6 -34
- package/dist/package-loader/package-loader.js +27 -22
- package/dist/system-ids.d.ts +5 -0
- package/dist/system-ids.js +6 -1
- package/package.json +4 -2
- package/dist/context/user-context-identity.test.d.ts +0 -1
- package/dist/context/user-context-identity.test.js +0 -220
- package/dist/contracts/__tests__/action-dispatch.test.d.ts +0 -1
- package/dist/contracts/__tests__/action-dispatch.test.js +0 -319
- package/dist/contracts/__tests__/also-implements.test.d.ts +0 -1
- package/dist/contracts/__tests__/also-implements.test.js +0 -110
- package/dist/contracts/__tests__/builder.test.d.ts +0 -1
- package/dist/contracts/__tests__/builder.test.js +0 -669
- package/dist/contracts/__tests__/contract-events.test.d.ts +0 -1
- package/dist/contracts/__tests__/contract-events.test.js +0 -199
- package/dist/contracts/__tests__/contract-observables.test.d.ts +0 -1
- package/dist/contracts/__tests__/contract-observables.test.js +0 -290
- package/dist/contracts/__tests__/contract-provider-router.test.d.ts +0 -1
- package/dist/contracts/__tests__/contract-provider-router.test.js +0 -315
- package/dist/contracts/__tests__/contract-proxy.test.d.ts +0 -1
- package/dist/contracts/__tests__/contract-proxy.test.js +0 -657
- package/dist/contracts/__tests__/contract-resolvers.test.d.ts +0 -1
- package/dist/contracts/__tests__/contract-resolvers.test.js +0 -758
- package/dist/contracts/__tests__/contract-subscription-lifecycle.test.d.ts +0 -1
- package/dist/contracts/__tests__/contract-subscription-lifecycle.test.js +0 -353
- package/dist/contracts/__tests__/contract-table-events.test.d.ts +0 -1
- package/dist/contracts/__tests__/contract-table-events.test.js +0 -209
- package/dist/contracts/__tests__/contract-transport.test.d.ts +0 -1
- package/dist/contracts/__tests__/contract-transport.test.js +0 -163
- package/dist/contracts/__tests__/extract.test.d.ts +0 -1
- package/dist/contracts/__tests__/extract.test.js +0 -145
- package/dist/contracts/__tests__/frozen-contracts.test.d.ts +0 -1
- package/dist/contracts/__tests__/frozen-contracts.test.js +0 -191
- package/dist/contracts/__tests__/generic-tool-dispatch.test.d.ts +0 -1
- package/dist/contracts/__tests__/generic-tool-dispatch.test.js +0 -130
- package/dist/contracts/__tests__/host-contract-client.test.d.ts +0 -1
- package/dist/contracts/__tests__/host-contract-client.test.js +0 -793
- package/dist/contracts/__tests__/host-contract-consumer.test.d.ts +0 -1
- package/dist/contracts/__tests__/host-contract-consumer.test.js +0 -163
- package/dist/contracts/__tests__/host-contract-transport.test.d.ts +0 -1
- package/dist/contracts/__tests__/host-contract-transport.test.js +0 -66
- package/dist/contracts/__tests__/integration.test.d.ts +0 -1
- package/dist/contracts/__tests__/integration.test.js +0 -348
- package/dist/contracts/__tests__/legacy-removal.test.d.ts +0 -1
- package/dist/contracts/__tests__/legacy-removal.test.js +0 -128
- package/dist/contracts/__tests__/persistent-registry.test.d.ts +0 -1
- package/dist/contracts/__tests__/persistent-registry.test.js +0 -109
- package/dist/contracts/__tests__/playground.test.d.ts +0 -1
- package/dist/contracts/__tests__/playground.test.js +0 -216
- package/dist/contracts/__tests__/registry.test.d.ts +0 -1
- package/dist/contracts/__tests__/registry.test.js +0 -238
- package/dist/contracts/__tests__/remote-contract-transport.test.d.ts +0 -1
- package/dist/contracts/__tests__/remote-contract-transport.test.js +0 -119
- package/dist/contracts/__tests__/system-contracts.test.d.ts +0 -1
- package/dist/contracts/__tests__/system-contracts.test.js +0 -247
- package/dist/contracts/__tests__/target-dispatch.d.ts +0 -11
- package/dist/contracts/__tests__/target-dispatch.js +0 -24
- package/dist/contracts/__tests__/tool-catalog-inventory.test.d.ts +0 -1
- package/dist/contracts/__tests__/tool-catalog-inventory.test.js +0 -44
- package/dist/contracts/__tests__/tool-catalog-service.test.d.ts +0 -1
- package/dist/contracts/__tests__/tool-catalog-service.test.js +0 -482
- package/dist/contracts/__tests__/tool-catalog.test.d.ts +0 -1
- package/dist/contracts/__tests__/tool-catalog.test.js +0 -1199
- package/dist/contracts/__tests__/validate.test.d.ts +0 -1
- package/dist/contracts/__tests__/validate.test.js +0 -991
- package/dist/contracts/__tests__/workflow-context.test.d.ts +0 -1
- package/dist/contracts/__tests__/workflow-context.test.js +0 -50
- package/dist/data/access-level.test.d.ts +0 -1
- package/dist/data/access-level.test.js +0 -53
- package/dist/data/change-tracking.test.d.ts +0 -1
- package/dist/data/change-tracking.test.js +0 -62
- package/dist/data/files/files.test.d.ts +0 -1
- package/dist/data/files/files.test.js +0 -770
- package/dist/data/group-members.test.d.ts +0 -1
- package/dist/data/group-members.test.js +0 -336
- package/dist/data/group-share.test.d.ts +0 -1
- package/dist/data/group-share.test.js +0 -110
- package/dist/data/groups.test.d.ts +0 -1
- package/dist/data/groups.test.js +0 -153
- package/dist/data/orm/cursor.test.d.ts +0 -1
- package/dist/data/orm/cursor.test.js +0 -314
- package/dist/data/orm/data-query.mongo.test.d.ts +0 -1
- package/dist/data/orm/data-query.mongo.test.js +0 -367
- package/dist/data/orm/data-query.sqlite.test.d.ts +0 -1
- package/dist/data/orm/data-query.sqlite.test.js +0 -365
- package/dist/data/orm/data-query.test.d.ts +0 -1
- package/dist/data/orm/data-query.test.js +0 -545
- package/dist/data/orm/dependency-injection.test.d.ts +0 -1
- package/dist/data/orm/dependency-injection.test.js +0 -171
- package/dist/data/orm/event-registry.test.d.ts +0 -1
- package/dist/data/orm/event-registry.test.js +0 -44
- package/dist/data/orm/multi-cursors.test.d.ts +0 -1
- package/dist/data/orm/multi-cursors.test.js +0 -463
- package/dist/data/orm/sql.data-source.test.d.ts +0 -1
- package/dist/data/orm/sql.data-source.test.js +0 -731
- package/dist/data/orm/table-container-events.test.d.ts +0 -1
- package/dist/data/orm/table-container-events.test.js +0 -101
- package/dist/data/orm/table-container.test.d.ts +0 -1
- package/dist/data/orm/table-container.test.js +0 -273
- package/dist/data/orm/table.event-source.test.d.ts +0 -1
- package/dist/data/orm/table.event-source.test.js +0 -331
- package/dist/data/orm/types.test.d.ts +0 -1
- package/dist/data/orm/types.test.js +0 -409
- package/dist/data/package-table-identity.test.d.ts +0 -1
- package/dist/data/package-table-identity.test.js +0 -46
- package/dist/data/package-version-permissions.test.d.ts +0 -1
- package/dist/data/package-version-permissions.test.js +0 -107
- package/dist/data/package-version-resolver.test.d.ts +0 -4
- package/dist/data/package-version-resolver.test.js +0 -543
- package/dist/data/package-versions.test.d.ts +0 -1
- package/dist/data/package-versions.test.js +0 -227
- package/dist/data/persistent-vars.conflict.test.d.ts +0 -1
- package/dist/data/persistent-vars.conflict.test.js +0 -126
- package/dist/data/persistent-vars.migration.test.d.ts +0 -1
- package/dist/data/persistent-vars.migration.test.js +0 -133
- package/dist/data/persistent-vars.package-scope.test.d.ts +0 -1
- package/dist/data/persistent-vars.package-scope.test.js +0 -27
- package/dist/data/sync-recovery-queue.test.d.ts +0 -1
- package/dist/data/sync-recovery-queue.test.js +0 -215
- package/dist/data/table-signing.test.d.ts +0 -1
- package/dist/data/table-signing.test.js +0 -118
- package/dist/data/tool-access.test.d.ts +0 -1
- package/dist/data/tool-access.test.js +0 -166
- package/dist/data/user-permissions.test.d.ts +0 -1
- package/dist/data/user-permissions.test.js +0 -305
- package/dist/data/user-trust-levels.test.d.ts +0 -1
- package/dist/data/user-trust-levels.test.js +0 -37
- package/dist/define/also-implements.test.d.ts +0 -1
- package/dist/define/also-implements.test.js +0 -123
- package/dist/define/declare-contract.test.d.ts +0 -1
- package/dist/define/declare-contract.test.js +0 -573
- package/dist/define/define.test.d.ts +0 -1
- package/dist/define/define.test.js +0 -1010
- package/dist/define/empty-fields.test.d.ts +0 -1
- package/dist/define/empty-fields.test.js +0 -55
- package/dist/define/events-observables.test.d.ts +0 -1
- package/dist/define/events-observables.test.js +0 -1013
- package/dist/define/serve-members.test.d.ts +0 -1
- package/dist/define/serve-members.test.js +0 -630
- package/dist/define/vars.test.d.ts +0 -1
- package/dist/define/vars.test.js +0 -39
- package/dist/device/binary-peer-connection-v2.test.d.ts +0 -1
- package/dist/device/binary-peer-connection-v2.test.js +0 -730
- package/dist/device/binary-peer-connection.test.d.ts +0 -1
- package/dist/device/binary-peer-connection.test.js +0 -184
- package/dist/device/connection.test.d.ts +0 -1
- package/dist/device/connection.test.js +0 -613
- package/dist/device/device-election.test.d.ts +0 -1
- package/dist/device/device-election.test.js +0 -516
- package/dist/device/device.test.d.ts +0 -1
- package/dist/device/device.test.js +0 -243
- package/dist/device/frame-cipher.test.d.ts +0 -1
- package/dist/device/frame-cipher.test.js +0 -219
- package/dist/device/get-trust-level-fn.test.d.ts +0 -1
- package/dist/device/get-trust-level-fn.test.js +0 -685
- package/dist/device/streamed-socket.test.d.ts +0 -1
- package/dist/device/streamed-socket.test.js +0 -216
- package/dist/device/tx-encoding.test.d.ts +0 -1
- package/dist/device/tx-encoding.test.js +0 -295
- package/dist/device-pairing/cpace.test.d.ts +0 -1
- package/dist/device-pairing/cpace.test.js +0 -116
- package/dist/device-pairing/device-pairing.test.d.ts +0 -1
- package/dist/device-pairing/device-pairing.test.js +0 -211
- package/dist/hlc.test.d.ts +0 -1
- package/dist/hlc.test.js +0 -45
- package/dist/host-credentials.test.d.ts +0 -1
- package/dist/host-credentials.test.js +0 -88
- package/dist/identity/account-email.test.d.ts +0 -1
- package/dist/identity/account-email.test.js +0 -59
- package/dist/identity/anchor-document.test.d.ts +0 -1
- package/dist/identity/anchor-document.test.js +0 -16
- package/dist/identity/anchor-resolution.test.d.ts +0 -1
- package/dist/identity/anchor-resolution.test.js +0 -130
- package/dist/identity/key-change.test.d.ts +0 -1
- package/dist/identity/key-change.test.js +0 -811
- package/dist/invites/group-approval.test.d.ts +0 -1
- package/dist/invites/group-approval.test.js +0 -223
- package/dist/invites/invite-token.test.d.ts +0 -1
- package/dist/invites/invite-token.test.js +0 -123
- package/dist/keys.test.d.ts +0 -1
- package/dist/keys.test.js +0 -336
- package/dist/logging/console-logger.test.d.ts +0 -1
- package/dist/logging/console-logger.test.js +0 -300
- package/dist/logging/console-logs.table.test.d.ts +0 -1
- package/dist/logging/console-logs.table.test.js +0 -156
- package/dist/observable.test.d.ts +0 -1
- package/dist/observable.test.js +0 -309
- package/dist/package-build/build-package.test.d.ts +0 -1
- package/dist/package-build/build-package.test.js +0 -204
- package/dist/package-build/contract-add.test.d.ts +0 -1
- package/dist/package-build/contract-add.test.js +0 -467
- package/dist/package-build/freeze-contracts.test.d.ts +0 -1
- package/dist/package-build/freeze-contracts.test.js +0 -355
- package/dist/package-installer/package-author-signing.test.d.ts +0 -1
- package/dist/package-installer/package-author-signing.test.js +0 -200
- package/dist/package-installer/package-cloner.test.d.ts +0 -1
- package/dist/package-installer/package-cloner.test.js +0 -278
- package/dist/package-installer/package-creator.test.d.ts +0 -1
- package/dist/package-installer/package-creator.test.js +0 -908
- package/dist/package-installer/package-dev-tools.test.d.ts +0 -1
- package/dist/package-installer/package-dev-tools.test.js +0 -64
- package/dist/package-installer/package-installer.test.d.ts +0 -1
- package/dist/package-installer/package-installer.test.js +0 -882
- package/dist/package-installer/package-propagation.test.d.ts +0 -1
- package/dist/package-installer/package-propagation.test.js +0 -1269
- package/dist/package-installer/package-publisher.test.d.ts +0 -1
- package/dist/package-installer/package-publisher.test.js +0 -153
- package/dist/package-installer/package-remote-checker.test.d.ts +0 -1
- package/dist/package-installer/package-remote-checker.test.js +0 -334
- package/dist/package-installer/package-seed-installer.test.d.ts +0 -1
- package/dist/package-installer/package-seed-installer.test.js +0 -123
- package/dist/package-installer/package-tarball.test.d.ts +0 -1
- package/dist/package-installer/package-tarball.test.js +0 -75
- package/dist/package-installer/peers-core-installer.test.d.ts +0 -1
- package/dist/package-installer/peers-core-installer.test.js +0 -49
- package/dist/package-installer/peers-core-trust-anchor.test.d.ts +0 -1
- package/dist/package-installer/peers-core-trust-anchor.test.js +0 -155
- package/dist/package-loader/contract-package-loader.test.d.ts +0 -1
- package/dist/package-loader/contract-package-loader.test.js +0 -274
- package/dist/package-loader/host-authority-loading.test.d.ts +0 -1
- package/dist/package-loader/host-authority-loading.test.js +0 -104
- package/dist/package-loader/host-dispatch-policy.test.d.ts +0 -1
- package/dist/package-loader/host-dispatch-policy.test.js +0 -56
- package/dist/package-loader/isolated-artifact.test.d.ts +0 -1
- package/dist/package-loader/isolated-artifact.test.js +0 -688
- package/dist/package-loader/isolated-persistent-var-gateway.test.d.ts +0 -1
- package/dist/package-loader/isolated-persistent-var-gateway.test.js +0 -56
- package/dist/package-loader/isolated-table-gateway.test.d.ts +0 -1
- package/dist/package-loader/isolated-table-gateway.test.js +0 -633
- package/dist/package-loader/package-loader.test.d.ts +0 -1
- package/dist/package-loader/package-loader.test.js +0 -1764
- package/dist/package-loader/resolve-consumed-contracts.test.d.ts +0 -1
- package/dist/package-loader/resolve-consumed-contracts.test.js +0 -166
- package/dist/serial-json.compat.test.d.ts +0 -1
- package/dist/serial-json.compat.test.js +0 -369
- package/dist/serial-json.test.d.ts +0 -1
- package/dist/serial-json.test.js +0 -401
- package/dist/testing/mock-host-contract.test.d.ts +0 -1
- package/dist/testing/mock-host-contract.test.js +0 -782
- package/dist/utils.test.d.ts +0 -1
- 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 {};
|