@yume-chan/struct 0.0.23 → 0.0.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/CHANGELOG.json +12 -0
  2. package/CHANGELOG.md +8 -1
  3. package/LICENSE +1 -1
  4. package/esm/basic/field-value.d.ts +2 -2
  5. package/esm/basic/field-value.d.ts.map +1 -1
  6. package/esm/basic/field-value.js.map +1 -1
  7. package/esm/basic/struct-value.d.ts +6 -2
  8. package/esm/basic/struct-value.d.ts.map +1 -1
  9. package/esm/basic/struct-value.js +5 -0
  10. package/esm/basic/struct-value.js.map +1 -1
  11. package/esm/struct.d.ts +27 -14
  12. package/esm/struct.d.ts.map +1 -1
  13. package/esm/struct.js +31 -18
  14. package/esm/struct.js.map +1 -1
  15. package/esm/sync-promise.d.ts +2 -2
  16. package/esm/sync-promise.d.ts.map +1 -1
  17. package/esm/sync-promise.js.map +1 -1
  18. package/esm/types/bigint.d.ts +13 -14
  19. package/esm/types/bigint.d.ts.map +1 -1
  20. package/esm/types/bigint.js +16 -17
  21. package/esm/types/bigint.js.map +1 -1
  22. package/esm/types/buffer/base.d.ts +31 -27
  23. package/esm/types/buffer/base.d.ts.map +1 -1
  24. package/esm/types/buffer/base.js +25 -26
  25. package/esm/types/buffer/base.js.map +1 -1
  26. package/esm/types/buffer/fixed-length.d.ts +2 -2
  27. package/esm/types/buffer/fixed-length.d.ts.map +1 -1
  28. package/esm/types/buffer/fixed-length.js.map +1 -1
  29. package/esm/types/buffer/variable-length.d.ts +10 -9
  30. package/esm/types/buffer/variable-length.d.ts.map +1 -1
  31. package/esm/types/buffer/variable-length.js +30 -19
  32. package/esm/types/buffer/variable-length.js.map +1 -1
  33. package/esm/types/number.d.ts +13 -13
  34. package/esm/types/number.d.ts.map +1 -1
  35. package/esm/types/number.js +22 -34
  36. package/esm/types/number.js.map +1 -1
  37. package/esm/utils.d.ts.map +1 -1
  38. package/esm/utils.js +6 -4
  39. package/esm/utils.js.map +1 -1
  40. package/package.json +8 -10
  41. package/src/basic/field-value.ts +7 -7
  42. package/src/basic/struct-value.ts +21 -3
  43. package/src/struct.ts +106 -65
  44. package/src/sync-promise.ts +9 -9
  45. package/src/types/bigint.ts +40 -37
  46. package/src/types/buffer/base.ts +48 -47
  47. package/src/types/buffer/fixed-length.ts +9 -4
  48. package/src/types/buffer/variable-length.ts +55 -31
  49. package/src/types/number.ts +32 -39
  50. package/src/utils.ts +6 -4
  51. package/tsconfig.build.tsbuildinfo +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"number.js","sourceRoot":"","sources":["../../src/types/number.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"number.js","sourceRoot":"","sources":["../../src/types/number.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;AAE5B;;GAEG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG,KAAK,CAAC;AAE/E;;GAEG;AACH,MAAM,MAAM,SAAS,CAAC,KAAK,SAAS,MAAM,EAAE,IAAI,SAAS,MAAM,IAAI,QAAQ,CACvE,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,GAAG,IAAI,CACjC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,IAAI,CAC3B,CAAC,EACD;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC;CAAE,CAAC,MAAM,CAAC,CAAC,CAClE,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,EAAE,MAAM,IAAI;KAC/B,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,GAAG,IAAI,GAAG,KAAK;CAC3D,CAAC,MAAM,CAAC,CAAC,CAAC;AAEX,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAEnD;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,KAAK,CAAC,CAElC;AAgCD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAEpD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,WAAW,GAAG,MAAM,CAExE"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;AAE5B;;GAEG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG,KAAK,CAAC;AAE/E;;GAEG;AACH,MAAM,MAAM,SAAS,CAAC,KAAK,SAAS,MAAM,EAAE,IAAI,SAAS,MAAM,IAAI,QAAQ,CACvE,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,GAAG,IAAI,CACjC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,IAAI,CAC3B,CAAC,EACD;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC;CAAE,CAAC,MAAM,CAAC,CAAC,CAClE,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,EAAE,MAAM,IAAI;KAC/B,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,GAAG,IAAI,GAAG,KAAK;CAC3D,CAAC,MAAM,CAAC,CAAC,CAAC;AAEX,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAEnD;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,KAAK,CAAC,CAElC;AAgCD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAEpD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,WAAW,GAAG,MAAM,CAIxE"}
