@elaraai/east 1.0.76 → 1.0.78
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/dist/src/fuzz.d.ts +103 -11
- package/dist/src/fuzz.d.ts.map +1 -1
- package/dist/src/fuzz.js +226 -16
- package/dist/src/fuzz.js.map +1 -1
- package/dist/src/patch/fuzz.d.ts +26 -0
- package/dist/src/patch/fuzz.d.ts.map +1 -1
- package/dist/src/patch/fuzz.js +42 -4
- package/dist/src/patch/fuzz.js.map +1 -1
- package/dist/src/patch/type_of_patch.d.ts +14 -1
- package/dist/src/patch/type_of_patch.d.ts.map +1 -1
- package/dist/src/patch/type_of_patch.js +8 -13
- package/dist/src/patch/type_of_patch.js.map +1 -1
- package/dist/src/patch/type_of_patch.spec.d.ts +6 -0
- package/dist/src/patch/type_of_patch.spec.d.ts.map +1 -0
- package/dist/src/patch/type_of_patch.spec.js +74 -0
- package/dist/src/patch/type_of_patch.spec.js.map +1 -0
- package/dist/src/serialization/beast2/index.d.ts +22 -1
- package/dist/src/serialization/beast2/index.d.ts.map +1 -1
- package/dist/src/serialization/beast2/index.js +56 -1
- package/dist/src/serialization/beast2/index.js.map +1 -1
- package/dist/src/serialization/beast2/index.spec.js +16 -0
- package/dist/src/serialization/beast2/index.spec.js.map +1 -1
- package/dist/src/serialization/beast2/v4/container.js +10 -15
- package/dist/src/serialization/beast2/v4/container.js.map +1 -1
- package/dist/src/serialization/beast2/v4/type-table.d.ts +63 -34
- package/dist/src/serialization/beast2/v4/type-table.d.ts.map +1 -1
- package/dist/src/serialization/beast2/v4/type-table.js +353 -403
- package/dist/src/serialization/beast2/v4/type-table.js.map +1 -1
- package/dist/src/serialization/beast2/v5/deflate.d.ts.map +1 -1
- package/dist/src/serialization/beast2/v5/deflate.js +147 -50
- package/dist/src/serialization/beast2/v5/deflate.js.map +1 -1
- package/dist/src/serialization/beast2/v5/deflate.spec.d.ts +6 -0
- package/dist/src/serialization/beast2/v5/deflate.spec.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/deflate.spec.js +237 -0
- package/dist/src/serialization/beast2/v5/deflate.spec.js.map +1 -0
- package/dist/src/serialization/beast2/v5/frame-pool.d.ts +119 -0
- package/dist/src/serialization/beast2/v5/frame-pool.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/frame-pool.js +235 -0
- package/dist/src/serialization/beast2/v5/frame-pool.js.map +1 -0
- package/dist/src/serialization/beast2/v5/frame-pool.spec.d.ts +6 -0
- package/dist/src/serialization/beast2/v5/frame-pool.spec.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/frame-pool.spec.js +287 -0
- package/dist/src/serialization/beast2/v5/frame-pool.spec.js.map +1 -0
- package/dist/src/serialization/beast2/v5/frame-worker.d.ts +6 -0
- package/dist/src/serialization/beast2/v5/frame-worker.d.ts.map +1 -0
- package/dist/src/serialization/beast2/v5/frame-worker.js +40 -0
- package/dist/src/serialization/beast2/v5/frame-worker.js.map +1 -0
- package/dist/src/serialization/beast2/v5/index.spec.js +292 -5
- package/dist/src/serialization/beast2/v5/index.spec.js.map +1 -1
- package/dist/src/serialization/beast2/v5/lazy.d.ts +11 -8
- package/dist/src/serialization/beast2/v5/lazy.d.ts.map +1 -1
- package/dist/src/serialization/beast2/v5/lazy.js +49 -39
- package/dist/src/serialization/beast2/v5/lazy.js.map +1 -1
- package/dist/src/serialization/beast2/v5/lazy.spec.js +98 -3
- package/dist/src/serialization/beast2/v5/lazy.spec.js.map +1 -1
- package/dist/src/serialization/beast2/v5/stream.d.ts +88 -2
- package/dist/src/serialization/beast2/v5/stream.d.ts.map +1 -1
- package/dist/src/serialization/beast2/v5/stream.js +175 -22
- package/dist/src/serialization/beast2/v5/stream.js.map +1 -1
- package/dist/src/serialization/index.d.ts +1 -1
- package/dist/src/serialization/index.d.ts.map +1 -1
- package/dist/src/serialization/index.js +1 -1
- package/dist/src/serialization/index.js.map +1 -1
- package/dist/src/type_of_type.d.ts +0 -5
- package/dist/src/type_of_type.d.ts.map +1 -1
- package/dist/src/type_of_type.js +51 -49
- package/dist/src/type_of_type.js.map +1 -1
- package/dist/src/type_of_type.to_etv.spec.js +75 -0
- package/dist/src/type_of_type.to_etv.spec.js.map +1 -1
- package/package.json +1 -1
package/dist/src/patch/fuzz.d.ts
CHANGED
|
@@ -17,6 +17,8 @@ export interface FuzzTestCase<T extends EastType = EastType> {
|
|
|
17
17
|
type: T;
|
|
18
18
|
/** String representation of the type for test naming */
|
|
19
19
|
typeName: string;
|
|
20
|
+
/** {@link typeFingerprint} of the type — a name stable across processes */
|
|
21
|
+
fingerprint: string;
|
|
20
22
|
/** Array type for before/after pairs (used by compliance tests) */
|
|
21
23
|
pairsArrayType: ArrayTypeT<StructTypeT<{
|
|
22
24
|
before: T;
|
|
@@ -39,6 +41,23 @@ export interface FuzzTestCase<T extends EastType = EastType> {
|
|
|
39
41
|
v2: ValueTypeOf<T>;
|
|
40
42
|
v3: ValueTypeOf<T>;
|
|
41
43
|
}>;
|
|
44
|
+
/**
|
|
45
|
+
* Per pair, the beast2 bytes of `diff(before, after)` as TypeScript
|
|
46
|
+
* computes and encodes it (`0x…`): the corpus asserts every runtime's
|
|
47
|
+
* diff encodes to these bytes, so a patch is the same value on every
|
|
48
|
+
* runtime — not merely one that applies to the same result (#774).
|
|
49
|
+
*/
|
|
50
|
+
diffHex: string[];
|
|
51
|
+
/** Per pair, the bytes of `invertPatch(diff(before, after))`. */
|
|
52
|
+
invertHex: string[];
|
|
53
|
+
/**
|
|
54
|
+
* Per triplet, the bytes of `composePatch(diff(v1, v2), diff(v2, v3))`.
|
|
55
|
+
* A composition can carry one input container twice — an element the
|
|
56
|
+
* first patch inserts and the second replaces — and the wire records
|
|
57
|
+
* that sharing as a back-reference, so these bytes also pin that every
|
|
58
|
+
* runtime's writer sees the sharing (#774).
|
|
59
|
+
*/
|
|
60
|
+
composeHex: string[];
|
|
42
61
|
}
|
|
43
62
|
/**
|
|
44
63
|
* Options for generating fuzz test cases.
|
|
@@ -48,10 +67,17 @@ export interface FuzzTestOptions {
|
|
|
48
67
|
numTypes?: number;
|
|
49
68
|
/** Number of sample values per type */
|
|
50
69
|
numSamples?: number;
|
|
70
|
+
/** Depth at which sample values stop nesting (default 5) */
|
|
71
|
+
valueDepth?: number;
|
|
51
72
|
/** Include recursive types in generation */
|
|
52
73
|
includeRecursive?: boolean;
|
|
53
74
|
/** Include function types in generation */
|
|
54
75
|
includeFunctions?: boolean;
|
|
76
|
+
/** Recursion below the top level: closed recursive leaves, a recursive
|
|
77
|
+
* type shared by several fields, random recursive bodies (default true) */
|
|
78
|
+
nestedRecursive?: boolean;
|
|
79
|
+
/** `EastTypeType` as a leaf, with type values as values (default true) */
|
|
80
|
+
includeTypeValues?: boolean;
|
|
55
81
|
/** Maximum retries when generating values for a single type */
|
|
56
82
|
maxValueRetries?: number;
|
|
57
83
|
/** Multiplier for max attempts (numTypes * multiplier) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fuzz.d.ts","sourceRoot":"","sources":["../../../src/patch/fuzz.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,IAAI,UAAU,EAAE,UAAU,IAAI,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"fuzz.d.ts","sourceRoot":"","sources":["../../../src/patch/fuzz.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,IAAI,UAAU,EAAE,UAAU,IAAI,WAAW,EAAE,MAAM,aAAa,CAAC;AAwB7G;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ;IACvD,uCAAuC;IACvC,IAAI,EAAE,CAAC,CAAC;IACR,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,cAAc,EAAE,UAAU,CAAC,WAAW,CAAC;QAAE,MAAM,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,CAAC,CAAA;KAAE,CAAC,CAAC,CAAC;IACjE,kEAAkE;IAClE,iBAAiB,EAAE,UAAU,CAAC,WAAW,CAAC;QAAE,EAAE,EAAE,CAAC,CAAC;QAAC,EAAE,EAAE,CAAC,CAAC;QAAC,EAAE,EAAE,CAAC,CAAA;KAAE,CAAC,CAAC,CAAC;IACpE,8CAA8C;IAC9C,KAAK,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;QAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAA;KAAE,CAAC,CAAC;IAChE,uCAAuC;IACvC,QAAQ,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;QAAC,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;QAAC,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAA;KAAE,CAAC,CAAC;IAChF;;;;;OAKG;IACH,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iEAAiE;IACjE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB;;;;;;OAMG;IACH,UAAU,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;gFAC4E;IAC5E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,+DAA+D;IAC/D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,+DAA+D;IAC/D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;+CAG2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AA6FD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,eAAoB,GAAG,YAAY,EAAE,CAmHnF"}
|
package/dist/src/patch/fuzz.js
CHANGED
|
@@ -3,12 +3,21 @@
|
|
|
3
3
|
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
4
|
*/
|
|
5
5
|
import { ArrayType, StructType, VariantType, DictType, SetType, RefType, FunctionType, IntegerType, StringType, FloatType, BooleanType, NullType, printType, } from "../types.js";
|
|
6
|
-
import {
|
|
6
|
+
import { EastTypeType } from "../type_of_type.js";
|
|
7
|
+
import { randomType, randomValueFor, randomRecursiveType, randomSharedRecursiveType, randomFunctionType, seedFuzz, typeFingerprint } from "../fuzz.js";
|
|
8
|
+
import { encodeBeast2For } from "../serialization/beast2/index.js";
|
|
9
|
+
import { PatchType } from "./type_of_patch.js";
|
|
10
|
+
import { diffFor } from "./diff.js";
|
|
11
|
+
import { invertFor } from "./invert.js";
|
|
12
|
+
import { composeFor } from "./compose.js";
|
|
7
13
|
const DEFAULT_OPTIONS = {
|
|
8
14
|
numTypes: 20,
|
|
9
15
|
numSamples: 5,
|
|
16
|
+
valueDepth: 5,
|
|
10
17
|
includeRecursive: true,
|
|
11
18
|
includeFunctions: true,
|
|
19
|
+
nestedRecursive: true,
|
|
20
|
+
includeTypeValues: true,
|
|
12
21
|
maxValueRetries: 20,
|
|
13
22
|
attemptsMultiplier: 3,
|
|
14
23
|
ensureDiversity: true,
|
|
@@ -18,7 +27,7 @@ const DEFAULT_OPTIONS = {
|
|
|
18
27
|
* Specific type generators to ensure diversity in test coverage.
|
|
19
28
|
* These guarantee we test important type patterns that random generation might miss.
|
|
20
29
|
*/
|
|
21
|
-
function getDiverseTypes(includeRecursive, includeFunctions) {
|
|
30
|
+
function getDiverseTypes(includeRecursive, includeFunctions, nestedRecursive, includeTypeValues) {
|
|
22
31
|
const types = [
|
|
23
32
|
// Variants (often missed by random generation)
|
|
24
33
|
VariantType({ none: NullType, some: IntegerType }),
|
|
@@ -51,6 +60,17 @@ function getDiverseTypes(includeRecursive, includeFunctions) {
|
|
|
51
60
|
for (let i = 0; i < 3; i++) {
|
|
52
61
|
types.push(randomRecursiveType());
|
|
53
62
|
}
|
|
63
|
+
if (nestedRecursive) {
|
|
64
|
+
// A recursive type reached through a container before itself,
|
|
65
|
+
// random bodies, and recursion nested in recursion (#770).
|
|
66
|
+
types.push(randomSharedRecursiveType());
|
|
67
|
+
types.push(randomRecursiveType({ randomBody: true }));
|
|
68
|
+
types.push(ArrayType(randomRecursiveType({ randomBody: true })));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Type values: the shape every IR annotation travels as
|
|
72
|
+
if (includeTypeValues) {
|
|
73
|
+
types.push(EastTypeType, StructType({ a: ArrayType(EastTypeType), b: EastTypeType, c: ArrayType(EastTypeType) }));
|
|
54
74
|
}
|
|
55
75
|
// Add function types if enabled
|
|
56
76
|
if (includeFunctions) {
|
|
@@ -89,7 +109,7 @@ export function generateFuzzTestCases(options = {}) {
|
|
|
89
109
|
return false;
|
|
90
110
|
}
|
|
91
111
|
try {
|
|
92
|
-
const genValue = randomValueFor(type);
|
|
112
|
+
const genValue = randomValueFor(type, { maxDepth: opts.valueDepth });
|
|
93
113
|
// Helper to safely generate a value (retry on depth exceeded)
|
|
94
114
|
const safeGenValue = () => {
|
|
95
115
|
for (let retry = 0; retry < opts.maxValueRetries; retry++) {
|
|
@@ -118,14 +138,30 @@ export function generateFuzzTestCases(options = {}) {
|
|
|
118
138
|
// Create array types for East runtime iteration
|
|
119
139
|
const pairsArrayType = ArrayType(StructType({ before: type, after: type }));
|
|
120
140
|
const tripletsArrayType = ArrayType(StructType({ v1: type, v2: type, v3: type }));
|
|
141
|
+
// The reference patch values and their bytes, for the runtimes
|
|
142
|
+
// to match byte for byte.
|
|
143
|
+
const patchType = PatchType(type);
|
|
144
|
+
const diff = diffFor(type);
|
|
145
|
+
const invert = invertFor(type);
|
|
146
|
+
const compose = composeFor(type);
|
|
147
|
+
const encode = encodeBeast2For(patchType);
|
|
148
|
+
const hex = (patch) => `0x${Buffer.from(encode(patch)).toString("hex")}`;
|
|
149
|
+
const diffs = pairs.map(({ before, after }) => diff(before, after));
|
|
150
|
+
const diffHex = diffs.map(hex);
|
|
151
|
+
const invertHex = diffs.map((patch) => hex(invert(patch)));
|
|
152
|
+
const composeHex = triplets.map(({ v1, v2, v3 }) => hex(compose(diff(v1, v2), diff(v2, v3))));
|
|
121
153
|
seenTypes.add(typeName);
|
|
122
154
|
testCases.push({
|
|
123
155
|
type,
|
|
124
156
|
typeName,
|
|
157
|
+
fingerprint: typeFingerprint(type),
|
|
125
158
|
pairsArrayType,
|
|
126
159
|
tripletsArrayType,
|
|
127
160
|
pairs,
|
|
128
161
|
triplets,
|
|
162
|
+
diffHex,
|
|
163
|
+
invertHex,
|
|
164
|
+
composeHex,
|
|
129
165
|
});
|
|
130
166
|
return true;
|
|
131
167
|
}
|
|
@@ -139,7 +175,7 @@ export function generateFuzzTestCases(options = {}) {
|
|
|
139
175
|
};
|
|
140
176
|
// First, add diverse types to ensure coverage
|
|
141
177
|
if (opts.ensureDiversity) {
|
|
142
|
-
const diverseTypes = getDiverseTypes(opts.includeRecursive, opts.includeFunctions);
|
|
178
|
+
const diverseTypes = getDiverseTypes(opts.includeRecursive, opts.includeFunctions, opts.nestedRecursive, opts.includeTypeValues);
|
|
143
179
|
for (const type of diverseTypes) {
|
|
144
180
|
if (testCases.length >= opts.numTypes)
|
|
145
181
|
break;
|
|
@@ -155,6 +191,8 @@ export function generateFuzzTestCases(options = {}) {
|
|
|
155
191
|
const type = randomType(0, {
|
|
156
192
|
includeRecursive: opts.includeRecursive,
|
|
157
193
|
includeFunctions: opts.includeFunctions,
|
|
194
|
+
nestedRecursive: opts.nestedRecursive,
|
|
195
|
+
includeTypeValues: opts.includeTypeValues,
|
|
158
196
|
});
|
|
159
197
|
tryAddType(type);
|
|
160
198
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fuzz.js","sourceRoot":"","sources":["../../../src/patch/fuzz.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,EACH,SAAS,EACT,UAAU,EACV,WAAW,EACX,QAAQ,EACR,OAAO,EACP,OAAO,EACP,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EACT,WAAW,EACX,QAAQ,EACR,SAAS,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"fuzz.js","sourceRoot":"","sources":["../../../src/patch/fuzz.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,20 @@ import { type EastTypeValue } from "../type_of_type.js";
|
|
|
18
18
|
* for passing to constructors like {@link StructType} or for round-tripping
|
|
19
19
|
* via `toEastTypeValue` if a runtime form is needed.
|
|
20
20
|
*
|
|
21
|
-
*
|
|
21
|
+
* The patch type is a pure function of the type — every occurrence of a
|
|
22
|
+
* type gets the same patch type, wherever it sits — and it is the type the
|
|
23
|
+
* runtimes' patch values conform to, so it is one definition on every
|
|
24
|
+
* runtime (`PatchType` in east-py's `types.py`; east-c's `patch.c` builds
|
|
25
|
+
* values of exactly these shapes). A **recursive type is replace-only**:
|
|
26
|
+
* its patch has `unchanged` and `replace` cases and no `patch` case, at the
|
|
27
|
+
* wrapper and at every reference back to it, which is what `diffFor`,
|
|
28
|
+
* `applyFor`, `composeFor`, `invertFor`, `mergeFor` and `walkPatch` implement
|
|
29
|
+
* and what the type-level {@link PatchTypeOf} states. (An earlier version
|
|
30
|
+
* descended into the wrapper's body on its first occurrence only, keyed by
|
|
31
|
+
* object identity, so `Struct{a: Array<T>, b: T}` gave `a`'s element and `b`
|
|
32
|
+
* different patch types — a type no runtime's values conformed to; #774.)
|
|
33
|
+
*
|
|
34
|
+
* `ctx` memoizes the result per type object across one computation.
|
|
22
35
|
*/
|
|
23
36
|
export declare function PatchType<T extends EastType>(type: T, ctx?: Map<EastType, EastType>): EastType;
|
|
24
37
|
export declare function PatchType(type: EastTypeValue, ctx?: Map<EastType, EastType>): EastType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type_of_patch.d.ts","sourceRoot":"","sources":["../../../src/patch/type_of_patch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AAEH,OAAO,EACL,KAAK,QAAQ,EAOd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,aAAa,EAAqB,MAAM,oBAAoB,CAAC;AAG3E
|
|
1
|
+
{"version":3,"file":"type_of_patch.d.ts","sourceRoot":"","sources":["../../../src/patch/type_of_patch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AAEH,OAAO,EACL,KAAK,QAAQ,EAOd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,aAAa,EAAqB,MAAM,oBAAoB,CAAC;AAG3E;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC;AAChG,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC"}
|
|
@@ -13,13 +13,16 @@ import { isVariant } from "../containers/variant.js";
|
|
|
13
13
|
export function PatchType(type, ctx) {
|
|
14
14
|
if (isVariant(type))
|
|
15
15
|
type = fromEastTypeValue(type);
|
|
16
|
-
// Initialize context for tracking recursive types
|
|
17
16
|
const context = ctx ?? new Map();
|
|
18
|
-
// Check if we've already computed the patch type for this type (handles recursion)
|
|
19
17
|
const cached = context.get(type);
|
|
20
18
|
if (cached !== undefined) {
|
|
21
19
|
return cached;
|
|
22
20
|
}
|
|
21
|
+
const result = patchTypeOf(type, context);
|
|
22
|
+
context.set(type, result);
|
|
23
|
+
return result;
|
|
24
|
+
}
|
|
25
|
+
function patchTypeOf(type, context) {
|
|
23
26
|
const t = type;
|
|
24
27
|
if (t.type === "Never" ||
|
|
25
28
|
t.type === "Null" ||
|
|
@@ -116,20 +119,12 @@ export function PatchType(type, ctx) {
|
|
|
116
119
|
});
|
|
117
120
|
}
|
|
118
121
|
else if (t.type === "Recursive") {
|
|
119
|
-
//
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
return cached;
|
|
123
|
-
}
|
|
124
|
-
// For back-references within the recursive structure, use replace-only semantics
|
|
125
|
-
// Register this BEFORE recursing so circular refs are caught
|
|
126
|
-
const replaceOnlyType = VariantType({
|
|
122
|
+
// Replace-only, at the wrapper and at every reference back to it: the
|
|
123
|
+
// whole recursive value is the unit of change (see the module comment).
|
|
124
|
+
return VariantType({
|
|
127
125
|
unchanged: NullType,
|
|
128
126
|
replace: StructType({ before: type, after: type }),
|
|
129
127
|
});
|
|
130
|
-
context.set(type, replaceOnlyType);
|
|
131
|
-
// Recurse into the node - the outer structure gets structural patching
|
|
132
|
-
return PatchType(t.node, context);
|
|
133
128
|
}
|
|
134
129
|
else if (t.type === "Function" || t.type === "AsyncFunction") {
|
|
135
130
|
return VariantType({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type_of_patch.js","sourceRoot":"","sources":["../../../src/patch/type_of_patch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;GAIG;AAEH,OAAO,EAEL,QAAQ,EACR,UAAU,EACV,WAAW,EACX,SAAS,EACT,QAAQ,EACR,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAsB,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"type_of_patch.js","sourceRoot":"","sources":["../../../src/patch/type_of_patch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type_of_patch.spec.d.ts","sourceRoot":"","sources":["../../../src/patch/type_of_patch.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Elara AI Pty Ltd
|
|
3
|
+
* Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* PatchType over recursive types (#774): a pure function of the type, and
|
|
7
|
+
* replace-only at a recursive wrapper — the patch type every runtime
|
|
8
|
+
* declares and the type every runtime's patch values conform to.
|
|
9
|
+
*/
|
|
10
|
+
import { describe, test } from "node:test";
|
|
11
|
+
import assert from "node:assert/strict";
|
|
12
|
+
import { NullType, IntegerType, StringType, ArrayType, DictType, StructType, VariantType, OptionType, RecursiveType, } from "../types.js";
|
|
13
|
+
import { PatchType } from "./type_of_patch.js";
|
|
14
|
+
import { diffFor } from "./diff.js";
|
|
15
|
+
import { applyFor } from "./apply.js";
|
|
16
|
+
import { isValueOf, isTypeEqual } from "../types.js";
|
|
17
|
+
import { variant } from "../containers/variant.js";
|
|
18
|
+
const Linked = RecursiveType((self) => VariantType({
|
|
19
|
+
cons: StructType({ head: IntegerType, tail: self }),
|
|
20
|
+
nil: NullType,
|
|
21
|
+
}));
|
|
22
|
+
const replaceOnly = (t) => VariantType({ unchanged: NullType, replace: StructType({ before: t, after: t }) });
|
|
23
|
+
const caseType = (v, name) => v.cases[name];
|
|
24
|
+
const cases = (v) => Object.keys(v.cases).sort();
|
|
25
|
+
const fieldsOf = (v) => v.fields;
|
|
26
|
+
describe("PatchType — recursive types (#774)", () => {
|
|
27
|
+
test("a recursive type is replace-only: no patch case at the wrapper", () => {
|
|
28
|
+
const p = PatchType(Linked);
|
|
29
|
+
assert.deepEqual(cases(p), ["replace", "unchanged"]);
|
|
30
|
+
assert.ok(isTypeEqual(p, replaceOnly(Linked)));
|
|
31
|
+
// What diffFor computes and applyFor accepts — the type describes the values.
|
|
32
|
+
const before = variant("cons", { head: 1n, tail: variant("nil", null) });
|
|
33
|
+
const after = variant("cons", { head: 2n, tail: variant("nil", null) });
|
|
34
|
+
const patch = diffFor(Linked)(before, after);
|
|
35
|
+
assert.equal(patch.type, "replace");
|
|
36
|
+
assert.ok(isValueOf(patch, p), "the runtime's patch is a value of the patch type");
|
|
37
|
+
assert.deepEqual(applyFor(Linked)(before, patch), after);
|
|
38
|
+
});
|
|
39
|
+
test("the same type gets the same patch type wherever it occurs", () => {
|
|
40
|
+
// A wrapper reached through a container and bare, side by side: the
|
|
41
|
+
// shape the Patch_Fuzz corpus names several times over. An earlier
|
|
42
|
+
// PatchType descended into the wrapper on its first occurrence only, so
|
|
43
|
+
// `a`'s element and `b` disagreed and neither matched the runtime.
|
|
44
|
+
const Both = StructType({ a: ArrayType(Linked), b: Linked, c: Linked });
|
|
45
|
+
const p = PatchType(Both);
|
|
46
|
+
const fields = fieldsOf(caseType(p, "patch"));
|
|
47
|
+
const aElement = caseType(caseType(fields.a, "patch").value.fields.operation, "update");
|
|
48
|
+
assert.ok(isTypeEqual(aElement, fields.b));
|
|
49
|
+
assert.ok(isTypeEqual(fields.b, fields.c));
|
|
50
|
+
assert.ok(isTypeEqual(fields.b, PatchType(Linked)));
|
|
51
|
+
// ...and in the other order.
|
|
52
|
+
const Swapped = StructType({ b: Linked, a: ArrayType(Linked) });
|
|
53
|
+
assert.ok(isTypeEqual(fieldsOf(caseType(PatchType(Swapped), "patch")).b, fields.b));
|
|
54
|
+
});
|
|
55
|
+
test("a nested wrapper under an enclosing wrapper is replace-only too", () => {
|
|
56
|
+
const Outer = RecursiveType((self) => StructType({
|
|
57
|
+
first: DictType(StringType, Linked),
|
|
58
|
+
second: OptionType(Linked),
|
|
59
|
+
third: Linked,
|
|
60
|
+
next: OptionType(self),
|
|
61
|
+
}));
|
|
62
|
+
const p = PatchType(Outer);
|
|
63
|
+
assert.ok(isTypeEqual(p, replaceOnly(Outer)));
|
|
64
|
+
// The wrapper's body, patched as a struct on its own, names Linked's
|
|
65
|
+
// patch type in every position.
|
|
66
|
+
const body = PatchType(Outer.node);
|
|
67
|
+
const fields = fieldsOf(caseType(body, "patch"));
|
|
68
|
+
const firstValue = caseType(caseType(fields.first, "patch").value, "update");
|
|
69
|
+
assert.ok(isTypeEqual(firstValue, PatchType(Linked)));
|
|
70
|
+
assert.ok(isTypeEqual(caseType(caseType(fields.second, "patch"), "some"), PatchType(Linked)));
|
|
71
|
+
assert.ok(isTypeEqual(fields.third, PatchType(Linked)));
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=type_of_patch.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type_of_patch.spec.js","sourceRoot":"","sources":["../../../src/patch/type_of_patch.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,9 +23,10 @@ export { MAGIC_BYTES } from "./v4/container.js";
|
|
|
23
23
|
export { MAGIC_BYTES_V5 } from "./v5/codec.js";
|
|
24
24
|
export type { Beast2DecodeOptions } from "./shared.js";
|
|
25
25
|
export type { Beast2Codec } from "./v5/frames.js";
|
|
26
|
-
export { Beast2Writer, type Beast2WriterOptions, encodeBeast2SegmentsFor, encodeBeast2PagedFor, type Beast2PagedEncodeOptions, BEAST2_PAGED_BATCH_DEFAULT, BEAST2_PAGED_TARGET_BYTES_DEFAULT, iterBeast2SegmentsFor, Beast2Pages, openBeast2PagesFor, } from "./v5/stream.js";
|
|
26
|
+
export { Beast2Writer, type Beast2WriterOptions, encodeBeast2SegmentsFor, encodeBeast2PagedFor, type Beast2PagedEncodeOptions, BEAST2_PAGED_BATCH_DEFAULT, BEAST2_PAGED_PROBE_BATCH, BEAST2_PAGED_TARGET_BYTES_DEFAULT, iterBeast2SegmentsFor, Beast2Pages, openBeast2PagesFor, } from "./v5/stream.js";
|
|
27
27
|
export { type Beast2Extents, readBeast2Extents, carveBeast2, spliceBeast2, rebuildBeast2, type RebuildBeast2Options, type Beast2RangeReader, type Beast2SyncRangeReader, type Beast2RangedExtents, type ReadBeast2ExtentsRangedOptions, readBeast2ExtentsRanged, readBeast2ExtentsSync, isBeast2SyncRangeReader, carveBeast2Ranged, spliceBeast2Tail, } from "./v5/geometry.js";
|
|
28
28
|
export { openBeast2LazyFor, isBeast2LazySafe, type Beast2LazySafeOptions } from "./v5/lazy.js";
|
|
29
|
+
import type { Beast2SyncRangeReader } from "./v5/range.js";
|
|
29
30
|
/**
|
|
30
31
|
* Reads the root type a beast2 blob's header declares, without decoding the
|
|
31
32
|
* value.
|
|
@@ -41,6 +42,26 @@ export { openBeast2LazyFor, isBeast2LazySafe, type Beast2LazySafeOptions } from
|
|
|
41
42
|
* section is malformed.
|
|
42
43
|
*/
|
|
43
44
|
export declare function readBeast2Type(data: Uint8Array): EastTypeValue;
|
|
45
|
+
/**
|
|
46
|
+
* Reads the root type a beast2 blob's header declares, through ranged reads
|
|
47
|
+
* instead of the whole blob.
|
|
48
|
+
*
|
|
49
|
+
* The sibling of {@link readBeast2Type}, for a blob too big to hold in memory:
|
|
50
|
+
* a delivered file a caller is about to accept as a dataset, where the point of
|
|
51
|
+
* checking the type is to refuse it *before* paying for its bytes. Both
|
|
52
|
+
* container versions carry the type up front, so one head read normally answers
|
|
53
|
+
* it; a type section wider than the probe costs one more read, never the file.
|
|
54
|
+
*
|
|
55
|
+
* Collection roots have a cheaper and stricter check available in
|
|
56
|
+
* `readBeast2Extents(reader)`, which reads the index too. This one is for the
|
|
57
|
+
* roots that have no index.
|
|
58
|
+
*
|
|
59
|
+
* @param reader - synchronous ranged access to the blob
|
|
60
|
+
* @returns the declared root type
|
|
61
|
+
* @throws {Error} When the blob is not a beast2 container, or its type section
|
|
62
|
+
* is malformed or implausibly large.
|
|
63
|
+
*/
|
|
64
|
+
export declare function readBeast2HeaderType(reader: Beast2SyncRangeReader): EastTypeValue;
|
|
44
65
|
/**
|
|
45
66
|
* Whether a blob carries the v5 trailing paging index (a well-formed
|
|
46
67
|
* index + footer). O(index) — inspects the blob's tail without decoding any
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/serialization/beast2/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AAEH,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE5E,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAU,KAAK,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAiBvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAExE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EACL,YAAY,EACZ,KAAK,mBAAmB,EACxB,uBAAuB,EACvB,oBAAoB,EACpB,KAAK,wBAAwB,EAC7B,0BAA0B,EAC1B,iCAAiC,EACjC,qBAAqB,EACrB,WAAW,EACX,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,KAAK,aAAa,EAClB,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,EACxB,KAAK,8BAA8B,EACnC,uBAAuB,EACvB,qBAAqB,EACrB,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/serialization/beast2/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,7 +22,7 @@ import { encodeBeast2V5For, decodeBeast2V5For, decodeBeast2V5ForAsync, decodeBea
|
|
|
22
22
|
import { BEAST2_WRITE_VERSION } from "./version.js";
|
|
23
23
|
export { MAGIC_BYTES } from "./v4/container.js";
|
|
24
24
|
export { MAGIC_BYTES_V5 } from "./v5/codec.js";
|
|
25
|
-
export { Beast2Writer, encodeBeast2SegmentsFor, encodeBeast2PagedFor, BEAST2_PAGED_BATCH_DEFAULT, BEAST2_PAGED_TARGET_BYTES_DEFAULT, iterBeast2SegmentsFor, Beast2Pages, openBeast2PagesFor, } from "./v5/stream.js";
|
|
25
|
+
export { Beast2Writer, encodeBeast2SegmentsFor, encodeBeast2PagedFor, BEAST2_PAGED_BATCH_DEFAULT, BEAST2_PAGED_PROBE_BATCH, BEAST2_PAGED_TARGET_BYTES_DEFAULT, iterBeast2SegmentsFor, Beast2Pages, openBeast2PagesFor, } from "./v5/stream.js";
|
|
26
26
|
export { readBeast2Extents, carveBeast2, spliceBeast2, rebuildBeast2, readBeast2ExtentsRanged, readBeast2ExtentsSync, isBeast2SyncRangeReader, carveBeast2Ranged, spliceBeast2Tail, } from "./v5/geometry.js";
|
|
27
27
|
export { openBeast2LazyFor, isBeast2LazySafe } from "./v5/lazy.js";
|
|
28
28
|
import { readIndex, MAGIC_BYTES_V5 } from "./v5/codec.js";
|
|
@@ -45,6 +45,61 @@ export function readBeast2Type(data) {
|
|
|
45
45
|
return readBeast2V4Type(data);
|
|
46
46
|
return readTypeSection(new BufferReader(data, MAGIC_BYTES_V5.length)).rootType;
|
|
47
47
|
}
|
|
48
|
+
/** Head read sizes {@link readBeast2HeaderType} tries, in order. The first
|
|
49
|
+
* covers every type section anything realistic writes; the last is a ceiling,
|
|
50
|
+
* not a budget — a blob whose declared type needs more than 16 MiB of type
|
|
51
|
+
* table is malformed, not merely large. */
|
|
52
|
+
const HEADER_TYPE_PROBE_BYTES = [64 * 1024, 1024 * 1024, 16 * 1024 * 1024];
|
|
53
|
+
/**
|
|
54
|
+
* Reads the root type a beast2 blob's header declares, through ranged reads
|
|
55
|
+
* instead of the whole blob.
|
|
56
|
+
*
|
|
57
|
+
* The sibling of {@link readBeast2Type}, for a blob too big to hold in memory:
|
|
58
|
+
* a delivered file a caller is about to accept as a dataset, where the point of
|
|
59
|
+
* checking the type is to refuse it *before* paying for its bytes. Both
|
|
60
|
+
* container versions carry the type up front, so one head read normally answers
|
|
61
|
+
* it; a type section wider than the probe costs one more read, never the file.
|
|
62
|
+
*
|
|
63
|
+
* Collection roots have a cheaper and stricter check available in
|
|
64
|
+
* `readBeast2Extents(reader)`, which reads the index too. This one is for the
|
|
65
|
+
* roots that have no index.
|
|
66
|
+
*
|
|
67
|
+
* @param reader - synchronous ranged access to the blob
|
|
68
|
+
* @returns the declared root type
|
|
69
|
+
* @throws {Error} When the blob is not a beast2 container, or its type section
|
|
70
|
+
* is malformed or implausibly large.
|
|
71
|
+
*/
|
|
72
|
+
export function readBeast2HeaderType(reader) {
|
|
73
|
+
const size = reader.size;
|
|
74
|
+
if (size < 8) {
|
|
75
|
+
throw new Error(`Data too short for Beast2 format: ${size} bytes`);
|
|
76
|
+
}
|
|
77
|
+
let lastError;
|
|
78
|
+
let read = 0;
|
|
79
|
+
for (const probe of HEADER_TYPE_PROBE_BYTES) {
|
|
80
|
+
const length = Math.min(size, probe);
|
|
81
|
+
if (length <= read && read > 0)
|
|
82
|
+
break;
|
|
83
|
+
read = length;
|
|
84
|
+
const head = reader.read(0, length);
|
|
85
|
+
if (head.length !== length) {
|
|
86
|
+
throw new Error(`beast2: reader returned ${head.length} bytes for a ${length}-byte range at offset 0`);
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
return readBeast2Type(head);
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
// A short head fails the same way a malformed one does, so grow first
|
|
93
|
+
// and only report the failure once the whole type section must be in
|
|
94
|
+
// hand. `read === size` means it is.
|
|
95
|
+
if (length === size)
|
|
96
|
+
throw err;
|
|
97
|
+
lastError = err;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
throw new Error(`beast2: type section not readable in the first ${read} bytes — ` +
|
|
101
|
+
`${lastError instanceof Error ? lastError.message : String(lastError)}`);
|
|
102
|
+
}
|
|
48
103
|
/**
|
|
49
104
|
* Whether a blob carries the v5 trailing paging index (a well-formed
|
|
50
105
|
* index + footer). O(index) — inspects the blob's tail without decoding any
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/serialization/beast2/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAAsB,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAExD,OAAO,EAAE,MAAM,EAAyC,MAAM,aAAa,CAAC;AAE5E,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAA4B,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,EACd,uBAAuB,GACxB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,oBAAoB,EAAsB,MAAM,cAAc,CAAC;AAExE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,EACL,YAAY,EAEZ,uBAAuB,EACvB,oBAAoB,EAEpB,0BAA0B,EAC1B,iCAAiC,EACjC,qBAAqB,EACrB,WAAW,EACX,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAEL,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,aAAa,EAMb,uBAAuB,EACvB,qBAAqB,EACrB,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAA8B,MAAM,cAAc,CAAC;AAC/F,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/serialization/beast2/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ import { describe, test } from "node:test";
|
|
|
11
11
|
import assert from "node:assert/strict";
|
|
12
12
|
import { NullType, BooleanType, IntegerType, FloatType, StringType, DateTimeType, BlobType, ArrayType, SetType, DictType, StructType, VariantType, RecursiveType, RefType, VectorType, MatrixType, FunctionType, } from "../../types.js";
|
|
13
13
|
import { toEastTypeValue, EastTypeValueType } from "../../type_of_type.js";
|
|
14
|
+
import { TypeTableBuilder } from "./v4/type-table.js";
|
|
14
15
|
import { IRType } from "../../ir.js";
|
|
15
16
|
import { equalFor } from "../../comparison.js";
|
|
16
17
|
import { East, variant, ref, some, none } from "../../index.js";
|
|
@@ -676,6 +677,21 @@ describe("Beast2 — canonical type table", () => {
|
|
|
676
677
|
});
|
|
677
678
|
assertCanonical(EastTypeValueType, toEastTypeValue(T), "EastTypeValueType");
|
|
678
679
|
});
|
|
680
|
+
test("a deduplicated wrapper binds every id that named it", () => {
|
|
681
|
+
// One recursive type reaches a table under two wrapper ids — an interned
|
|
682
|
+
// type id for a type built here, a table index for one read off the wire.
|
|
683
|
+
// The ids are runtime artefacts and are never written, so the wrappers
|
|
684
|
+
// dedup to one entry; binding only the first id left a later bare `ref`
|
|
685
|
+
// under the second — which is what a mutable container over the
|
|
686
|
+
// self-reference adds — bound by no wrapper, failing the whole encode.
|
|
687
|
+
const wrapper = (id) => variant("Recursive", variant("wrapper", { id, inner: variant("Integer", null) }));
|
|
688
|
+
const selfRef = (id) => variant("Recursive", variant("ref", id));
|
|
689
|
+
const builder = new TypeTableBuilder();
|
|
690
|
+
const first = builder.add(wrapper(42n));
|
|
691
|
+
assert.equal(builder.add(wrapper(7n)), first, "structurally equal wrappers are one entry");
|
|
692
|
+
assert.equal(builder.add(selfRef(42n)), first);
|
|
693
|
+
assert.equal(builder.add(selfRef(7n)), first, "the deduplicated wrapper's id resolves too");
|
|
694
|
+
});
|
|
679
695
|
test("one table index yields one shared object", () => {
|
|
680
696
|
// Identity, not just structure: TypeTableBuilder dedups EastTypeValues by
|
|
681
697
|
// object identity, so a decoded type that hands out two objects for one
|