@chr33s/pdf-restructure 5.0.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.
Files changed (93) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +323 -0
  3. package/dist/array.d.ts +15 -0
  4. package/dist/array.js +95 -0
  5. package/dist/array.js.map +1 -0
  6. package/dist/base.d.ts +4 -0
  7. package/dist/base.js +16 -0
  8. package/dist/base.js.map +1 -0
  9. package/dist/bitfield.d.ts +11 -0
  10. package/dist/bitfield.js +37 -0
  11. package/dist/bitfield.js.map +1 -0
  12. package/dist/boolean.d.ts +10 -0
  13. package/dist/boolean.js +18 -0
  14. package/dist/boolean.js.map +1 -0
  15. package/dist/buffer.d.ts +11 -0
  16. package/dist/buffer.js +31 -0
  17. package/dist/buffer.js.map +1 -0
  18. package/dist/decode-stream.d.ts +26 -0
  19. package/dist/decode-stream.js +84 -0
  20. package/dist/decode-stream.js.map +1 -0
  21. package/dist/encode-stream.d.ts +19 -0
  22. package/dist/encode-stream.js +137 -0
  23. package/dist/encode-stream.js.map +1 -0
  24. package/dist/enum.d.ts +11 -0
  25. package/dist/enum.js +25 -0
  26. package/dist/enum.js.map +1 -0
  27. package/dist/index.d.ts +17 -0
  28. package/dist/index.js +18 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/lazy-array.d.ts +22 -0
  31. package/dist/lazy-array.js +75 -0
  32. package/dist/lazy-array.js.map +1 -0
  33. package/dist/number.d.ts +51 -0
  34. package/dist/number.js +76 -0
  35. package/dist/number.js.map +1 -0
  36. package/dist/optional.d.ts +14 -0
  37. package/dist/optional.js +34 -0
  38. package/dist/optional.js.map +1 -0
  39. package/dist/pointer.d.ts +28 -0
  40. package/dist/pointer.js +160 -0
  41. package/dist/pointer.js.map +1 -0
  42. package/dist/reserved.d.ts +12 -0
  43. package/dist/reserved.js +23 -0
  44. package/dist/reserved.js.map +1 -0
  45. package/dist/string.d.ts +14 -0
  46. package/dist/string.js +123 -0
  47. package/dist/string.js.map +1 -0
  48. package/dist/struct.d.ts +15 -0
  49. package/dist/struct.js +93 -0
  50. package/dist/struct.js.map +1 -0
  51. package/dist/utils.d.ts +13 -0
  52. package/dist/utils.js +45 -0
  53. package/dist/utils.js.map +1 -0
  54. package/dist/versioned-struct.d.ts +18 -0
  55. package/dist/versioned-struct.js +129 -0
  56. package/dist/versioned-struct.js.map +1 -0
  57. package/package.json +47 -0
  58. package/src/array.ts +113 -0
  59. package/src/base.ts +17 -0
  60. package/src/bitfield.ts +46 -0
  61. package/src/boolean.ts +24 -0
  62. package/src/buffer.ts +40 -0
  63. package/src/decode-stream.ts +97 -0
  64. package/src/encode-stream.ts +161 -0
  65. package/src/enum.ts +32 -0
  66. package/src/index.ts +17 -0
  67. package/src/lazy-array.ts +91 -0
  68. package/src/number.ts +88 -0
  69. package/src/optional.ts +46 -0
  70. package/src/pointer.ts +204 -0
  71. package/src/reserved.ts +29 -0
  72. package/src/string.ts +154 -0
  73. package/src/struct.ts +127 -0
  74. package/src/utils.ts +55 -0
  75. package/src/versioned-struct.ts +174 -0
  76. package/test/array.test.ts +95 -0
  77. package/test/bitfield.test.ts +52 -0
  78. package/test/boolean.test.ts +35 -0
  79. package/test/buffer.test.ts +49 -0
  80. package/test/decode-stream.test.ts +104 -0
  81. package/test/encode-stream.test.ts +111 -0
  82. package/test/enum.test.ts +30 -0
  83. package/test/lazy-array.test.ts +70 -0
  84. package/test/number.test.ts +222 -0
  85. package/test/optional.test.ts +105 -0
  86. package/test/pointer.test.ts +248 -0
  87. package/test/reserved.test.ts +28 -0
  88. package/test/string.test.ts +114 -0
  89. package/test/struct.test.ts +164 -0
  90. package/test/versioned-struct.test.ts +462 -0
  91. package/tsconfig.json +9 -0
  92. package/tsconfig.typecheck.json +14 -0
  93. package/vitest.config.ts +12 -0