package/esm/utils.js CHANGED
@@ -5,12 +5,14 @@ export function placeholder() {
5
5
  return undefined;
6
6
  }
7
7
  const { TextEncoder, TextDecoder } = globalThis;
8
- const Utf8Encoder = new TextEncoder();
9
- const Utf8Decoder = new TextDecoder();
8
+ const SharedEncoder = new TextEncoder();
9
+ const SharedDecoder = new TextDecoder();
10
10
  export function encodeUtf8(input) {
11
- return Utf8Encoder.encode(input);
11
+ return SharedEncoder.encode(input);
12
12
  }
13
13
  export function decodeUtf8(buffer) {
14
- return Utf8Decoder.decode(buffer);
14
+ // `TextDecoder` has internal states in stream mode,
15
+ // but this method is not for stream mode, so the instance can be reused
16
+ return SharedDecoder.decode(buffer);
15
17
  }
16
18
  //# sourceMappingURL=utils.js.map
package/esm/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAgDA;;GAEG;AACH,MAAM,UAAU,WAAW;IACvB,OAAO,SAAyB,CAAC;AACrC,CAAC;AA2BD,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,UAAwC,CAAC;AAE9E,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AACtC,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC,MAAM,UAAU,UAAU,CAAC,KAAa;IACpC,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAqC;IAC5D,OAAO,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAgDA;;GAEG;AACH,MAAM,UAAU,WAAW;IACvB,OAAO,SAAyB,CAAC;AACrC,CAAC;AA2BD,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,UAAwC,CAAC;AAE9E,MAAM,aAAa,GAAG,IAAI,WAAW,EAAE,CAAC;AACxC,MAAM,aAAa,GAAG,IAAI,WAAW,EAAE,CAAC;AAExC,MAAM,UAAU,UAAU,CAAC,KAAa;IACpC,OAAO,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAqC;IAC5D,oDAAoD;IACpD,wEAAwE;IACxE,OAAO,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yume-chan/struct",
3
- "version": "0.0.23",
3
+ "version": "0.0.24",
4
4
  "description": "C-style structure serializer and deserializer.",
