@nnilky/structo 1.0.7 → 1.0.9

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 (91) hide show
  1. package/README.md +3 -3
  2. package/dist/datatypes/containers/array.d.ts +1 -1
  3. package/dist/datatypes/containers/array.js +9 -0
  4. package/dist/datatypes/containers/array.test.js +2 -2
  5. package/dist/datatypes/containers/exhuastiveArray.d.ts +2 -2
  6. package/dist/datatypes/containers/exhuastiveArray.js +13 -2
  7. package/dist/datatypes/containers/exhuastiveArray.test.js +2 -2
  8. package/dist/datatypes/containers/fastObject.d.ts +3 -3
  9. package/dist/datatypes/containers/fastObject.js +2 -2
  10. package/dist/datatypes/containers/fastObject.test.js +2 -2
  11. package/dist/datatypes/containers/list.d.ts +1 -1
  12. package/dist/datatypes/containers/list.js +14 -2
  13. package/dist/datatypes/containers/list.test.js +2 -2
  14. package/dist/datatypes/containers/object.d.ts +1 -1
  15. package/dist/datatypes/containers/object.js +8 -8
  16. package/dist/datatypes/containers/object.test.js +2 -2
  17. package/dist/datatypes/containers/taggedUnion.d.ts +1 -1
  18. package/dist/datatypes/containers/taggedUnion.test.js +2 -2
  19. package/dist/datatypes/index.d.ts +13 -13
  20. package/dist/datatypes/index.js +13 -13
  21. package/dist/datatypes/numbers/bigints.d.ts +1 -1
  22. package/dist/datatypes/numbers/bigints.test.js +2 -2
  23. package/dist/datatypes/numbers/floats.d.ts +1 -1
  24. package/dist/datatypes/numbers/floats.test.js +2 -2
  25. package/dist/datatypes/numbers/sints.d.ts +1 -1
  26. package/dist/datatypes/numbers/sints.test.js +2 -2
  27. package/dist/datatypes/numbers/uints.d.ts +1 -1
  28. package/dist/datatypes/numbers/uints.test.js +2 -2
  29. package/dist/datatypes/values/bytes.d.ts +1 -1
  30. package/dist/datatypes/values/bytes.test.js +2 -2
  31. package/dist/datatypes/values/sizedbytes.d.ts +1 -1
  32. package/dist/datatypes/values/sizedbytes.test.js +2 -2
  33. package/dist/datatypes/values/string.d.ts +1 -1
  34. package/dist/datatypes/values/string.test.js +5 -2
  35. package/dist/index.d.ts +6 -6
  36. package/dist/index.js +5 -5
  37. package/dist/read.d.ts +2 -6
  38. package/dist/read.js +9 -1
  39. package/dist/transforms/encode.d.ts +5 -2
  40. package/dist/transforms/encode.js +2 -1
  41. package/dist/transforms/enum.d.ts +1 -1
  42. package/dist/transforms/enum.js +12 -9
  43. package/dist/transforms/enum.test.js +2 -2
  44. package/dist/transforms/index.d.ts +11 -12
  45. package/dist/transforms/index.js +11 -12
  46. package/dist/transforms/literal.d.ts +1 -1
  47. package/dist/transforms/literal.js +12 -9
  48. package/dist/transforms/literal.test.js +2 -2
  49. package/dist/transforms/modify.d.ts +20 -2
  50. package/dist/transforms/modify.js +21 -1
  51. package/dist/transforms/modify.test.d.ts +1 -0
  52. package/dist/transforms/modify.test.js +17 -0
  53. package/dist/transforms/offset.d.ts +2 -0
  54. package/dist/transforms/offset.js +20 -0
  55. package/dist/transforms/offset.test.d.ts +1 -0
  56. package/dist/transforms/offset.test.js +39 -0
  57. package/dist/transforms/pipe.d.ts +1 -1
  58. package/dist/transforms/pipe.js +1 -1
  59. package/dist/transforms/toAscii.d.ts +1 -1
  60. package/dist/transforms/toAscii.js +7 -4
  61. package/dist/transforms/toAscii.test.js +2 -2
  62. package/dist/transforms/toBase64.d.ts +1 -1
  63. package/dist/transforms/toBase64.js +5 -2
  64. package/dist/transforms/toBase64.test.js +2 -2
  65. package/dist/transforms/toBytes.d.ts +1 -1
  66. package/dist/transforms/toBytes.js +5 -2
  67. package/dist/transforms/toBytes.test.js +2 -2
  68. package/dist/transforms/toHex.d.ts +1 -1
  69. package/dist/transforms/toHex.js +5 -2
  70. package/dist/transforms/toHex.test.js +2 -2
  71. package/dist/transforms/toTypedArray.d.ts +1 -1
  72. package/dist/transforms/toTypedArray.js +5 -2
  73. package/dist/transforms/toTypedArray.test.js +2 -2
  74. package/dist/types.d.ts +3 -0
  75. package/dist/utilities/index.d.ts +3 -2
  76. package/dist/utilities/index.js +3 -2
  77. package/dist/utilities/lazy.d.ts +1 -1
  78. package/dist/utilities/lazy.js +4 -4
  79. package/dist/utilities/lazy.test.js +2 -2
  80. package/dist/utilities/reference.d.ts +18 -0
  81. package/dist/utilities/reference.js +91 -0
  82. package/dist/utilities/reference.test.d.ts +1 -0
  83. package/dist/utilities/reference.test.js +63 -0
  84. package/dist/utilities/remember.d.ts +7 -6
  85. package/dist/utilities/remember.js +45 -8
  86. package/dist/utilities/remember.test.js +3 -7
  87. package/dist/utils.test.d.ts +1 -1
  88. package/dist/utils.test.js +1 -1
  89. package/dist/write.d.ts +1 -1
  90. package/dist/write.js +9 -1
  91. package/package.json +9 -9
