@nnilky/structo 1.0.9 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/dist/datatypes/containers/array.js +9 -12
- package/dist/datatypes/containers/exhuastiveArray.js +6 -6
- package/dist/datatypes/containers/list.js +7 -7
- package/dist/datatypes/containers/object.js +9 -8
- package/dist/datatypes/numbers/bigints.js +2 -2
- package/dist/datatypes/numbers/floats.js +12 -9
- package/dist/datatypes/numbers/sints.js +13 -10
- package/dist/datatypes/numbers/uints.js +13 -10
- package/dist/datatypes/values/bytes.d.ts +2 -2
- package/dist/datatypes/values/bytes.js +6 -6
- package/dist/datatypes/values/bytes.test.js +2 -2
- package/dist/datatypes/values/sizedbytes.d.ts +1 -1
- package/dist/datatypes/values/sizedbytes.js +3 -4
- package/dist/datatypes/values/sizedbytes.test.js +1 -1
- package/dist/datatypes/values/string.js +2 -3
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/read.d.ts +2 -3
- package/dist/read.js +10 -12
- package/dist/transforms/enum.d.ts +1 -1
- package/dist/transforms/literal.d.ts +1 -1
- package/dist/transforms/toAscii.d.ts +1 -1
- package/dist/transforms/toAscii.js +2 -2
- package/dist/transforms/toBase64.d.ts +1 -1
- package/dist/transforms/toBase64.js +2 -2
- package/dist/transforms/toBytes.d.ts +1 -1
- package/dist/transforms/toBytes.js +2 -2
- package/dist/transforms/toHex.d.ts +3 -3
- package/dist/transforms/toHex.js +4 -4
- package/dist/transforms/toTypedArray.d.ts +11 -6
- package/dist/transforms/toTypedArray.js +10 -5
- package/dist/transforms/toTypedArray.test.js +18 -9
- package/dist/types.d.ts +11 -9
- package/dist/utilities/remember.d.ts +1 -1
- package/dist/utilities/remember.js +3 -3
- package/dist/utils.test.d.ts +1 -1
- package/dist/utils.test.js +1 -3
- package/dist/write.d.ts +2 -2
- package/dist/write.js +47 -34
- package/package.json +7 -2
- package/dist/datatypes/containers/sizedbytes.d.ts +0 -2
- package/dist/datatypes/containers/sizedbytes.js +0 -17
- package/dist/datatypes/containers/sizedbytes.test.d.ts +0 -1
- package/dist/datatypes/containers/sizedbytes.test.js +0 -27
- package/dist/datatypes/containers/string.d.ts +0 -2
- package/dist/datatypes/containers/string.js +0 -24
- package/dist/datatypes/containers/string.test.d.ts +0 -1
- package/dist/datatypes/containers/string.test.js +0 -24
- package/dist/datatypes/transforms/encode.d.ts +0 -2
- package/dist/datatypes/transforms/encode.js +0 -7
- package/dist/datatypes/transforms/fixedOffset.d.ts +0 -2
- package/dist/datatypes/transforms/fixedOffset.js +0 -18
- package/dist/datatypes/transforms/modify.d.ts +0 -2
- package/dist/datatypes/transforms/modify.js +0 -7
- package/dist/datatypes/transforms/noAdvance.d.ts +0 -16
- package/dist/datatypes/transforms/noAdvance.js +0 -30
- package/dist/datatypes/transforms/pipe.d.ts +0 -11
- package/dist/datatypes/transforms/pipe.js +0 -16
- package/dist/datatypes/utilities/remember.d.ts +0 -15
- package/dist/datatypes/utilities/remember.js +0 -36
- package/dist/datatypes/utilities/remember.test.d.ts +0 -1
- package/dist/datatypes/utilities/remember.test.js +0 -44
- package/dist/datatypes/utils.test.d.ts +0 -8
- package/dist/datatypes/utils.test.js +0 -37
- package/dist/datatypes/values/byteliteral.d.ts +0 -2
- package/dist/datatypes/values/byteliteral.js +0 -20
- package/dist/datatypes/values/json.d.ts +0 -10
- package/dist/datatypes/values/json.js +0 -21
- package/dist/transforms/fixedOffset.d.ts +0 -2
- package/dist/transforms/fixedOffset.js +0 -18
- package/dist/transforms/noAdvance.d.ts +0 -16
- package/dist/transforms/noAdvance.js +0 -30
- package/dist/transforms/noAdvance.test.d.ts +0 -1
- package/dist/transforms/noAdvance.test.js +0 -17
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "bun:test";
|
|
2
|
-
import { expectEncode, expectEncodeSnapshot } from "../utils.test";
|
|
3
|
-
import * as st from "../../index";
|
|
4
|
-
describe("st.remember", () => {
|
|
5
|
-
const v = st.createRememberedValue();
|
|
6
|
-
it("encodes correctly", () => {
|
|
7
|
-
const spec = st.object({
|
|
8
|
-
a: v.save(st.u32()),
|
|
9
|
-
b: st.list(v.load(), st.u8()),
|
|
10
|
-
});
|
|
11
|
-
expectEncode(spec, {
|
|
12
|
-
a: 3,
|
|
13
|
-
b: [1, 3, 4],
|
|
14
|
-
});
|
|
15
|
-
});
|
|
16
|
-
it("omitted serializer doesn't write data ", () => {
|
|
17
|
-
const spec = st.object({
|
|
18
|
-
a: v.save(st.u32()),
|
|
19
|
-
b: v.load(),
|
|
20
|
-
});
|
|
21
|
-
const output = st.write(spec, { a: 3, b: 0 });
|
|
22
|
-
expect(output.byteLength).toBe(4);
|
|
23
|
-
});
|
|
24
|
-
it("serializer is used write data ", () => {
|
|
25
|
-
const spec = st.object({
|
|
26
|
-
a: v.save(st.u32()),
|
|
27
|
-
b: v.load(st.u8()),
|
|
28
|
-
});
|
|
29
|
-
expectEncode(spec, { a: 3, b: 0 }, { a: 3, b: 3 });
|
|
30
|
-
});
|
|
31
|
-
it("snapshots are correct", () => {
|
|
32
|
-
expectEncodeSnapshot(st.object({
|
|
33
|
-
a: v.save(st.u32()),
|
|
34
|
-
b: st.list(v.load(), st.u8()),
|
|
35
|
-
}), {
|
|
36
|
-
a: 3,
|
|
37
|
-
b: [1, 3, 4],
|
|
38
|
-
});
|
|
39
|
-
expectEncodeSnapshot(st.object({
|
|
40
|
-
a: v.save(st.u32()),
|
|
41
|
-
b: v.load(st.u8()),
|
|
42
|
-
}), { a: 3, b: 0 });
|
|
43
|
-
});
|
|
44
|
-
});
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import * as st from "../index";
|
|
2
|
-
export declare const randint: (start: number, end: number) => number;
|
|
3
|
-
export declare const randbigint: (start: bigint, end: bigint) => bigint;
|
|
4
|
-
export declare const expectEncode: <TIn, TOut>(serializer: st.Serializer<TIn, TOut>, value: TIn, expected?: TOut) => void;
|
|
5
|
-
export declare const expectEncodeSize: <TIn, TOut>(serializer: st.Serializer<TIn, TOut>, size: number, value: TIn) => void;
|
|
6
|
-
export declare const expectEncodeSnapshot: <T>(serializer: st.Serializer<T>, value: T) => void;
|
|
7
|
-
export declare const expectError: (callback: () => void) => void;
|
|
8
|
-
export declare const bytes: (bytes: number[]) => ArrayBuffer;
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
//@ts-ignore TODO
|
|
2
|
-
import { describe, it, expect } from "bun:test";
|
|
3
|
-
import * as st from "../index";
|
|
4
|
-
export const randint = (start, end) => {
|
|
5
|
-
const range = end - start;
|
|
6
|
-
return Math.floor(start + range * Math.random());
|
|
7
|
-
};
|
|
8
|
-
export const randbigint = (start, end) => {
|
|
9
|
-
const range = end - start;
|
|
10
|
-
const offset = BigInt(Math.floor(Number(range) * Math.random()));
|
|
11
|
-
return start + offset;
|
|
12
|
-
};
|
|
13
|
-
export const expectEncode = (serializer, value, expected) => {
|
|
14
|
-
const data = st.write(serializer, value);
|
|
15
|
-
const newValue = st.read(serializer, data);
|
|
16
|
-
expect(newValue).toEqual((expected ?? value));
|
|
17
|
-
};
|
|
18
|
-
export const expectEncodeSize = (serializer, size, value) => {
|
|
19
|
-
const data = st.write(serializer, value);
|
|
20
|
-
expect(data.byteLength).toEqual(size);
|
|
21
|
-
};
|
|
22
|
-
export const expectEncodeSnapshot = (serializer, value) => {
|
|
23
|
-
const data = st.write(serializer, value);
|
|
24
|
-
expect(data).toMatchSnapshot();
|
|
25
|
-
};
|
|
26
|
-
export const expectError = (callback) => {
|
|
27
|
-
try {
|
|
28
|
-
callback();
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
throw new Error("Expected Error");
|
|
34
|
-
};
|
|
35
|
-
export const bytes = (bytes) => {
|
|
36
|
-
return new Uint8Array(bytes).buffer;
|
|
37
|
-
};
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
export function bytesLiteral(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
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `st.json` stores JSON data using a string serializer
|
|
3
|
-
*
|
|
4
|
-
* ```
|
|
5
|
-
* st.json(st.string(st.u32()))
|
|
6
|
-
* ```
|
|
7
|
-
*
|
|
8
|
-
*/
|
|
9
|
-
export function json(type) {
|
|
10
|
-
return {
|
|
11
|
-
size: type.size,
|
|
12
|
-
write: (ctx, value) => {
|
|
13
|
-
const json = JSON.stringify(value);
|
|
14
|
-
type.write(ctx, json);
|
|
15
|
-
},
|
|
16
|
-
read: (ctx) => {
|
|
17
|
-
const value = type.read(ctx);
|
|
18
|
-
return JSON.parse(value);
|
|
19
|
-
},
|
|
20
|
-
};
|
|
21
|
-
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export function fixedOffset(delta) {
|
|
2
|
-
return (type) => ({
|
|
3
|
-
size: type.size,
|
|
4
|
-
read: (ctx) => {
|
|
5
|
-
let start = ctx.offset;
|
|
6
|
-
ctx.offset += delta;
|
|
7
|
-
const value = type.read(ctx);
|
|
8
|
-
ctx.offset = start;
|
|
9
|
-
return value;
|
|
10
|
-
},
|
|
11
|
-
write: (ctx, value) => {
|
|
12
|
-
let start = ctx.offset;
|
|
13
|
-
ctx.offset += delta;
|
|
14
|
-
type.write(ctx, value);
|
|
15
|
-
ctx.offset = start;
|
|
16
|
-
},
|
|
17
|
-
});
|
|
18
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { Serializer } from "../types";
|
|
2
|
-
/**
|
|
3
|
-
* Whilst reading this type, don't advance the offset after reading
|
|
4
|
-
*
|
|
5
|
-
* This can be useful for taggedUnions where they key is the first value in all the variants
|
|
6
|
-
*
|
|
7
|
-
* ```
|
|
8
|
-
* st.object({
|
|
9
|
-
* stringLength: st.pipe(
|
|
10
|
-
* st.u16(),
|
|
11
|
-
* st.noAdvance(),
|
|
12
|
-
* ),
|
|
13
|
-
* text: st.string(st.u16()),
|
|
14
|
-
* })
|
|
15
|
-
*/
|
|
16
|
-
export declare function noAdvance<T>(): (type: Serializer<T>) => Serializer<T>;
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Whilst reading this type, don't advance the offset after reading
|
|
3
|
-
*
|
|
4
|
-
* This can be useful for taggedUnions where they key is the first value in all the variants
|
|
5
|
-
*
|
|
6
|
-
* ```
|
|
7
|
-
* st.object({
|
|
8
|
-
* stringLength: st.pipe(
|
|
9
|
-
* st.u16(),
|
|
10
|
-
* st.noAdvance(),
|
|
11
|
-
* ),
|
|
12
|
-
* text: st.string(st.u16()),
|
|
13
|
-
* })
|
|
14
|
-
*/
|
|
15
|
-
export function noAdvance() {
|
|
16
|
-
return (type) => ({
|
|
17
|
-
size: type.size,
|
|
18
|
-
read: (ctx) => {
|
|
19
|
-
let start = ctx.offset;
|
|
20
|
-
const value = type.read(ctx);
|
|
21
|
-
ctx.offset = start;
|
|
22
|
-
return value;
|
|
23
|
-
},
|
|
24
|
-
write: (ctx, value) => {
|
|
25
|
-
let start = ctx.offset;
|
|
26
|
-
type.write(ctx, value);
|
|
27
|
-
ctx.offset = start;
|
|
28
|
-
},
|
|
29
|
-
});
|
|
30
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { describe, it } from "node:test";
|
|
2
|
-
import * as st from "../index";
|
|
3
|
-
import { encodeTest } from "../utils.test";
|
|
4
|
-
describe("st.noAdvance", () => {
|
|
5
|
-
it("encode correctly", () => {
|
|
6
|
-
encodeTest(st.object({
|
|
7
|
-
length: st.pipe(st.u8(), st.noAdvance()),
|
|
8
|
-
text: st.string(st.u8()),
|
|
9
|
-
}), //
|
|
10
|
-
{ length: 3, text: "foo" });
|
|
11
|
-
encodeTest(st.object({
|
|
12
|
-
a: st.pipe(st.u16(), st.noAdvance()),
|
|
13
|
-
b: st.f16(),
|
|
14
|
-
}), //
|
|
15
|
-
{ a: 0, b: 1 }, { a: 15360, b: 1 });
|
|
16
|
-
});
|
|
17
|
-
});
|