5
5
  "keywords": [
6
6
  "structure",
@@ -27,24 +27,22 @@
27
27
  "main": "esm/index.js",
28
28
  "types": "esm/index.d.ts",
29
29
  "dependencies": {
30
- "@yume-chan/dataview-bigint-polyfill": "^0.0.23",
31
- "tslib": "^2.6.2"
30
+ "@yume-chan/no-data-view": "^0.0.24"
32
31
  },
33
32
  "devDependencies": {
34
- "@jest/globals": "^30.0.0-alpha.3",
33
+ "@jest/globals": "^30.0.0-alpha.4",
35
34
  "@yume-chan/eslint-config": "^1.0.0",
36
35
  "@yume-chan/tsconfig": "^1.0.0",
37
36
  "cross-env": "^7.0.3",
38
- "eslint": "^8.57.0",
39
- "jest": "^30.0.0-alpha.3",
40
- "prettier": "^3.2.5",
41
- "ts-jest": "^29.1.2",
42
- "typescript": "^5.4.2"
37
+ "jest": "^30.0.0-alpha.4",
38
+ "prettier": "^3.3.2",
39
+ "ts-jest": "^29.1.4",
40
+ "typescript": "^5.4.5"
43
41
  },
44
42
  "scripts": {
45
43
  "build": "tsc -b tsconfig.build.json",
46
44
  "build:watch": "tsc -b tsconfig.build.json",
47
45
  "test": "cross-env NODE_OPTIONS=\"--experimental-vm-modules --no-warnings\" TS_JEST_DISABLE_VER_CHECKER=true jest --coverage",
48
- "lint": "eslint src/**/*.ts --fix && prettier src/**/*.ts --write --tab-width 4"
46
+ "lint": "run-eslint && prettier src/**/*.ts --write --tab-width 4"
49
47
  }
50
48
  }
@@ -9,11 +9,7 @@ import type { StructValue } from "./struct-value.js";
9
9
  * helpful for the serialization process.
10
10
  */
11
11
  export abstract class StructFieldValue<
12
- TDefinition extends StructFieldDefinition<
13
- any,
14
- any,
15
- any
16
- > = StructFieldDefinition<any, any, any>,
12
+ TDefinition extends StructFieldDefinition<unknown, unknown, PropertyKey>,
17
13
  > {
18
14
  /** Gets the definition associated with this runtime value */
19
15
  readonly definition: TDefinition;
@@ -58,7 +54,7 @@ export abstract class StructFieldValue<
58
54
  * When implemented in derived classes, reads current field's value.
59
55
  */
60
56
  get(): TDefinition["TValue"] {
61
- return this.value;
57
+ return this.value as never;
62
58
  }
63
59
 
64
60
  /**
@@ -71,5 +67,9 @@ export abstract class StructFieldValue<
71
67
  /**
72
68
  * When implemented in derived classes, serializes this field into `dataView` at `offset`
73
69
  */
74
- abstract serialize(dataView: DataView, offset: number): void;
70
+ abstract serialize(
71
+ dataView: DataView,
72
+ array: Uint8Array,
73
+ offset: number,
74
+ ): void;
75
75
  }
@@ -1,14 +1,25 @@
1
+ import type { StructFieldDefinition } from "./definition.js";
1
2
  import type { StructFieldValue } from "./field-value.js";
2
3
 
3
4
  export const STRUCT_VALUE_SYMBOL = Symbol("struct-value");
4
5
 
6
+ export function isStructValueInit(
7
+ value: unknown,
8
+ ): value is { [STRUCT_VALUE_SYMBOL]: StructValue } {
9
+ return (
10
+ typeof value === "object" &&
11
+ value !== null &&
12
+ STRUCT_VALUE_SYMBOL in value
13
+ );
14
+ }
15
+
5
16
  /**
6
17
  * A struct value is a map between keys in a struct and their field values.
7
18
  */
