@nnilky/structo 1.0.1 → 1.0.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.
Files changed (74) hide show
  1. package/README.md +130 -0
  2. package/dist/datatypes/containers/array.d.ts +2 -0
  3. package/dist/datatypes/containers/array.js +22 -0
  4. package/dist/datatypes/containers/array.test.d.ts +1 -0
  5. package/dist/datatypes/containers/array.test.js +22 -0
  6. package/dist/datatypes/containers/fastObject.d.ts +19 -0
  7. package/dist/datatypes/containers/fastObject.js +59 -0
  8. package/dist/datatypes/containers/list.d.ts +5 -0
  9. package/dist/datatypes/containers/list.js +22 -0
  10. package/dist/datatypes/containers/list.test.d.ts +1 -0
  11. package/dist/datatypes/containers/list.test.js +31 -0
  12. package/dist/datatypes/containers/object.d.ts +20 -0
  13. package/dist/datatypes/containers/object.js +35 -0
  14. package/dist/datatypes/containers/object.test.d.ts +1 -0
  15. package/dist/datatypes/containers/object.test.js +33 -0
  16. package/dist/datatypes/containers/sizedbuffer.d.ts +2 -0
  17. package/dist/datatypes/containers/sizedbuffer.js +17 -0
  18. package/dist/datatypes/containers/sizedbuffer.test.d.ts +1 -0
  19. package/dist/datatypes/containers/sizedbuffer.test.js +27 -0
  20. package/dist/datatypes/index.d.ts +16 -0
  21. package/dist/datatypes/index.js +16 -0
  22. package/dist/datatypes/lazy.d.ts +1 -0
  23. package/dist/datatypes/lazy.js +1 -0
  24. package/dist/datatypes/numbers/bigints.d.ts +3 -0
  25. package/dist/datatypes/numbers/bigints.js +37 -0
  26. package/dist/datatypes/numbers/bigints.test.d.ts +1 -0
  27. package/dist/datatypes/numbers/bigints.test.js +61 -0
  28. package/dist/datatypes/numbers/floats.d.ts +3 -0
  29. package/dist/datatypes/numbers/floats.js +30 -0
  30. package/dist/datatypes/numbers/floats.test.d.ts +1 -0
  31. package/dist/datatypes/numbers/floats.test.js +71 -0
  32. package/dist/datatypes/numbers/sints.d.ts +5 -0
  33. package/dist/datatypes/numbers/sints.js +72 -0
  34. package/dist/datatypes/numbers/sints.test.d.ts +1 -0
  35. package/dist/datatypes/numbers/sints.test.js +87 -0
  36. package/dist/datatypes/numbers/uints.d.ts +5 -0
  37. package/dist/datatypes/numbers/uints.js +76 -0
  38. package/dist/datatypes/numbers/uints.test.d.ts +1 -0
  39. package/dist/datatypes/numbers/uints.test.js +87 -0
  40. package/dist/datatypes/transforms/pipe.d.ts +11 -0
  41. package/dist/datatypes/transforms/pipe.js +4 -0
  42. package/dist/datatypes/transforms/pipe.test.d.ts +1 -0
  43. package/dist/datatypes/transforms/pipe.test.js +13 -0
  44. package/dist/datatypes/transforms/readOffset.d.ts +2 -0
  45. package/dist/datatypes/transforms/readOffset.js +18 -0
  46. package/dist/datatypes/transforms/transform.d.ts +2 -0
  47. package/dist/datatypes/transforms/transform.js +13 -0
  48. package/dist/datatypes/utilities/constant.d.ts +2 -0
  49. package/dist/datatypes/utilities/constant.js +13 -0
  50. package/dist/datatypes/utilities/remember.d.ts +5 -0
  51. package/dist/datatypes/utilities/remember.js +26 -0
  52. package/dist/datatypes/utils.test.d.ts +7 -0
  53. package/dist/datatypes/utils.test.js +33 -0
  54. package/dist/datatypes/values/buffer.d.ts +2 -0
  55. package/dist/datatypes/values/buffer.js +18 -0
  56. package/dist/datatypes/values/buffer.test.d.ts +1 -0
  57. package/dist/datatypes/values/buffer.test.js +43 -0
  58. package/dist/datatypes/values/byteliteral.d.ts +2 -0
  59. package/dist/datatypes/values/byteliteral.js +20 -0
  60. package/dist/datatypes/values/string.d.ts +2 -0
  61. package/dist/datatypes/values/string.js +22 -0
  62. package/dist/datatypes/values/string.test.d.ts +1 -0
  63. package/dist/datatypes/values/string.test.js +18 -0
  64. package/dist/index.d.ts +4 -0
  65. package/dist/index.js +3 -0
  66. package/dist/read.d.ts +7 -0
  67. package/dist/read.js +10 -0
  68. package/dist/types.d.ts +18 -0
  69. package/dist/types.js +1 -0
  70. package/dist/utils.test.d.ts +1 -0
  71. package/dist/utils.test.js +1 -0
  72. package/dist/write.d.ts +3 -0
  73. package/dist/write.js +43 -0
  74. package/package.json +4 -4
