@yume-chan/struct 0.0.0-20240714132542
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 +131 -0
- package/LICENSE +21 -0
- package/README.md +747 -0
- package/esm/basic/definition.d.ts +44 -0
- package/esm/basic/definition.d.ts.map +1 -0
- package/esm/basic/definition.js +24 -0
- package/esm/basic/definition.js.map +1 -0
- package/esm/basic/field-value.d.ts +39 -0
- package/esm/basic/field-value.d.ts.map +1 -0
- package/esm/basic/field-value.js +46 -0
- package/esm/basic/field-value.js.map +1 -0
- package/esm/basic/index.d.ts +6 -0
- package/esm/basic/index.d.ts.map +1 -0
- package/esm/basic/index.js +6 -0
- package/esm/basic/index.js.map +1 -0
- package/esm/basic/options.d.ts +10 -0
- package/esm/basic/options.d.ts.map +1 -0
- package/esm/basic/options.js +4 -0
- package/esm/basic/options.js.map +1 -0
- package/esm/basic/stream.d.ts +25 -0
- package/esm/basic/stream.d.ts.map +1 -0
- package/esm/basic/stream.js +8 -0
- package/esm/basic/stream.js.map +1 -0
- package/esm/basic/struct-value.d.ts +30 -0
- package/esm/basic/struct-value.d.ts.map +1 -0
- package/esm/basic/struct-value.js +62 -0
- package/esm/basic/struct-value.js.map +1 -0
- package/esm/index.d.ts +15 -0
- package/esm/index.d.ts.map +1 -0
- package/esm/index.js +7 -0
- package/esm/index.js.map +1 -0
- package/esm/struct.d.ts +151 -0
- package/esm/struct.d.ts.map +1 -0
- package/esm/struct.js +255 -0
- package/esm/struct.js.map +1 -0
- package/esm/sync-promise.d.ts +13 -0
- package/esm/sync-promise.d.ts.map +1 -0
- package/esm/sync-promise.js +71 -0
- package/esm/sync-promise.js.map +1 -0
- package/esm/types/bigint.d.ts +25 -0
- package/esm/types/bigint.d.ts.map +1 -0
- package/esm/types/bigint.js +46 -0
- package/esm/types/bigint.js.map +1 -0
- package/esm/types/buffer/base.d.ts +69 -0
- package/esm/types/buffer/base.d.ts.map +1 -0
- package/esm/types/buffer/base.js +101 -0
- package/esm/types/buffer/base.js.map +1 -0
- package/esm/types/buffer/fixed-length.d.ts +9 -0
- package/esm/types/buffer/fixed-length.d.ts.map +1 -0
- package/esm/types/buffer/fixed-length.js +7 -0
- package/esm/types/buffer/fixed-length.js.map +1 -0
- package/esm/types/buffer/index.d.ts +4 -0
- package/esm/types/buffer/index.d.ts.map +1 -0
- package/esm/types/buffer/index.js +4 -0
- package/esm/types/buffer/index.js.map +1 -0
- package/esm/types/buffer/variable-length.d.ts +46 -0
- package/esm/types/buffer/variable-length.d.ts.map +1 -0
- package/esm/types/buffer/variable-length.js +88 -0
- package/esm/types/buffer/variable-length.js.map +1 -0
- package/esm/types/index.d.ts +4 -0
- package/esm/types/index.d.ts.map +1 -0
- package/esm/types/index.js +4 -0
- package/esm/types/index.js.map +1 -0
- package/esm/types/number.d.ts +28 -0
- package/esm/types/number.d.ts.map +1 -0
- package/esm/types/number.js +88 -0
- package/esm/types/number.js.map +1 -0
- package/esm/utils.d.ts +48 -0
- package/esm/utils.d.ts.map +1 -0
- package/esm/utils.js +18 -0
- package/esm/utils.js.map +1 -0
- package/package.json +49 -0
- package/src/basic/definition.ts +68 -0
- package/src/basic/field-value.ts +71 -0
- package/src/basic/index.ts +5 -0
- package/src/basic/options.ts +19 -0
- package/src/basic/stream.ts +34 -0
- package/src/basic/struct-value.ts +85 -0
- package/src/index.ts +18 -0
- package/src/struct.ts +705 -0
- package/src/sync-promise.ts +131 -0
- package/src/types/bigint.ts +120 -0
- package/src/types/buffer/base.ts +195 -0
- package/src/types/buffer/fixed-length.ts +22 -0
- package/src/types/buffer/index.ts +3 -0
- package/src/types/buffer/variable-length.ts +199 -0
- package/src/types/index.ts +3 -0
- package/src/types/number.ts +159 -0
- package/src/utils.ts +94 -0
- package/tsconfig.build.json +3 -0
- package/tsconfig.build.tsbuildinfo +1 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { StructFieldDefinition } from "./definition.js";
|
|
2
|
+
import type { StructFieldValue } from "./field-value.js";
|
|
3
|
+
|
|
4
|
+
export const STRUCT_VALUE_SYMBOL = Symbol("struct-value");
|
|
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
|
+
|
|
16
|
+
/**
|
|
17
|
+
* A struct value is a map between keys in a struct and their field values.
|
|
18
|
+
*/
|
|
19
|
+
export class StructValue {
|
|
20
|
+
/** @internal */ readonly fieldValues: Record<
|
|
21
|
+
PropertyKey,
|
|
22
|
+
StructFieldValue<StructFieldDefinition<unknown, unknown, PropertyKey>>
|
|
23
|
+
> = {};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Gets the result struct value object
|
|
27
|
+
*/
|
|
28
|
+
readonly value: Record<PropertyKey, unknown>;
|
|
29
|
+
|
|
30
|
+
constructor(prototype: object) {
|
|
31
|
+
// PERF: `Object.create(extra)` is 50% faster
|
|
32
|
+
// than `Object.defineProperties(this.value, extra)`
|
|
33
|
+
this.value = Object.create(prototype) as Record<PropertyKey, unknown>;
|
|
34
|
+
|
|
35
|
+
// PERF: `Object.defineProperty` is slow
|
|
36
|
+
// but we need it to be non-enumerable
|
|
37
|
+
Object.defineProperty(this.value, STRUCT_VALUE_SYMBOL, {
|
|
38
|
+
enumerable: false,
|
|
39
|
+
value: this,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Sets a `StructFieldValue` for `key`
|
|
45
|
+
*
|
|
46
|
+
* @param name The field name
|
|
47
|
+
* @param fieldValue The associated `StructFieldValue`
|
|
48
|
+
*/
|
|
49
|
+
set(
|
|
50
|
+
name: PropertyKey,
|
|
51
|
+
fieldValue: StructFieldValue<
|
|
52
|
+
StructFieldDefinition<unknown, unknown, PropertyKey>
|
|
53
|
+
>,
|
|
54
|
+
): void {
|
|
55
|
+
this.fieldValues[name] = fieldValue;
|
|
56
|
+
|
|
57
|
+
// PERF: `Object.defineProperty` is slow
|
|
58
|
+
// use normal property when possible
|
|
59
|
+
if (fieldValue.hasCustomAccessors) {
|
|
60
|
+
Object.defineProperty(this.value, name, {
|
|
61
|
+
configurable: true,
|
|
62
|
+
enumerable: true,
|
|
63
|
+
get() {
|
|
64
|
+
return fieldValue.get();
|
|
65
|
+
},
|
|
66
|
+
set(v) {
|
|
67
|
+
fieldValue.set(v);
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
} else {
|
|
71
|
+
this.value[name] = fieldValue.get();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Gets the `StructFieldValue` for `key`
|
|
77
|
+
*
|
|
78
|
+
* @param name The field name
|
|
79
|
+
*/
|
|
80
|
+
get(
|
|
81
|
+
name: PropertyKey,
|
|
82
|
+
): StructFieldValue<StructFieldDefinition<unknown, unknown, PropertyKey>> {
|
|
83
|
+
return this.fieldValues[name]!;
|
|
84
|
+
}
|
|
85
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
declare global {
|
|
2
|
+
interface ArrayBuffer {
|
|
3
|
+
// Disallow assigning `Uint8Array` to `Arraybuffer`
|
|
4
|
+
__brand: never;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
interface SharedArrayBuffer {
|
|
8
|
+
// Allow `SharedArrayBuffer` to be assigned to `ArrayBuffer`
|
|
9
|
+
__brand: never;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export * from "./basic/index.js";
|
|
14
|
+
export * from "./struct.js";
|
|
15
|
+
export { Struct as default } from "./struct.js";
|
|
16
|
+
export * from "./sync-promise.js";
|
|
17
|
+
export * from "./types/index.js";
|
|
18
|
+
export * from "./utils.js";
|