@peers-app/peers-sdk 0.26.6 → 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.
- package/README.md +3 -1
- package/bin/peers-package.js +13 -0
- package/define/package.json +4 -0
- package/dist/contracts/__tests__/action-dispatch.test.js +56 -76
- package/dist/contracts/__tests__/also-implements.test.d.ts +1 -0
- package/dist/contracts/__tests__/also-implements.test.js +110 -0
- package/dist/contracts/__tests__/builder.test.js +45 -0
- package/dist/contracts/__tests__/contract-resolvers.test.js +134 -4
- package/dist/contracts/__tests__/frozen-contracts.test.d.ts +1 -0
- package/dist/contracts/__tests__/frozen-contracts.test.js +191 -0
- package/dist/contracts/__tests__/generic-tool-dispatch.test.js +13 -56
- package/dist/contracts/__tests__/host-contract-client.test.d.ts +1 -0
- package/dist/contracts/__tests__/host-contract-client.test.js +793 -0
- package/dist/contracts/__tests__/host-contract-transport.test.js +15 -0
- package/dist/contracts/__tests__/registry.test.js +68 -0
- package/dist/contracts/__tests__/target-dispatch.d.ts +11 -0
- package/dist/contracts/__tests__/target-dispatch.js +24 -0
- package/dist/contracts/__tests__/tool-catalog-service.test.js +37 -1
- package/dist/contracts/__tests__/tool-catalog.test.js +12 -3
- package/dist/contracts/__tests__/validate.test.js +177 -7
- package/dist/contracts/__tests__/workflow-context.test.js +0 -11
- package/dist/contracts/builder.d.ts +16 -2
- package/dist/contracts/builder.js +44 -3
- package/dist/contracts/contract-definition-schema.d.ts +251 -0
- package/dist/contracts/contract-definition-schema.js +48 -0
- package/dist/contracts/contract-provider-router.d.ts +2 -0
- package/dist/contracts/contract-provider-router.js +5 -2
- package/dist/contracts/contract-proxy.d.ts +52 -18
- package/dist/contracts/contract-proxy.js +144 -203
- package/dist/contracts/contract-resolvers.d.ts +6 -4
- package/dist/contracts/contract-resolvers.js +32 -9
- package/dist/contracts/frozen-contracts.d.ts +59 -0
- package/dist/contracts/frozen-contracts.js +86 -0
- package/dist/contracts/host-contract-client.d.ts +134 -0
- package/dist/contracts/host-contract-client.js +396 -0
- package/dist/contracts/host-contract-transport.d.ts +2 -0
- package/dist/contracts/host-contract-transport.js +8 -0
- package/dist/contracts/index.d.ts +6 -4
- package/dist/contracts/index.js +11 -5
- package/dist/contracts/registry.d.ts +31 -1
- package/dist/contracts/registry.js +100 -6
- package/dist/contracts/system/contract-catalog-contract.d.ts +61 -6
- package/dist/contracts/system/contract-catalog-contract.js +17 -5
- package/dist/contracts/tool-catalog-service.js +26 -6
- package/dist/contracts/tool-catalog.d.ts +1 -1
- package/dist/contracts/tool-catalog.js +4 -1
- package/dist/contracts/types.d.ts +32 -2
- package/dist/contracts/validate.d.ts +16 -1
- package/dist/contracts/validate.js +139 -25
- package/dist/data/change-tracking.d.ts +17 -5
- package/dist/data/change-tracking.js +22 -6
- package/dist/data/change-tracking.test.d.ts +1 -0
- package/dist/data/change-tracking.test.js +62 -0
- package/dist/data/orm/sql.data-source.d.ts +9 -0
- package/dist/data/orm/sql.data-source.js +47 -2
- package/dist/data/orm/sql.data-source.test.js +142 -0
- package/dist/data/orm/table-container.js +9 -9
- package/dist/data/orm/table-container.test.js +44 -0
- package/dist/data/orm/types.d.ts +41 -1
- package/dist/data/orm/types.js +159 -28
- package/dist/data/orm/types.test.js +129 -0
- package/dist/data/peer-types.d.ts +8 -62
- package/dist/data/persistent-vars.d.ts +4 -1
- package/dist/data/persistent-vars.js +7 -2
- package/dist/data/tools.d.ts +29 -221
- package/dist/define/also-implements.test.d.ts +1 -0
- package/dist/define/also-implements.test.js +123 -0
- package/dist/define/context.d.ts +77 -0
- package/dist/define/context.js +2 -0
- package/dist/define/contract-ref.d.ts +177 -0
- package/dist/define/contract-ref.js +67 -0
- package/dist/define/declare-contract.d.ts +167 -0
- package/dist/define/declare-contract.js +220 -0
- package/dist/define/declare-contract.test.d.ts +1 -0
- package/dist/define/declare-contract.test.js +573 -0
- package/dist/define/define-package.d.ts +203 -0
- package/dist/define/define-package.js +289 -0
- package/dist/define/define.test.d.ts +1 -0
- package/dist/define/define.test.js +1010 -0
- package/dist/define/empty-fields.d.ts +15 -0
- package/dist/define/empty-fields.js +134 -0
- package/dist/define/empty-fields.test.d.ts +1 -0
- package/dist/define/empty-fields.test.js +55 -0
- package/dist/define/events-observables.test.d.ts +1 -0
- package/dist/define/events-observables.test.js +1013 -0
- package/dist/define/events.d.ts +81 -0
- package/dist/define/events.js +81 -0
- package/dist/define/generated-field.d.ts +20 -0
- package/dist/define/generated-field.js +25 -0
- package/dist/define/index.d.ts +28 -0
- package/dist/define/index.js +62 -0
- package/dist/define/lazy-members.d.ts +8 -0
- package/dist/define/lazy-members.js +38 -0
- package/dist/define/manifest.d.ts +63 -0
- package/dist/define/manifest.js +653 -0
- package/dist/define/observables.d.ts +146 -0
- package/dist/define/observables.js +187 -0
- package/dist/define/serve-members.d.ts +21 -0
- package/dist/define/serve-members.js +152 -0
- package/dist/define/serve-members.test.d.ts +1 -0
- package/dist/define/serve-members.test.js +630 -0
- package/dist/define/serve.d.ts +22 -0
- package/dist/define/serve.js +58 -0
- package/dist/define/system-contracts.d.ts +41 -0
- package/dist/define/system-contracts.js +21 -0
- package/dist/define/table-handle.d.ts +13 -0
- package/dist/define/table-handle.js +36 -0
- package/dist/define/table.d.ts +128 -0
- package/dist/define/table.js +122 -0
- package/dist/define/tool.d.ts +129 -0
- package/dist/define/tool.js +91 -0
- package/dist/define/vars.d.ts +82 -0
- package/dist/define/vars.js +256 -0
- package/dist/define/vars.test.d.ts +1 -0
- package/dist/define/vars.test.js +39 -0
- package/dist/define/wire-value.d.ts +12 -0
- package/dist/define/wire-value.js +76 -0
- package/dist/define/worker-state.d.ts +15 -0
- package/dist/define/worker-state.js +45 -0
- package/dist/device/tx-encoding.test.js +10 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +5 -1
- package/dist/observable.d.ts +42 -2
- package/dist/observable.js +25 -7
- package/dist/package-build/build-package.d.ts +60 -0
- package/dist/package-build/build-package.js +312 -0
- package/dist/package-build/build-package.test.d.ts +1 -0
- package/dist/package-build/build-package.test.js +204 -0
- package/dist/package-build/cli.d.ts +7 -0
- package/dist/package-build/cli.js +218 -0
- package/dist/package-build/contract-add.d.ts +35 -0
- package/dist/package-build/contract-add.js +97 -0
- package/dist/package-build/contract-add.test.d.ts +1 -0
- package/dist/package-build/contract-add.test.js +467 -0
- package/dist/package-build/contract-source.d.ts +59 -0
- package/dist/package-build/contract-source.js +471 -0
- package/dist/package-build/freeze-contracts.d.ts +56 -0
- package/dist/package-build/freeze-contracts.js +198 -0
- package/dist/package-build/freeze-contracts.test.d.ts +1 -0
- package/dist/package-build/freeze-contracts.test.js +355 -0
- package/dist/package-installer/package-creator.d.ts +4 -0
- package/dist/package-installer/package-creator.js +57 -16
- package/dist/package-installer/package-creator.test.js +86 -0
- package/dist/package-loader/contract-members.d.ts +53 -0
- package/dist/package-loader/contract-members.js +31 -0
- package/dist/package-loader/contract-package-loader.js +5 -1
- package/dist/package-loader/contract-package-loader.test.js +11 -0
- package/dist/package-loader/host-authority-loading.test.js +9 -5
- package/dist/package-loader/index.d.ts +1 -0
- package/dist/package-loader/index.js +1 -0
- package/dist/package-loader/isolated-artifact.d.ts +80 -17
- package/dist/package-loader/isolated-artifact.js +257 -51
- package/dist/package-loader/isolated-artifact.test.js +294 -21
- package/dist/package-loader/isolated-runtime.d.ts +22 -7
- package/dist/package-loader/isolated-table-gateway.js +30 -11
- package/dist/package-loader/isolated-table-gateway.test.js +243 -0
- package/dist/package-loader/package-loader.d.ts +8 -1
- package/dist/package-loader/package-loader.js +39 -20
- package/dist/package-loader/package-loader.test.js +47 -0
- package/dist/peer-id.d.ts +25 -0
- package/dist/peer-id.js +99 -0
- package/dist/serial-json.compat.test.d.ts +1 -0
- package/dist/serial-json.compat.test.js +369 -0
- package/dist/serial-json.d.ts +41 -5
- package/dist/serial-json.js +216 -157
- package/dist/serial-json.oracle.d.ts +21 -0
- package/dist/serial-json.oracle.js +222 -0
- package/dist/serial-json.test.js +315 -0
- package/dist/testing/index.d.ts +4 -0
- package/dist/testing/index.js +8 -0
- package/dist/testing/mock-host-contract.d.ts +123 -0
- package/dist/testing/mock-host-contract.js +434 -0
- package/dist/testing/mock-host-contract.test.d.ts +1 -0
- package/dist/testing/mock-host-contract.test.js +782 -0
- package/dist/types/field-type.d.ts +35 -18
- package/dist/types/field-type.js +4 -1
- package/dist/types/zod-types.d.ts +9 -0
- package/dist/types/zod-types.js +8 -2
- package/dist/utils.d.ts +1 -25
- package/dist/utils.js +10 -90
- package/package.json +9 -2
- package/testing/package.json +4 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* `value` without the empty fields `schema` lets a caller leave out, before the schema parses
|
|
4
|
+
* it: a field that is `null` or `undefined` and is `.optional()` or has a default is removed, in
|
|
5
|
+
* nested objects too (including each object in an array). Peers has one empty value, a missing
|
|
6
|
+
* field, so `.optional()` and defaults then see a missing field rather than refusing a `null`.
|
|
7
|
+
* Other fields, and values the schema doesn't describe as objects, are left as they are. Returns
|
|
8
|
+
* `value` itself when nothing is removed, and a copy otherwise; `value` is never changed.
|
|
9
|
+
*
|
|
10
|
+
* @internal
|
|
11
|
+
* @param schema - A tool's input or output, a table's row, an event's payload, or an
|
|
12
|
+
* observable's value schema.
|
|
13
|
+
* @param value - The value about to be parsed or sent.
|
|
14
|
+
*/
|
|
15
|
+
export declare function withoutEmptySchemaFields(schema: z.ZodTypeAny | undefined, value: unknown): unknown;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withoutEmptySchemaFields = withoutEmptySchemaFields;
|
|
4
|
+
/**
|
|
5
|
+
* `value` without the empty fields `schema` lets a caller leave out, before the schema parses
|
|
6
|
+
* it: a field that is `null` or `undefined` and is `.optional()` or has a default is removed, in
|
|
7
|
+
* nested objects too (including each object in an array). Peers has one empty value, a missing
|
|
8
|
+
* field, so `.optional()` and defaults then see a missing field rather than refusing a `null`.
|
|
9
|
+
* Other fields, and values the schema doesn't describe as objects, are left as they are. Returns
|
|
10
|
+
* `value` itself when nothing is removed, and a copy otherwise; `value` is never changed.
|
|
11
|
+
*
|
|
12
|
+
* @internal
|
|
13
|
+
* @param schema - A tool's input or output, a table's row, an event's payload, or an
|
|
14
|
+
* observable's value schema.
|
|
15
|
+
* @param value - The value about to be parsed or sent.
|
|
16
|
+
*/
|
|
17
|
+
function withoutEmptySchemaFields(schema, value) {
|
|
18
|
+
if (!schema) {
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
const root = walkField(schema);
|
|
22
|
+
const shape = objectShape(root.base);
|
|
23
|
+
// An observable's whole value may be an array; its object elements still have fields.
|
|
24
|
+
if (shape && root.isArray && Array.isArray(value)) {
|
|
25
|
+
return withoutEmptyItems(root.base, value);
|
|
26
|
+
}
|
|
27
|
+
if (!shape || !isPlainRecord(value)) {
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
let copy;
|
|
31
|
+
for (const [name, fieldSchema] of Object.entries(shape)) {
|
|
32
|
+
if (!Object.hasOwn(value, name)) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
const current = value[name];
|
|
36
|
+
const { mayBeMissing, base, isArray } = walkField(fieldSchema);
|
|
37
|
+
let next = current;
|
|
38
|
+
if (current === null || current === undefined) {
|
|
39
|
+
if (!mayBeMissing) {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
next = undefined;
|
|
43
|
+
}
|
|
44
|
+
else if (objectShape(base)) {
|
|
45
|
+
next =
|
|
46
|
+
isArray && Array.isArray(current)
|
|
47
|
+
? withoutEmptyItems(base, current)
|
|
48
|
+
: withoutEmptySchemaFields(base, current);
|
|
49
|
+
}
|
|
50
|
+
if (next === current && next !== undefined) {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
copy ??= { ...value };
|
|
54
|
+
if (next === undefined) {
|
|
55
|
+
delete copy[name];
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
// Define rather than assign, so a "__proto__" field stays a field.
|
|
59
|
+
Object.defineProperty(copy, name, {
|
|
60
|
+
value: next,
|
|
61
|
+
enumerable: true,
|
|
62
|
+
writable: true,
|
|
63
|
+
configurable: true,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return copy ?? value;
|
|
68
|
+
}
|
|
69
|
+
function withoutEmptyItems(schema, items) {
|
|
70
|
+
let copy;
|
|
71
|
+
items.forEach((item, index) => {
|
|
72
|
+
const next = withoutEmptySchemaFields(schema, item);
|
|
73
|
+
if (next !== item) {
|
|
74
|
+
copy ??= [...items];
|
|
75
|
+
copy[index] = next;
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
return copy ?? items;
|
|
79
|
+
}
|
|
80
|
+
/** Walk the wrappers the manifest walks, and one array, without running schema code. */
|
|
81
|
+
function walkField(schema) {
|
|
82
|
+
let current = schema;
|
|
83
|
+
let mayBeMissing = false;
|
|
84
|
+
let isArray = false;
|
|
85
|
+
while (true) {
|
|
86
|
+
const def = current._def;
|
|
87
|
+
switch (def.typeName) {
|
|
88
|
+
case "ZodOptional":
|
|
89
|
+
case "ZodDefault":
|
|
90
|
+
case "ZodCatch":
|
|
91
|
+
mayBeMissing ||= !isArray;
|
|
92
|
+
current = def.innerType;
|
|
93
|
+
continue;
|
|
94
|
+
case "ZodNullable":
|
|
95
|
+
case "ZodReadonly":
|
|
96
|
+
current = def.innerType;
|
|
97
|
+
continue;
|
|
98
|
+
case "ZodBranded":
|
|
99
|
+
current = def.type;
|
|
100
|
+
continue;
|
|
101
|
+
case "ZodEffects":
|
|
102
|
+
if (def.effect.type !== "refinement") {
|
|
103
|
+
// The input can still be left out behind an effect, as the manifest's input IR
|
|
104
|
+
// records. Keep the value opaque: don't clean object fields across a transform.
|
|
105
|
+
return {
|
|
106
|
+
mayBeMissing: mayBeMissing || (!isArray && walkField(def.schema).mayBeMissing),
|
|
107
|
+
base: current,
|
|
108
|
+
isArray,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
current = def.schema;
|
|
112
|
+
continue;
|
|
113
|
+
case "ZodArray":
|
|
114
|
+
if (isArray) {
|
|
115
|
+
return { mayBeMissing, base: current, isArray };
|
|
116
|
+
}
|
|
117
|
+
isArray = true;
|
|
118
|
+
current = def.type;
|
|
119
|
+
continue;
|
|
120
|
+
default:
|
|
121
|
+
return { mayBeMissing, base: current, isArray };
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function objectShape(schema) {
|
|
126
|
+
return schema._def.typeName === "ZodObject" ? schema.shape : undefined;
|
|
127
|
+
}
|
|
128
|
+
function isPlainRecord(value) {
|
|
129
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
const prototype = Object.getPrototypeOf(value);
|
|
133
|
+
return prototype === Object.prototype || prototype === null;
|
|
134
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const zod_1 = require("zod");
|
|
4
|
+
const empty_fields_1 = require("./empty-fields");
|
|
5
|
+
test("undefined fields are absent before author refinements run", () => {
|
|
6
|
+
const item = zod_1.z
|
|
7
|
+
.object({ note: zod_1.z.string().optional() })
|
|
8
|
+
.refine((value) => !Object.hasOwn(value, "note"));
|
|
9
|
+
const schema = zod_1.z.object({ item, items: zod_1.z.array(item), rank: zod_1.z.number().default(5) });
|
|
10
|
+
const input = { item: { note: undefined }, items: [{ note: undefined }], rank: null };
|
|
11
|
+
const cleaned = (0, empty_fields_1.withoutEmptySchemaFields)(schema, input);
|
|
12
|
+
expect(cleaned).toStrictEqual({ item: {}, items: [{}] });
|
|
13
|
+
expect(schema.parse(cleaned)).toStrictEqual({ item: {}, items: [{}], rank: 5 });
|
|
14
|
+
expect(input.item).toHaveProperty("note");
|
|
15
|
+
});
|
|
16
|
+
test("an array value's object fields are cleaned, while its empty elements are kept", () => {
|
|
17
|
+
const schema = zod_1.z.array(zod_1.z.object({ note: zod_1.z.string().optional() }).nullable()).readonly();
|
|
18
|
+
const input = [{ note: null }, null, { note: undefined }, { note: "set" }];
|
|
19
|
+
const cleaned = (0, empty_fields_1.withoutEmptySchemaFields)(schema, input);
|
|
20
|
+
expect(cleaned).toStrictEqual([{}, null, {}, { note: "set" }]);
|
|
21
|
+
expect(schema.parse(cleaned)).toStrictEqual(cleaned);
|
|
22
|
+
expect(input[0]).toStrictEqual({ note: null });
|
|
23
|
+
});
|
|
24
|
+
test("undescribed values retain nulls and required fields remain for validation", () => {
|
|
25
|
+
const schema = zod_1.z.object({
|
|
26
|
+
required: zod_1.z.string(),
|
|
27
|
+
data: zod_1.z.unknown(),
|
|
28
|
+
record: zod_1.z.record(zod_1.z.unknown()),
|
|
29
|
+
});
|
|
30
|
+
const input = { required: null, data: { note: null }, record: { note: null } };
|
|
31
|
+
expect((0, empty_fields_1.withoutEmptySchemaFields)(schema, input)).toBe(input);
|
|
32
|
+
expect(schema.safeParse((0, empty_fields_1.withoutEmptySchemaFields)(schema, input)).success).toBe(false);
|
|
33
|
+
});
|
|
34
|
+
test("an effect can accept a missing input without describing its inner object fields", () => {
|
|
35
|
+
const schema = zod_1.z.object({
|
|
36
|
+
rank: zod_1.z
|
|
37
|
+
.number()
|
|
38
|
+
.optional()
|
|
39
|
+
.transform((value) => value ?? 5),
|
|
40
|
+
opaque: zod_1.z.object({ note: zod_1.z.string().nullish() }).transform((value) => value),
|
|
41
|
+
items: zod_1.z.array(zod_1.z
|
|
42
|
+
.string()
|
|
43
|
+
.optional()
|
|
44
|
+
.transform((value) => value ?? "")),
|
|
45
|
+
});
|
|
46
|
+
const input = { rank: null, opaque: { note: null }, items: null };
|
|
47
|
+
const cleaned = (0, empty_fields_1.withoutEmptySchemaFields)(schema, input);
|
|
48
|
+
expect(cleaned).toStrictEqual({ opaque: { note: null }, items: null });
|
|
49
|
+
expect(schema.safeParse(cleaned).success).toBe(false);
|
|
50
|
+
expect(schema.parse({ ...cleaned, items: [] })).toStrictEqual({
|
|
51
|
+
rank: 5,
|
|
52
|
+
opaque: { note: null },
|
|
53
|
+
items: [],
|
|
54
|
+
});
|
|
55
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|