@@ -0,0 +1,20 @@
1
+ export function byteLiteral(bytes) {
2
+ const length = bytes.length;
3
+ return {
4
+ size: bytes.length,
5
+ read: (ctx) => {
6
+ const arr = new Uint8Array(ctx.view.buffer);
7
+ for (let i = 0; i < length; i++) {
8
+ if (arr[ctx.offset + i] !== bytes[i]) {
9
+ throw new Error("Invalid Value");
10
+ }
11
+ }
12
+ ctx.offset += length;
13
+ return bytes;
14
+ },
15
+ write(ctx) {
16
+ new Uint8Array(ctx.view.buffer).set(bytes, ctx.offset);
17
+ ctx.offset += length;
18
+ },
19
+ };
20
+ }
@@ -0,0 +1,2 @@
1
+ import type { Serializer } from "../../types";
2
+ export declare function string(length: Serializer<number>): Serializer<string>;
@@ -0,0 +1,22 @@
1
+ export function string(length) {
2
+ const { read: readLength, write: writeLength, size: lengthSize = 0 } = length;
3
+ const encoder = new TextEncoder();
4
+ const decoder = new TextDecoder();
5
+ return {
6
+ write: (ctx, value) => {
7
+ const bytes = encoder.encode(value);
8
+ const length = bytes.byteLength;
9
+ ctx.alloc(length + lengthSize);
10
+ writeLength(ctx, length);
11
+ const arr = new Uint8Array(ctx.buffer, ctx.offset);
12
+ arr.set(bytes);
13
+ ctx.offset += length;
14
+ },
15
+ read: (ctx) => {
16
+ const length = readLength(ctx);
17
+ const section = ctx.buffer.slice(ctx.offset, ctx.offset + length);
18
+ ctx.offset += length;
19
+ return decoder.decode(section);
20
+ },
21
+ };
22
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,18 @@
1
+ import { describe, it } from "bun:test";
2
+ import { expectEncode, expectError } from "../utils.test";
3
+ import * as st from "../../index";
4
+ describe("st.string", () => {
5
+ const string_u8 = st.string(st.u8());
6
+ const string_u32 = st.string(st.u32());
7
+ it("encode correctly", () => {
8
+ expectEncode(string_u8, "foo");
9
+ });
10
+ it("works on empty strings", () => {
11
+ expectEncode(string_u32, "");
12
+ });
13
+ it("errors on too long strings", () => {
14
+ expectError(() => {
15
+ st.write(string_u8, "A".repeat(256));
16
+ });
17
+ });
18
+ });
@@ -0,0 +1,4 @@
1
+ export type { InferInput as Infer, InferInput, InferOutput, ReaderContext, WriterContext, Serializer, } from "./types";
2
+ export * from "./datatypes";
3
+ export { read, createReaderContext } from "./read";
4
+ export { write, createdWriterContext } from "./write";
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from "./datatypes";
2
+ export { read, createReaderContext } from "./read";
3
+ export { write, createdWriterContext } from "./write";
package/dist/read.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ import type { Serializer } from "./types";
2
+ export declare function read<T>(serializer: Serializer<T>, buffer: ArrayBuffer): T;
3
+ export declare function createReaderContext(buffer: ArrayBuffer): {
4
+ offset: number;
5
+ buffer: ArrayBuffer;
6
+ view: DataView<ArrayBuffer>;
7
+ };
package/dist/read.js ADDED
@@ -0,0 +1,10 @@
1
+ export function read(serializer, buffer) {
2
+ return serializer.read(createReaderContext(buffer));
3
+ }
4
+ export function createReaderContext(buffer) {
5
+ return {
6
+ offset: 0,
7
+ buffer,
8
+ view: new DataView(buffer),
9
+ };
10
+ }
@@ -0,0 +1,18 @@
1
+ export type Serializer<TIn, TOut = TIn> = {
2
+ size?: number | undefined;
3
+ write: (ctx: WriterContext, value: TIn) => void;
4
+ read: (ctx: ReaderContext) => TOut;
5
+ };
6
+ export interface WriterContext {
7
+ buffer: ArrayBuffer;
8
+ view: DataView;
9
+ offset: number;
10
+ alloc: (length: number) => void;
11
+ }
12
+ export interface ReaderContext {
13
+ buffer: ArrayBuffer;
14
+ view: DataView;
15
+ offset: number;
16
+ }
17
+ export type InferInput<T> = T extends Serializer<infer V> ? V : never;
18
+ export type InferOutput<T> = T extends Serializer<any, infer V> ? V : never;
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ import type { WriterContext, Serializer } from "./types";
2
+ export declare function write<T>(serializer: Serializer<T>, value: T): ArrayBuffer;
3
+ export declare function createdWriterContext(type: Serializer<any>): WriterContext;
package/dist/write.js ADDED
@@ -0,0 +1,43 @@
1
+ export function write(serializer, value) {
2
+ const ctx = createdWriterContext(serializer);
3
+ serializer.write(ctx, value);
4
+ if (ctx.buffer.byteLength === ctx.offset) {
5
+ return ctx.buffer;
6
+ }
7
+ else {
8
+ return ctx.buffer.transfer(ctx.offset);
9
+ }
10
+ }
11
+ export function createdWriterContext(type) {
12
+ if (type.size) {
13
+ let buffer = new ArrayBuffer(type.size);
14
+ const view = new DataView(buffer);
15
+ return {
16
+ offset: 0,
17
+ buffer,
18
+ view,
19
+ alloc: Function.prototype,
20
+ };
21
+ }
22
+ else {
23
+ let bufferLength = 128;
24
+ let buffer = new ArrayBuffer(bufferLength, { maxByteLength: 1024 });
25
+ const view = new DataView(buffer);
26
+ return {
27
+ offset: 0,
28
+ buffer,
29
+ view,
30
+ alloc(length) {
31
+ if (length < 0)
32
+ return;
33
+ if (buffer.resizable) {
34
+ }
35
+ while (this.offset + length > bufferLength) {
36
+ bufferLength = bufferLength * 2;
37
+ this.buffer.resize(bufferLength);
38
+ this.view = new DataView(this.buffer);
39
+ }
40
+ },
41
+ };
42
+ }
43
+ }
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "A library for serializing and deserializing binary content",
4
4
  "keywords": ["binary", "library", "utility", "web", "node"],
5
5
  "license": "ISC",
6
- "version": "1.0.1",
6
+ "version": "1.0.3",
7
7
  "author": "Ben Brady",
8
8
  "private": false,
9
9
  "publishConfig": {"access": "public"},
@@ -34,9 +34,9 @@
34
34
  "files": [
35
35
  "LICENSE",
36
36
  "README.md",
37
- "./dist/*.d.ts",
38
- "./dist/*.js.map",
39
- "./dist/*.js"
37
+ "./dist/**/*.d.ts",
38
+ "./dist/**/*.js.map",
39
+ "./dist/**/*.js"
40
40
  ],
41
41
 
42
42
  "scripts": {