@@ -1,17 +1,18 @@
1
- import type { Serializer } from "../types";
1
+ import type { Serializer } from "../types.js";
2
2
  /**
3
3
  * createRememberedValue lets you save and recall a value when serializing
4
4
  *
5
+ * This is useful for checksums and other values calculated from a writen value
6
+ *
5
7
  * ```
6
- * const length = st.createRememberedValue<number>()
8
+ * const data = st.createRememberedValue<ArrayBuffer>()
7
9
  * st.object({
8
- * length: length.save(st.u32()),
9
- * type: st.u8(),
10
- * data: st.sizedBytes(length.load())
10
+ * data: data.save(st.bytes(1024))
11
+ * checksum: crc32(data.load())
11
12
  * })
12
13
  * ```
13
14
  */
14
15
  export declare function createRememberedValue<T>(): {
15
16
  save: (serializer: Serializer<T>) => Serializer<T>;
16
- load: (serializer?: Serializer<T>) => Serializer<T>;
17
+ load: (behaviour?: "pop" | "retain") => Serializer<T>;
17
18
  };
@@ -1,17 +1,30 @@
1
1
  /**
2
2
  * createRememberedValue lets you save and recall a value when serializing
3
3
  *
4
+ * This is useful for checksums and other values calculated from a writen value
5
+ *
4
6
  * ```
5
- * const length = st.createRememberedValue<number>()
7
+ * const data = st.createRememberedValue<ArrayBuffer>()
6
8
  * st.object({
7
- * length: length.save(st.u32()),
8
- * type: st.u8(),
9
- * data: st.sizedBytes(length.load())
9
+ * data: data.save(st.bytes(1024))
10
+ * checksum: crc32(data.load())
10
11
  * })
11
12
  * ```
12
13
  */
