@haneullabs/bcs 2.1.0 → 2.1.3

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/CHANGELOG.md CHANGED
@@ -1,5 +1,39 @@
1
1
  # Change Log
2
2
 
3
+ ## 2.1.3
4
+
5
+ ### Patch Changes
6
+
7
+ - 3aa65e2: Speed up BCS parsing and serialization: faster ULEB, integer and byte reads and writes,
8
+ enum and option encoding, string decoding, and a single input conversion per write for transformed
9
+ types. Base58, base64 and hex helpers in `@mysten/utils` are faster and no longer depend on
10
+ `@scure/base`. Sui address and object digest encoding is faster.
11
+
12
+ Behaviour changes:
13
+
14
+ - `BcsReader.readBytes` and `readULEB` throw instead of reading past the end of a view into the
15
+ rest of its buffer.
16
+ - `bcs.option(T)` returns `null`/`undefined` when `T` reads as `null`/`undefined` (for example a
17
+ nested option's inner `None`), instead of `true`.
18
+ - `bcs.Address.serializedSize` and `bcs.ObjectDigest.serializedSize` throw on invalid input
19
+ instead of returning a size.
20
+
21
+ ## 2.1.2
22
+
23
+ ### Patch Changes
24
+
25
+ - 30289c1: Reject non-canonical encodings when decoding: `bool` values other than `0` or `1`,
26
+ non-minimal ULEB128 encodings (used for lengths and enum variant indices) and strings that are not
27
+ valid UTF-8. Strings now also keep a leading byte order mark instead of silently dropping it
28
+
29
+ ## 2.1.1
30
+
31
+ ### Patch Changes
32
+
33
+ - f2f7048: Upgrade workspace dependencies, remove the legacy dapp-kit package, and migrate the
34
+ remaining consumers to the current gRPC-based dapp-kit. Remove the legacy API reference while
35
+ retaining the migration guide and deprecation notice.
36
+
3
37
  ## 2.1.0
4
38
 
5
39
  ### Minor Changes
@@ -1,7 +1,6 @@
1
1
  import { BcsReader } from "./reader.mjs";
2
2
  import { EnumInputShape, EnumOutputShape, JoinString } from "./types.mjs";
3
3
  import { BcsWriter, BcsWriterOptions } from "./writer.mjs";
4
-
5
4
  //#region src/bcs-type.d.ts
6
5
  interface BcsTypeOptions<T, Input = T, Name extends string = string> {
7
6
  name?: Name;
@@ -29,12 +28,7 @@ declare class BcsType<T, Input = T, const Name extends string = string> {
29
28
  fromHex(hex: string): T;
30
29
  fromBase58(b64: string): T;
31
30
  fromBase64(b64: string): T;
32
- transform<T2 = T, Input2 = Input, NewName extends string = Name>({
33
- name,
34
- input,
35
- output,
36
- validate
37
- }: {
31
+ transform<T2 = T, Input2 = Input, NewName extends string = Name>({ name, input, output, validate }: {
38
32
  input?: (val: Input2) => Input;
39
33
  output?: (value: T) => T2;
40
34
  } & BcsTypeOptions<T2, Input2, NewName>): BcsType<T2, Input2, NewName>;
@@ -51,87 +45,58 @@ declare class SerializedBcs<T, Input = T> {
51
45
  toBase58(): string;
52
46
  parse(): T;
53
47
  }
54
- declare function fixedSizeBcsType<T, Input = T, const Name extends string = string>({
55
- size,
56
- ...options
57
- }: {
48
+ declare function fixedSizeBcsType<T, Input = T, const Name extends string = string>({ size, ...options }: {
58
49
  name: Name;
59
50
  size: number;
60
51
  read: (reader: BcsReader) => T;
61
52
  write: (value: Input, writer: BcsWriter) => void;
62
53
  } & BcsTypeOptions<T, Input, Name>): BcsType<T, Input, Name>;
63
- declare function uIntBcsType<const Name extends string = string>({
64
- readMethod,
65
- writeMethod,
66
- ...options
67
- }: {
54
+ declare function uIntBcsType<const Name extends string = string>({ readMethod, writeMethod, ...options }: {
68
55
  name: Name;
69
56
  size: number;
70
57
  readMethod: `read${8 | 16 | 32}`;
71
58
  writeMethod: `write${8 | 16 | 32}`;
72
59
  maxValue: number;
73
60
  } & BcsTypeOptions<number, number, Name>): BcsType<number, number, Name>;
74
- declare function bigUIntBcsType<const Name extends string = string>({
75
- readMethod,
76
- writeMethod,
77
- ...options
78
- }: {
61
+ declare function bigUIntBcsType<const Name extends string = string>({ readMethod, writeMethod, ...options }: {
79
62
  name: Name;
80
63
  size: number;
81
64
  readMethod: `read${64 | 128 | 256}`;
82
65
  writeMethod: `write${64 | 128 | 256}`;
83
66
  maxValue: bigint;
84
67
  } & BcsTypeOptions<string, string | number | bigint>): BcsType<string, string | number | bigint, Name>;
85
- declare function dynamicSizeBcsType<T, Input = T, const Name extends string = string>({
86
- serialize,
87
- ...options
88
- }: {
68
+ declare function dynamicSizeBcsType<T, Input = T, const Name extends string = string>({ serialize, ...options }: {
89
69
  name: Name;
90
70
  read: (reader: BcsReader) => T;
91
71
  serialize: (value: Input, options?: BcsWriterOptions) => Uint8Array<ArrayBuffer>;
92
72
  } & BcsTypeOptions<T, Input>): BcsType<T, Input, string>;
93
- declare function stringLikeBcsType<const Name extends string = string>({
94
- toBytes,
95
- fromBytes,
96
- ...options
97
- }: {
73
+ declare function stringLikeBcsType<const Name extends string = string>({ toBytes, fromBytes, ...options }: {
98
74
  name: Name;
99
75
  toBytes: (value: string) => Uint8Array;
100
76
  fromBytes: (bytes: Uint8Array) => string;
101
77
  serializedSize?: (value: string) => number | null;
102
78
  } & BcsTypeOptions<string, string, Name>): BcsType<string, string, Name>;
103
79
  declare function lazyBcsType<T, Input>(cb: () => BcsType<T, Input>): BcsType<T, Input, string>;
104
- interface BcsStructOptions<T extends Record<string, BcsType<any>>, Name extends string = string> extends Omit<BcsTypeOptions<{ [K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never }, { [K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never }, Name>, 'name'> {
80
+ interface BcsStructOptions<T extends Record<string, BcsType<any>>, Name extends string = string> extends Omit<BcsTypeOptions<{ [K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never; }, { [K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never; }, Name>, 'name'> {
105
81
  name: Name;
106
82
  fields: T;
107
83
  }
108
- declare class BcsStruct<T extends Record<string, BcsType<any>>, const Name extends string = string> extends BcsType<{ [K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never }, { [K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never }, Name> {
109
- constructor({
110
- name,
111
- fields,
112
- ...options
113
- }: BcsStructOptions<T, Name>);
84
+ declare class BcsStruct<T extends Record<string, BcsType<any>>, const Name extends string = string> extends BcsType<{ [K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never; }, { [K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never; }, Name> {
85
+ constructor({ name, fields, ...options }: BcsStructOptions<T, Name>);
114
86
  }
115
- interface BcsEnumOptions<T extends Record<string, BcsType<any> | null>, Name extends string = string> extends Omit<BcsTypeOptions<EnumOutputShape<{ [K in keyof T]: T[K] extends BcsType<infer U, any, any> ? U : true }>, EnumInputShape<{ [K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null }>, Name>, 'name'> {
87
+ interface BcsEnumOptions<T extends Record<string, BcsType<any> | null>, Name extends string = string> extends Omit<BcsTypeOptions<EnumOutputShape<{ [K in keyof T]: T[K] extends BcsType<infer U, any, any> ? U : true; }>, EnumInputShape<{ [K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null; }>, Name>, 'name'> {
116
88
  name: Name;
117
89
  fields: T;
118
90
  }
119
- declare class BcsEnum<T extends Record<string, BcsType<any> | null>, const Name extends string = string> extends BcsType<EnumOutputShape<{ [K in keyof T]: T[K] extends BcsType<infer U, any> ? U : true }>, EnumInputShape<{ [K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null }>, Name> {
120
- constructor({
121
- fields,
122
- ...options
123
- }: BcsEnumOptions<T, Name>);
91
+ declare class BcsEnum<T extends Record<string, BcsType<any> | null>, const Name extends string = string> extends BcsType<EnumOutputShape<{ [K in keyof T]: T[K] extends BcsType<infer U, any> ? U : true; }>, EnumInputShape<{ [K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null; }>, Name> {
92
+ constructor({ fields, ...options }: BcsEnumOptions<T, Name>);
124
93
  }
125
- interface BcsTupleOptions<T extends readonly BcsType<any>[], Name extends string> extends Omit<BcsTypeOptions<{ -readonly [K in keyof T]: T[K] extends BcsType<infer T, any> ? T : never }, { [K in keyof T]: T[K] extends BcsType<any, infer T> ? T : never }, Name>, 'name'> {
94
+ interface BcsTupleOptions<T extends readonly BcsType<any>[], Name extends string> extends Omit<BcsTypeOptions<{ -readonly [K in keyof T]: T[K] extends BcsType<infer T, any> ? T : never; }, { [K in keyof T]: T[K] extends BcsType<any, infer T> ? T : never; }, Name>, 'name'> {
126
95
  name?: Name;
127
96
  fields: T;
128
97
  }
129
- declare class BcsTuple<const T extends readonly BcsType<any>[], const Name extends string = `(${JoinString<{ [K in keyof T]: T[K] extends BcsType<any, any, infer T> ? T : never }, ', '>})`> extends BcsType<{ -readonly [K in keyof T]: T[K] extends BcsType<infer T, any> ? T : never }, { [K in keyof T]: T[K] extends BcsType<any, infer T> ? T : never }, Name> {
130
- constructor({
131
- fields,
132
- name,
133
- ...options
134
- }: BcsTupleOptions<T, Name>);
98
+ declare class BcsTuple<const T extends readonly BcsType<any>[], const Name extends string = `(${JoinString<{ [K in keyof T]: T[K] extends BcsType<any, any, infer T> ? T : never; }, ', '>})`> extends BcsType<{ -readonly [K in keyof T]: T[K] extends BcsType<infer T, any> ? T : never; }, { [K in keyof T]: T[K] extends BcsType<any, infer T> ? T : never; }, Name> {
99
+ constructor({ fields, name, ...options }: BcsTupleOptions<T, Name>);
135
100
  }
136
101
  //#endregion
137
102
  export { BcsEnum, BcsEnumOptions, BcsStruct, BcsStructOptions, BcsTuple, BcsTupleOptions, BcsType, BcsTypeOptions, SerializedBcs, bigUIntBcsType, dynamicSizeBcsType, fixedSizeBcsType, isSerializedBcs, lazyBcsType, stringLikeBcsType, uIntBcsType };
@@ -1 +1 @@
1
- {"version":3,"file":"bcs-type.d.mts","names":[],"sources":["../src/bcs-type.ts"],"mappings":"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"}
1
+ {"version":3,"file":"bcs-type.d.mts","names":[],"sources":["../src/bcs-type.ts"],"mappings":"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"}
package/dist/bcs-type.mjs CHANGED
@@ -1,11 +1,14 @@
1
- import { ulebEncode } from "./uleb.mjs";
2
1
  import { BcsReader } from "./reader.mjs";
2
+ import { ulebEncode } from "./uleb.mjs";
3
3
  import { BcsWriter } from "./writer.mjs";
4
4
  import { fromBase58, fromBase64, fromHex, toBase58, toBase64, toHex } from "@haneullabs/utils";
5
5
  //#region src/bcs-type.ts
6
6
  var BcsType = class BcsType {
7
7
  #write;
8
8
  #serialize;
9
+ #validatedWrite = null;
10
+ #validatedSerialize = null;
11
+ #transformValidate = null;
9
12
  constructor(options) {
10
13
  this.name = options.name;
11
14
  this.read = options.read;
@@ -22,10 +25,15 @@ var BcsType = class BcsType {
22
25
  this.validate = options.validate ?? (() => {});
23
26
  }
24
27
  write(value, writer) {
28
+ if (this.#validatedWrite && this.validate === this.#transformValidate) {
29
+ this.#validatedWrite(value, writer);
30
+ return;
31
+ }
25
32
  this.validate(value);
26
33
  this.#write(value, writer);
27
34
  }
28
35
  serialize(value, options) {
36
+ if (this.#validatedSerialize && this.validate === this.#transformValidate) return new SerializedBcs(this, this.#validatedSerialize(value, options));
29
37
  this.validate(value);
30
38
  return new SerializedBcs(this, this.#serialize(value, options));
31
39
  }
@@ -43,7 +51,7 @@ var BcsType = class BcsType {
43
51
  return this.parse(fromBase64(b64));
44
52
  }
45
53
  transform({ name, input, output, validate }) {
46
- return new BcsType({
54
+ const type = new BcsType({
47
55
  name: name ?? this.name,
48
56
  read: (reader) => output ? output(this.read(reader)) : this.read(reader),
49
57
  write: (value, writer) => this.#write(input ? input(value) : value, writer),
@@ -54,6 +62,20 @@ var BcsType = class BcsType {
54
62
  this.validate(input ? input(value) : value);
55
63
  }
56
64
  });
65
+ type.#transformValidate = type.validate;
66
+ type.#validatedWrite = (value, writer) => {
67
+ validate?.(value);
68
+ const converted = input ? input(value) : value;
69
+ this.validate(converted);
70
+ this.#write(converted, writer);
71
+ };
72
+ type.#validatedSerialize = (value, options) => {
73
+ validate?.(value);
74
+ const converted = input ? input(value) : value;
75
+ this.validate(converted);
76
+ return this.#serialize(converted, options);
77
+ };
78
+ return type;
57
79
  }
58
80
  };
59
81
  const SERIALIZED_BCS_BRAND = Symbol.for("@haneullabs/serialized-bcs");
@@ -135,7 +157,7 @@ function stringLikeBcsType({ toBytes, fromBytes, ...options }) {
135
157
  write: (hex, writer) => {
136
158
  const bytes = toBytes(hex);
137
159
  writer.writeULEB(bytes.length);
138
- for (let i = 0; i < bytes.length; i++) writer.write8(bytes[i]);
160
+ writer.writeBytes(bytes);
139
161
  },
140
162
  serialize: (value) => {
141
163
  const bytes = toBytes(value);
@@ -167,13 +189,15 @@ function lazyBcsType(cb) {
167
189
  }
168
190
  var BcsStruct = class extends BcsType {
169
191
  constructor({ name, fields, ...options }) {
170
- const canonicalOrder = Object.entries(fields);
192
+ const fieldNames = Object.keys(fields);
193
+ const fieldTypes = fieldNames.map((field) => fields[field]);
194
+ const fieldCount = fieldNames.length;
171
195
  super({
172
196
  name,
173
197
  serializedSize: (values) => {
174
198
  let total = 0;
175
- for (const [field, type] of canonicalOrder) {
176
- const size = type.serializedSize(values[field]);
199
+ for (let i = 0; i < fieldCount; i++) {
200
+ const size = fieldTypes[i].serializedSize(values[fieldNames[i]]);
177
201
  if (size == null) return null;
178
202
  total += size;
179
203
  }
@@ -181,11 +205,11 @@ var BcsStruct = class extends BcsType {
181
205
  },
182
206
  read: (reader) => {
183
207
  const result = {};
184
- for (const [field, type] of canonicalOrder) result[field] = type.read(reader);
208
+ for (let i = 0; i < fieldCount; i++) result[fieldNames[i]] = fieldTypes[i].read(reader);
185
209
  return result;
186
210
  },
187
211
  write: (value, writer) => {
188
- for (const [field, type] of canonicalOrder) type.write(value[field], writer);
212
+ for (let i = 0; i < fieldCount; i++) fieldTypes[i].write(value[fieldNames[i]], writer);
189
213
  },
190
214
  ...options,
191
215
  validate: (value) => {
@@ -198,24 +222,29 @@ var BcsStruct = class extends BcsType {
198
222
  var BcsEnum = class extends BcsType {
199
223
  constructor({ fields, ...options }) {
200
224
  const canonicalOrder = Object.entries(fields);
225
+ const variantIndex = new Map(canonicalOrder.map(([name], i) => [name, i]));
201
226
  super({
202
227
  read: (reader) => {
203
228
  const index = reader.readULEB();
204
229
  const enumEntry = canonicalOrder[index];
205
230
  if (!enumEntry) throw new TypeError(`Unknown value ${index} for enum ${options.name}`);
206
231
  const [kind, type] = enumEntry;
207
- return {
208
- [kind]: type?.read(reader) ?? true,
232
+ const value = type?.read(reader) ?? true;
233
+ if (kind === "__proto__") return {
234
+ [kind]: value,
209
235
  $kind: kind
210
236
  };
237
+ const result = {};
238
+ result[kind] = value;
239
+ result.$kind = kind;
240
+ return result;
211
241
  },
212
242
  write: (value, writer) => {
213
- const [name, val] = Object.entries(value).filter(([name]) => Object.hasOwn(fields, name))[0];
214
- for (let i = 0; i < canonicalOrder.length; i++) {
215
- const [optionName, optionType] = canonicalOrder[i];
216
- if (optionName === name) {
217
- writer.writeULEB(i);
218
- optionType?.write(val, writer);
243
+ for (const name of Object.keys(value)) {
244
+ const index = variantIndex.get(name);
245
+ if (index !== void 0) {
246
+ writer.writeULEB(index);
247
+ canonicalOrder[index][1]?.write(value[name], writer);
219
248
  return;
220
249
  }
221
250
  }
@@ -224,10 +253,9 @@ var BcsEnum = class extends BcsType {
224
253
  validate: (value) => {
225
254
  options?.validate?.(value);
226
255
  if (typeof value !== "object" || value == null) throw new TypeError(`Expected object, found ${typeof value}`);
227
- const keys = Object.keys(value).filter((k) => value[k] !== void 0 && Object.hasOwn(fields, k));
228
- if (keys.length !== 1) throw new TypeError(`Expected object with one key, but found ${keys.length} for type ${options.name}}`);
229
- const [variant] = keys;
230
- if (!Object.hasOwn(fields, variant)) throw new TypeError(`Invalid enum variant ${variant}`);
256
+ let variantCount = 0;
257
+ for (const key of Object.keys(value)) if (value[key] !== void 0 && variantIndex.has(key)) variantCount++;
258
+ if (variantCount !== 1) throw new TypeError(`Expected object with one key, but found ${variantCount} for type ${options.name}}`);
231
259
  }
232
260
  });
233
261
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bcs-type.mjs","names":["#write","#serialize","#schema","#bytes"],"sources":["../src/bcs-type.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase58, fromBase64, toBase58, toBase64, fromHex, toHex } from '@haneullabs/utils';\nimport { BcsReader } from './reader.js';\nimport { ulebEncode } from './uleb.js';\nimport type { BcsWriterOptions } from './writer.js';\nimport { BcsWriter } from './writer.js';\nimport type { EnumInputShape, EnumOutputShape, JoinString } from './types.js';\n\nexport interface BcsTypeOptions<T, Input = T, Name extends string = string> {\n\tname?: Name;\n\tvalidate?: (value: Input) => void;\n}\n\nexport class BcsType<T, Input = T, const Name extends string = string> {\n\t$inferType!: T;\n\t$inferInput!: Input;\n\tname: Name;\n\tread: (reader: BcsReader) => T;\n\tserializedSize: (value: Input, options?: BcsWriterOptions) => number | null;\n\tvalidate: (value: Input) => void;\n\t#write: (value: Input, writer: BcsWriter) => void;\n\t#serialize: (value: Input, options?: BcsWriterOptions) => Uint8Array<ArrayBuffer>;\n\n\tconstructor(\n\t\toptions: {\n\t\t\tname: Name;\n\t\t\tread: (reader: BcsReader) => T;\n\t\t\twrite: (value: Input, writer: BcsWriter) => void;\n\t\t\tserialize?: (value: Input, options?: BcsWriterOptions) => Uint8Array<ArrayBuffer>;\n\t\t\tserializedSize?: (value: Input) => number | null;\n\t\t\tvalidate?: (value: Input) => void;\n\t\t} & BcsTypeOptions<T, Input, Name>,\n\t) {\n\t\tthis.name = options.name;\n\t\tthis.read = options.read;\n\t\tthis.serializedSize = options.serializedSize ?? (() => null);\n\t\tthis.#write = options.write;\n\t\tthis.#serialize =\n\t\t\toptions.serialize ??\n\t\t\t((value, options) => {\n\t\t\t\tconst writer = new BcsWriter({\n\t\t\t\t\tinitialSize: this.serializedSize(value) ?? undefined,\n\t\t\t\t\t...options,\n\t\t\t\t});\n\t\t\t\tthis.#write(value, writer);\n\t\t\t\treturn writer.toBytes();\n\t\t\t});\n\n\t\tthis.validate = options.validate ?? (() => {});\n\t}\n\n\twrite(value: Input, writer: BcsWriter) {\n\t\tthis.validate(value);\n\t\tthis.#write(value, writer);\n\t}\n\n\tserialize(value: Input, options?: BcsWriterOptions) {\n\t\tthis.validate(value);\n\t\treturn new SerializedBcs(this, this.#serialize(value, options));\n\t}\n\n\tparse(bytes: Uint8Array): T {\n\t\tconst reader = new BcsReader(bytes);\n\t\treturn this.read(reader);\n\t}\n\n\tfromHex(hex: string) {\n\t\treturn this.parse(fromHex(hex));\n\t}\n\n\tfromBase58(b64: string) {\n\t\treturn this.parse(fromBase58(b64));\n\t}\n\n\tfromBase64(b64: string) {\n\t\treturn this.parse(fromBase64(b64));\n\t}\n\n\ttransform<T2 = T, Input2 = Input, NewName extends string = Name>({\n\t\tname,\n\t\tinput,\n\t\toutput,\n\t\tvalidate,\n\t}: {\n\t\tinput?: (val: Input2) => Input;\n\t\toutput?: (value: T) => T2;\n\t} & BcsTypeOptions<T2, Input2, NewName>) {\n\t\treturn new BcsType<T2, Input2, NewName>({\n\t\t\tname: (name ?? this.name) as NewName,\n\t\t\tread: (reader) => (output ? output(this.read(reader)) : (this.read(reader) as never)),\n\t\t\twrite: (value, writer) => this.#write(input ? input(value) : (value as never), writer),\n\t\t\tserializedSize: (value) => this.serializedSize(input ? input(value) : (value as never)),\n\t\t\tserialize: (value, options) =>\n\t\t\t\tthis.#serialize(input ? input(value) : (value as never), options),\n\t\t\tvalidate: (value) => {\n\t\t\t\tvalidate?.(value);\n\t\t\t\tthis.validate(input ? input(value) : (value as never));\n\t\t\t},\n\t\t});\n\t}\n}\n\nconst SERIALIZED_BCS_BRAND = Symbol.for('@haneullabs/serialized-bcs') as never;\nexport function isSerializedBcs(obj: unknown): obj is SerializedBcs<unknown> {\n\treturn !!obj && typeof obj === 'object' && (obj as any)[SERIALIZED_BCS_BRAND] === true;\n}\n\nexport class SerializedBcs<T, Input = T> {\n\t#schema: BcsType<T, Input>;\n\t#bytes: Uint8Array<ArrayBuffer>;\n\n\t// Used to brand SerializedBcs so that they can be identified, even between multiple copies\n\t// of the @haneullabs/bcs package are installed\n\tget [SERIALIZED_BCS_BRAND]() {\n\t\treturn true;\n\t}\n\n\tconstructor(schema: BcsType<T, Input>, bytes: Uint8Array<ArrayBuffer>) {\n\t\tthis.#schema = schema;\n\t\tthis.#bytes = bytes;\n\t}\n\n\ttoBytes() {\n\t\treturn this.#bytes;\n\t}\n\n\ttoHex() {\n\t\treturn toHex(this.#bytes);\n\t}\n\n\ttoBase64() {\n\t\treturn toBase64(this.#bytes);\n\t}\n\n\ttoBase58() {\n\t\treturn toBase58(this.#bytes);\n\t}\n\n\tparse() {\n\t\treturn this.#schema.parse(this.#bytes);\n\t}\n}\n\nexport function fixedSizeBcsType<T, Input = T, const Name extends string = string>({\n\tsize,\n\t...options\n}: {\n\tname: Name;\n\tsize: number;\n\tread: (reader: BcsReader) => T;\n\twrite: (value: Input, writer: BcsWriter) => void;\n} & BcsTypeOptions<T, Input, Name>) {\n\treturn new BcsType<T, Input, Name>({\n\t\t...options,\n\t\tserializedSize: () => size,\n\t});\n}\n\nexport function uIntBcsType<const Name extends string = string>({\n\treadMethod,\n\twriteMethod,\n\t...options\n}: {\n\tname: Name;\n\tsize: number;\n\treadMethod: `read${8 | 16 | 32}`;\n\twriteMethod: `write${8 | 16 | 32}`;\n\tmaxValue: number;\n} & BcsTypeOptions<number, number, Name>) {\n\treturn fixedSizeBcsType<number, number, Name>({\n\t\t...options,\n\t\tread: (reader) => reader[readMethod](),\n\t\twrite: (value, writer) => writer[writeMethod](value),\n\t\tvalidate: (value) => {\n\t\t\tif (value < 0 || value > options.maxValue) {\n\t\t\t\tthrow new TypeError(\n\t\t\t\t\t`Invalid ${options.name} value: ${value}. Expected value in range 0-${options.maxValue}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\toptions.validate?.(value);\n\t\t},\n\t});\n}\n\nexport function bigUIntBcsType<const Name extends string = string>({\n\treadMethod,\n\twriteMethod,\n\t...options\n}: {\n\tname: Name;\n\tsize: number;\n\treadMethod: `read${64 | 128 | 256}`;\n\twriteMethod: `write${64 | 128 | 256}`;\n\tmaxValue: bigint;\n} & BcsTypeOptions<string, string | number | bigint>) {\n\treturn fixedSizeBcsType<string, string | number | bigint, Name>({\n\t\t...options,\n\t\tread: (reader) => reader[readMethod](),\n\t\twrite: (value, writer) => writer[writeMethod](BigInt(value)),\n\t\tvalidate: (val) => {\n\t\t\tconst value = BigInt(val);\n\t\t\tif (value < 0 || value > options.maxValue) {\n\t\t\t\tthrow new TypeError(\n\t\t\t\t\t`Invalid ${options.name} value: ${value}. Expected value in range 0-${options.maxValue}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\toptions.validate?.(value);\n\t\t},\n\t});\n}\n\nexport function dynamicSizeBcsType<T, Input = T, const Name extends string = string>({\n\tserialize,\n\t...options\n}: {\n\tname: Name;\n\tread: (reader: BcsReader) => T;\n\tserialize: (value: Input, options?: BcsWriterOptions) => Uint8Array<ArrayBuffer>;\n} & BcsTypeOptions<T, Input>) {\n\tconst type = new BcsType<T, Input>({\n\t\t...options,\n\t\tserialize,\n\t\twrite: (value, writer) => {\n\t\t\tfor (const byte of type.serialize(value).toBytes()) {\n\t\t\t\twriter.write8(byte);\n\t\t\t}\n\t\t},\n\t});\n\n\treturn type;\n}\n\nexport function stringLikeBcsType<const Name extends string = string>({\n\ttoBytes,\n\tfromBytes,\n\t...options\n}: {\n\tname: Name;\n\ttoBytes: (value: string) => Uint8Array;\n\tfromBytes: (bytes: Uint8Array) => string;\n\tserializedSize?: (value: string) => number | null;\n} & BcsTypeOptions<string, string, Name>) {\n\treturn new BcsType<string, string, Name>({\n\t\t...options,\n\t\tread: (reader) => {\n\t\t\tconst length = reader.readULEB();\n\t\t\tconst bytes = reader.readBytes(length);\n\n\t\t\treturn fromBytes(bytes);\n\t\t},\n\t\twrite: (hex, writer) => {\n\t\t\tconst bytes = toBytes(hex);\n\t\t\twriter.writeULEB(bytes.length);\n\t\t\tfor (let i = 0; i < bytes.length; i++) {\n\t\t\t\twriter.write8(bytes[i]);\n\t\t\t}\n\t\t},\n\t\tserialize: (value) => {\n\t\t\tconst bytes = toBytes(value);\n\t\t\tconst size = ulebEncode(bytes.length);\n\t\t\tconst result = new Uint8Array(size.length + bytes.length);\n\t\t\tresult.set(size, 0);\n\t\t\tresult.set(bytes, size.length);\n\n\t\t\treturn result;\n\t\t},\n\t\tvalidate: (value) => {\n\t\t\tif (typeof value !== 'string') {\n\t\t\t\tthrow new TypeError(`Invalid ${options.name} value: ${value}. Expected string`);\n\t\t\t}\n\t\t\toptions.validate?.(value);\n\t\t},\n\t});\n}\n\nexport function lazyBcsType<T, Input>(cb: () => BcsType<T, Input>) {\n\tlet lazyType: BcsType<T, Input> | null = null;\n\tfunction getType() {\n\t\tif (!lazyType) {\n\t\t\tlazyType = cb();\n\t\t}\n\t\treturn lazyType;\n\t}\n\n\treturn new BcsType<T, Input>({\n\t\tname: 'lazy' as never,\n\t\tread: (data) => getType().read(data),\n\t\tserializedSize: (value) => getType().serializedSize(value),\n\t\twrite: (value, writer) => getType().write(value, writer),\n\t\tserialize: (value, options) => getType().serialize(value, options).toBytes(),\n\t});\n}\n\nexport interface BcsStructOptions<\n\tT extends Record<string, BcsType<any>>,\n\tName extends string = string,\n> extends Omit<\n\tBcsTypeOptions<\n\t\t{\n\t\t\t[K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never;\n\t\t},\n\t\t{\n\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never;\n\t\t},\n\t\tName\n\t>,\n\t'name'\n> {\n\tname: Name;\n\tfields: T;\n}\n\nexport class BcsStruct<\n\tT extends Record<string, BcsType<any>>,\n\tconst Name extends string = string,\n> extends BcsType<\n\t{\n\t\t[K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never;\n\t},\n\t{\n\t\t[K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never;\n\t},\n\tName\n> {\n\tconstructor({ name, fields, ...options }: BcsStructOptions<T, Name>) {\n\t\tconst canonicalOrder = Object.entries(fields);\n\n\t\tsuper({\n\t\t\tname,\n\t\t\tserializedSize: (values) => {\n\t\t\t\tlet total = 0;\n\t\t\t\tfor (const [field, type] of canonicalOrder) {\n\t\t\t\t\tconst size = type.serializedSize(values[field]);\n\t\t\t\t\tif (size == null) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\ttotal += size;\n\t\t\t\t}\n\n\t\t\t\treturn total;\n\t\t\t},\n\t\t\tread: (reader) => {\n\t\t\t\tconst result: Record<string, unknown> = {};\n\t\t\t\tfor (const [field, type] of canonicalOrder) {\n\t\t\t\t\tresult[field] = type.read(reader);\n\t\t\t\t}\n\n\t\t\t\treturn result as never;\n\t\t\t},\n\t\t\twrite: (value, writer) => {\n\t\t\t\tfor (const [field, type] of canonicalOrder) {\n\t\t\t\t\ttype.write(value[field], writer);\n\t\t\t\t}\n\t\t\t},\n\t\t\t...options,\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (typeof value !== 'object' || value == null) {\n\t\t\t\t\tthrow new TypeError(`Expected object, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n}\n\nexport interface BcsEnumOptions<\n\tT extends Record<string, BcsType<any> | null>,\n\tName extends string = string,\n> extends Omit<\n\tBcsTypeOptions<\n\t\tEnumOutputShape<{\n\t\t\t[K in keyof T]: T[K] extends BcsType<infer U, any, any> ? U : true;\n\t\t}>,\n\t\tEnumInputShape<{\n\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null;\n\t\t}>,\n\t\tName\n\t>,\n\t'name'\n> {\n\tname: Name;\n\tfields: T;\n}\n\nexport class BcsEnum<\n\tT extends Record<string, BcsType<any> | null>,\n\tconst Name extends string = string,\n> extends BcsType<\n\tEnumOutputShape<{\n\t\t[K in keyof T]: T[K] extends BcsType<infer U, any> ? U : true;\n\t}>,\n\tEnumInputShape<{\n\t\t[K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null;\n\t}>,\n\tName\n> {\n\tconstructor({ fields, ...options }: BcsEnumOptions<T, Name>) {\n\t\tconst canonicalOrder = Object.entries(fields as object);\n\t\tsuper({\n\t\t\tread: (reader) => {\n\t\t\t\tconst index = reader.readULEB();\n\n\t\t\t\tconst enumEntry = canonicalOrder[index];\n\t\t\t\tif (!enumEntry) {\n\t\t\t\t\tthrow new TypeError(`Unknown value ${index} for enum ${options.name}`);\n\t\t\t\t}\n\n\t\t\t\tconst [kind, type] = enumEntry;\n\n\t\t\t\treturn {\n\t\t\t\t\t[kind]: type?.read(reader) ?? true,\n\t\t\t\t\t$kind: kind,\n\t\t\t\t} as never;\n\t\t\t},\n\t\t\twrite: (value, writer) => {\n\t\t\t\tconst [name, val] = Object.entries(value).filter(([name]) =>\n\t\t\t\t\tObject.hasOwn(fields, name),\n\t\t\t\t)[0];\n\n\t\t\t\tfor (let i = 0; i < canonicalOrder.length; i++) {\n\t\t\t\t\tconst [optionName, optionType] = canonicalOrder[i];\n\t\t\t\t\tif (optionName === name) {\n\t\t\t\t\t\twriter.writeULEB(i);\n\t\t\t\t\t\toptionType?.write(val, writer);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t...options,\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (typeof value !== 'object' || value == null) {\n\t\t\t\t\tthrow new TypeError(`Expected object, found ${typeof value}`);\n\t\t\t\t}\n\n\t\t\t\tconst keys = Object.keys(value).filter(\n\t\t\t\t\t(k) => value[k] !== undefined && Object.hasOwn(fields, k),\n\t\t\t\t);\n\n\t\t\t\tif (keys.length !== 1) {\n\t\t\t\t\tthrow new TypeError(\n\t\t\t\t\t\t`Expected object with one key, but found ${keys.length} for type ${options.name}}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst [variant] = keys;\n\n\t\t\t\tif (!Object.hasOwn(fields, variant)) {\n\t\t\t\t\tthrow new TypeError(`Invalid enum variant ${variant}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n}\n\nexport interface BcsTupleOptions<\n\tT extends readonly BcsType<any>[],\n\tName extends string,\n> extends Omit<\n\tBcsTypeOptions<\n\t\t{\n\t\t\t-readonly [K in keyof T]: T[K] extends BcsType<infer T, any> ? T : never;\n\t\t},\n\t\t{\n\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer T> ? T : never;\n\t\t},\n\t\tName\n\t>,\n\t'name'\n> {\n\tname?: Name;\n\tfields: T;\n}\n\nexport class BcsTuple<\n\tconst T extends readonly BcsType<any>[],\n\tconst Name extends string =\n\t\t`(${JoinString<{ [K in keyof T]: T[K] extends BcsType<any, any, infer T> ? T : never }, ', '>})`,\n> extends BcsType<\n\t{\n\t\t-readonly [K in keyof T]: T[K] extends BcsType<infer T, any> ? T : never;\n\t},\n\t{\n\t\t[K in keyof T]: T[K] extends BcsType<any, infer T> ? T : never;\n\t},\n\tName\n> {\n\tconstructor({ fields, name, ...options }: BcsTupleOptions<T, Name>) {\n\t\tsuper({\n\t\t\tname: name ?? (`(${fields.map((t) => t.name).join(', ')})` as never),\n\t\t\tserializedSize: (values) => {\n\t\t\t\tlet total = 0;\n\t\t\t\tfor (let i = 0; i < fields.length; i++) {\n\t\t\t\t\tconst size = fields[i].serializedSize(values[i]);\n\t\t\t\t\tif (size == null) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\ttotal += size;\n\t\t\t\t}\n\n\t\t\t\treturn total;\n\t\t\t},\n\t\t\tread: (reader) => {\n\t\t\t\tconst result: unknown[] = [];\n\t\t\t\tfor (const field of fields) {\n\t\t\t\t\tresult.push(field.read(reader));\n\t\t\t\t}\n\t\t\t\treturn result as never;\n\t\t\t},\n\t\t\twrite: (value, writer) => {\n\t\t\t\tfor (let i = 0; i < fields.length; i++) {\n\t\t\t\t\tfields[i].write(value[i], writer);\n\t\t\t\t}\n\t\t\t},\n\t\t\t...options,\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (!Array.isArray(value)) {\n\t\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t\tif (value.length !== fields.length) {\n\t\t\t\t\tthrow new TypeError(`Expected array of length ${fields.length}, found ${value.length}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"bcs-type.mjs","names":["#write","#serialize","#validatedWrite","#transformValidate","#validatedSerialize","#schema","#bytes"],"sources":["../src/bcs-type.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase58, fromBase64, toBase58, toBase64, fromHex, toHex } from '@haneullabs/utils';\nimport { BcsReader } from './reader.js';\nimport { ulebEncode } from './uleb.js';\nimport type { BcsWriterOptions } from './writer.js';\nimport { BcsWriter } from './writer.js';\nimport type { EnumInputShape, EnumOutputShape, JoinString } from './types.js';\n\nexport interface BcsTypeOptions<T, Input = T, Name extends string = string> {\n\tname?: Name;\n\tvalidate?: (value: Input) => void;\n}\n\nexport class BcsType<T, Input = T, const Name extends string = string> {\n\t$inferType!: T;\n\t$inferInput!: Input;\n\tname: Name;\n\tread: (reader: BcsReader) => T;\n\tserializedSize: (value: Input, options?: BcsWriterOptions) => number | null;\n\tvalidate: (value: Input) => void;\n\t#write: (value: Input, writer: BcsWriter) => void;\n\t#serialize: (value: Input, options?: BcsWriterOptions) => Uint8Array<ArrayBuffer>;\n\t// Set by transform: validates and writes while converting the input only once. Only used\n\t// while validate is still the one transform created, so a reassigned validate is honoured.\n\t#validatedWrite: ((value: Input, writer: BcsWriter) => void) | null = null;\n\t#validatedSerialize:\n\t\t((value: Input, options?: BcsWriterOptions) => Uint8Array<ArrayBuffer>) | null = null;\n\t#transformValidate: ((value: Input) => void) | null = null;\n\n\tconstructor(\n\t\toptions: {\n\t\t\tname: Name;\n\t\t\tread: (reader: BcsReader) => T;\n\t\t\twrite: (value: Input, writer: BcsWriter) => void;\n\t\t\tserialize?: (value: Input, options?: BcsWriterOptions) => Uint8Array<ArrayBuffer>;\n\t\t\tserializedSize?: (value: Input) => number | null;\n\t\t\tvalidate?: (value: Input) => void;\n\t\t} & BcsTypeOptions<T, Input, Name>,\n\t) {\n\t\tthis.name = options.name;\n\t\tthis.read = options.read;\n\t\tthis.serializedSize = options.serializedSize ?? (() => null);\n\t\tthis.#write = options.write;\n\t\tthis.#serialize =\n\t\t\toptions.serialize ??\n\t\t\t((value, options) => {\n\t\t\t\tconst writer = new BcsWriter({\n\t\t\t\t\tinitialSize: this.serializedSize(value) ?? undefined,\n\t\t\t\t\t...options,\n\t\t\t\t});\n\t\t\t\tthis.#write(value, writer);\n\t\t\t\treturn writer.toBytes();\n\t\t\t});\n\n\t\tthis.validate = options.validate ?? (() => {});\n\t}\n\n\twrite(value: Input, writer: BcsWriter) {\n\t\tif (this.#validatedWrite && this.validate === this.#transformValidate) {\n\t\t\tthis.#validatedWrite(value, writer);\n\t\t\treturn;\n\t\t}\n\t\tthis.validate(value);\n\t\tthis.#write(value, writer);\n\t}\n\n\tserialize(value: Input, options?: BcsWriterOptions) {\n\t\tif (this.#validatedSerialize && this.validate === this.#transformValidate) {\n\t\t\treturn new SerializedBcs(this, this.#validatedSerialize(value, options));\n\t\t}\n\t\tthis.validate(value);\n\t\treturn new SerializedBcs(this, this.#serialize(value, options));\n\t}\n\n\tparse(bytes: Uint8Array): T {\n\t\tconst reader = new BcsReader(bytes);\n\t\treturn this.read(reader);\n\t}\n\n\tfromHex(hex: string) {\n\t\treturn this.parse(fromHex(hex));\n\t}\n\n\tfromBase58(b64: string) {\n\t\treturn this.parse(fromBase58(b64));\n\t}\n\n\tfromBase64(b64: string) {\n\t\treturn this.parse(fromBase64(b64));\n\t}\n\n\ttransform<T2 = T, Input2 = Input, NewName extends string = Name>({\n\t\tname,\n\t\tinput,\n\t\toutput,\n\t\tvalidate,\n\t}: {\n\t\tinput?: (val: Input2) => Input;\n\t\toutput?: (value: T) => T2;\n\t} & BcsTypeOptions<T2, Input2, NewName>) {\n\t\tconst type = new BcsType<T2, Input2, NewName>({\n\t\t\tname: (name ?? this.name) as NewName,\n\t\t\tread: (reader) => (output ? output(this.read(reader)) : (this.read(reader) as never)),\n\t\t\twrite: (value, writer) => this.#write(input ? input(value) : (value as never), writer),\n\t\t\tserializedSize: (value) => this.serializedSize(input ? input(value) : (value as never)),\n\t\t\tserialize: (value, options) =>\n\t\t\t\tthis.#serialize(input ? input(value) : (value as never), options),\n\t\t\tvalidate: (value) => {\n\t\t\t\tvalidate?.(value);\n\t\t\t\tthis.validate(input ? input(value) : (value as never));\n\t\t\t},\n\t\t});\n\n\t\t// Equivalent to validate() followed by the write above, but calls input() once instead of twice\n\t\ttype.#transformValidate = type.validate;\n\t\ttype.#validatedWrite = (value, writer) => {\n\t\t\tvalidate?.(value);\n\t\t\tconst converted = input ? input(value) : (value as never);\n\t\t\tthis.validate(converted);\n\t\t\tthis.#write(converted, writer);\n\t\t};\n\t\ttype.#validatedSerialize = (value, options) => {\n\t\t\tvalidate?.(value);\n\t\t\tconst converted = input ? input(value) : (value as never);\n\t\t\tthis.validate(converted);\n\t\t\treturn this.#serialize(converted, options);\n\t\t};\n\n\t\treturn type;\n\t}\n}\n\nconst SERIALIZED_BCS_BRAND = Symbol.for('@haneullabs/serialized-bcs') as never;\nexport function isSerializedBcs(obj: unknown): obj is SerializedBcs<unknown> {\n\treturn !!obj && typeof obj === 'object' && (obj as any)[SERIALIZED_BCS_BRAND] === true;\n}\n\nexport class SerializedBcs<T, Input = T> {\n\t#schema: BcsType<T, Input>;\n\t#bytes: Uint8Array<ArrayBuffer>;\n\n\t// Used to brand SerializedBcs so that they can be identified, even between multiple copies\n\t// of the @haneullabs/bcs package are installed\n\tget [SERIALIZED_BCS_BRAND]() {\n\t\treturn true;\n\t}\n\n\tconstructor(schema: BcsType<T, Input>, bytes: Uint8Array<ArrayBuffer>) {\n\t\tthis.#schema = schema;\n\t\tthis.#bytes = bytes;\n\t}\n\n\ttoBytes() {\n\t\treturn this.#bytes;\n\t}\n\n\ttoHex() {\n\t\treturn toHex(this.#bytes);\n\t}\n\n\ttoBase64() {\n\t\treturn toBase64(this.#bytes);\n\t}\n\n\ttoBase58() {\n\t\treturn toBase58(this.#bytes);\n\t}\n\n\tparse() {\n\t\treturn this.#schema.parse(this.#bytes);\n\t}\n}\n\nexport function fixedSizeBcsType<T, Input = T, const Name extends string = string>({\n\tsize,\n\t...options\n}: {\n\tname: Name;\n\tsize: number;\n\tread: (reader: BcsReader) => T;\n\twrite: (value: Input, writer: BcsWriter) => void;\n} & BcsTypeOptions<T, Input, Name>) {\n\treturn new BcsType<T, Input, Name>({\n\t\t...options,\n\t\tserializedSize: () => size,\n\t});\n}\n\nexport function uIntBcsType<const Name extends string = string>({\n\treadMethod,\n\twriteMethod,\n\t...options\n}: {\n\tname: Name;\n\tsize: number;\n\treadMethod: `read${8 | 16 | 32}`;\n\twriteMethod: `write${8 | 16 | 32}`;\n\tmaxValue: number;\n} & BcsTypeOptions<number, number, Name>) {\n\treturn fixedSizeBcsType<number, number, Name>({\n\t\t...options,\n\t\tread: (reader) => reader[readMethod](),\n\t\twrite: (value, writer) => writer[writeMethod](value),\n\t\tvalidate: (value) => {\n\t\t\tif (value < 0 || value > options.maxValue) {\n\t\t\t\tthrow new TypeError(\n\t\t\t\t\t`Invalid ${options.name} value: ${value}. Expected value in range 0-${options.maxValue}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\toptions.validate?.(value);\n\t\t},\n\t});\n}\n\nexport function bigUIntBcsType<const Name extends string = string>({\n\treadMethod,\n\twriteMethod,\n\t...options\n}: {\n\tname: Name;\n\tsize: number;\n\treadMethod: `read${64 | 128 | 256}`;\n\twriteMethod: `write${64 | 128 | 256}`;\n\tmaxValue: bigint;\n} & BcsTypeOptions<string, string | number | bigint>) {\n\treturn fixedSizeBcsType<string, string | number | bigint, Name>({\n\t\t...options,\n\t\tread: (reader) => reader[readMethod](),\n\t\twrite: (value, writer) => writer[writeMethod](BigInt(value)),\n\t\tvalidate: (val) => {\n\t\t\tconst value = BigInt(val);\n\t\t\tif (value < 0 || value > options.maxValue) {\n\t\t\t\tthrow new TypeError(\n\t\t\t\t\t`Invalid ${options.name} value: ${value}. Expected value in range 0-${options.maxValue}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\toptions.validate?.(value);\n\t\t},\n\t});\n}\n\nexport function dynamicSizeBcsType<T, Input = T, const Name extends string = string>({\n\tserialize,\n\t...options\n}: {\n\tname: Name;\n\tread: (reader: BcsReader) => T;\n\tserialize: (value: Input, options?: BcsWriterOptions) => Uint8Array<ArrayBuffer>;\n} & BcsTypeOptions<T, Input>) {\n\tconst type = new BcsType<T, Input>({\n\t\t...options,\n\t\tserialize,\n\t\twrite: (value, writer) => {\n\t\t\tfor (const byte of type.serialize(value).toBytes()) {\n\t\t\t\twriter.write8(byte);\n\t\t\t}\n\t\t},\n\t});\n\n\treturn type;\n}\n\nexport function stringLikeBcsType<const Name extends string = string>({\n\ttoBytes,\n\tfromBytes,\n\t...options\n}: {\n\tname: Name;\n\ttoBytes: (value: string) => Uint8Array;\n\tfromBytes: (bytes: Uint8Array) => string;\n\tserializedSize?: (value: string) => number | null;\n} & BcsTypeOptions<string, string, Name>) {\n\treturn new BcsType<string, string, Name>({\n\t\t...options,\n\t\tread: (reader) => {\n\t\t\tconst length = reader.readULEB();\n\t\t\tconst bytes = reader.readBytes(length);\n\n\t\t\treturn fromBytes(bytes);\n\t\t},\n\t\twrite: (hex, writer) => {\n\t\t\tconst bytes = toBytes(hex);\n\t\t\twriter.writeULEB(bytes.length);\n\t\t\twriter.writeBytes(bytes);\n\t\t},\n\t\tserialize: (value) => {\n\t\t\tconst bytes = toBytes(value);\n\t\t\tconst size = ulebEncode(bytes.length);\n\t\t\tconst result = new Uint8Array(size.length + bytes.length);\n\t\t\tresult.set(size, 0);\n\t\t\tresult.set(bytes, size.length);\n\n\t\t\treturn result;\n\t\t},\n\t\tvalidate: (value) => {\n\t\t\tif (typeof value !== 'string') {\n\t\t\t\tthrow new TypeError(`Invalid ${options.name} value: ${value}. Expected string`);\n\t\t\t}\n\t\t\toptions.validate?.(value);\n\t\t},\n\t});\n}\n\nexport function lazyBcsType<T, Input>(cb: () => BcsType<T, Input>) {\n\tlet lazyType: BcsType<T, Input> | null = null;\n\tfunction getType() {\n\t\tif (!lazyType) {\n\t\t\tlazyType = cb();\n\t\t}\n\t\treturn lazyType;\n\t}\n\n\treturn new BcsType<T, Input>({\n\t\tname: 'lazy' as never,\n\t\tread: (data) => getType().read(data),\n\t\tserializedSize: (value) => getType().serializedSize(value),\n\t\twrite: (value, writer) => getType().write(value, writer),\n\t\tserialize: (value, options) => getType().serialize(value, options).toBytes(),\n\t});\n}\n\nexport interface BcsStructOptions<\n\tT extends Record<string, BcsType<any>>,\n\tName extends string = string,\n> extends Omit<\n\tBcsTypeOptions<\n\t\t{\n\t\t\t[K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never;\n\t\t},\n\t\t{\n\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never;\n\t\t},\n\t\tName\n\t>,\n\t'name'\n> {\n\tname: Name;\n\tfields: T;\n}\n\nexport class BcsStruct<\n\tT extends Record<string, BcsType<any>>,\n\tconst Name extends string = string,\n> extends BcsType<\n\t{\n\t\t[K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never;\n\t},\n\t{\n\t\t[K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never;\n\t},\n\tName\n> {\n\tconstructor({ name, fields, ...options }: BcsStructOptions<T, Name>) {\n\t\tconst fieldNames = Object.keys(fields);\n\t\tconst fieldTypes = fieldNames.map((field) => fields[field]);\n\t\tconst fieldCount = fieldNames.length;\n\n\t\tsuper({\n\t\t\tname,\n\t\t\tserializedSize: (values) => {\n\t\t\t\tlet total = 0;\n\t\t\t\tfor (let i = 0; i < fieldCount; i++) {\n\t\t\t\t\tconst size = fieldTypes[i].serializedSize(values[fieldNames[i]]);\n\t\t\t\t\tif (size == null) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\ttotal += size;\n\t\t\t\t}\n\n\t\t\t\treturn total;\n\t\t\t},\n\t\t\tread: (reader) => {\n\t\t\t\tconst result: Record<string, unknown> = {};\n\t\t\t\tfor (let i = 0; i < fieldCount; i++) {\n\t\t\t\t\tresult[fieldNames[i]] = fieldTypes[i].read(reader);\n\t\t\t\t}\n\n\t\t\t\treturn result as never;\n\t\t\t},\n\t\t\twrite: (value, writer) => {\n\t\t\t\tfor (let i = 0; i < fieldCount; i++) {\n\t\t\t\t\tfieldTypes[i].write(value[fieldNames[i]], writer);\n\t\t\t\t}\n\t\t\t},\n\t\t\t...options,\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (typeof value !== 'object' || value == null) {\n\t\t\t\t\tthrow new TypeError(`Expected object, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n}\n\nexport interface BcsEnumOptions<\n\tT extends Record<string, BcsType<any> | null>,\n\tName extends string = string,\n> extends Omit<\n\tBcsTypeOptions<\n\t\tEnumOutputShape<{\n\t\t\t[K in keyof T]: T[K] extends BcsType<infer U, any, any> ? U : true;\n\t\t}>,\n\t\tEnumInputShape<{\n\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null;\n\t\t}>,\n\t\tName\n\t>,\n\t'name'\n> {\n\tname: Name;\n\tfields: T;\n}\n\nexport class BcsEnum<\n\tT extends Record<string, BcsType<any> | null>,\n\tconst Name extends string = string,\n> extends BcsType<\n\tEnumOutputShape<{\n\t\t[K in keyof T]: T[K] extends BcsType<infer U, any> ? U : true;\n\t}>,\n\tEnumInputShape<{\n\t\t[K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null;\n\t}>,\n\tName\n> {\n\tconstructor({ fields, ...options }: BcsEnumOptions<T, Name>) {\n\t\tconst canonicalOrder = Object.entries(fields as object);\n\t\tconst variantIndex = new Map(canonicalOrder.map(([name], i) => [name, i]));\n\t\tsuper({\n\t\t\tread: (reader) => {\n\t\t\t\tconst index = reader.readULEB();\n\n\t\t\t\tconst enumEntry = canonicalOrder[index];\n\t\t\t\tif (!enumEntry) {\n\t\t\t\t\tthrow new TypeError(`Unknown value ${index} for enum ${options.name}`);\n\t\t\t\t}\n\n\t\t\t\tconst [kind, type] = enumEntry;\n\n\t\t\t\tconst value = type?.read(reader) ?? true;\n\t\t\t\t// Assigning to __proto__ would set the prototype rather than add a property\n\t\t\t\tif (kind === '__proto__') {\n\t\t\t\t\treturn { [kind]: value, $kind: kind } as never;\n\t\t\t\t}\n\n\t\t\t\t// Avoid a computed-key object literal, which V8 builds through a slow runtime path\n\t\t\t\tconst result: Record<string, unknown> = {};\n\t\t\t\tresult[kind] = value;\n\t\t\t\tresult.$kind = kind;\n\n\t\t\t\treturn result as never;\n\t\t\t},\n\t\t\twrite: (value, writer) => {\n\t\t\t\t// The first own key that names a variant selects it\n\t\t\t\tfor (const name of Object.keys(value)) {\n\t\t\t\t\tconst index = variantIndex.get(name);\n\t\t\t\t\tif (index !== undefined) {\n\t\t\t\t\t\twriter.writeULEB(index);\n\t\t\t\t\t\tcanonicalOrder[index][1]?.write(value[name], writer);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t...options,\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (typeof value !== 'object' || value == null) {\n\t\t\t\t\tthrow new TypeError(`Expected object, found ${typeof value}`);\n\t\t\t\t}\n\n\t\t\t\tlet variantCount = 0;\n\t\t\t\tfor (const key of Object.keys(value)) {\n\t\t\t\t\tif (value[key] !== undefined && variantIndex.has(key)) {\n\t\t\t\t\t\tvariantCount++;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (variantCount !== 1) {\n\t\t\t\t\tthrow new TypeError(\n\t\t\t\t\t\t`Expected object with one key, but found ${variantCount} for type ${options.name}}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n}\n\nexport interface BcsTupleOptions<\n\tT extends readonly BcsType<any>[],\n\tName extends string,\n> extends Omit<\n\tBcsTypeOptions<\n\t\t{\n\t\t\t-readonly [K in keyof T]: T[K] extends BcsType<infer T, any> ? T : never;\n\t\t},\n\t\t{\n\t\t\t[K in keyof T]: T[K] extends BcsType<any, infer T> ? T : never;\n\t\t},\n\t\tName\n\t>,\n\t'name'\n> {\n\tname?: Name;\n\tfields: T;\n}\n\nexport class BcsTuple<\n\tconst T extends readonly BcsType<any>[],\n\tconst Name extends string =\n\t\t`(${JoinString<{ [K in keyof T]: T[K] extends BcsType<any, any, infer T> ? T : never }, ', '>})`,\n> extends BcsType<\n\t{\n\t\t-readonly [K in keyof T]: T[K] extends BcsType<infer T, any> ? T : never;\n\t},\n\t{\n\t\t[K in keyof T]: T[K] extends BcsType<any, infer T> ? T : never;\n\t},\n\tName\n> {\n\tconstructor({ fields, name, ...options }: BcsTupleOptions<T, Name>) {\n\t\tsuper({\n\t\t\tname: name ?? (`(${fields.map((t) => t.name).join(', ')})` as never),\n\t\t\tserializedSize: (values) => {\n\t\t\t\tlet total = 0;\n\t\t\t\tfor (let i = 0; i < fields.length; i++) {\n\t\t\t\t\tconst size = fields[i].serializedSize(values[i]);\n\t\t\t\t\tif (size == null) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\ttotal += size;\n\t\t\t\t}\n\n\t\t\t\treturn total;\n\t\t\t},\n\t\t\tread: (reader) => {\n\t\t\t\tconst result: unknown[] = [];\n\t\t\t\tfor (const field of fields) {\n\t\t\t\t\tresult.push(field.read(reader));\n\t\t\t\t}\n\t\t\t\treturn result as never;\n\t\t\t},\n\t\t\twrite: (value, writer) => {\n\t\t\t\tfor (let i = 0; i < fields.length; i++) {\n\t\t\t\t\tfields[i].write(value[i], writer);\n\t\t\t\t}\n\t\t\t},\n\t\t\t...options,\n\t\t\tvalidate: (value) => {\n\t\t\t\toptions?.validate?.(value);\n\t\t\t\tif (!Array.isArray(value)) {\n\t\t\t\t\tthrow new TypeError(`Expected array, found ${typeof value}`);\n\t\t\t\t}\n\t\t\t\tif (value.length !== fields.length) {\n\t\t\t\t\tthrow new TypeError(`Expected array of length ${fields.length}, found ${value.length}`);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n}\n"],"mappings":"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"}
package/dist/bcs.d.mts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { EnumInputShape, EnumOutputShape, InferBcsInput, InferBcsType, JoinString } from "./types.mjs";
2
2
  import { BcsEnum, BcsStruct, BcsTuple, BcsType, BcsTypeOptions } from "./bcs-type.mjs";
3
-
4
3
  //#region src/bcs.d.ts
5
4
  declare function fixedArray<T extends BcsType<any>, Name extends string = string>(size: number, type: T, options?: BcsTypeOptions<InferBcsType<T>[], Iterable<InferBcsInput<T>> & {
6
5
  length: number;
@@ -133,7 +132,7 @@ declare const bcs: {
133
132
  * const tuple = bcs.tuple([bcs.u8(), bcs.string(), bcs.bool()])
134
133
  * tuple.serialize([1, 'a', true]).toBytes() // Uint8Array [ 1, 1, 97, 1 ]
135
134
  */
136
- tuple<const T extends readonly BcsType<any, any>[], const Name extends string = `(${JoinString<{ [K in keyof T]: T[K] extends BcsType<any, any, infer T_1 extends string> ? T_1 : never }, ", ">})`>(fields: T, options?: BcsTypeOptions<{ -readonly [K_1 in keyof T]: T[K_1] extends BcsType<infer T_1, any> ? T_1 : never }, { [K_1 in keyof T]: T[K_1] extends BcsType<any, infer T_1> ? T_1 : never }, Name>): BcsTuple<T, Name>;
135
+ tuple<const T extends readonly BcsType<any, any>[], const Name extends string = `(${JoinString<{ [K in keyof T]: T[K] extends BcsType<any, any, infer T_1 extends string> ? T_1 : never; }, ", ">})`>(fields: T, options?: BcsTypeOptions<{ -readonly [K in keyof T]: T[K] extends BcsType<infer T_1, any> ? T_1 : never; }, { [K in keyof T]: T[K] extends BcsType<any, infer T_1> ? T_1 : never; }, Name>): BcsTuple<T, Name>;
137
136
  /**
138
137
  * Creates a BcsType representing a struct of a given set of fields
139
138
  * @param name The name of the struct
@@ -146,7 +145,7 @@ declare const bcs: {
146
145
  * })
147
146
  * struct.serialize({ a: 1, b: 'a' }).toBytes() // Uint8Array [ 1, 1, 97 ]
148
147
  */
149
- struct<T extends Record<string, BcsType<any>>, const Name extends string = string>(name: Name, fields: T, options?: Omit<BcsTypeOptions<{ [K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never }, { [K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never }>, "name">): BcsStruct<T, string>;
148
+ struct<T extends Record<string, BcsType<any>>, const Name extends string = string>(name: Name, fields: T, options?: Omit<BcsTypeOptions<{ [K in keyof T]: T[K] extends BcsType<infer U, any> ? U : never; }, { [K in keyof T]: T[K] extends BcsType<any, infer U> ? U : never; }>, 'name'>): BcsStruct<T, string>;
150
149
  /**
151
150
  * Creates a BcsType representing an enum of a given set of options
152
151
  * @param name The name of the enum
@@ -163,7 +162,7 @@ declare const bcs: {
163
162
  * enum.serialize({ B: 'a' }).toBytes() // Uint8Array [ 1, 1, 97 ]
164
163
  * enum.serialize({ C: true }).toBytes() // Uint8Array [ 2 ]
165
164
  */
166
- enum<T extends Record<string, BcsType<any> | null>, const Name extends string = string>(name: Name, fields: T, options?: Omit<BcsTypeOptions<EnumOutputShape<{ [K in keyof T]: T[K] extends BcsType<infer U, any, any> ? U : true }>, EnumInputShape<{ [K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null }>, Name>, "name">): BcsEnum<T, Name>;
165
+ enum<T extends Record<string, BcsType<any> | null>, const Name extends string = string>(name: Name, fields: T, options?: Omit<BcsTypeOptions<EnumOutputShape<{ [K in keyof T]: T[K] extends BcsType<infer U, any, any> ? U : true; }>, EnumInputShape<{ [K in keyof T]: T[K] extends BcsType<any, infer U, any> ? U : boolean | object | null; }>, Name>, 'name'>): BcsEnum<T, Name>;
167
166
  /**
168
167
  * Creates a BcsType representing a map of a given key and value type
169
168
  * @param keyType The BcsType of the key
@@ -1 +1 @@
1
- {"version":3,"file":"bcs.d.mts","names":[],"sources":["../src/bcs.ts"],"mappings":"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"}
1
+ {"version":3,"file":"bcs.d.mts","names":[],"sources":["../src/bcs.ts"],"mappings":";;;iBAyBS,WAAW,UAAU,cAAc,8BAC3C,cACA,MAAM,GACN,UAAU,eACT,aAAa,MACb,SAAS,cAAc;EAAQ;GAC/B,QAEC,QAAQ,aAAa,MAAM,SAAS,cAAc;EAAQ;GAAkB;iBACtE,WAAW,GAAG,OAAO,8BAC7B,cACA,MAAM,QAAQ,GAAG,QACjB,UAAU,eAAe,KAAK,SAAS;EAAW;GAAkB,QAClE,QAAQ,KAAK,SAAS;EAAW;GAAkB;iBAqC7C,OAAO,UAAU,cACzB,MAAM,IACJ,QAAQ,aAAa,WAAW,cAAc,iCAAiC;iBACzE,OAAO,GAAG,OAAO,8BACzB,MAAM,QAAQ,GAAG,OAAO,QACtB,QAAQ,UAAU;iBAkCZ,OAAO,UAAU,cAAc,gCAAgC,cACvE,MAAM,GACN,UAAU,eACT,aAAa,MACb,SAAS,cAAc;EAAQ;GAC/B,QAEC,QAAQ,aAAa,MAAM,SAAS,cAAc;EAAQ;GAAkB;iBACtE,OAAO,GAAG,OAAO,8BACzB,MAAM,QAAQ,GAAG,OAAO,OACxB,UAAU,eAAe,KAAK,SAAS;EAAW;aAA4B,WAC5E,QAAQ,KAAK,SAAS;EAAW;aAA4B;;;;;;iBAwChD,gBAAgB,GAAG,YAAY,GAAG;iBAUzC,IAAI,UAAU,cAAc,UAAU,cAC9C,SAAS,GACT,WAAW,IACT,QACF,IAAI,aAAa,IAAI,aAAa,KAClC,IAAI,cAAc,IAAI,cAAc,YAC7B,cAAc;iBAEb,IAAI,GAAG,GAAG,SAAS,GAAG,SAAS,GACvC,SAAS,QAAQ,GAAG,SACpB,WAAW,QAAQ,GAAG,UACpB,QAAQ,IAAI,GAAG,IAAI,IAAI,QAAQ;cA4DrB;;;;;;EAMC,GAAA,UAAA,yBAAsB;;;;;;EAgBrB,IAAA,UAAA,yBAAsB;;;;;;EAgBtB,IAAA,UAAA,yBAAsB;;;;;;EAgBtB,IAAA,UAAA,mDAAgD;;;;;;EAgB/C,KAAA,UAAA,mDAAgD;;;;;;EAgBhD,KAAA,UAAA,mDAAgD;;;;;;EAgBhD,KAAA,UAAA,0BAAuB;;;;;;EA2BpB,QAAA,UAAA,yBAAsB;;;;;;;EAiBlC,MAAA,kBAAgB,MAAQ,GAAC,UAAY,eAAe,YAAY,oBAAiB,QAAA,WAAA,kBAAA,2BAAA;;;;;;;EA2BlE,WAAA,UAAA,eAAe,YAAY,oBAAiB,QAAA,WAAA,kBAAA;;;;;;EAgChD,OAAA,UAAA,yBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4ChC,YAAA,mBAAmB,2BACnB,0BAAmB,cACN,WAAC,IAAA,EAAA,WAAA,wBAAA,sBAAA,0BAAA,QAEZ,GAAC,UACC,4BAEG,WAAW,IAAI,EAAE,WAAW,cAAc,YAAU,mBAG9D,WAAW,IAAI,EAAE,WAAW,mBAAmB,OAAK,gBAEtD,QACA,SAAA,GAAA;;;;;;;;;;;;;EAoBK,OAAA,UAAU,eAAe,qBAAqB,8BAAmB,MACjE,MAAI,QACF,GAAC,UACC,KACT,kBAEG,WAAW,IAAI,EAAE,WAAW,cAAc,UAAU,iBAGpD,WAAW,IAAI,EAAE,WAAW,mBAAmB,KAAK,yBAIvD,UAAA;;;;;;;;;;;;;;;;;EAyBG,KAAA,UAAU,eAAe,4BAA4B,8BAAmB,MACtE,MAAI,QACF,GAAC,UACC,KACT,eACC,mBACE,WAAW,IAAI,EAAE,WAAW,cAAc,eAAe,cAE3D,kBACE,WAAW,IAAI,EAAE,WAAW,mBAAmB,UAAU,iCAE3D,iBAGD,QAAA,GAAA;;;;;;;;;;;;;;EAuBG,KAAA,UAAU,cAAY,UAAY,IAAI"}