@@ -0,0 +1,28 @@
1
+ import Base from "./base.js";
2
+ import type DecodeStream from "./decode-stream.js";
3
+ import type EncodeStream from "./encode-stream.js";
4
+ export type PointerType = "local" | "immediate" | "parent" | "global";
5
+ export interface PointerOptions {
6
+ type?: PointerType;
7
+ allowNull?: boolean;
8
+ nullValue?: number;
9
+ relativeTo?: string | ((ctx: any) => number);
10
+ lazy?: boolean;
11
+ }
12
+ export declare class Pointer extends Base<any> {
13
+ #private;
14
+ options: Required<Omit<PointerOptions, "relativeTo">> & {
15
+ relativeTo?: string | ((ctx: any) => number);
16
+ };
17
+ type: any;
18
+ offsetType: any;
19
+ constructor(offsetType: any, type: any, options?: PointerOptions);
20
+ decode(stream: DecodeStream, ctx: any): any;
21
+ size(val?: any, ctx?: any): number;
22
+ encode(stream: EncodeStream, val: any, ctx: any): void;
23
+ }
24
+ export declare class VoidPointer {
25
+ type: any;
26
+ value: any;
27
+ constructor(type: any, value: any);
28
+ }
@@ -0,0 +1,160 @@
1
+ import Base from "./base.js";
2
+ import { PropertyDescriptor } from "./utils.js";
3
+ export class Pointer extends Base {
4
+ options;
5
+ type;
6
+ offsetType;
7
+ constructor(offsetType, type, options = {}) {
8
+ super();
9
+ this.offsetType = offsetType;
10
+ this.type = type === "void" ? null : type;
11
+ this.options = {
12
+ type: "local",
13
+ allowNull: true,
14
+ nullValue: 0,
15
+ lazy: false,
16
+ ...options,
17
+ };
18
+ }
19
+ #relativeToGetter(ctx) {
20
+ const { relativeTo } = this.options;
21
+ if (!relativeTo) {
22
+ return 0;
23
+ }
24
+ if (typeof relativeTo === "function") {
25
+ return relativeTo(ctx) ?? 0;
26
+ }
27
+ return relativeTo.split(".").reduce((obj, prop) => obj?.[prop], ctx) ?? 0;
28
+ }
29
+ decode(stream, ctx) {
30
+ const offset = this.offsetType.decode(stream, ctx);
31
+ if (offset === this.options.nullValue && this.options.allowNull) {
32
+ return null;
33
+ }
34
+ let relative = 0;
35
+ switch (this.options.type) {
36
+ case "local":
37
+ relative = ctx?._startOffset ?? 0;
38
+ break;
39
+ case "immediate":
40
+ relative = stream.pos - this.offsetType.size();
41
+ break;
42
+ case "parent":
43
+ relative = ctx?.parent?._startOffset ?? 0;
44
+ break;
45
+ default: {
46
+ let current = ctx;
47
+ while (current?.parent) {
48
+ current = current.parent;
49
+ }
50
+ relative = current?._startOffset ?? 0;
51
+ }
52
+ }
53
+ if (this.options.relativeTo) {
54
+ relative += this.#relativeToGetter(ctx);
55
+ }
56
+ const ptr = offset + relative;
57
+ if (this.type) {
58
+ let value;
59
+ let decoded = false;
60
+ const decodeValue = () => {
61
+ if (decoded) {
62
+ return value;
63
+ }
64
+ const pos = stream.pos;
65
+ stream.pos = ptr;
66
+ value = this.type.decode(stream, ctx);
67
+ stream.pos = pos;
68
+ decoded = true;
69
+ return value;
70
+ };
71
+ if (this.options.lazy) {
72
+ return new PropertyDescriptor({ get: decodeValue });
73
+ }
74
+ return decodeValue();
75
+ }
76
+ return ptr;
77
+ }
78
+ size(val, ctx) {
79
+ const parent = ctx;
80
+ if (ctx) {
81
+ switch (this.options.type) {
82
+ case "local":
83
+ case "immediate":
84
+ break;
85
+ case "parent":
86
+ ctx = ctx.parent;
87
+ break;
88
+ default:
89
+ while (ctx.parent) {
90
+ ctx = ctx.parent;
91
+ }
92
+ }
93
+ }
94
+ let type = this.type;
95
+ if (!type) {
96
+ if (!(val instanceof VoidPointer)) {
97
+ throw new Error("Must be a VoidPointer");
98
+ }
99
+ type = val.type;
100
+ val = val.value;
101
+ }
102
+ if (val != null && ctx) {
103
+ ctx.pointerSize += type.size(val, parent);
104
+ }
105
+ return this.offsetType.size();
106
+ }
107
+ encode(stream, val, ctx) {
108
+ const parent = ctx;
109
+ if (val == null) {
110
+ this.offsetType.encode(stream, this.options.nullValue);
111
+ return;
112
+ }
113
+ let relative;
114
+ switch (this.options.type) {
115
+ case "local":
116
+ relative = ctx.startOffset;
117
+ break;
118
+ case "immediate":
119
+ relative = stream.pos + this.offsetType.size(val, parent);
120
+ break;
121
+ case "parent":
122
+ ctx = ctx.parent;
123
+ relative = ctx.startOffset;
124
+ break;
125
+ default:
126
+ relative = 0;
127
+ while (ctx.parent) {
128
+ ctx = ctx.parent;
129
+ }
130
+ }
131
+ if (this.options.relativeTo) {
132
+ const target = parent?.val ?? parent;
133
+ relative += this.#relativeToGetter(target);
134
+ }
135
+ this.offsetType.encode(stream, ctx.pointerOffset - relative);
136
+ let type = this.type;
137
+ if (!type) {
138
+ if (!(val instanceof VoidPointer)) {
139
+ throw new Error("Must be a VoidPointer");
140
+ }
141
+ type = val.type;
142
+ val = val.value;
143
+ }
144
+ ctx.pointers.push({
145
+ type,
146
+ val,
147
+ parent,
148
+ });
149
+ ctx.pointerOffset += type.size(val, parent);
150
+ }
151
+ }
152
+ export class VoidPointer {
153
+ type;
154
+ value;
155
+ constructor(type, value) {
156
+ this.type = type;
157
+ this.value = value;
158
+ }
159
+ }
160
+ //# sourceMappingURL=pointer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pointer.js","sourceRoot":"","sources":["../src/pointer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import Base from "./base.js";
2
+ import type DecodeStream from "./decode-stream.js";
3
+ import type EncodeStream from "./encode-stream.js";
4
+ import { type LengthLike } from "./utils.js";
5
+ export default class Reserved extends Base<void> {
6
+ type: any;
7
+ count: LengthLike | number;
8
+ constructor(type: any, count?: LengthLike | number);
9
+ decode(stream: DecodeStream, parent?: any): undefined;
10
+ size(_data?: any, parent?: any): number;
11
+ encode(stream: EncodeStream, _val?: any, parent?: any): void;
12
+ }
@@ -0,0 +1,23 @@
1
+ import Base from "./base.js";
2
+ import { resolveLength } from "./utils.js";
3
+ export default class Reserved extends Base {
4
+ type;
5
+ count;
6
+ constructor(type, count = 1) {
7
+ super();
8
+ this.type = type;
9
+ this.count = count;
10
+ }
11
+ decode(stream, parent) {
12
+ stream.pos += this.size(undefined, parent);
13
+ return undefined;
14
+ }
15
+ size(_data, parent) {
16
+ const count = resolveLength(this.count, undefined, parent);
17
+ return this.type.size() * count;
18
+ }
19
+ encode(stream, _val, parent) {
20
+ stream.fill(0, this.size(undefined, parent));
21
+ }
22
+ }
23
+ //# sourceMappingURL=reserved.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reserved.js","sourceRoot":"","sources":["../src/reserved.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,aAAa,EAAmB,MAAM,YAAY,CAAC;AAE5D,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,IAAU;IACvC,IAAI,CAAM;IACV,KAAK,CAAsB;IAElC,YAAY,IAAS,EAAE,QAA6B,CAAC;QACnD,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,MAAoB,EAAE,MAAY;QACvC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,KAAW,EAAE,MAAY;QAC5B,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,KAAmB,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC;IAClC,CAAC;IAED,MAAM,CAAC,MAAoB,EAAE,IAAU,EAAE,MAAY;QACnD,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/C,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import Base from "./base.js";
2
+ import type DecodeStream from "./decode-stream.js";
3
+ import type EncodeStream from "./encode-stream.js";
4
+ import { type LengthLike } from "./utils.js";
5
+ type EncodingResolver = string | ((this: any, parent?: any) => string | undefined);
6
+ export default class StringT extends Base<string | Uint8Array> {
7
+ length?: LengthLike;
8
+ encoding: EncodingResolver;
9
+ constructor(length?: LengthLike, encoding?: EncodingResolver);
10
+ decode(stream: DecodeStream, parent?: any): string | Uint8Array;
11
+ size(value?: string, parent?: any): number;
12
+ encode(stream: EncodeStream, value: string, parent?: any): void;
13
+ }
14
+ export {};
package/dist/string.js ADDED
@@ -0,0 +1,123 @@
1
+ import Base from "./base.js";
2
+ import { Number as NumberT } from "./number.js";
3
+ import { resolveLength } from "./utils.js";
4
+ const ENCODING_ALIASES = {
5
+ "utf-8": "utf8",
6
+ utf8: "utf8",
7
+ ascii: "ascii",
8
+ utf16: "utf16le",
9
+ "utf-16": "utf16le",
10
+ utf16le: "utf16le",
11
+ "utf-16le": "utf16le",
12
+ "utf16-le": "utf16le",
13
+ "utf-16-le": "utf16le",
14
+ utf16be: "utf16be",
15
+ "utf-16be": "utf16be",
16
+ "utf16-be": "utf16be",
17
+ "utf-16-be": "utf16be",
18
+ ucs2: "ucs2",
19
+ };
20
+ function normalizeEncoding(encoding) {
21
+ if (!encoding) {
22
+ return "ascii";
23
+ }
24
+ const key = encoding.toLowerCase();
25
+ return ENCODING_ALIASES[key] ?? key;
26
+ }
27
+ function resolveEncodingValue(resolver, parent, useParentVal = false) {
28
+ if (typeof resolver === "function") {
29
+ const ctx = useParentVal ? (parent?.val ?? parent) : parent;
30
+ return normalizeEncoding(resolver.call(ctx, ctx));
31
+ }
32
+ return normalizeEncoding(resolver);
33
+ }
34
+ function encodingWidth(encoding) {
35
+ switch (encoding) {
36
+ case "ascii":
37
+ case "utf8":
38
+ return 1;
39
+ case "utf16le":
40
+ case "utf16be":
41
+ case "ucs2":
42
+ return 2;
43
+ default:
44
+ return 1;
45
+ }
46
+ }
47
+ const textEncoder = new TextEncoder();
48
+ function byteLength(string, encoding) {
49
+ switch (encoding) {
50
+ case "utf8":
51
+ return textEncoder.encode(string).length;
52
+ case "utf16le":
53
+ case "utf16be":
54
+ case "ucs2":
55
+ return string.length * 2;
56
+ case "ascii":
57
+ default:
58
+ return string.length;
59
+ }
60
+ }
61
+ export default class StringT extends Base {
62
+ length;
63
+ encoding;
64
+ constructor(length, encoding = "ascii") {
65
+ super();
66
+ this.length = length;
67
+ this.encoding = encoding;
68
+ }
69
+ decode(stream, parent) {
70
+ const encoding = resolveEncodingValue(this.encoding, parent);
71
+ const width = encodingWidth(encoding);
72
+ let length;
73
+ if (typeof this.length !== "undefined") {
74
+ length = resolveLength(this.length, stream, parent);
75
+ }
76
+ else {
77
+ const { buffer } = stream;
78
+ let pos = stream.pos;
79
+ const limit = stream.length;
80
+ const maxPos = Math.max(limit - width + 1, stream.pos);
81
+ while (pos < maxPos && (buffer[pos] !== 0x00 || (width === 2 && buffer[pos + 1] !== 0x00))) {
82
+ pos += width;
83
+ }
84
+ length = Math.max(pos - stream.pos, 0);
85
+ }
86
+ const value = stream.readString(length, encoding);
87
+ if (typeof this.length === "undefined" && stream.pos < stream.length) {
88
+ stream.pos += width;
89
+ }
90
+ return value;
91
+ }
92
+ size(value, parent) {
93
+ if (value == null) {
94
+ return resolveLength(this.length, undefined, parent);
95
+ }
96
+ const encoding = resolveEncodingValue(this.encoding, parent, true);
97
+ let size = byteLength(value, encoding);
98
+ if (this.length instanceof NumberT) {
99
+ size += this.length.size();
100
+ }
101
+ if (typeof this.length === "undefined") {
102
+ size += encodingWidth(encoding);
103
+ }
104
+ return size;
105
+ }
106
+ encode(stream, value, parent) {
107
+ const encoding = resolveEncodingValue(this.encoding, parent, true);
108
+ const width = encodingWidth(encoding);
109
+ if (this.length instanceof NumberT) {
110
+ this.length.encode(stream, byteLength(value, encoding));
111
+ }
112
+ stream.writeString(value, encoding);
113
+ if (typeof this.length === "undefined") {
114
+ if (width === 2) {
115
+ stream.writeUInt16LE(0x0000);
116
+ }
117
+ else {
118
+ stream.writeUInt8(0x00);
119
+ }
120
+ }
121
+ }
122
+ }
123
+ //# sourceMappingURL=string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.js","sourceRoot":"","sources":["../src/string.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type DecodeStream from "./decode-stream.js";
2
+ import type EncodeStream from "./encode-stream.js";
3
+ type FieldMap = Record<string, any>;
4
+ export default class Struct<T extends Record<string, any> = Record<string, any>> {
5
+ process?: (this: T, stream: DecodeStream) => void;
6
+ preEncode?: (this: T, stream?: EncodeStream) => void;
7
+ fields: FieldMap;
8
+ constructor(fields?: FieldMap);
9
+ decode(stream: DecodeStream, parent?: any, length?: number): T;
10
+ protected _setup(stream: DecodeStream, parent: any, length: number): Record<string, any>;
11
+ protected _parseFields(stream: DecodeStream, target: Record<string, any>, fields: FieldMap): void;
12
+ size(val?: T, parent?: any, includePointers?: boolean): number;
13
+ encode(stream: EncodeStream, val: T, parent?: any): void;
14
+ }
15
+ export {};
package/dist/struct.js ADDED
@@ -0,0 +1,93 @@
1
+ import { PropertyDescriptor } from "./utils.js";
2
+ export default class Struct {
3
+ process;
4
+ preEncode;
5
+ fields;
6
+ constructor(fields = {}) {
7
+ this.fields = fields;
8
+ }
9
+ decode(stream, parent, length = 0) {
10
+ const result = this._setup(stream, parent, length);
11
+ this._parseFields(stream, result, this.fields);
12
+ if (this.process) {
13
+ this.process.call(result, stream);
14
+ }
15
+ return result;
16
+ }
17
+ _setup(stream, parent, length) {
18
+ const result = {};
19
+ Object.defineProperties(result, {
20
+ parent: { value: parent },
21
+ _startOffset: { value: stream.pos },
22
+ _currentOffset: { value: 0, writable: true },
23
+ _length: { value: length },
24
+ });
25
+ return result;
26
+ }
27
+ _parseFields(stream, target, fields) {
28
+ for (const [key, type] of Object.entries(fields)) {
29
+ let value;
30
+ if (typeof type === "function" && typeof type.decode !== "function") {
31
+ value = type.call(target, target);
32
+ }
33
+ else if (type && typeof type.decode === "function") {
34
+ value = type.decode(stream, target);
35
+ }
36
+ if (typeof value !== "undefined") {
37
+ if (value instanceof PropertyDescriptor) {
38
+ Object.defineProperty(target, key, value);
39
+ }
40
+ else {
41
+ target[key] = value;
42
+ }
43
+ }
44
+ target._currentOffset = stream.pos - target._startOffset;
45
+ }
46
+ }
47
+ size(val = {}, parent, includePointers = true) {
48
+ const ctx = {
49
+ parent,
50
+ val,
51
+ pointerSize: 0,
52
+ };
53
+ if (this.preEncode) {
54
+ this.preEncode.call(val);
55
+ }
56
+ let total = 0;
57
+ for (const [key, type] of Object.entries(this.fields)) {
58
+ if (type && typeof type.size === "function") {
59
+ const fieldVal = val ? val[key] : undefined;
60
+ total += type.size(fieldVal, ctx);
61
+ }
62
+ }
63
+ if (includePointers) {
64
+ total += ctx.pointerSize;
65
+ }
66
+ return total;
67
+ }
68
+ encode(stream, val, parent) {
69
+ if (this.preEncode) {
70
+ this.preEncode.call(val, stream);
71
+ }
72
+ const ctx = {
73
+ pointers: [],
74
+ startOffset: stream.pos,
75
+ pointerOffset: 0,
76
+ pointerSize: 0,
77
+ parent,
78
+ val,
79
+ };
80
+ ctx.pointerOffset = stream.pos + this.size(val, ctx, false);
81
+ for (const [key, type] of Object.entries(this.fields)) {
82
+ if (type && typeof type.encode === "function") {
83
+ type.encode(stream, val[key], ctx);
84
+ }
85
+ }
86
+ let i = 0;
87
+ while (i < ctx.pointers.length) {
88
+ const ptr = ctx.pointers[i++];
89
+ ptr.type.encode(stream, ptr.val, ptr.parent);
90
+ }
91
+ }
92
+ }
93
+ //# sourceMappingURL=struct.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"struct.js","sourceRoot":"","sources":["../src/struct.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type DecodeStream from "./decode-stream.js";
2
+ import { NumberT } from "./number.js";
3
+ export type LengthLike = number | string | ((this: any, parent?: any) => number) | NumberT;
4
+ export declare function resolveLength(length: LengthLike | undefined, stream?: DecodeStream, parent?: any): number;
5
+ export declare class PropertyDescriptor<T = unknown> {
6
+ enumerable: boolean;
7
+ configurable: boolean;
8
+ writable?: boolean;
9
+ value?: T;
10
+ get?: () => T;
11
+ set?: (value: T) => void;
12
+ constructor(opts?: Partial<PropertyDescriptor<T>>);
13
+ }
package/dist/utils.js ADDED
@@ -0,0 +1,45 @@
1
+ import { NumberT } from "./number.js";
2
+ export function resolveLength(length, stream, parent) {
3
+ let resolved;
4
+ if (typeof length === "number") {
5
+ resolved = length;
6
+ }
7
+ else if (typeof length === "function") {
8
+ resolved = length.call(parent, parent);
9
+ }
10
+ else if (parent && typeof length === "string") {
11
+ resolved = parent[length];
12
+ }
13
+ else if (stream && length instanceof NumberT) {
14
+ resolved = length.decode(stream);
15
+ }
16
+ if (typeof resolved !== "number" || Number.isNaN(resolved)) {
17
+ throw new Error("Not a fixed size");
18
+ }
19
+ return resolved;
20
+ }
21
+ export class PropertyDescriptor {
22
+ enumerable = true;
23
+ configurable = true;
24
+ writable;
25
+ value;
26
+ get;
27
+ set;
28
+ constructor(opts = {}) {
29
+ Object.assign(this, opts);
30
+ const provided = new Set(Object.keys(opts));
31
+ if (!provided.has("value")) {
32
+ delete this.value;
33
+ }
34
+ if (!provided.has("get")) {
35
+ delete this.get;
36
+ }
37
+ if (!provided.has("set")) {
38
+ delete this.set;
39
+ }
40
+ if (!provided.has("writable")) {
41
+ delete this.writable;
42
+ }
43
+ }
44
+ }
45
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAItC,MAAM,UAAU,aAAa,CAC3B,MAA8B,EAC9B,MAAqB,EACrB,MAAY;IAEZ,IAAI,QAA4B,CAAC;IAEjC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,QAAQ,GAAG,MAAM,CAAC;IACpB,CAAC;SAAM,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;QACxC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;SAAM,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChD,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;SAAM,IAAI,MAAM,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;QAC/C,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,OAAO,kBAAkB;IAC7B,UAAU,GAAG,IAAI,CAAC;IAClB,YAAY,GAAG,IAAI,CAAC;IACpB,QAAQ,CAAW;IACnB,KAAK,CAAK;IACV,GAAG,CAAW;IACd,GAAG,CAAsB;IAEzB,YAAY,OAAuC,EAAE;QACnD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAE1B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAQ,IAAgC,CAAC,KAAK,CAAC;QACjD,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,OAAQ,IAAgC,CAAC,GAAG,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,OAAQ,IAAgC,CAAC,GAAG,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,OAAQ,IAAgC,CAAC,QAAQ,CAAC;QACpD,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ import type DecodeStream from "./decode-stream.js";
2
+ import type EncodeStream from "./encode-stream.js";
3
+ import Struct from "./struct.js";
4
+ type FieldMap = Record<string, any>;
5
+ type VersionDefinitions = {
6
+ header?: FieldMap;
7
+ [version: string]: FieldMap | VersionedStruct | undefined;
8
+ };
9
+ export default class VersionedStruct extends Struct {
10
+ #private;
11
+ type: any;
12
+ versions: VersionDefinitions;
13
+ constructor(type: any, versions?: VersionDefinitions);
14
+ decode(stream: DecodeStream, parent?: any, length?: number): any;
15
+ size(val: any, parent?: any, includePointers?: boolean): number;
16
+ encode(stream: EncodeStream, val: any, parent?: any): void;
17
+ }
18
+ export {};