13
14
  export function createRememberedValue() {
14
15
  const stack = [];
16
+ /**
17
+ * Transparently writes/reads the underlying value but stores the value written.
18
+ *
19
+ * ---
20
+ * ```
21
+ * const data = st.createRememberedValue<ArrayBuffer>()
22
+ * st.object({
23
+ * data: data.save(st.bytes(1024))
24
+ * checksum: crc32(data.load())
25
+ * })
26
+ * ```
27
+ * */
15
28
  function save(serializer) {
16
29
  return {
17
30
  size: serializer.size,
@@ -27,11 +40,35 @@ export function createRememberedValue() {
27
40
  },
28
41
  };
29
42
  }
30
- function load(serializer) {
43
+ /**
44
+ * Retrieves the last value written by `.save()`
45
+ *
46
+ * By default, the value is forgotten when written so that memory isn't leaked.
47
+ * It can be retained by setting `behaviour` to `"retain"`
48
+ *
49
+ * When writing this type does nothing
50
+ *
51
+ * ---
52
+ * ```
53
+ * const data = st.createRememberedValue<ArrayBuffer>()
54
+ * st.object({
55
+ * data: data.save(st.bytes(1024))
56
+ * checksum: crc32(data.load())
57
+ * })
58
+ * ```
59
+ */
60
+ function load(behaviour = "pop") {
31
61
  return {
32
- size: serializer?.size ?? 0,
33
- read: () => stack.pop(),
34
- write: (ctx) => serializer && serializer.write(ctx, stack.pop()),
62
+ size: 0,
63
+ read: () => {
64
+ if (behaviour === "pop") {
65
+ return stack.pop();
66
+ }
67
+ else {
68
+ return stack.at(-1);
69
+ }
70
+ },
71
+ write: () => { },
35
72
  };
36
73
  }
37
74
  return { save: save, load: load };
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, it } from "bun:test";
2
- import { encodeTest, encodeSnapshotTest } from "../utils.test";
3
- import * as st from "../index";
2
+ import { encodeTest, encodeSnapshotTest } from "../utils.test.js";
3
+ import * as st from "../index.js";
4
4
  describe("st.remember", () => {
5
5
  it("encodes correctly", () => {
6
6
  const v = st.createRememberedValue();
@@ -37,7 +37,7 @@ describe("st.remember", () => {
37
37
  const v = st.createRememberedValue();
38
38
  const spec = st.object({
39
39
  a: v.save(st.u32()),
40
- b: v.load(st.u8()),
40
+ b: v.load(),
41
41
  });
42
42
  encodeTest(spec, { a: 3, b: 0 }, { a: 3, b: 3 });
43
43
  });
@@ -68,9 +68,5 @@ describe("st.remember", () => {
68
68
  a: 3,
69
69
  b: [1, 3, 4],
70
70
  });
71
- encodeSnapshotTest(st.object({
72
- a: v.save(st.u32()),
73
- b: v.load(st.u8()),
74
- }), { a: 3, b: 0 });
75
71
  });
76
72
  });
@@ -1,4 +1,4 @@
1
- import * as st from "./index";
1
+ import * as st from "./index.js";
2
2
  export declare const randint: (start: number, end: number) => number;
3
3
  export declare const randbigint: (start: bigint, end: bigint) => bigint;
4
4
  export declare const encodeTest: <TIn, TOut>(serializer: st.Serializer<TIn, TOut>, value: TIn, expected?: TOut) => void;
@@ -1,6 +1,6 @@
1
1
  //@ts-ignore TODO
2
2
  import { describe, it, expect } from "bun:test";
3
- import * as st from "./index";
3
+ import * as st from "./index.js";
4
4
  export const randint = (start, end) => {
5
5
  const range = end - start;
6
6
  return Math.floor(start + range * Math.random());
package/dist/write.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- import type { WriterContext, Serializer } from "./types";
1
+ import type { WriterContext, Serializer } from "./types.js";
2
2
  export declare function write<TIn, TOut>(serializer: Serializer<TIn, TOut>, value: TIn): ArrayBuffer;
3
3
  export declare function createdWriterContext(type: Serializer<any>): WriterContext;
package/dist/write.js CHANGED
@@ -1,6 +1,12 @@
1
1
  export function write(serializer, value) {
2
2
  const ctx = createdWriterContext(serializer);
3
- serializer.write(ctx, value);
3
+ try {
4
+ serializer.write(ctx, value);
5
+ }
6
+ catch (e) {
7
+ const path = ctx.stack.join("") ?? "root";
8
+ throw new Error(`Serialization error at value${path}`, { cause: e });
9
+ }
4
10
  if (ctx.buffer.byteLength === ctx.offset) {
5
11
  return ctx.buffer;
6
12
  }
@@ -13,6 +19,7 @@ export function createdWriterContext(type) {
13
19
  let buffer = new ArrayBuffer(type.size);
14
20
  const view = new DataView(buffer);
15
21
  return {
22
+ stack: [],
16
23
  offset: 0,
17
24
  buffer,
18
25
  view,
@@ -24,6 +31,7 @@ export function createdWriterContext(type) {
24
31
  let buffer = new ArrayBuffer(bufferLength);
25
32
  const view = new DataView(buffer);
26
33
  return {
34
+ stack: [],
27
35
  offset: 0,
28
36
  buffer,
29
37
  view,
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "node"
10
10
  ],
11
11
  "license": "ISC",
12
- "version": "1.0.7",
12
+ "version": "1.0.9",
13
13
  "author": "Ben Brady",
14
14
  "private": false,
15
15
  "publishConfig": {
@@ -44,12 +44,6 @@
44
44
  "./dist/**/*.js.map",
45
45
  "./dist/**/*.js"
46
46
  ],
47
- "scripts": {
48
- "build": "tsc",
49
- "prepublish": "tsc",
50
- "check": "tsc --noEmit",
51
- "test": "bun test src --only-failures --coverage"
52
- },
53
47
  "devDependencies": {
54
48
  "@types/bun": "^1.3.14",
55
49
  "@types/node": "^25.9.2",
@@ -57,5 +51,11 @@
57
51
  "jest": "^30.4.2",
58
52
  "typescript": "^6.0.3"
59
53
  },
60
- "packageManager": "pnpm@10.13.1"
61
- }
54
+ "scripts": {
55
+ "build": "tsc",
56
+ "prepublish": "tsc",
57
+ "check": "tsc --noEmit",
58
+ "test": "bun test src --only-failures",
59
+ "test:coverage": "bun test src --only-failures --coverage"
60
+ }
61
+ }