8
19
  export class StructValue {
9
20
  /** @internal */ readonly fieldValues: Record<
10
21
  PropertyKey,
11
- StructFieldValue
22
+ StructFieldValue<StructFieldDefinition<unknown, unknown, PropertyKey>>
12
23
  > = {};
13
24
 
14
25
  /**
@@ -35,7 +46,12 @@ export class StructValue {
35
46
  * @param name The field name
36
47
  * @param fieldValue The associated `StructFieldValue`
37
48
  */
38
- set(name: PropertyKey, fieldValue: StructFieldValue): void {
49
+ set(
50
+ name: PropertyKey,
51
+ fieldValue: StructFieldValue<
52
+ StructFieldDefinition<unknown, unknown, PropertyKey>
53
+ >,
54
+ ): void {
39
55
  this.fieldValues[name] = fieldValue;
40
56
 
41
57
  // PERF: `Object.defineProperty` is slow
@@ -61,7 +77,9 @@ export class StructValue {
61
77
  *
62
78
  * @param name The field name
63
79
  */
64
- get(name: PropertyKey): StructFieldValue {
80
+ get(
81
+ name: PropertyKey,
82
+ ): StructFieldValue<StructFieldDefinition<unknown, unknown, PropertyKey>> {
65
83
  return this.fieldValues[name]!;
66
84
  }
67
85
  }
package/src/struct.ts CHANGED
@@ -1,3 +1,5 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+
1
3
  import type {
2
4
  AsyncExactReadable,
3
5
  ExactReadable,
@@ -10,22 +12,23 @@ import {
10
12
  STRUCT_VALUE_SYMBOL,
11
13
  StructDefaultOptions,
12
14
  StructValue,
15
+ isStructValueInit,
13
16
  } from "./basic/index.js";
14
17
  import { SyncPromise } from "./sync-promise.js";
15
18
  import type {
16
- BufferFieldSubType,
19
+ BufferFieldConverter,
17
20
  FixedLengthBufferLikeFieldOptions,
18
21
  LengthField,
19
22
  VariableLengthBufferLikeFieldOptions,
20
23
  } from "./types/index.js";
21
24
  import {
22
25
  BigIntFieldDefinition,
23
- BigIntFieldType,
26
+ BigIntFieldVariant,
24
27
  FixedLengthBufferLikeFieldDefinition,
25
28
  NumberFieldDefinition,
26
- NumberFieldType,
27
- StringBufferFieldSubType,
28
- Uint8ArrayBufferFieldSubType,
29
+ NumberFieldVariant,
30
+ StringBufferFieldConverter,
31
+ Uint8ArrayBufferFieldConverter,
29
32
  VariableLengthBufferLikeFieldDefinition,
30
33
  } from "./types/index.js";
31
34
  import type { Evaluate, Identity, Overwrite, ValueOrPromise } from "./utils.js";
@@ -50,7 +53,7 @@ type AddFieldDescriptor<
50
53
  TExtra extends object,
51
54
  TPostDeserialized,
52
55
  TFieldName extends PropertyKey,
53
- TDefinition extends StructFieldDefinition<any, any, any>,
56
+ TDefinition extends StructFieldDefinition<unknown, unknown, PropertyKey>,
54
57
  > = Identity<
55
58
  Struct<
56
59
  // Merge two types
@@ -83,7 +86,7 @@ interface ArrayBufferLikeFieldCreator<
83
86
  */
84
87
  <
85
88
  TName extends PropertyKey,
86
- TType extends BufferFieldSubType<any, any>,
89
+ TType extends BufferFieldConverter<unknown, unknown>,
87
90
  TTypeScriptType = TType["TTypeScriptType"],
88
91
  >(
89
92
  name: TName,
@@ -107,7 +110,7 @@ interface ArrayBufferLikeFieldCreator<
107
110
  */
108
111
  <
109
112
  TName extends PropertyKey,
110
- TType extends BufferFieldSubType<any, any>,
113
+ TType extends BufferFieldConverter<unknown, unknown>,
111
114
  TOptions extends VariableLengthBufferLikeFieldOptions<TFields>,
112
115
  TTypeScriptType = TType["TTypeScriptType"],
113
116
  >(
@@ -133,7 +136,7 @@ interface BoundArrayBufferLikeFieldDefinitionCreator<
133
136
  TOmitInitKey extends PropertyKey,
134
137
  TExtra extends object,
135
138
  TPostDeserialized,
136
- TType extends BufferFieldSubType<any, any>,
139
+ TType extends BufferFieldConverter<unknown, unknown>,
137
140
  > {
138
141
  <TName extends PropertyKey, TTypeScriptType = TType["TTypeScriptType"]>(
139
142
  name: TName,
@@ -154,10 +157,9 @@ interface BoundArrayBufferLikeFieldDefinitionCreator<
154
157
 
155
158
  <
156
159
  TName extends PropertyKey,
157
- TLengthField extends LengthField<TFields>,
158
160
  TOptions extends VariableLengthBufferLikeFieldOptions<
159
161
  TFields,
160
- TLengthField
162
+ LengthField<TFields>
161
163
  >,
162
164
  TTypeScriptType = TType["TTypeScriptType"],
163
165
  >(
@@ -212,6 +214,20 @@ export class StructEmptyError extends StructDeserializeError {
212
214
  }
213
215
  }
214
216
 
217
+ interface StructDefinition<
218
+ TFields extends object,
219
+ TOmitInitKey extends PropertyKey,
220
+ TExtra extends object,
221
+ > {
222
+ readonly TFields: TFields;
223
+
224
+ readonly TOmitInitKey: TOmitInitKey;
225
+
226
+ readonly TExtra: TExtra;
227
+
228
+ readonly TInit: Evaluate<Omit<TFields, TOmitInitKey>>;
229
+ }
230
+
215
231
  export class Struct<
216
232
  TFields extends object = Record<never, never>,
217
233
  TOmitInitKey extends PropertyKey = never,
@@ -248,18 +264,18 @@ export class Struct<
248
264
 
249
265
  #fields: [
250
266
  name: PropertyKey,
251
- definition: StructFieldDefinition<any, any, any>,
267
+ definition: StructFieldDefinition<unknown, unknown, PropertyKey>,
252
268
  ][] = [];
253
269
  get fields(): readonly [
254
270
  name: PropertyKey,
255
- definition: StructFieldDefinition<any, any, any>,
271
+ definition: StructFieldDefinition<unknown, unknown, PropertyKey>,
256
272
  ][] {
257
273
  return this.#fields;
258
274
  }
259
275
 
260
276
  #extra: Record<PropertyKey, unknown> = {};
261
277
 
262
- #postDeserialized?: StructPostDeserialized<any, any> | undefined;
278
+ #postDeserialized?: StructPostDeserialized<never, unknown> | undefined;
263
279
 
264
280
  constructor(options?: Partial<Readonly<StructOptions>>) {
265
281
  this.options = { ...StructDefaultOptions, ...options };
@@ -270,7 +286,11 @@ export class Struct<
270
286
  */
271
287
  field<
272
288
  TName extends PropertyKey,
273
- TDefinition extends StructFieldDefinition<any, any, any>,
289
+ TDefinition extends StructFieldDefinition<
290
+ unknown,
291
+ unknown,
292
+ PropertyKey
293
+ >,
274
294
  >(
275
295
  name: TName,
276
296
  definition: TDefinition,
@@ -298,13 +318,15 @@ export class Struct<
298
318
  this.#size += size;
299
319
 
300
320
  // Force cast `this` to another type
301
- return this as any;
321
+ return this as never;
302
322
  }
303
323
 
304
324
  /**
305
325
  * Merges (flats) another `Struct`'s fields and extra fields into this one.
326
+ *
327
+ * `other`'s `postDeserialize` will be ignored.
306
328
  */
307
- concat<TOther extends Struct<any, any, any, any>>(
329
+ concat<TOther extends StructDefinition<object, PropertyKey, object>>(
308
330
  other: TOther,
309
331
  ): Struct<
310
332
  TFields & TOther["TFields"],
@@ -312,6 +334,10 @@ export class Struct<
312
334
  TExtra & TOther["TExtra"],
313
335
  TPostDeserialized
314
336
  > {
337
+ if (!(other instanceof Struct)) {
338
+ throw new TypeError("The other value must be a `Struct` instance");
339
+ }
340
+
315
341
  for (const field of other.#fields) {
316
342
  this.#fields.push(field);
317
343
  }
@@ -320,12 +346,12 @@ export class Struct<
320
346
  this.#extra,
321
347
  Object.getOwnPropertyDescriptors(other.#extra),
322
348
  );
323
- return this as any;
349
+ return this as never;
324
350
  }
325
351
 
326
352
  #number<
327
353
  TName extends PropertyKey,
328
- TType extends NumberFieldType = NumberFieldType,
354
+ TType extends NumberFieldVariant = NumberFieldVariant,
329
355
  TTypeScriptType = number,
330
356
  >(name: TName, type: TType, typeScriptType?: TTypeScriptType) {
331
357
  return this.field(
@@ -341,7 +367,7 @@ export class Struct<
341
367
  name: TName,
342
368
  typeScriptType?: TTypeScriptType,
343
369
  ) {
344
- return this.#number(name, NumberFieldType.Int8, typeScriptType);
370
+ return this.#number(name, NumberFieldVariant.Int8, typeScriptType);
345
371
  }
346
372
 
347
373
  /**
@@ -351,7 +377,7 @@ export class Struct<
351
377
  name: TName,
352
378
  typeScriptType?: TTypeScriptType,
353
379
  ) {
354
- return this.#number(name, NumberFieldType.Uint8, typeScriptType);
380
+ return this.#number(name, NumberFieldVariant.Uint8, typeScriptType);
355
381
  }
356
382
 
357
383
  /**
@@ -361,7 +387,7 @@ export class Struct<
361
387
  name: TName,
362
388
  typeScriptType?: TTypeScriptType,
363
389
  ) {
364
- return this.#number(name, NumberFieldType.Int16, typeScriptType);
390
+ return this.#number(name, NumberFieldVariant.Int16, typeScriptType);
365
391
  }
366
392
 
367
393
  /**
@@ -371,7 +397,7 @@ export class Struct<
371
397
  name: TName,
372
398
  typeScriptType?: TTypeScriptType,
373
399
  ) {
374
- return this.#number(name, NumberFieldType.Uint16, typeScriptType);
400
+ return this.#number(name, NumberFieldVariant.Uint16, typeScriptType);
375
401
  }
376
402
 
377
403
  /**
@@ -381,7 +407,7 @@ export class Struct<
381
407
  name: TName,
382
408
  typeScriptType?: TTypeScriptType,
383
409
  ) {
384
- return this.#number(name, NumberFieldType.Int32, typeScriptType);
410
+ return this.#number(name, NumberFieldVariant.Int32, typeScriptType);
385
411
  }
386
412
 
387
413
  /**
@@ -391,12 +417,12 @@ export class Struct<
391
417
  name: TName,
392
418
  typeScriptType?: TTypeScriptType,
393
419
  ) {
394
- return this.#number(name, NumberFieldType.Uint32, typeScriptType);
420
+ return this.#number(name, NumberFieldVariant.Uint32, typeScriptType);
395
421
  }
396
422
 
397
423
  #bigint<
398
424
  TName extends PropertyKey,
399
- TType extends BigIntFieldType = BigIntFieldType,
425
+ TType extends BigIntFieldVariant = BigIntFieldVariant,
400
426
  TTypeScriptType = TType["TTypeScriptType"],
401
427
  >(name: TName, type: TType, typeScriptType?: TTypeScriptType) {
402
428
  return this.field(
@@ -412,9 +438,9 @@ export class Struct<
412
438
  */
413
439
  int64<
414
440
  TName extends PropertyKey,
415
- TTypeScriptType = BigIntFieldType["TTypeScriptType"],
441
+ TTypeScriptType = BigIntFieldVariant["TTypeScriptType"],
416
442
  >(name: TName, typeScriptType?: TTypeScriptType) {
417
- return this.#bigint(name, BigIntFieldType.Int64, typeScriptType);
443
+ return this.#bigint(name, BigIntFieldVariant.Int64, typeScriptType);
418
444
  }
419
445
 
420
446
  /**
@@ -424,9 +450,9 @@ export class Struct<
424
450
  */
425
451
  uint64<
426
452
  TName extends PropertyKey,
427
- TTypeScriptType = BigIntFieldType["TTypeScriptType"],
453
+ TTypeScriptType = BigIntFieldVariant["TTypeScriptType"],
428
454
  >(name: TName, typeScriptType?: TTypeScriptType) {
429
- return this.#bigint(name, BigIntFieldType.Uint64, typeScriptType);
455
+ return this.#bigint(name, BigIntFieldVariant.Uint64, typeScriptType);
430
456
  }
431
457
 
432
458
  #arrayBufferLike: ArrayBufferLikeFieldCreator<
@@ -436,21 +462,21 @@ export class Struct<
436
462
  TPostDeserialized
437
463
  > = (
438
464
  name: PropertyKey,
439
- type: BufferFieldSubType,
465
+ type: BufferFieldConverter,
440
466
  options:
441
467
  | FixedLengthBufferLikeFieldOptions
442
468
  | VariableLengthBufferLikeFieldOptions,
443
- ): any => {
469
+ ): never => {
444
470
  if ("length" in options) {
445
471
  return this.field(
446
472
  name,
447
473
  new FixedLengthBufferLikeFieldDefinition(type, options),
448
- );
474
+ ) as never;
449
475
  } else {
450
476
  return this.field(
451
477
  name,
452
478
  new VariableLengthBufferLikeFieldDefinition(type, options),
453
- );
479
+ ) as never;
454
480
  }
455
481
  };
456
482
 
@@ -459,14 +485,18 @@ export class Struct<
459
485
  TOmitInitKey,
460
486
  TExtra,
461
487
  TPostDeserialized,
462
- Uint8ArrayBufferFieldSubType
463
- > = (name: PropertyKey, options: any, typeScriptType: any): any => {
488
+ Uint8ArrayBufferFieldConverter
489
+ > = (
490
+ name: PropertyKey,
491
+ options: unknown,
492
+ typeScriptType: unknown,
493
+ ): never => {
464
494
  return this.#arrayBufferLike(
465
495
  name,
466
- Uint8ArrayBufferFieldSubType.Instance,
467
- options,
496
+ Uint8ArrayBufferFieldConverter.Instance,
497
+ options as never,
468
498
  typeScriptType,
469
- );
499
+ ) as never;
470
500
  };
471
501
 
472
502
  string: BoundArrayBufferLikeFieldDefinitionCreator<
@@ -474,14 +504,18 @@ export class Struct<
474
504
  TOmitInitKey,
475
505
  TExtra,
476
506
  TPostDeserialized,
477
- StringBufferFieldSubType
478
- > = (name: PropertyKey, options: any, typeScriptType: any): any => {
507
+ StringBufferFieldConverter
508
+ > = (
509
+ name: PropertyKey,
510
+ options: unknown,
511
+ typeScriptType: unknown,
512
+ ): never => {
479
513
  return this.#arrayBufferLike(
480
514
  name,
481
- StringBufferFieldSubType.Instance,
482
- options,
515
+ StringBufferFieldConverter.Instance,
516
+ options as never,
483
517
  typeScriptType,
484
- );
518
+ ) as never;
485
519
  };
486
520
 
487
521
  /**
@@ -507,7 +541,7 @@ export class Struct<
507
541
  this.#extra,
508
542
  Object.getOwnPropertyDescriptors(value),
509
543
  );
510
- return this as any;
544
+ return this as never;
511
545
  }
512
546
 
513
547
  /**
@@ -537,9 +571,9 @@ export class Struct<
537
571
  postDeserialize<TPostSerialize>(
538
572
  callback?: StructPostDeserialized<TFields, TPostSerialize>,
539
573
  ): Struct<TFields, TOmitInitKey, TExtra, TPostSerialize>;
540
- postDeserialize(callback?: StructPostDeserialized<TFields, any>) {
574
+ postDeserialize(callback?: StructPostDeserialized<TFields, unknown>) {
541
575
  this.#postDeserialized = callback;
542
- return this as any;
576
+ return this as never;
543
577
  }
544
578
 
545
579
  /**
@@ -590,31 +624,35 @@ export class Struct<
590
624
 
591
625
  // Run `postDeserialized`
592
626
  if (this.#postDeserialized) {
593
- const override = this.#postDeserialized.call(value, value);
627
+ const override = this.#postDeserialized.call(
628
+ value as never,
629
+ value as never,
630
+ );
594
631
  // If it returns a new value, use that as result
595
632
  // Otherwise it only inspects/mutates the object in place.
596
633
  if (override !== undefined) {
597
- return override;
634
+ return override as never;
598
635
  }
599
636
  }
600
637
 
601
- return value;
638
+ return value as never;
602
639
  })
603
640
  .valueOrPromise();
604
641
  }
605
642
 
606
- serialize(init: Evaluate<Omit<TFields, TOmitInitKey>>): Uint8Array;
607
- serialize(
608
- init: Evaluate<Omit<TFields, TOmitInitKey>>,
609
- output: Uint8Array,
610
- ): number;
643
+ /**
644
+ * Serialize a struct value to a buffer.
645
+ * @param init Fields of the struct
646
+ * @param output The buffer to serialize the struct to. It must be large enough to hold the entire struct. If not provided, a new buffer will be created.
647
+ * @returns A view of `output` that contains the serialized struct, or a new buffer if `output` is not provided.
648
+ */
611
649
  serialize(
612
650
  init: Evaluate<Omit<TFields, TOmitInitKey>>,
613
651
  output?: Uint8Array,
614
- ): Uint8Array | number {
652
+ ): Uint8Array {
615
653
  let structValue: StructValue;
616
- if (STRUCT_VALUE_SYMBOL in init) {
617
- structValue = (init as any)[STRUCT_VALUE_SYMBOL];
654
+ if (isStructValueInit(init)) {
655
+ structValue = init[STRUCT_VALUE_SYMBOL];
618
656
  for (const [key, value] of Object.entries(init)) {
619
657
  const fieldValue = structValue.get(key);
620
658
  if (fieldValue) {
@@ -627,14 +665,17 @@ export class Struct<
627
665
  const fieldValue = definition.create(
628
666
  this.options,
629
667
  structValue,
630
- (init as any)[name],
668
+ (init as Record<PropertyKey, unknown>)[name],
631
669
  );
632
670
  structValue.set(name, fieldValue);
633
671
  }
634
672
  }
635
673
 
636
674
  let structSize = 0;
637
- const fieldsInfo: { fieldValue: StructFieldValue; size: number }[] = [];
675
+ const fieldsInfo: {
676
+ fieldValue: StructFieldValue<any>;
677
+ size: number;
678
+ }[] = [];
638
679
 
639
680
  for (const [name] of this.#fields) {
640
681
  const fieldValue = structValue.get(name);
@@ -643,10 +684,10 @@ export class Struct<
643
684
  structSize += size;
644
685
  }
645
686
 
646
- let outputType = "number";
647
687
  if (!output) {
648
688
  output = new Uint8Array(structSize);
649
- outputType = "Uint8Array";
689
+ } else if (output.length < structSize) {
690
+ throw new TypeError("Output buffer is too small");
650
691
  }
651
692
 
652
693
  const dataView = new DataView(
@@ -656,12 +697,12 @@ export class Struct<
656
697
  );
657
698
  let offset = 0;
658
699
  for (const { fieldValue, size } of fieldsInfo) {
659
- fieldValue.serialize(dataView, offset);
700
+ fieldValue.serialize(dataView, output, offset);
660
701
  offset += size;
661
702
  }
662
703
 
663
- if (outputType === "number") {
664
- return structSize;
704
+ if (output.length !== structSize) {
705
+ return output.subarray(0, structSize);
665
706
  } else {
666
707
  return output;
667
708
  }