@hegeldev/hegel 0.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.
Files changed (144) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +59 -0
  3. package/dist/binary.d.ts +27 -0
  4. package/dist/binary.d.ts.map +1 -0
  5. package/dist/binary.js +50 -0
  6. package/dist/binary.js.map +1 -0
  7. package/dist/collections.d.ts +114 -0
  8. package/dist/collections.d.ts.map +1 -0
  9. package/dist/collections.js +313 -0
  10. package/dist/collections.js.map +1 -0
  11. package/dist/combinators.d.ts +34 -0
  12. package/dist/combinators.d.ts.map +1 -0
  13. package/dist/combinators.js +152 -0
  14. package/dist/combinators.js.map +1 -0
  15. package/dist/conformance.d.ts +31 -0
  16. package/dist/conformance.d.ts.map +1 -0
  17. package/dist/conformance.js +60 -0
  18. package/dist/conformance.js.map +1 -0
  19. package/dist/connection.d.ts +82 -0
  20. package/dist/connection.d.ts.map +1 -0
  21. package/dist/connection.js +231 -0
  22. package/dist/connection.js.map +1 -0
  23. package/dist/crc32.d.ts +13 -0
  24. package/dist/crc32.d.ts.map +1 -0
  25. package/dist/crc32.js +30 -0
  26. package/dist/crc32.js.map +1 -0
  27. package/dist/derive.d.ts +225 -0
  28. package/dist/derive.d.ts.map +1 -0
  29. package/dist/derive.js +296 -0
  30. package/dist/derive.js.map +1 -0
  31. package/dist/embedded.d.ts +38 -0
  32. package/dist/embedded.d.ts.map +1 -0
  33. package/dist/embedded.js +237 -0
  34. package/dist/embedded.js.map +1 -0
  35. package/dist/floats.d.ts +57 -0
  36. package/dist/floats.d.ts.map +1 -0
  37. package/dist/floats.js +100 -0
  38. package/dist/floats.js.map +1 -0
  39. package/dist/formats.d.ts +62 -0
  40. package/dist/formats.d.ts.map +1 -0
  41. package/dist/formats.js +164 -0
  42. package/dist/formats.js.map +1 -0
  43. package/dist/generator.d.ts +80 -0
  44. package/dist/generator.d.ts.map +1 -0
  45. package/dist/generator.js +128 -0
  46. package/dist/generator.js.map +1 -0
  47. package/dist/generators/collections.d.ts +20 -0
  48. package/dist/generators/collections.d.ts.map +1 -0
  49. package/dist/generators/collections.js +209 -0
  50. package/dist/generators/collections.js.map +1 -0
  51. package/dist/generators/combinators.d.ts +15 -0
  52. package/dist/generators/combinators.d.ts.map +1 -0
  53. package/dist/generators/combinators.js +143 -0
  54. package/dist/generators/combinators.js.map +1 -0
  55. package/dist/generators/compose.d.ts +27 -0
  56. package/dist/generators/compose.d.ts.map +1 -0
  57. package/dist/generators/compose.js +82 -0
  58. package/dist/generators/compose.js.map +1 -0
  59. package/dist/generators/core.d.ts +53 -0
  60. package/dist/generators/core.d.ts.map +1 -0
  61. package/dist/generators/core.js +134 -0
  62. package/dist/generators/core.js.map +1 -0
  63. package/dist/generators/index.d.ts +18 -0
  64. package/dist/generators/index.d.ts.map +1 -0
  65. package/dist/generators/index.js +15 -0
  66. package/dist/generators/index.js.map +1 -0
  67. package/dist/generators/numeric.d.ts +40 -0
  68. package/dist/generators/numeric.d.ts.map +1 -0
  69. package/dist/generators/numeric.js +128 -0
  70. package/dist/generators/numeric.js.map +1 -0
  71. package/dist/generators/primitives.d.ts +138 -0
  72. package/dist/generators/primitives.d.ts.map +1 -0
  73. package/dist/generators/primitives.js +240 -0
  74. package/dist/generators/primitives.js.map +1 -0
  75. package/dist/generators/strings.d.ts +73 -0
  76. package/dist/generators/strings.d.ts.map +1 -0
  77. package/dist/generators/strings.js +215 -0
  78. package/dist/generators/strings.js.map +1 -0
  79. package/dist/generators/tuples.d.ts +11 -0
  80. package/dist/generators/tuples.d.ts.map +1 -0
  81. package/dist/generators/tuples.js +43 -0
  82. package/dist/generators/tuples.js.map +1 -0
  83. package/dist/generators.d.ts +408 -0
  84. package/dist/generators.d.ts.map +1 -0
  85. package/dist/generators.js +898 -0
  86. package/dist/generators.js.map +1 -0
  87. package/dist/index.d.ts +16 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +13 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/install.d.ts +6 -0
  92. package/dist/install.d.ts.map +1 -0
  93. package/dist/install.js +91 -0
  94. package/dist/install.js.map +1 -0
  95. package/dist/integers.d.ts +37 -0
  96. package/dist/integers.d.ts.map +1 -0
  97. package/dist/integers.js +63 -0
  98. package/dist/integers.js.map +1 -0
  99. package/dist/labels.d.ts +21 -0
  100. package/dist/labels.d.ts.map +1 -0
  101. package/dist/labels.js +20 -0
  102. package/dist/labels.js.map +1 -0
  103. package/dist/objects.d.ts +39 -0
  104. package/dist/objects.d.ts.map +1 -0
  105. package/dist/objects.js +98 -0
  106. package/dist/objects.js.map +1 -0
  107. package/dist/primitives.d.ts +14 -0
  108. package/dist/primitives.d.ts.map +1 -0
  109. package/dist/primitives.js +51 -0
  110. package/dist/primitives.js.map +1 -0
  111. package/dist/protocol.d.ts +25 -0
  112. package/dist/protocol.d.ts.map +1 -0
  113. package/dist/protocol.js +77 -0
  114. package/dist/protocol.js.map +1 -0
  115. package/dist/runner.d.ts +115 -0
  116. package/dist/runner.d.ts.map +1 -0
  117. package/dist/runner.js +455 -0
  118. package/dist/runner.js.map +1 -0
  119. package/dist/session.d.ts +19 -0
  120. package/dist/session.d.ts.map +1 -0
  121. package/dist/session.js +157 -0
  122. package/dist/session.js.map +1 -0
  123. package/dist/spans.d.ts +23 -0
  124. package/dist/spans.d.ts.map +1 -0
  125. package/dist/spans.js +51 -0
  126. package/dist/spans.js.map +1 -0
  127. package/dist/strings.d.ts +67 -0
  128. package/dist/strings.d.ts.map +1 -0
  129. package/dist/strings.js +107 -0
  130. package/dist/strings.js.map +1 -0
  131. package/dist/testCase.d.ts +118 -0
  132. package/dist/testCase.d.ts.map +1 -0
  133. package/dist/testCase.js +186 -0
  134. package/dist/testCase.js.map +1 -0
  135. package/dist/uv-install.sh +2226 -0
  136. package/dist/uv.d.ts +20 -0
  137. package/dist/uv.d.ts.map +1 -0
  138. package/dist/uv.js +103 -0
  139. package/dist/uv.js.map +1 -0
  140. package/dist/wtf8.d.ts +16 -0
  141. package/dist/wtf8.d.ts.map +1 -0
  142. package/dist/wtf8.js +52 -0
  143. package/dist/wtf8.js.map +1 -0
  144. package/package.json +60 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Antithesis, LLC
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,59 @@
1
+ > [!IMPORTANT]
2
+ > We're excited you're checking out Hegel! Hegel is in beta, and we'd love for you to try it and [report any feedback](https://github.com/hegeldev/hegel-typescript/issues/new).
3
+ >
4
+ > As part of our beta, we may make breaking changes if it makes Hegel a better property-based testing library. If that instability bothers you, please check back in a few months for a stable release!
5
+ >
6
+ > See https://hegel.dev/compatibility for more details.
7
+
8
+ # Hegel for TypeScript
9
+
10
+ - [Documentation](https://hegel.dev/typescript)
11
+ - [Website](https://hegel.dev)
12
+
13
+ Hegel is a property-based testing library for TypeScript. Hegel is based on [Hypothesis](https://github.com/hypothesisworks/hypothesis), using the [Hegel protocol](https://hegel.dev/).
14
+
15
+ ## Installation
16
+
17
+ To install: `npm install --save-dev @hegeldev/hegel`.
18
+
19
+ Hegel requires Node 16+. Bun and Deno are not currently supported.
20
+
21
+ Hegel will use [uv](https://docs.astral.sh/uv/) to install the required [hegel-core](https://github.com/hegeldev/hegel-core) server component.
22
+ If `uv` is already on your path, it will use that, otherwise it will download a private copy of it to ~/.cache/hegel and not put it on your path.
23
+ See https://hegel.dev/reference/installation for details.
24
+
25
+ ## Quickstart
26
+
27
+ Here's a quick example of how to write a Hegel test:
28
+
29
+ ```typescript
30
+ import { test } from "vitest";
31
+ import * as hegel from "@hegeldev/hegel";
32
+ import * as gs from "@hegeldev/hegel/generators";
33
+
34
+ function mySort(ls: number[]): number[] {
35
+ const result = [...ls].sort((a, b) => a - b);
36
+ return [...new Set(result)];
37
+ }
38
+
39
+ test(
40
+ "my_sort matches builtin",
41
+ hegel.test((tc) => {
42
+ const vec1 = tc.draw(gs.arrays(gs.integers()));
43
+ const vec2 = mySort(vec1);
44
+ const sorted = [...vec1].sort((a, b) => a - b);
45
+ if (JSON.stringify(sorted) !== JSON.stringify(vec2)) {
46
+ throw new Error(`sort mismatch: ${JSON.stringify(sorted)} != ${JSON.stringify(vec2)}`);
47
+ }
48
+ }),
49
+ );
50
+ ```
51
+
52
+ This test will fail when run with `vitest`! Hegel will produce a minimal failing test case for us:
53
+
54
+ ```
55
+ Draw 1: [0, 0]
56
+ Error: sort mismatch: [0,0] != [0]
57
+ ```
58
+
59
+ Hegel reports the minimal example showing that our sort is incorrectly dropping duplicates. If we remove the `new Set(...)` deduplication from `mySort()`, this test will then pass (because it's just comparing the standard sort against itself).
@@ -0,0 +1,27 @@
1
+ import { Generator } from "./generator.js";
2
+ /**
3
+ * Options for binary generator.
4
+ */
5
+ export interface BinaryOptions {
6
+ /** Minimum size in bytes (default: 0) */
7
+ minSize?: number;
8
+ /** Maximum size in bytes (default: no limit) */
9
+ maxSize?: number;
10
+ }
11
+ /**
12
+ * Create a generator for binary data (byte sequences).
13
+ *
14
+ * @param options - Size constraints
15
+ * @returns Generator producing Uint8Array
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * // Generate any byte sequence
20
+ * const gen = binary();
21
+ *
22
+ * // Generate 16-32 bytes
23
+ * const bounded = binary({ minSize: 16, maxSize: 32 });
24
+ * ```
25
+ */
26
+ export declare function binary(options?: BinaryOptions): Generator<Uint8Array>;
27
+ //# sourceMappingURL=binary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary.d.ts","sourceRoot":"","sources":["../src/binary.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,SAAS,EAAc,MAAM,gBAAgB,CAAA;AAErE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAmCD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,SAAS,CAAC,UAAU,CAAC,CAEzE"}
package/dist/binary.js ADDED
@@ -0,0 +1,50 @@
1
+ import { generateFromSchema } from "./connection.js";
2
+ import { FuncGenerator } from "./generator.js";
3
+ /**
4
+ * Generator for binary data (byte sequences).
5
+ */
6
+ class BinaryGenerator extends FuncGenerator {
7
+ _binarySchema;
8
+ constructor(options = {}) {
9
+ const schema = {
10
+ type: "binary",
11
+ min_size: options.minSize ?? 0,
12
+ };
13
+ if (options.maxSize !== undefined) {
14
+ schema.max_size = options.maxSize;
15
+ }
16
+ super(() => {
17
+ const b64 = generateFromSchema(schema);
18
+ // Decode base64 to Uint8Array
19
+ const binaryString = atob(b64);
20
+ const bytes = new Uint8Array(binaryString.length);
21
+ for (let i = 0; i < binaryString.length; i++) {
22
+ bytes[i] = binaryString.charCodeAt(i);
23
+ }
24
+ return bytes;
25
+ }, schema);
26
+ this._binarySchema = schema;
27
+ }
28
+ schema() {
29
+ return this._binarySchema;
30
+ }
31
+ }
32
+ /**
33
+ * Create a generator for binary data (byte sequences).
34
+ *
35
+ * @param options - Size constraints
36
+ * @returns Generator producing Uint8Array
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * // Generate any byte sequence
41
+ * const gen = binary();
42
+ *
43
+ * // Generate 16-32 bytes
44
+ * const bounded = binary({ minSize: 16, maxSize: 32 });
45
+ * ```
46
+ */
47
+ export function binary(options = {}) {
48
+ return new BinaryGenerator(options);
49
+ }
50
+ //# sourceMappingURL=binary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary.js","sourceRoot":"","sources":["../src/binary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAyB,MAAM,gBAAgB,CAAA;AAYrE;;GAEG;AACH,MAAM,eAAgB,SAAQ,aAAyB;IACpC,aAAa,CAAY;IAE1C,YAAY,UAAyB,EAAE;QACrC,MAAM,MAAM,GAAe;YACzB,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC;SAC/B,CAAA;QACD,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAA;QACnC,CAAC;QAED,KAAK,CAAC,GAAG,EAAE;YACT,MAAM,GAAG,GAAG,kBAAkB,CAAS,MAAM,CAAC,CAAA;YAC9C,8BAA8B;YAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;YAC9B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;YACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7C,KAAK,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;YACvC,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC,EAAE,MAAM,CAAC,CAAA;QACV,IAAI,CAAC,aAAa,GAAG,MAAM,CAAA;IAC7B,CAAC;IAEQ,MAAM;QACb,OAAO,IAAI,CAAC,aAAa,CAAA;IAC3B,CAAC;CACF;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,MAAM,CAAC,UAAyB,EAAE;IAChD,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,CAAA;AACrC,CAAC"}
@@ -0,0 +1,114 @@
1
+ import { Generator, JsonSchema, BaseGenerator } from "./generator.js";
2
+ /**
3
+ * Generator for arrays with builder pattern.
4
+ */
5
+ export declare class ArrayGenerator<T> extends BaseGenerator<T[]> {
6
+ private readonly elements;
7
+ private readonly _minSize;
8
+ private readonly _maxSize?;
9
+ private readonly _unique;
10
+ private constructor();
11
+ static create<T>(elements: Generator<T>): ArrayGenerator<T>;
12
+ /**
13
+ * Set the minimum array size.
14
+ */
15
+ minSize(value: number): ArrayGenerator<T>;
16
+ /**
17
+ * Set the maximum array size.
18
+ */
19
+ maxSize(value: number): ArrayGenerator<T>;
20
+ /**
21
+ * Require all elements to be unique.
22
+ */
23
+ unique(): ArrayGenerator<T>;
24
+ generate(): T[];
25
+ schema(): JsonSchema | null;
26
+ }
27
+ /**
28
+ * Create a generator for arrays.
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * // Generate array of integers
33
+ * const gen = arrays(integers());
34
+ *
35
+ * // Generate array with size bounds
36
+ * const bounded = arrays(integers()).minSize(1).maxSize(10);
37
+ *
38
+ * // Generate array with unique elements
39
+ * const uniqueGen = arrays(integers()).unique();
40
+ * ```
41
+ */
42
+ export declare function arrays<T>(elements: Generator<T>): ArrayGenerator<T>;
43
+ /**
44
+ * Generator for Sets.
45
+ * Internally generates unique arrays and converts to Set.
46
+ */
47
+ export declare class SetGenerator<T> extends BaseGenerator<Set<T>> {
48
+ private readonly elements;
49
+ private readonly _minSize;
50
+ private readonly _maxSize?;
51
+ private constructor();
52
+ static create<T>(elements: Generator<T>): SetGenerator<T>;
53
+ /**
54
+ * Set the minimum set size.
55
+ */
56
+ minSize(value: number): SetGenerator<T>;
57
+ /**
58
+ * Set the maximum set size.
59
+ */
60
+ maxSize(value: number): SetGenerator<T>;
61
+ generate(): Set<T>;
62
+ schema(): JsonSchema | null;
63
+ }
64
+ /**
65
+ * Create a generator for Sets.
66
+ */
67
+ export declare function sets<T>(elements: Generator<T>): SetGenerator<T>;
68
+ /**
69
+ * Generator for Maps (dictionaries) with configurable key and value types.
70
+ */
71
+ export declare class MapGenerator<K, V> extends BaseGenerator<Map<K, V>> {
72
+ private readonly keys;
73
+ private readonly values;
74
+ private readonly _minSize;
75
+ private readonly _maxSize?;
76
+ private constructor();
77
+ static create<K, V>(keys: Generator<K>, values: Generator<V>): MapGenerator<K, V>;
78
+ /**
79
+ * Set the minimum map size.
80
+ */
81
+ minSize(value: number): MapGenerator<K, V>;
82
+ /**
83
+ * Set the maximum map size.
84
+ */
85
+ maxSize(value: number): MapGenerator<K, V>;
86
+ generate(): Map<K, V>;
87
+ schema(): JsonSchema | null;
88
+ }
89
+ /**
90
+ * Create a generator for Maps with configurable key and value types.
91
+ *
92
+ * @example
93
+ * ```typescript
94
+ * // String keys (common case)
95
+ * const strMap = maps(text(), integers());
96
+ *
97
+ * // Integer keys
98
+ * const intMap = maps(integers(), text());
99
+ * ```
100
+ */
101
+ export declare function maps<K, V>(keys: Generator<K>, values: Generator<V>): MapGenerator<K, V>;
102
+ /**
103
+ * Create a generator for tuples (fixed-length heterogeneous arrays).
104
+ *
105
+ * @example
106
+ * ```typescript
107
+ * const gen = tuples(integers(), text(), booleans());
108
+ * const [num, str, bool] = gen.generate();
109
+ * ```
110
+ */
111
+ export declare function tuples<T extends unknown[]>(...generators: {
112
+ [K in keyof T]: Generator<T[K]>;
113
+ }): Generator<T>;
114
+ //# sourceMappingURL=collections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../src/collections.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,313 @@
1
+ import { generateFromSchema, assume } from "./connection.js";
2
+ import { BaseGenerator } from "./generator.js";
3
+ import { integers } from "./integers.js";
4
+ import { LABELS } from "./labels.js";
5
+ import { group } from "./spans.js";
6
+ /**
7
+ * Generator for arrays with builder pattern.
8
+ */
9
+ export class ArrayGenerator extends BaseGenerator {
10
+ elements;
11
+ _minSize;
12
+ _maxSize;
13
+ _unique;
14
+ constructor(elements, _minSize = 0, _maxSize, _unique = false) {
15
+ super();
16
+ this.elements = elements;
17
+ this._minSize = _minSize;
18
+ this._maxSize = _maxSize;
19
+ this._unique = _unique;
20
+ }
21
+ static create(elements) {
22
+ return new ArrayGenerator(elements);
23
+ }
24
+ /**
25
+ * Set the minimum array size.
26
+ */
27
+ minSize(value) {
28
+ return new ArrayGenerator(this.elements, value, this._maxSize, this._unique);
29
+ }
30
+ /**
31
+ * Set the maximum array size.
32
+ */
33
+ maxSize(value) {
34
+ return new ArrayGenerator(this.elements, this._minSize, value, this._unique);
35
+ }
36
+ /**
37
+ * Require all elements to be unique.
38
+ */
39
+ unique() {
40
+ return new ArrayGenerator(this.elements, this._minSize, this._maxSize, true);
41
+ }
42
+ generate() {
43
+ const schema = this.schema();
44
+ if (schema) {
45
+ // Schema composition: single socket round-trip
46
+ return generateFromSchema(schema);
47
+ }
48
+ // Compositional fallback: generate length, then each element
49
+ return group(LABELS.LIST, () => {
50
+ const maxSize = this._maxSize ?? 100;
51
+ const length = integers().min(this._minSize).max(maxSize).generate();
52
+ if (this._unique) {
53
+ // For unique arrays, track seen values
54
+ const seen = new Set();
55
+ const result = [];
56
+ const maxAttempts = length * 10;
57
+ let attempts = 0;
58
+ while (result.length < length && attempts < maxAttempts) {
59
+ const value = group(LABELS.LIST_ELEMENT, () => this.elements.generate());
60
+ const key = JSON.stringify(value);
61
+ if (!seen.has(key)) {
62
+ seen.add(key);
63
+ result.push(value);
64
+ }
65
+ attempts++;
66
+ }
67
+ assume(result.length >= this._minSize);
68
+ return result;
69
+ }
70
+ const result = [];
71
+ for (let i = 0; i < length; i++) {
72
+ result.push(group(LABELS.LIST_ELEMENT, () => this.elements.generate()));
73
+ }
74
+ return result;
75
+ });
76
+ }
77
+ schema() {
78
+ const elementSchema = this.elements.schema();
79
+ if (!elementSchema) {
80
+ return null; // Fall back to compositional generation
81
+ }
82
+ const schema = {
83
+ type: this._unique ? "set" : "list",
84
+ elements: elementSchema,
85
+ min_size: this._minSize,
86
+ };
87
+ if (this._maxSize !== undefined) {
88
+ schema.max_size = this._maxSize;
89
+ }
90
+ return schema;
91
+ }
92
+ }
93
+ /**
94
+ * Create a generator for arrays.
95
+ *
96
+ * @example
97
+ * ```typescript
98
+ * // Generate array of integers
99
+ * const gen = arrays(integers());
100
+ *
101
+ * // Generate array with size bounds
102
+ * const bounded = arrays(integers()).minSize(1).maxSize(10);
103
+ *
104
+ * // Generate array with unique elements
105
+ * const uniqueGen = arrays(integers()).unique();
106
+ * ```
107
+ */
108
+ export function arrays(elements) {
109
+ return ArrayGenerator.create(elements);
110
+ }
111
+ /**
112
+ * Generator for Sets.
113
+ * Internally generates unique arrays and converts to Set.
114
+ */
115
+ export class SetGenerator extends BaseGenerator {
116
+ elements;
117
+ _minSize;
118
+ _maxSize;
119
+ constructor(elements, _minSize = 0, _maxSize) {
120
+ super();
121
+ this.elements = elements;
122
+ this._minSize = _minSize;
123
+ this._maxSize = _maxSize;
124
+ }
125
+ static create(elements) {
126
+ return new SetGenerator(elements);
127
+ }
128
+ /**
129
+ * Set the minimum set size.
130
+ */
131
+ minSize(value) {
132
+ return new SetGenerator(this.elements, value, this._maxSize);
133
+ }
134
+ /**
135
+ * Set the maximum set size.
136
+ */
137
+ maxSize(value) {
138
+ return new SetGenerator(this.elements, this._minSize, value);
139
+ }
140
+ generate() {
141
+ // Generate as unique array, then convert to Set
142
+ const arr = arrays(this.elements)
143
+ .minSize(this._minSize)
144
+ .maxSize(this._maxSize ?? 100)
145
+ .unique()
146
+ .generate();
147
+ return new Set(arr);
148
+ }
149
+ schema() {
150
+ const elementSchema = this.elements.schema();
151
+ if (!elementSchema) {
152
+ return null;
153
+ }
154
+ const schema = {
155
+ type: "set",
156
+ elements: elementSchema,
157
+ min_size: this._minSize,
158
+ };
159
+ if (this._maxSize !== undefined) {
160
+ schema.max_size = this._maxSize;
161
+ }
162
+ return schema;
163
+ }
164
+ }
165
+ /**
166
+ * Create a generator for Sets.
167
+ */
168
+ export function sets(elements) {
169
+ return SetGenerator.create(elements);
170
+ }
171
+ /**
172
+ * Generator for Maps (dictionaries) with configurable key and value types.
173
+ */
174
+ export class MapGenerator extends BaseGenerator {
175
+ keys;
176
+ values;
177
+ _minSize;
178
+ _maxSize;
179
+ constructor(keys, values, _minSize = 0, _maxSize) {
180
+ super();
181
+ this.keys = keys;
182
+ this.values = values;
183
+ this._minSize = _minSize;
184
+ this._maxSize = _maxSize;
185
+ }
186
+ static create(keys, values) {
187
+ return new MapGenerator(keys, values);
188
+ }
189
+ /**
190
+ * Set the minimum map size.
191
+ */
192
+ minSize(value) {
193
+ return new MapGenerator(this.keys, this.values, value, this._maxSize);
194
+ }
195
+ /**
196
+ * Set the maximum map size.
197
+ */
198
+ maxSize(value) {
199
+ return new MapGenerator(this.keys, this.values, this._minSize, value);
200
+ }
201
+ generate() {
202
+ const schema = this.schema();
203
+ if (schema) {
204
+ // Schema composition: single socket round-trip
205
+ // Wire format is [[key, value], ...]
206
+ const pairs = generateFromSchema(schema);
207
+ const result = new Map(pairs);
208
+ // Ensure size constraints are met (in case of duplicate keys)
209
+ assume(result.size >= this._minSize);
210
+ if (this._maxSize !== undefined) {
211
+ assume(result.size <= this._maxSize);
212
+ }
213
+ return result;
214
+ }
215
+ // Compositional fallback
216
+ return group(LABELS.MAP, () => {
217
+ const maxSize = this._maxSize ?? 100;
218
+ const targetSize = integers().min(this._minSize).max(maxSize).generate();
219
+ const result = new Map();
220
+ const maxAttempts = targetSize * 10;
221
+ let attempts = 0;
222
+ while (result.size < targetSize && attempts < maxAttempts) {
223
+ group(LABELS.MAP_ENTRY, () => {
224
+ const key = this.keys.generate();
225
+ if (!result.has(key)) {
226
+ result.set(key, this.values.generate());
227
+ }
228
+ });
229
+ attempts++;
230
+ }
231
+ assume(result.size >= this._minSize);
232
+ return result;
233
+ });
234
+ }
235
+ schema() {
236
+ const keySchema = this.keys.schema();
237
+ const valueSchema = this.values.schema();
238
+ if (!keySchema || !valueSchema) {
239
+ return null;
240
+ }
241
+ const schema = {
242
+ type: "dict",
243
+ keys: keySchema,
244
+ values: valueSchema,
245
+ min_size: this._minSize,
246
+ };
247
+ if (this._maxSize !== undefined) {
248
+ schema.max_size = this._maxSize;
249
+ }
250
+ return schema;
251
+ }
252
+ }
253
+ /**
254
+ * Create a generator for Maps with configurable key and value types.
255
+ *
256
+ * @example
257
+ * ```typescript
258
+ * // String keys (common case)
259
+ * const strMap = maps(text(), integers());
260
+ *
261
+ * // Integer keys
262
+ * const intMap = maps(integers(), text());
263
+ * ```
264
+ */
265
+ export function maps(keys, values) {
266
+ return MapGenerator.create(keys, values);
267
+ }
268
+ /**
269
+ * Generator for tuples (fixed-length heterogeneous arrays).
270
+ */
271
+ class TupleGenerator extends BaseGenerator {
272
+ generators;
273
+ constructor(generators) {
274
+ super();
275
+ this.generators = generators;
276
+ }
277
+ generate() {
278
+ const schema = this.schema();
279
+ if (schema) {
280
+ return generateFromSchema(schema);
281
+ }
282
+ // Compositional fallback
283
+ return group(LABELS.TUPLE, () => {
284
+ return this.generators.map(gen => gen.generate());
285
+ });
286
+ }
287
+ schema() {
288
+ const schemas = [];
289
+ for (const gen of this.generators) {
290
+ const s = gen.schema();
291
+ if (!s)
292
+ return null;
293
+ schemas.push(s);
294
+ }
295
+ return {
296
+ type: "tuple",
297
+ elements: schemas,
298
+ };
299
+ }
300
+ }
301
+ /**
302
+ * Create a generator for tuples (fixed-length heterogeneous arrays).
303
+ *
304
+ * @example
305
+ * ```typescript
306
+ * const gen = tuples(integers(), text(), booleans());
307
+ * const [num, str, bool] = gen.generate();
308
+ * ```
309
+ */
310
+ export function tuples(...generators) {
311
+ return new TupleGenerator(generators);
312
+ }
313
+ //# sourceMappingURL=collections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.js","sourceRoot":"","sources":["../src/collections.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { Generator } from "./generator.js";
2
+ /**
3
+ * Create a generator that samples uniformly from a fixed collection.
4
+ *
5
+ * @example
6
+ * ```typescript
7
+ * const colors = sampledFrom(["red", "green", "blue"]);
8
+ * const color: string = colors.generate();
9
+ * ```
10
+ */
11
+ export declare function sampledFrom<T>(elements: readonly T[]): Generator<T>;
12
+ /**
13
+ * Create a generator that chooses from one of several generators.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const gen = oneOf(
18
+ * integers().min(0).max(10),
19
+ * integers().min(100).max(110)
20
+ * );
21
+ * ```
22
+ */
23
+ export declare function oneOf<T>(...generators: Generator<T>[]): Generator<T>;
24
+ /**
25
+ * Create a generator for optional values (T | null).
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * const gen = optional(integers());
30
+ * const value: number | null = gen.generate();
31
+ * ```
32
+ */
33
+ export declare function optional<T>(inner: Generator<T>): Generator<T | null>;
34
+ //# sourceMappingURL=combinators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combinators.d.ts","sourceRoot":"","sources":["../src/combinators.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAA6B,MAAM,gBAAgB,CAAA;AAkDrE;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAEnE;AAwCD;;;;;;;;;;GAUG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAEpE;AAiCD;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAEpE"}