@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.
Files changed (91) hide show
  1. package/CHANGELOG.md +131 -0
  2. package/LICENSE +21 -0
  3. package/README.md +747 -0
  4. package/esm/basic/definition.d.ts +44 -0
  5. package/esm/basic/definition.d.ts.map +1 -0
  6. package/esm/basic/definition.js +24 -0
  7. package/esm/basic/definition.js.map +1 -0
  8. package/esm/basic/field-value.d.ts +39 -0
  9. package/esm/basic/field-value.d.ts.map +1 -0
  10. package/esm/basic/field-value.js +46 -0
  11. package/esm/basic/field-value.js.map +1 -0
  12. package/esm/basic/index.d.ts +6 -0
  13. package/esm/basic/index.d.ts.map +1 -0
  14. package/esm/basic/index.js +6 -0
  15. package/esm/basic/index.js.map +1 -0
  16. package/esm/basic/options.d.ts +10 -0
  17. package/esm/basic/options.d.ts.map +1 -0
  18. package/esm/basic/options.js +4 -0
  19. package/esm/basic/options.js.map +1 -0
  20. package/esm/basic/stream.d.ts +25 -0
  21. package/esm/basic/stream.d.ts.map +1 -0
  22. package/esm/basic/stream.js +8 -0
  23. package/esm/basic/stream.js.map +1 -0
  24. package/esm/basic/struct-value.d.ts +30 -0
  25. package/esm/basic/struct-value.d.ts.map +1 -0
  26. package/esm/basic/struct-value.js +62 -0
  27. package/esm/basic/struct-value.js.map +1 -0
  28. package/esm/index.d.ts +15 -0
  29. package/esm/index.d.ts.map +1 -0
  30. package/esm/index.js +7 -0
  31. package/esm/index.js.map +1 -0
  32. package/esm/struct.d.ts +151 -0
  33. package/esm/struct.d.ts.map +1 -0
  34. package/esm/struct.js +255 -0
  35. package/esm/struct.js.map +1 -0
  36. package/esm/sync-promise.d.ts +13 -0
  37. package/esm/sync-promise.d.ts.map +1 -0
  38. package/esm/sync-promise.js +71 -0
  39. package/esm/sync-promise.js.map +1 -0
  40. package/esm/types/bigint.d.ts +25 -0
  41. package/esm/types/bigint.d.ts.map +1 -0
  42. package/esm/types/bigint.js +46 -0
  43. package/esm/types/bigint.js.map +1 -0
  44. package/esm/types/buffer/base.d.ts +69 -0
  45. package/esm/types/buffer/base.d.ts.map +1 -0
  46. package/esm/types/buffer/base.js +101 -0
  47. package/esm/types/buffer/base.js.map +1 -0
  48. package/esm/types/buffer/fixed-length.d.ts +9 -0
  49. package/esm/types/buffer/fixed-length.d.ts.map +1 -0
  50. package/esm/types/buffer/fixed-length.js +7 -0
  51. package/esm/types/buffer/fixed-length.js.map +1 -0
  52. package/esm/types/buffer/index.d.ts +4 -0
  53. package/esm/types/buffer/index.d.ts.map +1 -0
  54. package/esm/types/buffer/index.js +4 -0
  55. package/esm/types/buffer/index.js.map +1 -0
  56. package/esm/types/buffer/variable-length.d.ts +46 -0
  57. package/esm/types/buffer/variable-length.d.ts.map +1 -0
  58. package/esm/types/buffer/variable-length.js +88 -0
  59. package/esm/types/buffer/variable-length.js.map +1 -0
  60. package/esm/types/index.d.ts +4 -0
  61. package/esm/types/index.d.ts.map +1 -0
  62. package/esm/types/index.js +4 -0
  63. package/esm/types/index.js.map +1 -0
  64. package/esm/types/number.d.ts +28 -0
  65. package/esm/types/number.d.ts.map +1 -0
  66. package/esm/types/number.js +88 -0
  67. package/esm/types/number.js.map +1 -0
  68. package/esm/utils.d.ts +48 -0
  69. package/esm/utils.d.ts.map +1 -0
  70. package/esm/utils.js +18 -0
  71. package/esm/utils.js.map +1 -0
  72. package/package.json +49 -0
  73. package/src/basic/definition.ts +68 -0
  74. package/src/basic/field-value.ts +71 -0
  75. package/src/basic/index.ts +5 -0
  76. package/src/basic/options.ts +19 -0
  77. package/src/basic/stream.ts +34 -0
  78. package/src/basic/struct-value.ts +85 -0
  79. package/src/index.ts +18 -0
  80. package/src/struct.ts +705 -0
  81. package/src/sync-promise.ts +131 -0
  82. package/src/types/bigint.ts +120 -0
  83. package/src/types/buffer/base.ts +195 -0
  84. package/src/types/buffer/fixed-length.ts +22 -0
  85. package/src/types/buffer/index.ts +3 -0
  86. package/src/types/buffer/variable-length.ts +199 -0
  87. package/src/types/index.ts +3 -0
  88. package/src/types/number.ts +159 -0
  89. package/src/utils.ts +94 -0
  90. package/tsconfig.build.json +3 -0
  91. 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";